Update copyright dates with scripts/update-copyrights.
[glibc.git] / sysdeps / sparc / sparc64 / strncpy.S
blob661d445fce058ea4457bd17827152c5b7b2e027b
1 /* strncpy(DST, SRC, COUNT) - Copy no more than COUNT bytes of the
2    null-terminated string from SRC to DST.  If SRC does not cover all of
3    COUNT, the balance is zeroed.
4    For SPARC v9.
5    Copyright (C) 1998-2015 Free Software Foundation, Inc.
6    This file is part of the GNU C Library.
7    Contributed by Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz> and
8                   Jakub Jelinek <jj@ultra.linux.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(strncpy)
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          mov            %o0, %g6                        /* IEU0         Group           */
61         or              %g1, %lo(0x01010101), %g1       /* IEU1                         */
63         andcc           %o0, 7, %g0                     /* IEU1         Group           */
64         sllx            %g1, 32, %g2                    /* IEU0                         */
65         bne,pn          %icc, 26f                       /* CTI                          */
66          or             %g1, %g2, %g1                   /* IEU0         Group           */
68         andcc           %o1, 7, %g3                     /* IEU1                         */
69         bne,pn          %icc, 28f                       /* CTI                          */
70          sllx           %g1, 7, %g2                     /* IEU0         Group           */
71         ldx             [%o1], %o3                      /* Load                         */
73 1:      add             %o1, 8, %o1                     /* IEU1                         */
74 2:      subcc           %o2, 8, %o2                     /* IEU1         Group           */
75         bl,pn           %XCC, 18f                       /* CTI                          */
76          sub            %o3, %g1, %o4                   /* IEU0                         */
78         add             %o0, 8, %o0                     /* IEU0         Group           */
79 #ifdef EIGHTBIT_NOT_MORE
80         andn            %o4, %o3, %o4                   /* IEU1                         */
81 #endif
82         mov             %o3, %g3                        /* IEU1                         */
83         ldxa            [%o1] ASI_PNF, %o3              /* Load                         */
84         add             %o1, 8, %o1                     /* IEU0         Group           */
86         andcc           %o4, %g2, %g0                   /* IEU1                         */
87         be,a,pt         %xcc, 2b                        /* CTI                          */
88          stx            %g3, [%o0-8]                    /* Store        Group           */
89         srlx            %g3, 56, %g5                    /* IEU0         Group           */
91         andcc           %g5, 0xff, %g0                  /* IEU1         Group           */
92         be,pn           %icc, 16f                       /* CTI                          */
93          srlx           %g3, 48, %g4                    /* IEU0                         */
94         andcc           %g4, 0xff, %g0                  /* IEU1         Group           */
96         be,pn           %icc, 15f                       /* CTI                          */
97          srlx           %g3, 40, %g5                    /* IEU0                         */
98         andcc           %g5, 0xff, %g0                  /* IEU1         Group           */
99         be,pn           %icc, 14f                       /* CTI                          */
101          srlx           %g3, 32, %g4                    /* IEU0                         */
102         andcc           %g4, 0xff, %g0                  /* IEU1         Group           */
103         be,pn           %icc, 13f                       /* CTI                          */
104          srlx           %g3, 24, %g5                    /* IEU0                         */
106         andcc           %g5, 0xff, %g0                  /* IEU1         Group           */
107         be,pn           %icc, 12f                       /* CTI                          */
108          srlx           %g3, 16, %g4                    /* IEU0                         */
109         andcc           %g4, 0xff, %g0                  /* IEU1         Group           */
111         be,pn           %icc, 11f                       /* CTI                          */
112          srlx           %g3, 8, %g5                     /* IEU0                         */
113         andcc           %g5, 0xff, %g0                  /* IEU1         Group           */
114         be,pn           %icc, 10f                       /* CTI                          */
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                         */
160         .align          16
161 10:     ba,pt           %xcc, 3b                        /* CTI                          */
162          sllx           %g5, 8, %g3                     /* IEU0                         */
163 11:     ba,pt           %xcc, 3b                        /* CTI          Group           */
164          sllx           %g4, 16, %g3                    /* IEU0                         */
166 12:     ba,pt           %xcc, 3b                        /* CTI          Group           */
167          sllx           %g5, 24, %g3                    /* IEU0                         */
168 13:     ba,pt           %xcc, 3b                        /* CTI          Group           */
169          sllx           %g4, 32, %g3                    /* IEU0                         */
171 14:     ba,pt           %xcc, 3b                        /* CTI          Group           */
172          sllx           %g5, 40, %g3                    /* IEU0                         */
173 15:     ba,pt           %xcc, 3b                        /* CTI          Group           */
174          sllx           %g4, 48, %g3                    /* IEU0                         */
176 16:     ba,pt           %xcc, 3b                        /* CTI                          */
177          sllx           %g5, 56, %g3                    /* IEU0                         */
178 17:     or              %o3, %o4, %o3                   /* IEU0         Group           */
179         sub             %o3, %g1, %o4                   /* IEU1                         */
181 18:     addcc           %o2, 8, %o2                     /* IEU1         Group           */
182         be,pn           %XCC, 19f                       /* CTI                          */
183          andcc          %o4, %g2, %g0                   /* IEU1         Group           */
184         be,pt           %xcc, 21f                       /* CTI                          */
186          srlx           %o3, 56, %g5                    /* IEU0                         */
187         andcc           %g5, 0xff, %g0                  /* IEU1         Group           */
188         be,pn           %icc, 20f                       /* CTI                          */
189          stb            %g5, [%o0]                      /* Store                        */
191         add             %o0, 1, %o0                     /* IEU0         Group           */
192         subcc           %o2, 1, %o2                     /* IEU1                         */
193         be,pn           %XCC, 19f                       /* CTI                          */
194          srlx           %o3, 48, %g5                    /* IEU0         Group           */
196         andcc           %g5, 0xff, %g0                  /* IEU1         Group           */
197         be,pn           %icc, 20f                       /* CTI                          */
198          stb            %g5, [%o0]                      /* Store                        */
199         add             %o0, 1, %o0                     /* IEU0         Group           */
201         subcc           %o2, 1, %o2                     /* IEU1                         */
202         be,pn           %XCC, 19f                       /* CTI                          */
203          srlx           %o3, 40, %g5                    /* IEU0         Group           */
204         andcc           %g5, 0xff, %g0                  /* IEU1         Group           */
206         be,pn           %icc, 20f                       /* CTI                          */
207          stb            %g5, [%o0]                      /* Store                        */
208         add             %o0, 1, %o0                     /* IEU0         Group           */
209         subcc           %o2, 1, %o2                     /* IEU1                         */
211         be,pn           %XCC, 19f                       /* CTI                          */
212          srlx           %o3, 32, %g5                    /* IEU0         Group           */
213         andcc           %g5, 0xff, %g0                  /* IEU1         Group           */
214         be,pn           %icc, 20f                       /* CTI                          */
216          stb            %g5, [%o0]                      /* Store                        */
217         add             %o0, 1, %o0                     /* IEU0         Group           */
218         subcc           %o2, 1, %o2                     /* IEU1                         */
219         be,pn           %XCC, 19f                       /* CTI                          */
221          srlx           %o3, 24, %g5                    /* IEU0         Group           */
222         andcc           %g5, 0xff, %g0                  /* IEU1         Group           */
223         be,pn           %icc, 20f                       /* CTI                          */
224          stb            %g5, [%o0]                      /* Store                        */
226         add             %o0, 1, %o0                     /* IEU0         Group           */
227         subcc           %o2, 1, %o2                     /* IEU1                         */
228         be,pn           %XCC, 19f                       /* CTI                          */
229          srlx           %o3, 16, %g5                    /* IEU0         Group           */
231         andcc           %g5, 0xff, %g0                  /* IEU1         Group           */
232         be,pn           %icc, 20f                       /* CTI                          */
233          stb            %g5, [%o0]                      /* Store                        */
234         add             %o0, 1, %o0                     /* IEU0         Group           */
236         subcc           %o2, 1, %o2                     /* IEU1                         */
237         be,pn           %XCC, 19f                       /* CTI                          */
238          srlx           %o3, 8, %g5                     /* IEU0         Group           */
239         stb             %g5, [%o0]                      /* Store                        */
241 19:     retl                                            /* CTI+IEU1     Group           */
242          mov            %g6, %o0                        /* IEU0                         */
243 50:     stb             %g0, [%o0]                      /* Store        Group           */
244 20:     subcc           %o2, 1, %o2                     /* IEU1         Group           */
246         bne,pt          %XCC, 50b                       /* CTI                          */
247          add            %o0, 1, %o0                     /* IEU0                         */
248         retl                                            /* CTI+IEU1     Group           */
249          mov            %g6, %o0                        /* IEU0                         */
251 21:     andcc           %o2, 4, %g0                     /* IEU1         Group           */
252         be,pn           %icc, 22f                       /* CTI                          */
253          srlx           %o3, 32, %g5                    /* IEU0                         */
254         stw             %g5, [%o0]                      /* Store        Group           */
256         add             %o0, 4, %o0                     /* IEU0                         */
257         mov             %o3, %g5                        /* IEU1                         */
258 22:     andcc           %o2, 2, %g0                     /* IEU1         Group           */
259         be,pn           %icc, 23f                       /* CTI                          */
261          srlx           %g5, 16, %g4                    /* IEU0                         */
262         sth             %g4, [%o0]                      /* Store        Group           */
263         add             %o0, 2, %o0                     /* IEU0                         */
264         mov             %g5, %g4                        /* IEU1                         */
266 23:     srlx            %g4, 8, %g4                     /* IEU0         Group           */
267         andcc           %o2, 1, %g0                     /* IEU1                         */
268         bne,a,pn        %icc, 24f                       /* CTI                          */
269          stb            %g4, [%o0]                      /* Store        Group           */
271 24:     retl                                            /* CTI+IEU1     Group           */
272          mov            %g6, %o0                        /* IEU0                         */
273 25:     andcc           %o0, 7, %g0                     /* IEU1         Group           */
274         be,a,pn         %icc, 4b                        /* CTI                          */
276          andncc         %o2, 31, %g3                    /* IEU1         Group           */
277         stb             %g0, [%o0]                      /* Store        Group           */
278         subcc           %o2, 1, %o2                     /* IEU1                         */
279         bne,pt          %XCC, 25b                       /* CTI                          */
281          add            %o0, 1, %o0                     /* IEU0         Group           */
282         retl                                            /* CTI+IEU1     Group           */
283          mov            %g6, %o0                        /* IEU0                         */
285         .align          16
286 26:     ldub            [%o1], %o3                      /* Load                         */
287         sllx            %g1, 7, %g2                     /* IEU0         Group           */
288         stb             %o3, [%o0]                      /* Store                        */
289 27:     subcc           %o2, 1, %o2                     /* IEU1                         */
291         be,pn           %XCC, 9b                        /* CTI                          */
292          add            %o1, 1, %o1                     /* IEU0         Group           */
293         add             %o0, 1, %o0                     /* IEU1                         */
294         andcc           %o3, 0xff, %g0                  /* IEU1         Group           */
296         be,pn           %icc, 25b                       /* CTI                          */
297          lduba          [%o1] ASI_PNF, %o3              /* Load                         */
298         andcc           %o0, 7, %g0                     /* IEU1         Group           */
299         bne,a,pt        %icc, 27b                       /* CTI                          */
301          stb            %o3, [%o0]                      /* Store                        */
302         andcc           %o1, 7, %g3                     /* IEU1         Group           */
303         be,a,pt         %icc, 1b                        /* CTI                          */
304          ldx            [%o1], %o3                      /* Load                         */
306 28:     orcc            %g0, 64, %g4                    /* IEU1         Group           */
307         sllx            %g3, 3, %g5                     /* IEU0                         */
308         sub             %g4, %g5, %g4                   /* IEU0         Group           */
309         sub             %o1, %g3, %o1                   /* IEU1                         */
310                                                         /* %g1 = 0101010101010101
311                                                            %g2 = 8080808080808080
312                                                            %g3 = source alignment
313                                                            %g5 = number of bits to shift left
314                                                            %g4 = number of bits to shift right */
316         ldxa            [%o1] ASI_PNF, %o5              /* Load         Group           */
317         addcc           %o1, 8, %o1                     /* IEU1                         */
319 29:     sllx            %o5, %g5, %o3                   /* IEU0         Group           */
320         ldxa            [%o1] ASI_PNF, %o5              /* Load                         */
321         subcc           %o2, 8, %o2                     /* IEU1                         */
322         bl,pn           %XCC, 17b                       /* CTI                          */
324          srlx           %o5, %g4, %o4                   /* IEU0         Group           */
325         add             %o1, 8, %o1                     /* IEU1                         */
326         or              %o3, %o4, %o3                   /* IEU0         Group           */
327         add             %o0, 8, %o0                     /* IEU1                         */
329         sub             %o3, %g1, %o4                   /* IEU0         Group           */
330 #ifdef EIGHTBIT_NOT_RARE
331         andn            %o4, %o3, %o4                   /* IEU0         Group           */
332 #endif
333         andcc           %o4, %g2, %g0                   /* IEU1         Group           */
334         be,a,pt         %xcc, 29b                       /* CTI                          */
335          stx            %o3, [%o0-8]                    /* Store                        */
337         srlx            %o3, 56, %o4                    /* IEU0         Group           */
338         andcc           %o4, 0xff, %g0                  /* IEU1         Group           */
339         be,pn           %icc, 36f                       /* CTI                          */
340          srlx           %o3, 48, %o4                    /* IEU0                         */
342         andcc           %o4, 0xff, %g0                  /* IEU1         Group           */
343         be,pn           %icc, 35f                       /* CTI                          */
344          srlx           %o3, 40, %o4                    /* IEU0                         */
345         andcc           %o4, 0xff, %g0                  /* IEU1         Group           */
347         be,pn           %icc, 34f                       /* CTI                          */
348          srlx           %o3, 32, %o4                    /* IEU0                         */
349         andcc           %o4, 0xff, %g0                  /* IEU1         Group           */
350         be,pn           %icc, 33f                       /* CTI                          */
352          srlx           %o3, 24, %o4                    /* IEU0                         */
353         andcc           %o4, 0xff, %g0                  /* IEU1         Group           */
354         be,pn           %icc, 32f                       /* CTI                          */
355          srlx           %o3, 16, %o4                    /* IEU0                         */
357         andcc           %o4, 0xff, %g0                  /* IEU1         Group           */
358         be,pn           %icc, 31f                       /* CTI                          */
359          srlx           %o3, 8, %o4                     /* IEU0                         */
360         andcc           %o4, 0xff, %g0                  /* IEU1         Group           */
362         be,pn           %icc, 30f                       /* CTI                          */
363          andcc          %o3, 0xff, %g0                  /* IEU1         Group           */
364         bne,pn          %icc, 29b                       /* CTI                          */
365          stx            %o3, [%o0-8]                    /* Store                        */
367         ba,pt           %xcc, 4b                        /* CTI          Group           */
368          andncc         %o2, 31, %g3                    /* IEU1                         */
369 30:     srlx            %o3, 8, %o4                     /* IEU0                         */
370         ba,pt           %xcc, 3b                        /* CTI                          */
372          sllx           %o4, 8, %g3                     /* IEU0         Group           */
373 31:     srlx            %o3, 16, %o4                    /* IEU0         Group           */
374         ba,pt           %xcc, 3b                        /* CTI                          */
375          sllx           %o4, 16, %g3                    /* IEU0         Group           */
377 32:     srlx            %o3, 24, %o4                    /* IEU0         Group           */
378         ba,pt           %xcc, 3b                        /* CTI                          */
379          sllx           %o4, 24, %g3                    /* IEU0         Group           */
380 33:     srlx            %o3, 32, %o4                    /* IEU0         Group           */
382         ba,pt           %xcc, 3b                        /* CTI                          */
383          sllx           %o4, 32, %g3                    /* IEU0         Group           */
384 34:     srlx            %o3, 40, %o4                    /* IEU0         Group           */
385         ba,pt           %xcc, 3b                        /* CTI                          */
387          sllx           %o4, 40, %g3                    /* IEU0         Group           */
388 35:     srlx            %o3, 48, %o4                    /* IEU0         Group           */
389         ba,pt           %xcc, 3b                        /* CTI                          */
390          sllx           %o4, 48, %g3                    /* IEU0         Group           */
392 36:     srlx            %o3, 56, %o4                    /* IEU0         Group           */
393         ba,pt           %xcc, 3b                        /* CTI                          */
394          sllx           %o4, 56, %g3                    /* IEU0         Group           */
395 END(strncpy)
396 libc_hidden_builtin_def (strncpy)