2.9
[glibc/nacl-glibc.git] / sysdeps / sparc / sparc64 / strncmp.S
blobd104351463c20850fcefca038a9527f57c6c57b1
1 /* Compare no more than N characters of S1 and S2, returning less than, 
2    equal to or greater than zero if S1 is lexicographically less than, 
3    equal to or greater than S2.
4    For SPARC v9.
5    Copyright (C) 1997, 1999, 2003 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, write to the Free
22    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
23    02111-1307 USA.  */
25 #include <sysdep.h>
26 #include <asm/asi.h>
27 #ifndef XCC
28 #define XCC xcc
29 #define USE_BPR
30         .register       %g2, #scratch
31         .register       %g3, #scratch
32         .register       %g6, #scratch
33 #endif
35         /* Normally, this uses
36            ((xword - 0x0101010101010101) & 0x8080808080808080) test
37            to find out if any byte in xword could be zero. This is fast, but
38            also gives false alarm for any byte in range 0x81-0xff. It does
39            not matter for correctness, as if this test tells us there could
40            be some zero byte, we check it byte by byte, but if bytes with
41            high bits set are common in the strings, then this will give poor
42            performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
43            will use one tick slower, but more precise test
44            ((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
45            which does not give any false alarms (but if some bits are set,
46            one cannot assume from it which bytes are zero and which are not).
47            It is yet to be measured, what is the correct default for glibc
48            in these days for an average user.
49          */
51         .text
52         .align          32
53 ENTRY(strncmp)
54 #ifdef USE_BPR
55         brz,pn          %o2, 4f                         /* CTI+IEU1     Group           */
56 #else
57         tst             %o2                             /* IEU1         Group           */
58         be,pn           %XCC, 4f                        /* CTI                          */
59 #endif
60          sethi          %hi(0x1010101), %g1             /* IEU0                         */
61         andcc           %o0, 7, %g0                     /* IEU1         Group           */
62         bne,pn          %icc, 9f                        /* CTI                          */
64          or             %g1, %lo(0x1010101), %g1        /* IEU0                         */
65         andcc           %o1, 7, %g3                     /* IEU1         Group           */
66         bne,pn          %icc, 11f                       /* CTI                          */
67          sllx           %g1, 32, %g2                    /* IEU0                         */
69         ldx             [%o0], %g4                      /* Load         Group           */
70         or              %g1, %g2, %g1                   /* IEU0                         */
71 1:      ldx             [%o1], %o3                      /* Load         Group           */
72         sllx            %g1, 7, %g2                     /* IEU0                         */
74         add             %o0, 8, %o0                     /* IEU1                         */
75 2:      subcc           %o2, 8, %o2                     /* IEU1         Group           */
76         bl,pn           %XCC, 5f                        /* CTI                          */
77          add            %o1, 8, %o1                     /* IEU0                         */
79         sub             %g4, %g1, %g3                   /* IEU0         Group           */
80         subcc           %g4, %o3, %o4                   /* IEU1                         */
81 #ifdef EIGHTBIT_NOT_RARE
82         andn            %g3, %g4, %g6                   /* IEU0         Group           */
83 #endif
84         bne,pn          %xcc, 6f                        /* CTI                          */
85          ldxa           [%o0] ASI_PNF, %g4              /* Load         Group           */
87         add             %o0, 8, %o0                     /* IEU0                         */
88 #ifdef EIGHTBIT_NOT_RARE
89         andcc           %g6, %g2, %g0                   /* IEU1                         */
90 #else
91         andcc           %g3, %g2, %g0                   /* IEU1                         */
92 #endif
93         be,a,pt         %xcc, 2b                        /* CTI                          */
94          ldxa           [%o1] ASI_PNF, %o3              /* Load         Group           */
96         addcc           %g3, %g1, %o4                   /* IEU1                         */
97 #ifdef EIGHTBIT_NOT_RARE
98         srlx            %g6, 32, %g6                    /* IEU0                         */
99         andcc           %g6, %g2, %g0                   /* IEU1         Group           */
100 #else
101         srlx            %g3, 32, %g3                    /* IEU0                         */
102         andcc           %g3, %g2, %g0                   /* IEU1         Group           */
103 #endif
104         be,pt           %xcc, 3f                        /* CTI                          */
106          srlx           %o4, 56, %o5                    /* IEU0                         */
107         andcc           %o5, 0xff, %g0                  /* IEU1         Group           */
108         be,pn           %icc, 4f                        /* CTI                          */
109          srlx           %o4, 48, %o5                    /* IEU0                         */
111         andcc           %o5, 0xff, %g0                  /* IEU1         Group           */
112         be,pn           %icc, 4f                        /* CTI                          */
113          srlx           %o4, 40, %o5                    /* IEU0                         */
114         andcc           %o5, 0xff, %g0                  /* IEU1         Group           */
116         be,pn           %icc, 4f                        /* CTI                          */
117          srlx           %o4, 32, %o5                    /* IEU0                         */
118         andcc           %o5, 0xff, %g0                  /* IEU1         Group           */
119         be,pn           %icc, 4f                        /* CTI                          */
121 3:       srlx           %o4, 24, %o5                    /* IEU0                         */
122         andcc           %o5, 0xff, %g0                  /* IEU1         Group           */
123         be,pn           %icc, 4f                        /* CTI                          */
124          srlx           %o4, 16, %o5                    /* IEU0                         */
126         andcc           %o5, 0xff, %g0                  /* IEU1         Group           */
127         be,pn           %icc, 4f                        /* CTI                          */
128          srlx           %o4, 8, %o5                     /* IEU0                         */
129         andcc           %o5, 0xff, %g0                  /* IEU1         Group           */
131         be,pn           %icc, 4f                        /* CTI                          */
132         andcc           %o4, 0xff, %g0                  /* IEU1         Group           */
133         bne,a,pn        %icc, 2b                        /* CTI                          */
134          ldxa           [%o1] ASI_PNF, %o3              /* Load                         */
136 4:      retl                                            /* CTI+IEU1     Group           */
137          clr            %o0                             /* IEU0                         */
139         .align          16
140 5:      srlx            %g4, 56, %o4                    /* IEU0         Group           */
141         cmp             %o2, -8                         /* IEU1                         */
142         be,pn           %XCC, 4b                        /* CTI                          */
143          srlx           %o3, 56, %o5                    /* IEU0         Group           */
144         
145         andcc           %o4, 0xff, %g0                  /* IEU1                         */
146         be,pn           %xcc, 8f                        /* CTI                          */
147          subcc          %o4, %o5, %o4                   /* IEU1         Group           */
148         bne,pn          %xcc, 8f                        /* CTI                          */
150          srlx           %o3, 48, %o5                    /* IEU0                         */
151         cmp             %o2, -7                         /* IEU1         Group           */
152         be,pn           %XCC, 4b                        /* CTI                          */
153          srlx           %g4, 48, %o4                    /* IEU0                         */
155         andcc           %o4, 0xff, %g0                  /* IEU1         Group           */
156         be,pn           %xcc, 8f                        /* CTI                          */
157          subcc          %o4, %o5, %o4                   /* IEU1         Group           */
158         bne,pn          %xcc, 8f                        /* CTI                          */
160          srlx           %o3, 40, %o5                    /* IEU0                         */
161         cmp             %o2, -6                         /* IEU1         Group           */
162         be,pn           %XCC, 4b                        /* CTI                          */
163          srlx           %g4, 40, %o4                    /* IEU0                         */
165         andcc           %o4, 0xff, %g0                  /* IEU1         Group           */
166         be,pn           %xcc, 8f                        /* CTI                          */
167          subcc          %o4, %o5, %o4                   /* IEU1         Group           */
168         bne,pn          %xcc, 8f                        /* CTI                          */
170          srlx           %o3, 32, %o5                    /* IEU0                         */
171         cmp             %o2, -5                         /* IEU1         Group           */
172         be,pn           %XCC, 4b                        /* CTI                          */
173          srlx           %g4, 32, %o4                    /* IEU0                         */
175         andcc           %o4, 0xff, %g0                  /* IEU1         Group           */
176         be,pn           %xcc, 8f                        /* CTI                          */
177          subcc          %o4, %o5, %o4                   /* IEU1         Group           */
178         bne,pn          %xcc, 8f                        /* CTI                          */
180          srlx           %o3, 24, %o5                    /* IEU0                         */
181         cmp             %o2, -4                         /* IEU1         Group           */
182         be,pn           %XCC, 4b                        /* CTI                          */
183          srlx           %g4, 24, %o4                    /* IEU0                         */
185         andcc           %o4, 0xff, %g0                  /* IEU1         Group           */
186         be,pn           %xcc, 8f                        /* CTI                          */
187          subcc          %o4, %o5, %o4                   /* IEU1         Group           */
188         bne,pn          %xcc, 8f                        /* CTI                          */
190          srlx           %o3, 16, %o5                    /* IEU0                         */
191         cmp             %o2, -3                         /* IEU1         Group           */
192         be,pn           %XCC, 4b                        /* CTI                          */
193          srlx           %g4, 16, %o4                    /* IEU0                         */
195         andcc           %o4, 0xff, %g0                  /* IEU1         Group           */
196         be,pn           %xcc, 8f                        /* CTI                          */
197          subcc          %o4, %o5, %o4                   /* IEU1         Group           */
198         bne,pn          %xcc, 8f                        /* CTI                          */
200          srlx           %o3, 8, %o5                     /* IEU0                         */
201         cmp             %o2, -2                         /* IEU1         Group           */
202         be,pn           %XCC, 4b                        /* CTI                          */
203          srlx           %g4, 8, %o4                     /* IEU0                         */
205         retl                                            /* CTI+IEU1     Group           */
206          sub            %o4, %o5, %o0                   /* IEU0                         */
207 6:      addcc           %o3, %o4, %g4                   /* IEU1                         */
208 7:      srlx            %o3, 56, %o5                    /* IEU0                         */
210         srlx            %g4, 56, %o4                    /* IEU0         Group           */
211         andcc           %o4, 0xff, %g0                  /* IEU1         Group           */
212         be,pn           %xcc, 8f                        /* CTI                          */
213          subcc          %o4, %o5, %o4                   /* IEU1         Group           */
215         bne,pn          %xcc, 8f                        /* CTI                          */
216          srlx           %o3, 48, %o5                    /* IEU0                         */
217         srlx            %g4, 48, %o4                    /* IEU0         Group           */
218         andcc           %o4, 0xff, %g0                  /* IEU1         Group           */
220         be,pn           %xcc, 8f                        /* CTI                          */
221          subcc          %o4, %o5, %o4                   /* IEU1         Group           */
222         bne,pn          %xcc, 8f                        /* CTI                          */
223          srlx           %o3, 40, %o5                    /* IEU0                         */
225         srlx            %g4, 40, %o4                    /* IEU0         Group           */
226         andcc           %o4, 0xff, %g0                  /* IEU1         Group           */
227         be,pn           %xcc, 8f                        /* CTI                          */
228          subcc          %o4, %o5, %o4                   /* IEU1         Group           */
230         bne,pn          %xcc, 8f                        /* CTI                          */
231          srlx           %o3, 32, %o5                    /* IEU0                         */
232         srlx            %g4, 32, %o4                    /* IEU0         Group           */
233         andcc           %o4, 0xff, %g0                  /* IEU1         Group           */
235         be,pn           %xcc, 8f                        /* CTI                          */
236          subcc          %o4, %o5, %o4                   /* IEU1         Group           */
237         bne,pn          %xcc, 8f                        /* CTI                          */
238          srlx           %o3, 24, %o5                    /* IEU0                         */
240         srlx            %g4, 24, %o4                    /* IEU0         Group           */
241         andcc           %o4, 0xff, %g0                  /* IEU1         Group           */
242         be,pn           %xcc, 8f                        /* CTI                          */
243          subcc          %o4, %o5, %o4                   /* IEU1         Group           */
245         bne,pn          %xcc, 8f                        /* CTI                          */
246          srlx           %o3, 16, %o5                    /* IEU0                         */
247         srlx            %g4, 16, %o4                    /* IEU0         Group           */
248         andcc           %o4, 0xff, %g0                  /* IEU1         Group           */
250         be,pn           %xcc, 8f                        /* CTI                          */
251          subcc          %o4, %o5, %o4                   /* IEU1         Group           */
252         bne,pn          %xcc, 8f                        /* CTI                          */
253          srlx           %o3, 8, %o5                     /* IEU0                         */
255         srlx            %g4, 8, %o4                     /* IEU0         Group           */
256         andcc           %o4, 0xff, %g0                  /* IEU1         Group           */
257         be,pn           %xcc, 8f                        /* CTI                          */
258          subcc          %o4, %o5, %o4                   /* IEU1         Group           */
260         retl                                            /* CTI+IEU1     Group           */
261          sub            %g4, %o3, %o0                   /* IEU0                         */
262 8:      retl                                            /* CTI+IEU1     Group           */
263          mov            %o4, %o0                        /* IEU0                         */
265 9:      ldub            [%o0], %g4                      /* Load         Group           */
266         add             %o0, 1, %o0                     /* IEU0                         */
267         ldub            [%o1], %o3                      /* Load         Group           */
268         sllx            %g1, 32, %g2                    /* IEU0                         */
270 10:     subcc           %o2, 1, %o2                     /* IEU1         Group           */
271         be,pn           %XCC, 8b                        /* CTI                          */
272          sub            %g4, %o3, %o4                   /* IEU0                         */
273         add             %o1, 1, %o1                     /* IEU0         Group           */
275         cmp             %g4, %o3                        /* IEU1                         */
276         bne,pn          %xcc, 8b                        /* CTI                          */
277          lduba          [%o0] ASI_PNF, %g4              /* Load         Group           */
278         andcc           %o3, 0xff, %g0                  /* IEU1                         */
280         be,pn           %icc, 4b                        /* CTI                          */
281          lduba          [%o1] ASI_PNF, %o3              /* Load         Group           */
282         andcc           %o0, 7, %g0                     /* IEU1                         */
283         bne,a,pn        %icc, 10b                       /* CTI                          */
285          add            %o0, 1, %o0                     /* IEU0         Group           */
286         or              %g1, %g2, %g1                   /* IEU1                         */
287         andcc           %o1, 7, %g3                     /* IEU1         Group           */
288         be,pn           %icc, 1b                        /* CTI                          */
290          ldxa           [%o0] ASI_PNF, %g4              /* Load                         */
291 11:     sllx            %g3, 3, %g5                     /* IEU0         Group           */
292         mov             64, %g6                         /* IEU1                         */
293         or              %g1, %g2, %g1                   /* IEU0         Group           */
294         sub             %o1, %g3, %o1                   /* IEU1                         */
296         sub             %g6, %g5, %g6                   /* IEU0         Group           */
297         ldxa            [%o1] ASI_PNF, %o4              /* Load                         */
298         sllx            %g1, 7, %g2                     /* IEU1                         */
299         add             %o1, 8, %o1                     /* IEU0         Group           */
300                                                         /* %g1 = 0101010101010101
301                                                            %g2 = 8080808080808080
302                                                            %g3 = %o1 alignment
303                                                            %g5 = number of bits to shift left
304                                                            %g6 = number of bits to shift right */
306 12:     sllx            %o4, %g5, %o3                   /* IEU0         Group           */
307         ldxa            [%o1] ASI_PNF, %o4              /* Load                         */
308         add             %o1, 8, %o1                     /* IEU1                         */
309 13:     ldxa            [%o0] ASI_PNF, %g4              /* Load         Group           */
311         addcc           %o0, 8, %o0                     /* IEU1                         */
312         srlx            %o4, %g6, %o5                   /* IEU0                         */
313         subcc           %o2, 8, %o2                     /* IEU1         Group           */
314         bl,pn           %XCC, 5b                        /* CTI                          */
316          or             %o3, %o5, %o3                   /* IEU0                         */
317         cmp             %g4, %o3                        /* IEU1         Group           */
318         bne,pn          %xcc, 7b                        /* CTI                          */
319          sub            %g4, %g1, %o5                   /* IEU0                         */
321 #ifdef EIGHTBIT_NOT_RARE
322         andn            %o5, %g4, %o5                   /* IEU0         Group           */
323 #endif
324         andcc           %o5, %g2, %g0                   /* IEU1         Group           */
325         be,pt           %xcc, 12b                       /* CTI                          */
326          srlx           %o5, 32, %o5                    /* IEU0                         */
327         andcc           %o5, %g2, %g0                   /* IEU1         Group           */
329         be,pt           %xcc, 14f                       /* CTI                          */
330          srlx           %g4, 56, %o5                    /* IEU0                         */
331         andcc           %o5, 0xff, %g0                  /* IEU1         Group           */
332         be,pn           %icc, 4b                        /* CTI                          */
334          srlx           %g4, 48, %o5                    /* IEU0                         */
335         andcc           %o5, 0xff, %g0                  /* IEU1         Group           */
336         be,pn           %icc, 4b                        /* CTI                          */
337          srlx           %g4, 40, %o5                    /* IEU0                         */
339         andcc           %o5, 0xff, %g0                  /* IEU1         Group           */
340         be,pn           %icc, 4b                        /* CTI                          */
341          srlx           %g4, 32, %o5                    /* IEU0                         */
342         andcc           %o5, 0xff, %g0                  /* IEU1         Group           */
344         be,pn           %icc, 4b                        /* CTI                          */
345 14:      srlx           %g4, 24, %o5                    /* IEU0                         */
346         andcc           %o5, 0xff, %g0                  /* IEU1         Group           */
347         be,pn           %icc, 4b                        /* CTI                          */
349          srlx           %g4, 16, %o5                    /* IEU0                         */
350         andcc           %o5, 0xff, %g0                  /* IEU1         Group           */
351         be,pn           %icc, 4b                        /* CTI                          */
352          srlx           %g4, 8, %o5                     /* IEU0                         */
354         andcc           %o5, 0xff, %g0                  /* IEU1         Group           */
355         be,pn           %icc, 4b                        /* CTI                          */
356          andcc          %g4, 0xff, %g0                  /* IEU1         Group           */
357         be,pn           %icc, 4b                        /* CTI                          */
359          sllx           %o4, %g5, %o3                   /* IEU0                         */
360         ldxa            [%o1] ASI_PNF, %o4              /* Load         Group           */
361         ba,pt           %xcc, 13b                       /* CTI                          */
362          add            %o1, 8, %o1                     /* IEU0                         */
363 END(strncmp)
364 libc_hidden_builtin_def (strncmp)