]> git.ipfire.org Git - thirdparty/glibc.git/blob - sysdeps/i386/i686/multiarch/strcmp-sse4.S
Update copyright dates with scripts/update-copyrights
[thirdparty/glibc.git] / sysdeps / i386 / i686 / multiarch / strcmp-sse4.S
1 /* strcmp with SSE4.2
2 Copyright (C) 2010-2021 Free Software Foundation, Inc.
3 Contributed by Intel Corporation.
4 This file is part of the GNU C Library.
5
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
10
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library; if not, see
18 <https://www.gnu.org/licenses/>. */
19
20 #if IS_IN (libc)
21
22 #include <sysdep.h>
23 #include "asm-syntax.h"
24
25 #define CFI_PUSH(REG) \
26 cfi_adjust_cfa_offset (4); \
27 cfi_rel_offset (REG, 0)
28
29 #define CFI_POP(REG) \
30 cfi_adjust_cfa_offset (-4); \
31 cfi_restore (REG)
32
33 #define PUSH(REG) pushl REG; CFI_PUSH (REG)
34 #define POP(REG) popl REG; CFI_POP (REG)
35
36 #ifdef USE_AS_STRNCMP
37 # ifndef STRCMP
38 # define STRCMP __strncmp_sse4_2
39 # endif
40 # define STR1 8
41 # define STR2 STR1+4
42 # define CNT STR2+4
43 # define RETURN POP (REM); ret; .p2align 4; CFI_PUSH (REM)
44 # define REM %ebp
45 #elif defined USE_AS_STRCASECMP_L
46 # include "locale-defines.h"
47 # ifndef STRCMP
48 # define STRCMP __strcasecmp_l_sse4_2
49 # endif
50 # ifdef PIC
51 # define STR1 12
52 # else
53 # define STR1 8
54 # endif
55 # define STR2 STR1+4
56 # define LOCALE 12 /* Loaded before the adjustment. */
57 # ifdef PIC
58 # define RETURN POP (%edi); POP (%ebx); ret; \
59 .p2align 4; CFI_PUSH (%ebx); CFI_PUSH (%edi)
60 # else
61 # define RETURN POP (%edi); ret; .p2align 4; CFI_PUSH (%edi)
62 # endif
63 # define NONASCII __strcasecmp_nonascii
64 #elif defined USE_AS_STRNCASECMP_L
65 # include "locale-defines.h"
66 # ifndef STRCMP
67 # define STRCMP __strncasecmp_l_sse4_2
68 # endif
69 # ifdef PIC
70 # define STR1 16
71 # else
72 # define STR1 12
73 # endif
74 # define STR2 STR1+4
75 # define CNT STR2+4
76 # define LOCALE 16 /* Loaded before the adjustment. */
77 # ifdef PIC
78 # define RETURN POP (%edi); POP (REM); POP (%ebx); ret; \
79 .p2align 4; \
80 CFI_PUSH (%ebx); CFI_PUSH (REM); CFI_PUSH (%edi)
81 # else
82 # define RETURN POP (%edi); POP (REM); ret; \
83 .p2align 4; CFI_PUSH (REM); CFI_PUSH (%edi)
84 # endif
85 # define REM %ebp
86 # define NONASCII __strncasecmp_nonascii
87 #else
88 # ifndef STRCMP
89 # define STRCMP __strcmp_sse4_2
90 # endif
91 # define STR1 4
92 # define STR2 STR1+4
93 # define RETURN ret; .p2align 4
94 #endif
95
96 .section .text.sse4.2,"ax",@progbits
97
98 #ifdef USE_AS_STRCASECMP_L
99 ENTRY (__strcasecmp_sse4_2)
100 # ifdef PIC
101 PUSH (%ebx)
102 LOAD_PIC_REG(bx)
103 movl __libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
104 movl %gs:(%eax), %eax
105 # else
106 movl %gs:__libc_tsd_LOCALE@NTPOFF, %eax
107 # endif
108 # if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
109 movl LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
110 # else
111 movl (%eax), %eax
112 # endif
113 testl $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
114 # ifdef PIC
115 je L(ascii)
116 POP (%ebx)
117 jmp __strcasecmp_nonascii
118 # else
119 jne __strcasecmp_nonascii
120 jmp L(ascii)
121 # endif
122 END (__strcasecmp_sse4_2)
123 #endif
124
125 #ifdef USE_AS_STRNCASECMP_L
126 ENTRY (__strncasecmp_sse4_2)
127 # ifdef PIC
128 PUSH (%ebx)
129 LOAD_PIC_REG(bx)
130 movl __libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
131 movl %gs:(%eax), %eax
132 # else
133 movl %gs:__libc_tsd_LOCALE@NTPOFF, %eax
134 # endif
135 # if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
136 movl LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
137 # else
138 movl (%eax), %eax
139 # endif
140 testl $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
141 # ifdef PIC
142 je L(ascii)
143 POP (%ebx)
144 jmp __strncasecmp_nonascii
145 # else
146 jne __strncasecmp_nonascii
147 jmp L(ascii)
148 # endif
149 END (__strncasecmp_sse4_2)
150 #endif
151
152 ENTRY (STRCMP)
153 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
154 movl LOCALE(%esp), %eax
155 # if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
156 movl LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
157 # else
158 movl (%eax), %eax
159 # endif
160 testl $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
161 jne NONASCII
162
163 # ifdef PIC
164 PUSH (%ebx)
165 LOAD_PIC_REG(bx)
166 # endif
167 L(ascii):
168 .section .rodata.cst16,"aM",@progbits,16
169 .align 16
170 .Lbelowupper:
171 .quad 0x4040404040404040
172 .quad 0x4040404040404040
173 .Ltopupper:
174 .quad 0x5b5b5b5b5b5b5b5b
175 .quad 0x5b5b5b5b5b5b5b5b
176 .Ltouppermask:
177 .quad 0x2020202020202020
178 .quad 0x2020202020202020
179 .previous
180
181 # ifdef PIC
182 # define UCLOW_reg .Lbelowupper@GOTOFF(%ebx)
183 # define UCHIGH_reg .Ltopupper@GOTOFF(%ebx)
184 # define LCQWORD_reg .Ltouppermask@GOTOFF(%ebx)
185 # else
186 # define UCLOW_reg .Lbelowupper
187 # define UCHIGH_reg .Ltopupper
188 # define LCQWORD_reg .Ltouppermask
189 # endif
190 #endif
191
192 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
193 PUSH (REM)
194 #endif
195 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
196 PUSH (%edi)
197 #endif
198 mov STR1(%esp), %edx
199 mov STR2(%esp), %eax
200 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
201 movl CNT(%esp), REM
202 test REM, REM
203 je L(eq)
204 #endif
205 mov %dx, %cx
206 and $0xfff, %cx
207 cmp $0xff0, %cx
208 ja L(first4bytes)
209 movdqu (%edx), %xmm2
210 mov %eax, %ecx
211 and $0xfff, %ecx
212 cmp $0xff0, %ecx
213 ja L(first4bytes)
214 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
215 # define TOLOWER(reg1, reg2) \
216 movdqa reg1, %xmm3; \
217 movdqa UCHIGH_reg, %xmm4; \
218 movdqa reg2, %xmm5; \
219 movdqa UCHIGH_reg, %xmm6; \
220 pcmpgtb UCLOW_reg, %xmm3; \
221 pcmpgtb reg1, %xmm4; \
222 pcmpgtb UCLOW_reg, %xmm5; \
223 pcmpgtb reg2, %xmm6; \
224 pand %xmm4, %xmm3; \
225 pand %xmm6, %xmm5; \
226 pand LCQWORD_reg, %xmm3; \
227 pand LCQWORD_reg, %xmm5; \
228 por %xmm3, reg1; \
229 por %xmm5, reg2
230
231 movdqu (%eax), %xmm1
232 TOLOWER (%xmm2, %xmm1)
233 movd %xmm2, %ecx
234 movd %xmm1, %edi
235 movdqa %xmm2, %xmm3
236 movdqa %xmm1, %xmm4
237 cmpl %edi, %ecx
238 #else
239 # define TOLOWER(reg1, reg)
240
241 movd %xmm2, %ecx
242 cmp (%eax), %ecx
243 #endif
244 jne L(less4bytes)
245 #if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
246 movdqu (%eax), %xmm1
247 #endif
248 pxor %xmm2, %xmm1
249 pxor %xmm0, %xmm0
250 ptest %xmm1, %xmm0
251 jnc L(less16bytes)
252 pcmpeqb %xmm0, %xmm2
253 ptest %xmm2, %xmm0
254 jnc L(less16bytes)
255
256 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
257 sub $16, REM
258 jbe L(eq)
259 #endif
260 add $16, %edx
261 add $16, %eax
262 L(first4bytes):
263 movzbl (%eax), %ecx
264 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
265 movzbl (%edx), %edi
266 # ifdef PIC
267 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
268 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
269 # else
270 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
271 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
272 # endif
273 cmpl %ecx, %edi
274 #else
275 cmpb %cl, (%edx)
276 #endif
277 jne L(neq)
278 cmpl $0, %ecx
279 je L(eq)
280
281 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
282 cmp $1, REM
283 je L(eq)
284 #endif
285
286 movzbl 1(%eax), %ecx
287 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
288 movzbl 1(%edx), %edi
289 # ifdef PIC
290 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
291 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
292 # else
293 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
294 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
295 # endif
296 cmpl %ecx, %edi
297 #else
298 cmpb %cl, 1(%edx)
299 #endif
300 jne L(neq)
301 cmpl $0, %ecx
302 je L(eq)
303
304 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
305 cmp $2, REM
306 je L(eq)
307 #endif
308 movzbl 2(%eax), %ecx
309 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
310 movzbl 2(%edx), %edi
311 # ifdef PIC
312 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
313 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
314 # else
315 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
316 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
317 # endif
318 cmpl %ecx, %edi
319 #else
320 cmpb %cl, 2(%edx)
321 #endif
322 jne L(neq)
323 cmpl $0, %ecx
324 je L(eq)
325
326 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
327 cmp $3, REM
328 je L(eq)
329 #endif
330 movzbl 3(%eax), %ecx
331 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
332 movzbl 3(%edx), %edi
333 # ifdef PIC
334 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
335 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
336 # else
337 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
338 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
339 # endif
340 cmpl %ecx, %edi
341 #else
342 cmpb %cl, 3(%edx)
343 #endif
344 jne L(neq)
345 cmpl $0, %ecx
346 je L(eq)
347
348 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
349 cmp $4, REM
350 je L(eq)
351 #endif
352 movzbl 4(%eax), %ecx
353 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
354 movzbl 4(%edx), %edi
355 # ifdef PIC
356 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
357 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
358 # else
359 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
360 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
361 # endif
362 cmpl %ecx, %edi
363 #else
364 cmpb %cl, 4(%edx)
365 #endif
366 jne L(neq)
367 cmpl $0, %ecx
368 je L(eq)
369
370 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
371 cmp $5, REM
372 je L(eq)
373 #endif
374 movzbl 5(%eax), %ecx
375 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
376 movzbl 5(%edx), %edi
377 # ifdef PIC
378 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
379 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
380 # else
381 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
382 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
383 # endif
384 cmpl %ecx, %edi
385 #else
386 cmpb %cl, 5(%edx)
387 #endif
388 jne L(neq)
389 cmpl $0, %ecx
390 je L(eq)
391
392 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
393 cmp $6, REM
394 je L(eq)
395 #endif
396 movzbl 6(%eax), %ecx
397 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
398 movzbl 6(%edx), %edi
399 # ifdef PIC
400 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
401 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
402 # else
403 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
404 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
405 # endif
406 cmpl %ecx, %edi
407 #else
408 cmpb %cl, 6(%edx)
409 #endif
410 jne L(neq)
411 cmpl $0, %ecx
412 je L(eq)
413
414 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
415 cmp $7, REM
416 je L(eq)
417 #endif
418 movzbl 7(%eax), %ecx
419 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
420 movzbl 7(%edx), %edi
421 # ifdef PIC
422 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
423 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
424 # else
425 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
426 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
427 # endif
428 cmpl %ecx, %edi
429 #else
430 cmpb %cl, 7(%edx)
431 #endif
432 jne L(neq)
433 cmpl $0, %ecx
434 je L(eq)
435
436 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
437 sub $8, REM
438 je L(eq)
439 #endif
440 add $8, %eax
441 add $8, %edx
442
443 #if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
444 PUSH (%edi)
445 #endif
446 PUSH (%esi)
447 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
448 cfi_remember_state
449 #endif
450 mov %edx, %edi
451 mov %eax, %esi
452 xorl %eax, %eax
453 L(check_offset):
454 movl %edi, %edx
455 movl %esi, %ecx
456 andl $0xfff, %edx
457 andl $0xfff, %ecx
458 cmpl %edx, %ecx
459 cmovl %edx, %ecx
460 lea -0xff0(%ecx), %edx
461 sub %edx, %edi
462 sub %edx, %esi
463 testl %edx, %edx
464 jg L(crosspage)
465 L(loop):
466 movdqu (%esi,%edx), %xmm2
467 movdqu (%edi,%edx), %xmm1
468 TOLOWER (%xmm2, %xmm1)
469 pcmpistri $0x1a, %xmm2, %xmm1
470 jbe L(end)
471
472 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
473 sub $16, REM
474 jbe L(more16byteseq)
475 #endif
476
477 add $16, %edx
478 jle L(loop)
479 L(crosspage):
480 movzbl (%edi,%edx), %eax
481 movzbl (%esi,%edx), %ecx
482 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
483 # ifdef PIC
484 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
485 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
486 # else
487 movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
488 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
489 # endif
490 #endif
491 subl %ecx, %eax
492 jne L(ret)
493 testl %ecx, %ecx
494 je L(ret)
495 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
496 sub $1, REM
497 jbe L(more16byteseq)
498 #endif
499 inc %edx
500 cmp $15, %edx
501 jle L(crosspage)
502 add %edx, %edi
503 add %edx, %esi
504 jmp L(check_offset)
505
506 .p2align 4
507 L(end):
508 jnc L(ret)
509 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
510 sub %ecx, REM
511 jbe L(more16byteseq)
512 #endif
513 lea (%ecx,%edx), %ecx
514 movzbl (%edi,%ecx), %eax
515 movzbl (%esi,%ecx), %ecx
516 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
517 # ifdef PIC
518 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
519 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
520 # else
521 movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
522 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
523 # endif
524 #endif
525 subl %ecx, %eax
526 L(ret):
527 POP (%esi)
528 POP (%edi)
529 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
530 POP (REM)
531 #endif
532 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
533 # ifdef PIC
534 POP (%ebx)
535 # endif
536 #endif
537 ret
538
539 .p2align 4
540 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
541 cfi_restore_state
542 L(more16byteseq):
543 POP (%esi)
544 # ifdef USE_AS_STRNCMP
545 POP (%edi)
546 # endif
547 #endif
548 L(eq):
549 xorl %eax, %eax
550 RETURN
551
552 L(neq):
553 mov $1, %eax
554 ja L(neq_bigger)
555 neg %eax
556 L(neq_bigger):
557 RETURN
558
559 L(less16bytes):
560 add $0xfefefeff, %ecx
561 jnc L(less4bytes)
562 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
563 movd %xmm3, %edi
564 xor %edi, %ecx
565 #else
566 xor (%edx), %ecx
567 #endif
568 or $0xfefefeff, %ecx
569 add $1, %ecx
570 jnz L(less4bytes)
571
572 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
573 cmp $4, REM
574 jbe L(eq)
575 #endif
576 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
577 psrldq $4, %xmm3
578 psrldq $4, %xmm4
579 movd %xmm3, %ecx
580 movd %xmm4, %edi
581 cmp %edi, %ecx
582 mov %ecx, %edi
583 #else
584 mov 4(%edx), %ecx
585 cmp 4(%eax), %ecx
586 #endif
587 jne L(more4bytes)
588 add $0xfefefeff, %ecx
589 jnc L(more4bytes)
590 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
591 xor %edi, %ecx
592 #else
593 xor 4(%edx), %ecx
594 #endif
595 or $0xfefefeff, %ecx
596 add $1, %ecx
597 jnz L(more4bytes)
598
599 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
600 sub $8, REM
601 jbe L(eq)
602 #endif
603
604 add $8, %edx
605 add $8, %eax
606 L(less4bytes):
607
608 movzbl (%eax), %ecx
609 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
610 movzbl (%edx), %edi
611 # ifdef PIC
612 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
613 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
614 # else
615 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
616 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
617 # endif
618 cmpl %ecx, %edi
619 #else
620 cmpb %cl, (%edx)
621 #endif
622 jne L(neq)
623 cmpl $0, %ecx
624 je L(eq)
625
626 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
627 cmp $1, REM
628 je L(eq)
629 #endif
630 movzbl 1(%eax), %ecx
631 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
632 movzbl 1(%edx), %edi
633 # ifdef PIC
634 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
635 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
636 # else
637 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
638 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
639 # endif
640 cmpl %ecx, %edi
641 #else
642 cmpb %cl, 1(%edx)
643 #endif
644 jne L(neq)
645 cmpl $0, %ecx
646 je L(eq)
647
648 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
649 cmp $2, REM
650 je L(eq)
651 #endif
652
653 movzbl 2(%eax), %ecx
654 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
655 movzbl 2(%edx), %edi
656 # ifdef PIC
657 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
658 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
659 # else
660 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
661 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
662 # endif
663 cmpl %ecx, %edi
664 #else
665 cmpb %cl, 2(%edx)
666 #endif
667 jne L(neq)
668 cmpl $0, %ecx
669 je L(eq)
670
671 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
672 cmp $3, REM
673 je L(eq)
674 #endif
675 movzbl 3(%eax), %ecx
676 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
677 movzbl 3(%edx), %edi
678 # ifdef PIC
679 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
680 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
681 # else
682 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
683 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
684 # endif
685 cmpl %ecx, %edi
686 #else
687 cmpb %cl, 3(%edx)
688 #endif
689 jne L(neq)
690 cmpl $0, %ecx
691 je L(eq)
692
693 L(more4bytes):
694 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
695 cmp $4, REM
696 je L(eq)
697 #endif
698 movzbl 4(%eax), %ecx
699 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
700 movzbl 4(%edx), %edi
701 # ifdef PIC
702 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
703 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
704 # else
705 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
706 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
707 # endif
708 cmpl %ecx, %edi
709 #else
710 cmpb %cl, 4(%edx)
711 #endif
712 jne L(neq)
713 cmpl $0, %ecx
714 je L(eq)
715
716
717 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
718 cmp $5, REM
719 je L(eq)
720 #endif
721 movzbl 5(%eax), %ecx
722 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
723 movzbl 5(%edx), %edi
724 # ifdef PIC
725 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
726 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
727 # else
728 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
729 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
730 # endif
731 cmpl %ecx, %edi
732 #else
733 cmpb %cl, 5(%edx)
734 #endif
735 jne L(neq)
736 cmpl $0, %ecx
737 je L(eq)
738
739 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
740 cmp $6, REM
741 je L(eq)
742 #endif
743 movzbl 6(%eax), %ecx
744 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
745 movzbl 6(%edx), %edi
746 # ifdef PIC
747 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
748 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
749 # else
750 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
751 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
752 # endif
753 cmpl %ecx, %edi
754 #else
755 cmpb %cl, 6(%edx)
756 #endif
757 jne L(neq)
758 cmpl $0, %ecx
759 je L(eq)
760
761 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
762 cmp $7, REM
763 je L(eq)
764 #endif
765 movzbl 7(%eax), %ecx
766 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
767 movzbl 7(%edx), %edi
768 # ifdef PIC
769 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
770 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
771 # else
772 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
773 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
774 # endif
775 cmpl %ecx, %edi
776 #else
777 cmpb %cl, 7(%edx)
778 #endif
779 jne L(neq)
780 jmp L(eq)
781
782 END (STRCMP)
783
784 #endif