Update copyright notices with scripts/update-copyrights
[glibc.git] / sysdeps / sparc / sparc64 / stpncpy.S
blob5bc0871c11544392359c09c8a515e802f0cfae6f
1 /* stpncpy(DST, SRC, COUNT) - Copy no more than N characters of
2    SRC to DEST, returning the address of the terminating '\0' in
3    DEST, if any, or else DEST + N.
4    For SPARC v9.
5    Copyright (C) 1998-2014 Free Software Foundation, Inc.
6    This file is part of the GNU C Library.
7    Contributed by Jakub Jelinek <jj@ultra.linux.cz> and
8                   Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz>.
10    The GNU C Library is free software; you can redistribute it and/or
11    modify it under the terms of the GNU Lesser General Public
12    License as published by the Free Software Foundation; either
13    version 2.1 of the License, or (at your option) any later version.
15    The GNU C Library is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18    Lesser General Public License for more details.
20    You should have received a copy of the GNU Lesser General Public
21    License along with the GNU C Library; if not, see
22    <http://www.gnu.org/licenses/>.  */
24 #include <sysdep.h>
25 #include <asm/asi.h>
26 #ifndef XCC
27 #define XCC xcc
28 #define USE_BPR
29         .register       %g2, #scratch
30         .register       %g3, #scratch
31         .register       %g6, #scratch
32 #endif
34         /* Normally, this uses
35            ((xword - 0x0101010101010101) & 0x8080808080808080) test
36            to find out if any byte in xword could be zero. This is fast, but
37            also gives false alarm for any byte in range 0x81-0xff. It does
38            not matter for correctness, as if this test tells us there could
39            be some zero byte, we check it byte by byte, but if bytes with
40            high bits set are common in the strings, then this will give poor
41            performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
42            will use one tick slower, but more precise test
43            ((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
44            which does not give any false alarms (but if some bits are set,
45            one cannot assume from it which bytes are zero and which are not).
46            It is yet to be measured, what is the correct default for glibc
47            in these days for an average user.
48          */
50         .text
51         .align          32
52 ENTRY(__stpncpy)
53         sethi           %hi(0x01010101), %g1            /* IEU0         Group           */
54 #ifdef USE_BPR
55         brz,pn          %o2, 19f                        /* CTI+IEU1                     */
56 #else
57         tst             %o2                             /* IEU1                         */
58         be,pn           %XCC, 19f                       /* CTI                          */
59 #endif
60          or             %g1, %lo(0x01010101), %g1       /* IEU1                         */
61         andcc           %o0, 7, %g0                     /* IEU1         Group           */
63         sllx            %g1, 32, %g2                    /* IEU0                         */
64         bne,pn          %icc, 26f                       /* CTI                          */
65          or             %g1, %g2, %g1                   /* IEU0         Group           */
66         andcc           %o1, 7, %g3                     /* IEU1                         */
68         bne,pn          %icc, 28f                       /* CTI                          */
69          sllx           %g1, 7, %g2                     /* IEU0         Group           */
70         ldx             [%o1], %o3                      /* Load                         */
71 1:      add             %o1, 8, %o1                     /* IEU1                         */
73 2:      subcc           %o2, 8, %o2                     /* IEU1         Group           */
74         bl,pn           %XCC, 18f                       /* CTI                          */
75          sub            %o3, %g1, %o4                   /* IEU0                         */
76         add             %o0, 8, %o0                     /* IEU0         Group           */
78 #ifdef EIGHTBIT_NOT_MORE
79         andn            %o4, %o3, %o4                   /* IEU1                         */
80 #endif
81         mov             %o3, %g3                        /* IEU1                         */
82         ldxa            [%o1] ASI_PNF, %o3              /* Load                         */
83         add             %o1, 8, %o1                     /* IEU0         Group           */
84         andcc           %o4, %g2, %g0                   /* IEU1                         */
86         be,a,pt         %xcc, 2b                        /* CTI                          */
87          stx            %g3, [%o0-8]                    /* Store        Group           */
88         srlx            %g3, 56, %g5                    /* IEU0         Group           */
89         andcc           %g5, 0xff, %g0                  /* IEU1         Group           */
91         be,pn           %icc, 16f                       /* CTI                          */
92          srlx           %g3, 48, %g4                    /* IEU0                         */
93         andcc           %g4, 0xff, %g0                  /* IEU1         Group           */
94         be,pn           %icc, 15f                       /* CTI                          */
96          srlx           %g3, 40, %g5                    /* IEU0                         */
97         andcc           %g5, 0xff, %g0                  /* IEU1         Group           */
98         be,pn           %icc, 14f                       /* CTI                          */
99          srlx           %g3, 32, %g4                    /* IEU0                         */
101         andcc           %g4, 0xff, %g0                  /* IEU1         Group           */
102         be,pn           %icc, 13f                       /* CTI                          */
103          srlx           %g3, 24, %g5                    /* IEU0                         */
104         andcc           %g5, 0xff, %g0                  /* IEU1         Group           */
106         be,pn           %icc, 12f                       /* CTI                          */
107          srlx           %g3, 16, %g4                    /* IEU0                         */
108         andcc           %g4, 0xff, %g0                  /* IEU1         Group           */
109         be,pn           %icc, 11f                       /* CTI                          */
111          srlx           %g3, 8, %g5                     /* IEU0                         */
112         andcc           %g5, 0xff, %g0                  /* IEU1         Group           */
113         be,pn           %icc, 10f                       /* CTI                          */
114          sub            %o0, 1, %g6                     /* IEU0                         */
116         andcc           %g3, 0xff, %g0                  /* IEU1         Group           */
117         bne,pt          %icc, 2b                        /* CTI                          */
118 3:       stx            %g3, [%o0-8]                    /* Store                        */
119         andncc          %o2, 31, %g3                    /* IEU1         Group           */
121 4:      be,pn           %XCC, 41f                       /* CTI                          */
122          and            %o2, 31, %o2                    /* IEU1         Group           */
123 40:     stx             %g0, [%o0]                      /* Store                        */
124         stx             %g0, [%o0 + 8]                  /* Store        Group           */
126         subcc           %g3, 32, %g3                    /* IEU1                         */
127         stx             %g0, [%o0 + 16]                 /* Store        Group           */
128         stx             %g0, [%o0 + 24]                 /* Store        Group           */
129         bne,pt          %XCC, 40b                       /* CTI                          */
131          add            %o0, 32, %o0                    /* IEU0                         */
132 41:     subcc           %o2, 8, %o2                     /* IEU1         Group           */
133         bl,a,pn         %XCC, 6f                        /* CTI                          */
134          andcc          %o2, 4, %g0                     /* IEU1         Group           */
136 5:      stx             %g0, [%o0]                      /* Store                        */
137         subcc           %o2, 8, %o2                     /* IEU1         Group           */
138         bge,pt          %XCC, 5b                        /* CTI                          */
139          add            %o0, 8, %o0                     /* IEU0                         */
141         andcc           %o2, 4, %g0                     /* IEU1         Group           */
142 6:      be,a,pn         %icc, 7f                        /* CTI                          */
143          andcc          %o2, 2, %g0                     /* IEU1         Group           */
144         stw             %g0, [%o0]                      /* Store                        */
146         add             %o0, 4, %o0                     /* IEU0                         */
147         andcc           %o2, 2, %g0                     /* IEU1         Group           */
148 7:      be,a,pn         %icc, 8f                        /* CTI                          */
149          andcc          %o2, 1, %g0                     /* IEU1         Group           */
151         sth             %g0, [%o0]                      /* Store                        */
152         add             %o0, 2, %o0                     /* IEU0                         */
153         andcc           %o2, 1, %g0                     /* IEU1         Group           */
154 8:      bne,a,pn        %icc, 9f                        /* CTI                          */
156          stb            %g0, [%o0]                      /* Store                        */
157 9:      retl                                            /* CTI+IEU1     Group           */
158          mov            %g6, %o0                        /* IEU0                         */
159 10:     subcc           %o0, 2, %g6                     /* IEU1         Group           */
161         ba,pt           %xcc, 3b                        /* CTI                          */
162          sllx           %g5, 8, %g3                     /* IEU0                         */
163 11:     subcc           %o0, 3, %g6                     /* IEU1         Group           */
164         ba,pt           %xcc, 3b                        /* CTI                          */
166          sllx           %g4, 16, %g3                    /* IEU0                         */
167 12:     subcc           %o0, 4, %g6                     /* IEU1         Group           */
168         ba,pt           %xcc, 3b                        /* CTI                          */
169          sllx           %g5, 24, %g3                    /* IEU0                         */
171 13:     subcc           %o0, 5, %g6                     /* IEU1         Group           */
172         ba,pt           %xcc, 3b                        /* CTI                          */
173          sllx           %g4, 32, %g3                    /* IEU0                         */
174 14:     subcc           %o0, 6, %g6                     /* IEU1         Group           */
176         ba,pt           %xcc, 3b                        /* CTI                          */
177          sllx           %g5, 40, %g3                    /* IEU0                         */
178 15:     subcc           %o0, 7, %g6                     /* IEU1         Group           */
179         ba,pt           %xcc, 3b                        /* CTI                          */
181          sllx           %g4, 48, %g3                    /* IEU0                         */
182 16:     subcc           %o0, 8, %g6                     /* IEU1         Group           */
183         ba,pt           %xcc, 3b                        /* CTI                          */
184          clr            %g3                             /* IEU0                         */
186         .align          16
187 17:     or              %o3, %o4, %o3                   /* IEU0         Group           */
188         sub             %o3, %g1, %o4                   /* IEU1                         */
189 18:     addcc           %o2, 8, %o2                     /* IEU1         Group           */
190         be,pn           %XCC, 19f                       /* CTI                          */
192          andcc          %o4, %g2, %g0                   /* IEU1         Group           */
193         be,pt           %xcc, 21f                       /* CTI                          */
194          srlx           %o3, 56, %g5                    /* IEU0                         */
195         andcc           %g5, 0xff, %g0                  /* IEU1         Group           */
197         be,pn           %icc, 20f                       /* CTI                          */
198          stb            %g5, [%o0]                      /* Store                        */
199         add             %o0, 1, %o0                     /* IEU0         Group           */
200         subcc           %o2, 1, %o2                     /* IEU1                         */
202         be,pn           %XCC, 19f                       /* CTI                          */
203          srlx           %o3, 48, %g5                    /* IEU0         Group           */
204         andcc           %g5, 0xff, %g0                  /* IEU1         Group           */
205         be,pn           %icc, 20f                       /* CTI                          */
207          stb            %g5, [%o0]                      /* Store                        */
208         add             %o0, 1, %o0                     /* IEU0         Group           */
209         subcc           %o2, 1, %o2                     /* IEU1                         */
210         be,pn           %XCC, 19f                       /* CTI                          */
212          srlx           %o3, 40, %g5                    /* IEU0         Group           */
213         andcc           %g5, 0xff, %g0                  /* IEU1         Group           */
214         be,pn           %icc, 20f                       /* CTI                          */
215          stb            %g5, [%o0]                      /* Store                        */
217         add             %o0, 1, %o0                     /* IEU0         Group           */
218         subcc           %o2, 1, %o2                     /* IEU1                         */
219         be,pn           %XCC, 19f                       /* CTI                          */
220          srlx           %o3, 32, %g5                    /* IEU0         Group           */
222         andcc           %g5, 0xff, %g0                  /* IEU1         Group           */
223         be,pn           %icc, 20f                       /* CTI                          */
224          stb            %g5, [%o0]                      /* Store                        */
225         add             %o0, 1, %o0                     /* IEU0         Group           */
227         subcc           %o2, 1, %o2                     /* IEU1                         */
228         be,pn           %XCC, 19f                       /* CTI                          */
229          srlx           %o3, 24, %g5                    /* IEU0         Group           */
230         andcc           %g5, 0xff, %g0                  /* IEU1         Group           */
232         be,pn           %icc, 20f                       /* CTI                          */
233          stb            %g5, [%o0]                      /* Store                        */
234         add             %o0, 1, %o0                     /* IEU0         Group           */
235         subcc           %o2, 1, %o2                     /* IEU1                         */
237         be,pn           %XCC, 19f                       /* CTI                          */
238          srlx           %o3, 16, %g5                    /* IEU0         Group           */
239         andcc           %g5, 0xff, %g0                  /* IEU1         Group           */
240         be,pn           %icc, 20f                       /* CTI                          */
242          stb            %g5, [%o0]                      /* Store                        */
243         add             %o0, 1, %o0                     /* IEU0         Group           */
244         subcc           %o2, 1, %o2                     /* IEU1                         */
245         be,pn           %XCC, 19f                       /* CTI                          */
247          srlx           %o3, 8, %o3                     /* IEU0         Group           */
248         stb             %o3, [%o0]                      /* Store                        */
249 59:     add             %o0, 1, %o2                     /* IEU1                         */
250         andcc           %o3, 0xff, %g0                  /* IEU1         Group           */
252         retl                                            /* CTI+IEU1     Group           */
253          movne          %icc, %o2, %o0                  /* Single       Group           */
254 19:     retl                                            /* CTI+IEU1     Group           */
255          nop                                            /* IEU0                         */
257 20:     mov             %o0, %g6                        /* IEU0         Group           */
258         subcc           %o2, 1, %o2                     /* IEU1                         */
259         be,pn           %XCC, 51f                       /* CTI                          */
260          add            %o0, 1, %o0                     /* IEU0         Group           */
262 50:     stb             %g0, [%o0]                      /* Store        Group           */
263         subcc           %o2, 1, %o2                     /* IEU1         Group           */
264         bne,pt          %XCC, 50b                       /* CTI                          */
265          add            %o0, 1, %o0                     /* IEU0                         */
267 51:     retl                                            /* CTI+IEU1     Group           */
268          mov            %g6, %o0                        /* IEU0                         */
270         .align          16
271 21:     andcc           %o2, 4, %g0                     /* IEU1         Group           */
272         be,pn           %icc, 22f                       /* CTI                          */
273          srlx           %o3, 32, %g5                    /* IEU0                         */
274         stw             %g5, [%o0]                      /* Store        Group           */
276         add             %o0, 4, %o0                     /* IEU0                         */
277         mov             %o3, %g5                        /* IEU1                         */
278 22:     andcc           %o2, 2, %g0                     /* IEU1         Group           */
279         be,pn           %icc, 23f                       /* CTI                          */
281          srlx           %g5, 16, %g4                    /* IEU0                         */
282         sth             %g4, [%o0]                      /* Store        Group           */
283         add             %o0, 2, %o0                     /* IEU0                         */
284         mov             %g5, %g4                        /* IEU1                         */
286 23:     srlx            %g4, 8, %g4                     /* IEU0         Group           */
287         andcc           %o2, 1, %g0                     /* IEU1                         */
288         bne,a,pn        %icc, 24f                       /* CTI                          */
289          stb            %g4, [%o0]                      /* Store        Group           */
291         retl                                            /* CTI+IEU1     Group           */
292          nop                                            /* IEU0                         */
293 24:     retl                                            /* CTI+IEU1     Group           */
294          add            %o0, 1, %o0                     /* IEU0                         */
296         .align          16
297 55:     sub             %o0, 1, %g6                     /* IEU0         Group           */
298 25:     andcc           %o0, 7, %g0                     /* IEU1                         */
299         be,a,pn         %icc, 4b                        /* CTI                          */
300          andncc         %o2, 31, %g3                    /* IEU1         Group           */
302         stb             %g0, [%o0]                      /* Store        Group           */
303         subcc           %o2, 1, %o2                     /* IEU1                         */
304         bne,pt          %XCC, 25b                       /* CTI                          */
305          add            %o0, 1, %o0                     /* IEU0         Group           */
307         retl                                            /* CTI+IEU1     Group           */
308          mov            %g6, %o0                        /* IEU0                         */
310         .align          16
311 26:     ldub            [%o1], %o3                      /* Load                         */
312         sllx            %g1, 7, %g2                     /* IEU0         Group           */
313         stb             %o3, [%o0]                      /* Store                        */
314 27:     subcc           %o2, 1, %o2                     /* IEU1                         */
316         be,pn           %XCC, 59b                       /* CTI                          */
317          add            %o1, 1, %o1                     /* IEU0         Group           */
318         add             %o0, 1, %o0                     /* IEU1                         */
319         andcc           %o3, 0xff, %g0                  /* IEU1         Group           */
321         be,pn           %icc, 55b                       /* CTI                          */
322          lduba          [%o1] ASI_PNF, %o3              /* Load                         */
323         andcc           %o0, 7, %g0                     /* IEU1         Group           */
324         bne,a,pt        %icc, 27b                       /* CTI                          */
326          stb            %o3, [%o0]                      /* Store                        */
327         andcc           %o1, 7, %g3                     /* IEU1         Group           */
328         be,a,pt         %icc, 1b                        /* CTI                          */
329          ldx            [%o1], %o3                      /* Load                         */
331 28:     orcc            %g0, 64, %g4                    /* IEU1         Group           */
332         sllx            %g3, 3, %g5                     /* IEU0                         */
333         sub             %g4, %g5, %g4                   /* IEU0         Group           */
334         sub             %o1, %g3, %o1                   /* IEU1                         */
335                                                         /* %g1 = 0101010101010101
336                                                            %g2 = 8080808080808080
337                                                            %g3 = source alignment
338                                                            %g5 = number of bits to shift left
339                                                            %g4 = number of bits to shift right */
341         ldxa            [%o1] ASI_PNF, %o5              /* Load         Group           */
342         addcc           %o1, 8, %o1                     /* IEU1                         */
343 29:     sllx            %o5, %g5, %o3                   /* IEU0         Group           */
344         ldxa            [%o1] ASI_PNF, %o5              /* Load                         */
346         subcc           %o2, 8, %o2                     /* IEU1                         */
347         bl,pn           %XCC, 17b                       /* CTI                          */
348          srlx           %o5, %g4, %o4                   /* IEU0         Group           */
349         add             %o1, 8, %o1                     /* IEU1                         */
351         or              %o3, %o4, %o3                   /* IEU0         Group           */
352         add             %o0, 8, %o0                     /* IEU1                         */
353         sub             %o3, %g1, %o4                   /* IEU0         Group           */
354 #ifdef EIGHTBIT_NOT_RARE
355         andn            %o4, %o3, %o4                   /* IEU0         Group           */
356 #endif
357         andcc           %o4, %g2, %g0                   /* IEU1         Group           */
359         be,a,pt         %xcc, 29b                       /* CTI                          */
360          stx            %o3, [%o0-8]                    /* Store                        */
361         srlx            %o3, 56, %o4                    /* IEU0         Group           */
362         andcc           %o4, 0xff, %g0                  /* IEU1         Group           */
364         be,pn           %icc, 36f                       /* CTI                          */
365          srlx           %o3, 48, %g6                    /* IEU0                         */
366         andcc           %g6, 0xff, %g0                  /* IEU1         Group           */
367         be,pn           %icc, 35f                       /* CTI                          */
369          srlx           %o3, 40, %o4                    /* IEU0                         */
370         andcc           %o4, 0xff, %g0                  /* IEU1         Group           */
371         be,pn           %icc, 34f                       /* CTI                          */
372          srlx           %o3, 32, %g6                    /* IEU0                         */
374         andcc           %g6, 0xff, %g0                  /* IEU1         Group           */
375         be,pn           %icc, 33f                       /* CTI                          */
376          srlx           %o3, 24, %o4                    /* IEU0                         */
377         andcc           %o4, 0xff, %g0                  /* IEU1         Group           */
379         be,pn           %icc, 32f                       /* CTI                          */
380          srlx           %o3, 16, %g6                    /* IEU0                         */
381         andcc           %g6, 0xff, %g0                  /* IEU1         Group           */
382         be,pn           %icc, 31f                       /* CTI                          */
384          srlx           %o3, 8, %o4                     /* IEU0                         */
385         andcc           %o4, 0xff, %g0                  /* IEU1         Group           */
386         be,pn           %icc, 30f                       /* CTI                          */
387          andcc          %o3, 0xff, %g0                  /* IEU1         Group           */
389         bne,pn          %icc, 29b                       /* CTI                          */
390          stx            %o3, [%o0-8]                    /* Store                        */
391         sub             %o0, 1, %g6                     /* IEU0         Group           */
392         ba,pt           %xcc, 4b                        /* CTI                          */
394          andncc         %o2, 31, %g3                    /* IEU1                         */
395 30:     subcc           %o0, 2, %g6                     /* IEU0                         */
396         ba,pt           %xcc, 3b                        /* CTI                          */
397          sllx           %o4, 8, %g3                     /* IEU0         Group           */
399 31:     sllx            %g6, 16, %g3                    /* IEU0         Group           */
400         ba,pt           %xcc, 3b                        /* CTI                          */
401          sub            %o0, 3, %g6                     /* IEU1                         */
402 32:     subcc           %o0, 4, %g6                     /* IEU1         Group           */
404         ba,pt           %xcc, 3b                        /* CTI                          */
405          sllx           %o4, 24, %g3                    /* IEU0                         */
406 33:     sllx            %g6, 32, %g3                    /* IEU0         Group           */
407         ba,pt           %xcc, 3b                        /* CTI                          */
409          sub            %o0, 5, %g6                     /* IEU1                         */
410 34:     subcc           %o0, 6, %g6                     /* IEU1         Group           */
411         ba,pt           %xcc, 3b                        /* CTI                          */
412          sllx           %o4, 40, %g3                    /* IEU0                         */
414 35:     sllx            %g6, 48, %g3                    /* IEU0         Group           */
415         ba,pt           %xcc, 3b                        /* CTI                          */
416          sub            %o0, 7, %g6                     /* IEU1                         */
417 36:     subcc           %o0, 8, %g6                     /* IEU1         Group           */
419         ba,pt           %xcc, 3b                        /* CTI                          */
420          sllx           %o4, 56, %g3                    /* IEU0                         */
421 END(__stpncpy)
423 libc_hidden_def (__stpncpy)
424 weak_alias (__stpncpy, stpncpy)