OSDN Git Service

Replace FSF snail mail address with URLs
[uclinux-h8/uClibc.git] / libc / string / sparc / sparc64 / strcmp.S
1 /* Compare two strings for differences.
2    For SPARC v9.
3    Copyright (C) 1997, 1999, 2003 Free Software Foundation, Inc.
4    This file is part of the GNU C Library.
5    Contributed by Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz> and
6                   Jakub Jelinek <jj@ultra.linux.cz>.
7
8    The GNU C Library is free software; you can redistribute it and/or
9    modify it under the terms of the GNU Lesser General Public
10    License as published by the Free Software Foundation; either
11    version 2.1 of the License, or (at your option) any later version.
12
13    The GNU C Library is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    Lesser General Public License for more details.
17
18    You should have received a copy of the GNU Lesser General Public
19    License along with the GNU C Library; if not, see
20    <http://www.gnu.org/licenses/>.  */
21
22 #include <asm/asi.h>
23 #ifndef XCC
24         .register       %g2, #scratch
25         .register       %g3, #scratch
26         .register       %g6, #scratch
27 #endif
28
29         /* Normally, this uses
30            ((xword - 0x0101010101010101) & 0x8080808080808080) test
31            to find out if any byte in xword could be zero. This is fast, but
32            also gives false alarm for any byte in range 0x81-0xff. It does
33            not matter for correctness, as if this test tells us there could
34            be some zero byte, we check it byte by byte, but if bytes with
35            high bits set are common in the strings, then this will give poor
36            performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
37            will use one tick slower, but more precise test
38            ((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
39            which does not give any false alarms (but if some bits are set,
40            one cannot assume from it which bytes are zero and which are not).
41            It is yet to be measured, what is the correct default for glibc
42            in these days for an average user.
43          */
44
45         .text
46         .align          32
47 ENTRY(strcmp)
48         sethi           %hi(0x01010101), %g1                    /* IEU0         Group           */
49         andcc           %o0, 7, %g0                             /* IEU1                         */
50         bne,pn          %icc, 7f                                /* CTI                          */
51          or             %g1, %lo(0x01010101), %g1               /* IEU0         Group           */
52
53         andcc           %o1, 7, %g3                             /* IEU1                         */
54         bne,pn          %icc, 9f                                /* CTI                          */
55          sllx           %g1, 32, %g2                            /* IEU0         Group           */
56         ldx             [%o0], %o2                              /* Load                         */
57
58         or              %g1, %g2, %g1                           /* IEU0         Group           */
59 1:      ldx             [%o1], %o3                              /* Load                         */
60         sub             %o1, %o0, %o1                           /* IEU1                         */
61         sllx            %g1, 7, %g2                             /* IEU0         Group           */
62
63 2:      add             %o0, 8, %o0                             /* IEU1                         */
64         sub             %o2, %g1, %g3                           /* IEU0         Group           */
65         subcc           %o2, %o3, %g0                           /* IEU1                         */
66         bne,pn          %xcc, 13f                               /* CTI                          */
67
68 #ifdef EIGHTBIT_NOT_RARE
69          andn           %g3, %o2, %g4                           /* IEU0         Group           */
70         ldxa            [%o0] ASI_PNF, %o2                      /* Load                         */
71         andcc           %g4, %g2, %g0                           /* IEU1         Group           */
72 #else
73          ldxa           [%o0] ASI_PNF, %o2                      /* Load         Group           */
74         andcc           %g3, %g2, %g0                           /* IEU1                         */
75 #endif
76         be,a,pt         %xcc, 2b                                /* CTI                          */
77          ldxa           [%o1 + %o0] ASI_PNF, %o3                /* Load         Group           */
78
79         addcc           %g3, %g1, %o4                           /* IEU1                         */
80         srlx            %g3, 32, %g3                            /* IEU0                         */
81         andcc           %g3, %g2, %g0                           /* IEU1         Group           */
82         be,pt           %xcc, 3f                                /* CTI                          */
83
84          srlx           %o4, 56, %o5                            /* IEU0                         */
85         andcc           %o5, 0xff, %g0                          /* IEU1         Group           */
86         be,pn           %icc, 4f                                /* CTI                          */
87          srlx           %o4, 48, %o5                            /* IEU0                         */
88
89         andcc           %o5, 0xff, %g0                          /* IEU1         Group           */
90         be,pn           %icc, 4f                                /* CTI                          */
91          srlx           %o4, 40, %o5                            /* IEU0                         */
92         andcc           %o5, 0xff, %g0                          /* IEU1         Group           */
93
94         be,pn           %icc, 4f                                /* CTI                          */
95          srlx           %o4, 32, %o5                            /* IEU0                         */
96         andcc           %o5, 0xff, %g0                          /* IEU1         Group           */
97         be,pn           %icc, 4f                                /* CTI                          */
98
99 3:       srlx           %o4, 24, %o5                            /* IEU0                         */
100         andcc           %o5, 0xff, %g0                          /* IEU1         Group           */
101         be,pn           %icc, 4f                                /* CTI                          */
102          srlx           %o4, 16, %o5                            /* IEU0                         */
103
104         andcc           %o5, 0xff, %g0                          /* IEU1         Group           */
105         be,pn           %icc, 4f                                /* CTI                          */
106          srlx           %o4, 8, %o5                             /* IEU0                         */
107         andcc           %o5, 0xff, %g0                          /* IEU1         Group           */
108
109         be,pn           %icc, 4f                                /* CTI                          */
110          andcc          %o4, 0xff, %g0                          /* IEU1         Group           */
111         bne,a,pn        %icc, 2b                                /* CTI                          */
112          ldxa           [%o1 + %o0] ASI_PNF, %o3                /* Load                         */
113
114 4:      retl                                                    /* CTI+IEU1     Group           */
115          clr            %o0                                     /* IEU0                         */
116
117         .align          32
118 13:     mov             0xff, %g6                               /* IEU0         Group           */
119 #ifdef EIGHTBIT_NOT_RARE
120         andcc           %g4, %g2, %g0                           /* IEU1                         */
121 #else
122         andcc           %g3, %g2, %g0                           /* IEU1                         */
123 #endif
124         be,pt           %xcc, 25f                               /* CTI                          */
125          addcc          %g3, %g1, %o4                           /* IEU1         Group           */
126
127         srlx            %g3, 32, %g3                            /* IEU0                         */
128         andcc           %g3, %g2, %g0                           /* IEU1         Group           */
129         be,pt           %xcc, 23f                               /* CTI                          */
130          sllx           %g6, 56, %o5                            /* IEU0                         */
131
132         andcc           %o4, %o5, %g0                           /* IEU1         Group           */
133         be,pn           %xcc, 24f                               /* CTI                          */
134          sllx           %g6, 48, %o5                            /* IEU0                         */
135         andcc           %o4, %o5, %g0                           /* IEU1         Group           */
136
137         be,pn           %xcc, 24f                               /* CTI                          */
138          sllx           %g6, 40, %o5                            /* IEU0                         */
139         andcc           %o4, %o5, %g0                           /* IEU1         Group           */
140         be,pn           %xcc, 24f                               /* CTI                          */
141
142          sllx           %g6, 32, %o5                            /* IEU0                         */
143         andcc           %o4, %o5, %g0                           /* IEU1         Group           */
144         be,pn           %xcc, 24f                               /* CTI                          */
145 23:      sllx           %g6, 24, %o5                            /* IEU0                         */
146
147         andcc           %o4, %o5, %g0                           /* IEU1         Group           */
148         be,pn           %icc, 24f                               /* CTI                          */
149          sllx           %g6, 16, %o5                            /* IEU0                         */
150         andcc           %o4, %o5, %g0                           /* IEU1         Group           */
151
152         be,pn           %icc, 24f                               /* CTI                          */
153          sllx           %g6, 8, %o5                             /* IEU0                         */
154         andcc           %o4, %o5, %g0                           /* IEU1         Group           */
155         be,pn           %icc, 24f                               /* CTI                          */
156
157          mov            %g6, %o5                                /* IEU0                         */
158 25:     cmp             %o4, %o3                                /* IEU1         Group           */
159 5:      mov             -1, %o0                                 /* IEU0                         */
160         retl                                                    /* CTI+IEU1     Group           */
161
162          movgu          %xcc, 1, %o0                            /* Single       Group           */
163
164         .align          16
165 24:     sub             %o5, 1, %g6                             /* IEU0         Group           */
166         clr             %o0                                     /* IEU1                         */
167         or              %o5, %g6, %o5                           /* IEU0         Group           */
168         andn            %o4, %o5, %o4                           /* IEU0         Group           */
169
170         andn            %o3, %o5, %o3                           /* IEU1                         */
171         cmp             %o4, %o3                                /* IEU1         Group           */
172         movgu           %xcc, 1, %o0                            /* Single       Group           */
173         retl                                                    /* CTI+IEU1     Group           */
174
175          movlu          %xcc, -1, %o0                           /* Single       Group           */
176 6:      retl                                                    /* CTI+IEU1     Group           */
177          mov            %o4, %o0                                /* IEU0                         */
178
179         .align          16
180 7:      ldub            [%o0], %o2                              /* Load                         */
181         add             %o0, 1, %o0                             /* IEU1                         */
182         ldub            [%o1], %o3                              /* Load         Group           */
183         sllx            %g1, 32, %g2                            /* IEU0                         */
184
185 8:      add             %o1, 1, %o1                             /* IEU1                         */
186         subcc           %o2, %o3, %o4                           /* IEU1         Group           */
187         bne,pn          %xcc, 6b                                /* CTI                          */
188          lduba          [%o0] ASI_PNF, %o2                      /* Load                         */
189
190         brz,pn          %o3, 4b                                 /* CTI+IEU1     Group           */
191          lduba          [%o1] ASI_PNF, %o3                      /* Load                         */
192         andcc           %o0, 7, %g0                             /* IEU1         Group           */
193         bne,a,pn        %icc, 8b                                /* CTI                          */
194
195          add            %o0, 1, %o0                             /* IEU0                         */
196         or              %g1, %g2, %g1                           /* IEU0         Group           */
197         andcc           %o1, 7, %g3                             /* IEU1                         */
198         be,a,pn         %icc, 1b                                /* CTI                          */
199
200          ldxa           [%o0] ASI_PNF, %o2                      /* Load         Group           */
201 9:      sllx            %g3, 3, %g5                             /* IEU0                         */
202         mov             64, %o5                                 /* IEU1                         */
203         sub             %o1, %g3, %o1                           /* IEU0         Group           */
204
205         sub             %o5, %g5, %o5                           /* IEU1                         */
206         ldxa            [%o1] ASI_PNF, %g6                      /* Load         Group           */
207         or              %g1, %g2, %g1                           /* IEU0                         */
208         sub             %o1, %o0, %o1                           /* IEU1                         */
209
210         sllx            %g1, 7, %g2                             /* IEU0         Group           */
211         add             %o1, 8, %o1                             /* IEU1                         */
212                                                                 /* %g1 = 0101010101010101
213                                                                  * %g2 = 8080808080800880
214                                                                  * %g5 = number of bits to shift left
215                                                                  * %o5 = number of bits to shift right */
216 10:     sllx            %g6, %g5, %o3                           /* IEU0         Group           */
217         ldxa            [%o1 + %o0] ASI_PNF, %g6                /* Load                         */
218
219 11:     srlx            %g6, %o5, %o4                           /* IEU0         Group           */
220         ldxa            [%o0] ASI_PNF, %o2                      /* Load                         */
221         or              %o3, %o4, %o3                           /* IEU1                         */
222         add             %o0, 8, %o0                             /* IEU0         Group           */
223
224         subcc           %o2, %o3, %g0                           /* IEU1                         */
225 #ifdef EIGHTBIT_NOT_RARE
226         sub             %o2, %g1, %g3                           /* IEU0         Group           */
227         bne,pn          %xcc, 13b                               /* CTI                          */
228          andn           %g3, %o2, %g4                           /* IEU0         Group           */
229
230         andcc           %g4, %g2, %g0                           /* IEU1         Group           */
231         be,pt           %xcc, 10b                               /* CTI                          */
232          srlx           %g4, 32, %g4                            /* IEU0                         */
233         andcc           %g4, %g2, %g0                           /* IEU1         Group           */
234 #else
235         bne,pn          %xcc, 13b                               /* CTI                          */
236          sub            %o2, %g1, %g3                           /* IEU0         Group           */
237         andcc           %g3, %g2, %g0                           /* IEU1         Group           */
238
239         be,pt           %xcc, 10b                               /* CTI                          */
240          srlx           %g3, 32, %g3                            /* IEU0                         */
241         andcc           %g3, %g2, %g0                           /* IEU1         Group           */
242 #endif
243         be,pt           %xcc, 12f                               /* CTI                          */
244
245          srlx           %o2, 56, %g3                            /* IEU0                         */
246         andcc           %g3, 0xff, %g0                          /* IEU1         Group           */
247         be,pn           %icc, 4b                                /* CTI                          */
248          srlx           %o2, 48, %g3                            /* IEU0                         */
249
250         andcc           %g3, 0xff, %g0                          /* IEU1         Group           */
251         be,pn           %icc, 4b                                /* CTI                          */
252          srlx           %o2, 40, %g3                            /* IEU0                         */
253         andcc           %g3, 0xff, %g0                          /* IEU1         Group           */
254
255         be,pn           %icc, 4b                                /* CTI                          */
256          srlx           %o2, 32, %g3                            /* IEU0                         */
257         andcc           %g3, 0xff, %g0                          /* IEU1         Group           */
258         be,pn           %icc, 4b                                /* CTI                          */
259
260 12:      srlx           %o2, 24, %g3                            /* IEU0                         */
261         andcc           %g3, 0xff, %g0                          /* IEU1         Group           */
262         be,pn           %icc, 4b                                /* CTI                          */
263          srlx           %o2, 16, %g3                            /* IEU0                         */
264
265         andcc           %g3, 0xff, %g0                          /* IEU1         Group           */
266         be,pn           %icc, 4b                                /* CTI                          */
267          srlx           %o2, 8, %g3                             /* IEU0                         */
268         andcc           %g3, 0xff, %g0                          /* IEU1         Group           */
269
270         be,pn           %icc, 4b                                /* CTI                          */
271          andcc          %o2, 0xff, %g0                          /* IEU1         Group           */
272         be,pn           %icc, 4b                                /* CTI                          */
273          sllx           %g6, %g5, %o3                           /* IEU0                         */
274
275         ba,pt           %xcc, 11b                               /* CTI          Group           */
276          ldxa           [%o1 + %o0] ASI_PNF, %g6                /* Load                         */
277 END(strcmp)
278 libc_hidden_def(strcmp)