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.
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
30 .register %g2, #scratch
31 .register %g3, #scratch
32 .register %g6, #scratch
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.
55 brz,pn %o2, 4f /* CTI+IEU1 Group */
57 tst %o2 /* IEU1 Group */
58 be,pn %XCC, 4f /* CTI */
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 */
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 */
91 andcc %g3, %g2, %g0 /* IEU1 */
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 */
101 srlx %g3, 32, %g3 /* IEU0 */
102 andcc %g3, %g2, %g0 /* IEU1 Group */
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 */
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 */
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
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 */
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 */
364 libc_hidden_builtin_def (strncmp)