]> git.ipfire.org Git - thirdparty/glibc.git/blob - sysdeps/i386/i686/multiarch/strcmp-ssse3.S
6480b68502211f8a6284a3a1572ff7c8b68968f8
[thirdparty/glibc.git] / sysdeps / i386 / i686 / multiarch / strcmp-ssse3.S
1 /* strcmp with SSSE3
2 Copyright (C) 2010-2019 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 <http://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_ssse3
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 UPDATE_STRNCMP_COUNTER \
45 /* calculate left number to compare */ \
46 mov $16, %esi; \
47 sub %ecx, %esi; \
48 cmp %esi, REM; \
49 jbe L(more8byteseq); \
50 sub %esi, REM
51 # define FLAGS %ebx
52 # define REM %ebp
53 #elif defined USE_AS_STRCASECMP_L
54 # include "locale-defines.h"
55 # ifndef STRCMP
56 # define STRCMP __strcasecmp_l_ssse3
57 # endif
58 # ifdef PIC
59 # define STR1 8
60 # else
61 # define STR1 4
62 # endif
63 # define STR2 STR1+4
64 # define LOCALE 12 /* Loaded before the adjustment. */
65 # ifdef PIC
66 # define RETURN POP (%ebx); ret; .p2align 4; CFI_PUSH (%ebx)
67 # else
68 # define RETURN ret; .p2align 4
69 # endif
70 # define UPDATE_STRNCMP_COUNTER
71 # define FLAGS (%esp)
72 # define NONASCII __strcasecmp_nonascii
73 #elif defined USE_AS_STRNCASECMP_L
74 # include "locale-defines.h"
75 # ifndef STRCMP
76 # define STRCMP __strncasecmp_l_ssse3
77 # endif
78 # ifdef PIC
79 # define STR1 12
80 # else
81 # define STR1 8
82 # endif
83 # define STR2 STR1+4
84 # define CNT STR2+4
85 # define LOCALE 16 /* Loaded before the adjustment. */
86 # ifdef PIC
87 # define RETURN POP (REM); POP (%ebx); ret; \
88 .p2align 4; CFI_PUSH (%ebx); CFI_PUSH (REM)
89 # else
90 # define RETURN POP (REM); ret; .p2align 4; CFI_PUSH (REM)
91 # endif
92 # define UPDATE_STRNCMP_COUNTER \
93 /* calculate left number to compare */ \
94 mov $16, %esi; \
95 sub %ecx, %esi; \
96 cmp %esi, REM; \
97 jbe L(more8byteseq); \
98 sub %esi, REM
99 # define FLAGS (%esp)
100 # define REM %ebp
101 # define NONASCII __strncasecmp_nonascii
102 #else
103 # ifndef STRCMP
104 # define STRCMP __strcmp_ssse3
105 # endif
106 # define STR1 4
107 # define STR2 STR1+4
108 # define RETURN ret; .p2align 4
109 # define UPDATE_STRNCMP_COUNTER
110 # define FLAGS %ebx
111 #endif
112
113 .section .text.ssse3,"ax",@progbits
114
115 #ifdef USE_AS_STRCASECMP_L
116 ENTRY (__strcasecmp_ssse3)
117 # ifdef PIC
118 PUSH (%ebx)
119 LOAD_PIC_REG(bx)
120 movl __libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
121 # ifdef NO_TLS_DIRECT_SEG_REFS
122 addl %gs:0, %eax
123 movl (%eax), %eax
124 # else
125 movl %gs:(%eax), %eax
126 # endif
127 # else
128 # ifdef NO_TLS_DIRECT_SEG_REFS
129 movl %gs:0, %eax
130 movl __libc_tsd_LOCALE@NTPOFF(%eax), %eax
131 # else
132 movl %gs:__libc_tsd_LOCALE@NTPOFF, %eax
133 # endif
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 __strcasecmp_nonascii
145 # else
146 jne __strcasecmp_nonascii
147 jmp L(ascii)
148 # endif
149 END (__strcasecmp_ssse3)
150 #endif
151
152 #ifdef USE_AS_STRNCASECMP_L
153 ENTRY (__strncasecmp_ssse3)
154 # ifdef PIC
155 PUSH (%ebx)
156 LOAD_PIC_REG(bx)
157 movl __libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
158 # ifdef NO_TLS_DIRECT_SEG_REFS
159 addl %gs:0, %eax
160 movl (%eax), %eax
161 # else
162 movl %gs:(%eax), %eax
163 # endif
164 # else
165 # ifdef NO_TLS_DIRECT_SEG_REFS
166 movl %gs:0, %eax
167 movl __libc_tsd_LOCALE@NTPOFF(%eax), %eax
168 # else
169 movl %gs:__libc_tsd_LOCALE@NTPOFF, %eax
170 # endif
171 # endif
172 # if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
173 movl LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
174 # else
175 movl (%eax), %eax
176 # endif
177 testl $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
178 # ifdef PIC
179 je L(ascii)
180 POP (%ebx)
181 jmp __strncasecmp_nonascii
182 # else
183 jne __strncasecmp_nonascii
184 jmp L(ascii)
185 # endif
186 END (__strncasecmp_ssse3)
187 #endif
188
189 ENTRY (STRCMP)
190 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
191 movl LOCALE(%esp), %eax
192 # if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
193 movl LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
194 # else
195 movl (%eax), %eax
196 # endif
197 testl $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
198 jne NONASCII
199
200 # ifdef PIC
201 PUSH (%ebx)
202 LOAD_PIC_REG(bx)
203 # endif
204 L(ascii):
205 .section .rodata.cst16,"aM",@progbits,16
206 .align 16
207 .Lbelowupper:
208 .quad 0x4040404040404040
209 .quad 0x4040404040404040
210 .Ltopupper:
211 .quad 0x5b5b5b5b5b5b5b5b
212 .quad 0x5b5b5b5b5b5b5b5b
213 .Ltouppermask:
214 .quad 0x2020202020202020
215 .quad 0x2020202020202020
216 .previous
217
218 # ifdef PIC
219 # define UCLOW_reg .Lbelowupper@GOTOFF(%ebx)
220 # define UCHIGH_reg .Ltopupper@GOTOFF(%ebx)
221 # define LCQWORD_reg .Ltouppermask@GOTOFF(%ebx)
222 # else
223 # define UCLOW_reg .Lbelowupper
224 # define UCHIGH_reg .Ltopupper
225 # define LCQWORD_reg .Ltouppermask
226 # endif
227 #endif
228
229 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
230 PUSH (REM)
231 #endif
232
233 movl STR1(%esp), %edx
234 movl STR2(%esp), %eax
235 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
236 movl CNT(%esp), REM
237 cmp $16, REM
238 jb L(less16bytes_sncmp)
239 #elif !defined USE_AS_STRCASECMP_L
240 movzbl (%eax), %ecx
241 cmpb %cl, (%edx)
242 jne L(neq)
243 cmpl $0, %ecx
244 je L(eq)
245
246 movzbl 1(%eax), %ecx
247 cmpb %cl, 1(%edx)
248 jne L(neq)
249 cmpl $0, %ecx
250 je L(eq)
251
252 movzbl 2(%eax), %ecx
253 cmpb %cl, 2(%edx)
254 jne L(neq)
255 cmpl $0, %ecx
256 je L(eq)
257
258 movzbl 3(%eax), %ecx
259 cmpb %cl, 3(%edx)
260 jne L(neq)
261 cmpl $0, %ecx
262 je L(eq)
263
264 movzbl 4(%eax), %ecx
265 cmpb %cl, 4(%edx)
266 jne L(neq)
267 cmpl $0, %ecx
268 je L(eq)
269
270 movzbl 5(%eax), %ecx
271 cmpb %cl, 5(%edx)
272 jne L(neq)
273 cmpl $0, %ecx
274 je L(eq)
275
276 movzbl 6(%eax), %ecx
277 cmpb %cl, 6(%edx)
278 jne L(neq)
279 cmpl $0, %ecx
280 je L(eq)
281
282 movzbl 7(%eax), %ecx
283 cmpb %cl, 7(%edx)
284 jne L(neq)
285 cmpl $0, %ecx
286 je L(eq)
287
288 add $8, %edx
289 add $8, %eax
290 #endif
291 movl %edx, %ecx
292 and $0xfff, %ecx
293 cmp $0xff0, %ecx
294 ja L(crosspage)
295 mov %eax, %ecx
296 and $0xfff, %ecx
297 cmp $0xff0, %ecx
298 ja L(crosspage)
299 pxor %xmm0, %xmm0
300 movlpd (%eax), %xmm1
301 movlpd (%edx), %xmm2
302 movhpd 8(%eax), %xmm1
303 movhpd 8(%edx), %xmm2
304 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
305 # define TOLOWER(reg1, reg2) \
306 movdqa reg1, %xmm5; \
307 movdqa reg2, %xmm7; \
308 movdqa UCHIGH_reg, %xmm6; \
309 pcmpgtb UCLOW_reg, %xmm5; \
310 pcmpgtb UCLOW_reg, %xmm7; \
311 pcmpgtb reg1, %xmm6; \
312 pand %xmm6, %xmm5; \
313 movdqa UCHIGH_reg, %xmm6; \
314 pcmpgtb reg2, %xmm6; \
315 pand %xmm6, %xmm7; \
316 pand LCQWORD_reg, %xmm5; \
317 por %xmm5, reg1; \
318 pand LCQWORD_reg, %xmm7; \
319 por %xmm7, reg2
320 TOLOWER (%xmm1, %xmm2)
321 #else
322 # define TOLOWER(reg1, reg2)
323 #endif
324 pcmpeqb %xmm1, %xmm0
325 pcmpeqb %xmm2, %xmm1
326 psubb %xmm0, %xmm1
327 pmovmskb %xmm1, %ecx
328 sub $0xffff, %ecx
329 jnz L(less16bytes)
330 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
331 cmp $16, REM
332 lea -16(REM), REM
333 jbe L(eq)
334 #endif
335 add $16, %eax
336 add $16, %edx
337
338 L(crosspage):
339
340 #if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
341 PUSH (FLAGS)
342 #endif
343 PUSH (%edi)
344 PUSH (%esi)
345 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
346 pushl $0
347 cfi_adjust_cfa_offset (4)
348 #endif
349 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
350 cfi_remember_state
351 #endif
352
353 movl %edx, %edi
354 movl %eax, %ecx
355 and $0xf, %ecx
356 and $0xf, %edi
357 xor %ecx, %eax
358 xor %edi, %edx
359 #if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
360 xor FLAGS, FLAGS
361 #endif
362 cmp %edi, %ecx
363 je L(ashr_0)
364 ja L(bigger)
365 orl $0x20, FLAGS
366 xchg %edx, %eax
367 xchg %ecx, %edi
368 L(bigger):
369 lea 15(%edi), %edi
370 sub %ecx, %edi
371 cmp $8, %edi
372 jle L(ashr_less_8)
373 cmp $14, %edi
374 je L(ashr_15)
375 cmp $13, %edi
376 je L(ashr_14)
377 cmp $12, %edi
378 je L(ashr_13)
379 cmp $11, %edi
380 je L(ashr_12)
381 cmp $10, %edi
382 je L(ashr_11)
383 cmp $9, %edi
384 je L(ashr_10)
385 L(ashr_less_8):
386 je L(ashr_9)
387 cmp $7, %edi
388 je L(ashr_8)
389 cmp $6, %edi
390 je L(ashr_7)
391 cmp $5, %edi
392 je L(ashr_6)
393 cmp $4, %edi
394 je L(ashr_5)
395 cmp $3, %edi
396 je L(ashr_4)
397 cmp $2, %edi
398 je L(ashr_3)
399 cmp $1, %edi
400 je L(ashr_2)
401 cmp $0, %edi
402 je L(ashr_1)
403
404 /*
405 * The following cases will be handled by ashr_0
406 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
407 * n(0~15) n(0~15) 15(15+ n-n) ashr_0
408 */
409 .p2align 4
410 L(ashr_0):
411 mov $0xffff, %esi
412 movdqa (%eax), %xmm1
413 pxor %xmm0, %xmm0
414 pcmpeqb %xmm1, %xmm0
415 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
416 movdqa (%edx), %xmm2
417 TOLOWER (%xmm1, %xmm2)
418 pcmpeqb %xmm2, %xmm1
419 #else
420 pcmpeqb (%edx), %xmm1
421 #endif
422 psubb %xmm0, %xmm1
423 pmovmskb %xmm1, %edi
424 shr %cl, %esi
425 shr %cl, %edi
426 sub %edi, %esi
427 mov %ecx, %edi
428 jne L(less32bytes)
429 UPDATE_STRNCMP_COUNTER
430 movl $0x10, FLAGS
431 mov $0x10, %ecx
432 pxor %xmm0, %xmm0
433 .p2align 4
434 L(loop_ashr_0):
435 movdqa (%eax, %ecx), %xmm1
436 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
437 movdqa (%edx, %ecx), %xmm2
438 TOLOWER (%xmm1, %xmm2)
439
440 pcmpeqb %xmm1, %xmm0
441 pcmpeqb %xmm2, %xmm1
442 #else
443 pcmpeqb %xmm1, %xmm0
444 pcmpeqb (%edx, %ecx), %xmm1
445 #endif
446 psubb %xmm0, %xmm1
447 pmovmskb %xmm1, %esi
448 sub $0xffff, %esi
449 jnz L(exit)
450 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
451 cmp $16, REM
452 lea -16(REM), REM
453 jbe L(more8byteseq)
454 #endif
455 add $16, %ecx
456 jmp L(loop_ashr_0)
457
458 /*
459 * The following cases will be handled by ashr_1
460 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
461 * n(15) n -15 0(15 +(n-15) - n) ashr_1
462 */
463 .p2align 4
464 L(ashr_1):
465 mov $0xffff, %esi
466 pxor %xmm0, %xmm0
467 movdqa (%edx), %xmm2
468 movdqa (%eax), %xmm1
469 pcmpeqb %xmm1, %xmm0
470 pslldq $15, %xmm2
471 TOLOWER (%xmm1, %xmm2)
472 pcmpeqb %xmm1, %xmm2
473 psubb %xmm0, %xmm2
474 pmovmskb %xmm2, %edi
475 shr %cl, %esi
476 shr %cl, %edi
477 sub %edi, %esi
478 lea -15(%ecx), %edi
479 jnz L(less32bytes)
480
481 UPDATE_STRNCMP_COUNTER
482
483 movdqa (%edx), %xmm3
484 pxor %xmm0, %xmm0
485 mov $16, %ecx
486 orl $1, FLAGS
487 lea 1(%edx), %edi
488 and $0xfff, %edi
489 sub $0x1000, %edi
490
491 .p2align 4
492 L(loop_ashr_1):
493 add $16, %edi
494 jg L(nibble_ashr_1)
495
496 L(gobble_ashr_1):
497 movdqa (%eax, %ecx), %xmm1
498 movdqa (%edx, %ecx), %xmm2
499 movdqa %xmm2, %xmm4
500
501 palignr $1, %xmm3, %xmm2
502 TOLOWER (%xmm1, %xmm2)
503
504 pcmpeqb %xmm1, %xmm0
505 pcmpeqb %xmm2, %xmm1
506 psubb %xmm0, %xmm1
507 pmovmskb %xmm1, %esi
508 sub $0xffff, %esi
509 jnz L(exit)
510 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
511 cmp $16, REM
512 lea -16(REM), REM
513 jbe L(more8byteseq)
514 #endif
515
516 add $16, %ecx
517 movdqa %xmm4, %xmm3
518
519 add $16, %edi
520 jg L(nibble_ashr_1)
521
522 movdqa (%eax, %ecx), %xmm1
523 movdqa (%edx, %ecx), %xmm2
524 movdqa %xmm2, %xmm4
525
526 palignr $1, %xmm3, %xmm2
527 TOLOWER (%xmm1, %xmm2)
528
529 pcmpeqb %xmm1, %xmm0
530 pcmpeqb %xmm2, %xmm1
531 psubb %xmm0, %xmm1
532 pmovmskb %xmm1, %esi
533 sub $0xffff, %esi
534 jnz L(exit)
535
536 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
537 cmp $16, REM
538 lea -16(REM), REM
539 jbe L(more8byteseq)
540 #endif
541 add $16, %ecx
542 movdqa %xmm4, %xmm3
543 jmp L(loop_ashr_1)
544
545 .p2align 4
546 L(nibble_ashr_1):
547 pcmpeqb %xmm3, %xmm0
548 pmovmskb %xmm0, %esi
549 test $0xfffe, %esi
550 jnz L(ashr_1_exittail)
551
552 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
553 cmp $15, REM
554 jbe L(ashr_1_exittail)
555 #endif
556 pxor %xmm0, %xmm0
557 sub $0x1000, %edi
558 jmp L(gobble_ashr_1)
559
560 .p2align 4
561 L(ashr_1_exittail):
562 movdqa (%eax, %ecx), %xmm1
563 psrldq $1, %xmm0
564 psrldq $1, %xmm3
565 jmp L(aftertail)
566
567 /*
568 * The following cases will be handled by ashr_2
569 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
570 * n(14~15) n -14 1(15 +(n-14) - n) ashr_2
571 */
572 .p2align 4
573 L(ashr_2):
574 mov $0xffff, %esi
575 pxor %xmm0, %xmm0
576 movdqa (%edx), %xmm2
577 movdqa (%eax), %xmm1
578 pcmpeqb %xmm1, %xmm0
579 pslldq $14, %xmm2
580 TOLOWER (%xmm1, %xmm2)
581 pcmpeqb %xmm1, %xmm2
582 psubb %xmm0, %xmm2
583 pmovmskb %xmm2, %edi
584 shr %cl, %esi
585 shr %cl, %edi
586 sub %edi, %esi
587 lea -14(%ecx), %edi
588 jnz L(less32bytes)
589
590 UPDATE_STRNCMP_COUNTER
591
592 movdqa (%edx), %xmm3
593 pxor %xmm0, %xmm0
594 mov $16, %ecx
595 orl $2, FLAGS
596 lea 2(%edx), %edi
597 and $0xfff, %edi
598 sub $0x1000, %edi
599
600 .p2align 4
601 L(loop_ashr_2):
602 add $16, %edi
603 jg L(nibble_ashr_2)
604
605 L(gobble_ashr_2):
606 movdqa (%eax, %ecx), %xmm1
607 movdqa (%edx, %ecx), %xmm2
608 movdqa %xmm2, %xmm4
609
610 palignr $2, %xmm3, %xmm2
611 TOLOWER (%xmm1, %xmm2)
612
613 pcmpeqb %xmm1, %xmm0
614 pcmpeqb %xmm2, %xmm1
615 psubb %xmm0, %xmm1
616 pmovmskb %xmm1, %esi
617 sub $0xffff, %esi
618 jnz L(exit)
619
620 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
621 cmp $16, REM
622 lea -16(REM), REM
623 jbe L(more8byteseq)
624 #endif
625 add $16, %ecx
626 movdqa %xmm4, %xmm3
627
628 add $16, %edi
629 jg L(nibble_ashr_2)
630
631 movdqa (%eax, %ecx), %xmm1
632 movdqa (%edx, %ecx), %xmm2
633 movdqa %xmm2, %xmm4
634
635 palignr $2, %xmm3, %xmm2
636 TOLOWER (%xmm1, %xmm2)
637
638 pcmpeqb %xmm1, %xmm0
639 pcmpeqb %xmm2, %xmm1
640 psubb %xmm0, %xmm1
641 pmovmskb %xmm1, %esi
642 sub $0xffff, %esi
643 jnz L(exit)
644
645 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
646 cmp $16, REM
647 lea -16(REM), REM
648 jbe L(more8byteseq)
649 #endif
650 add $16, %ecx
651 movdqa %xmm4, %xmm3
652 jmp L(loop_ashr_2)
653
654 .p2align 4
655 L(nibble_ashr_2):
656 pcmpeqb %xmm3, %xmm0
657 pmovmskb %xmm0, %esi
658 test $0xfffc, %esi
659 jnz L(ashr_2_exittail)
660
661 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
662 cmp $14, REM
663 jbe L(ashr_2_exittail)
664 #endif
665
666 pxor %xmm0, %xmm0
667 sub $0x1000, %edi
668 jmp L(gobble_ashr_2)
669
670 .p2align 4
671 L(ashr_2_exittail):
672 movdqa (%eax, %ecx), %xmm1
673 psrldq $2, %xmm0
674 psrldq $2, %xmm3
675 jmp L(aftertail)
676
677 /*
678 * The following cases will be handled by ashr_3
679 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
680 * n(13~15) n -13 2(15 +(n-13) - n) ashr_3
681 */
682 .p2align 4
683 L(ashr_3):
684 mov $0xffff, %esi
685 pxor %xmm0, %xmm0
686 movdqa (%edx), %xmm2
687 movdqa (%eax), %xmm1
688 pcmpeqb %xmm1, %xmm0
689 pslldq $13, %xmm2
690 TOLOWER (%xmm1, %xmm2)
691 pcmpeqb %xmm1, %xmm2
692 psubb %xmm0, %xmm2
693 pmovmskb %xmm2, %edi
694 shr %cl, %esi
695 shr %cl, %edi
696 sub %edi, %esi
697 lea -13(%ecx), %edi
698 jnz L(less32bytes)
699
700 UPDATE_STRNCMP_COUNTER
701
702 movdqa (%edx), %xmm3
703 pxor %xmm0, %xmm0
704 mov $16, %ecx
705 orl $3, FLAGS
706 lea 3(%edx), %edi
707 and $0xfff, %edi
708 sub $0x1000, %edi
709
710 .p2align 4
711 L(loop_ashr_3):
712 add $16, %edi
713 jg L(nibble_ashr_3)
714
715 L(gobble_ashr_3):
716 movdqa (%eax, %ecx), %xmm1
717 movdqa (%edx, %ecx), %xmm2
718 movdqa %xmm2, %xmm4
719
720 palignr $3, %xmm3, %xmm2
721 TOLOWER (%xmm1, %xmm2)
722
723 pcmpeqb %xmm1, %xmm0
724 pcmpeqb %xmm2, %xmm1
725 psubb %xmm0, %xmm1
726 pmovmskb %xmm1, %esi
727 sub $0xffff, %esi
728 jnz L(exit)
729
730 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
731 cmp $16, REM
732 lea -16(REM), REM
733 jbe L(more8byteseq)
734 #endif
735 add $16, %ecx
736 movdqa %xmm4, %xmm3
737
738 add $16, %edi
739 jg L(nibble_ashr_3)
740
741 movdqa (%eax, %ecx), %xmm1
742 movdqa (%edx, %ecx), %xmm2
743 movdqa %xmm2, %xmm4
744
745 palignr $3, %xmm3, %xmm2
746 TOLOWER (%xmm1, %xmm2)
747
748 pcmpeqb %xmm1, %xmm0
749 pcmpeqb %xmm2, %xmm1
750 psubb %xmm0, %xmm1
751 pmovmskb %xmm1, %esi
752 sub $0xffff, %esi
753 jnz L(exit)
754
755 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
756 cmp $16, REM
757 lea -16(REM), REM
758 jbe L(more8byteseq)
759 #endif
760 add $16, %ecx
761 movdqa %xmm4, %xmm3
762 jmp L(loop_ashr_3)
763
764 .p2align 4
765 L(nibble_ashr_3):
766 pcmpeqb %xmm3, %xmm0
767 pmovmskb %xmm0, %esi
768 test $0xfff8, %esi
769 jnz L(ashr_3_exittail)
770
771 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
772 cmp $13, REM
773 jbe L(ashr_3_exittail)
774 #endif
775 pxor %xmm0, %xmm0
776 sub $0x1000, %edi
777 jmp L(gobble_ashr_3)
778
779 .p2align 4
780 L(ashr_3_exittail):
781 movdqa (%eax, %ecx), %xmm1
782 psrldq $3, %xmm0
783 psrldq $3, %xmm3
784 jmp L(aftertail)
785
786 /*
787 * The following cases will be handled by ashr_4
788 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
789 * n(12~15) n -12 3(15 +(n-12) - n) ashr_4
790 */
791 .p2align 4
792 L(ashr_4):
793 mov $0xffff, %esi
794 pxor %xmm0, %xmm0
795 movdqa (%edx), %xmm2
796 movdqa (%eax), %xmm1
797 pcmpeqb %xmm1, %xmm0
798 pslldq $12, %xmm2
799 TOLOWER (%xmm1, %xmm2)
800 pcmpeqb %xmm1, %xmm2
801 psubb %xmm0, %xmm2
802 pmovmskb %xmm2, %edi
803 shr %cl, %esi
804 shr %cl, %edi
805 sub %edi, %esi
806 lea -12(%ecx), %edi
807 jnz L(less32bytes)
808
809 UPDATE_STRNCMP_COUNTER
810
811 movdqa (%edx), %xmm3
812 pxor %xmm0, %xmm0
813 mov $16, %ecx
814 orl $4, FLAGS
815 lea 4(%edx), %edi
816 and $0xfff, %edi
817 sub $0x1000, %edi
818
819 .p2align 4
820 L(loop_ashr_4):
821 add $16, %edi
822 jg L(nibble_ashr_4)
823
824 L(gobble_ashr_4):
825 movdqa (%eax, %ecx), %xmm1
826 movdqa (%edx, %ecx), %xmm2
827 movdqa %xmm2, %xmm4
828
829 palignr $4, %xmm3, %xmm2
830 TOLOWER (%xmm1, %xmm2)
831
832 pcmpeqb %xmm1, %xmm0
833 pcmpeqb %xmm2, %xmm1
834 psubb %xmm0, %xmm1
835 pmovmskb %xmm1, %esi
836 sub $0xffff, %esi
837 jnz L(exit)
838
839 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
840 cmp $16, REM
841 lea -16(REM), REM
842 jbe L(more8byteseq)
843 #endif
844
845 add $16, %ecx
846 movdqa %xmm4, %xmm3
847
848 add $16, %edi
849 jg L(nibble_ashr_4)
850
851 movdqa (%eax, %ecx), %xmm1
852 movdqa (%edx, %ecx), %xmm2
853 movdqa %xmm2, %xmm4
854
855 palignr $4, %xmm3, %xmm2
856 TOLOWER (%xmm1, %xmm2)
857
858 pcmpeqb %xmm1, %xmm0
859 pcmpeqb %xmm2, %xmm1
860 psubb %xmm0, %xmm1
861 pmovmskb %xmm1, %esi
862 sub $0xffff, %esi
863 jnz L(exit)
864
865 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
866 cmp $16, REM
867 lea -16(REM), REM
868 jbe L(more8byteseq)
869 #endif
870
871 add $16, %ecx
872 movdqa %xmm4, %xmm3
873 jmp L(loop_ashr_4)
874
875 .p2align 4
876 L(nibble_ashr_4):
877 pcmpeqb %xmm3, %xmm0
878 pmovmskb %xmm0, %esi
879 test $0xfff0, %esi
880 jnz L(ashr_4_exittail)
881
882 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
883 cmp $12, REM
884 jbe L(ashr_4_exittail)
885 #endif
886
887 pxor %xmm0, %xmm0
888 sub $0x1000, %edi
889 jmp L(gobble_ashr_4)
890
891 .p2align 4
892 L(ashr_4_exittail):
893 movdqa (%eax, %ecx), %xmm1
894 psrldq $4, %xmm0
895 psrldq $4, %xmm3
896 jmp L(aftertail)
897
898 /*
899 * The following cases will be handled by ashr_5
900 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
901 * n(11~15) n -11 4(15 +(n-11) - n) ashr_5
902 */
903 .p2align 4
904 L(ashr_5):
905 mov $0xffff, %esi
906 pxor %xmm0, %xmm0
907 movdqa (%edx), %xmm2
908 movdqa (%eax), %xmm1
909 pcmpeqb %xmm1, %xmm0
910 pslldq $11, %xmm2
911 TOLOWER (%xmm1, %xmm2)
912 pcmpeqb %xmm1, %xmm2
913 psubb %xmm0, %xmm2
914 pmovmskb %xmm2, %edi
915 shr %cl, %esi
916 shr %cl, %edi
917 sub %edi, %esi
918 lea -11(%ecx), %edi
919 jnz L(less32bytes)
920
921 UPDATE_STRNCMP_COUNTER
922
923 movdqa (%edx), %xmm3
924 pxor %xmm0, %xmm0
925 mov $16, %ecx
926 orl $5, FLAGS
927 lea 5(%edx), %edi
928 and $0xfff, %edi
929 sub $0x1000, %edi
930
931 .p2align 4
932 L(loop_ashr_5):
933 add $16, %edi
934 jg L(nibble_ashr_5)
935
936 L(gobble_ashr_5):
937 movdqa (%eax, %ecx), %xmm1
938 movdqa (%edx, %ecx), %xmm2
939 movdqa %xmm2, %xmm4
940
941 palignr $5, %xmm3, %xmm2
942 TOLOWER (%xmm1, %xmm2)
943
944 pcmpeqb %xmm1, %xmm0
945 pcmpeqb %xmm2, %xmm1
946 psubb %xmm0, %xmm1
947 pmovmskb %xmm1, %esi
948 sub $0xffff, %esi
949 jnz L(exit)
950
951 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
952 cmp $16, REM
953 lea -16(REM), REM
954 jbe L(more8byteseq)
955 #endif
956 add $16, %ecx
957 movdqa %xmm4, %xmm3
958
959 add $16, %edi
960 jg L(nibble_ashr_5)
961
962 movdqa (%eax, %ecx), %xmm1
963 movdqa (%edx, %ecx), %xmm2
964 movdqa %xmm2, %xmm4
965
966 palignr $5, %xmm3, %xmm2
967 TOLOWER (%xmm1, %xmm2)
968
969 pcmpeqb %xmm1, %xmm0
970 pcmpeqb %xmm2, %xmm1
971 psubb %xmm0, %xmm1
972 pmovmskb %xmm1, %esi
973 sub $0xffff, %esi
974 jnz L(exit)
975
976 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
977 cmp $16, REM
978 lea -16(REM), REM
979 jbe L(more8byteseq)
980 #endif
981 add $16, %ecx
982 movdqa %xmm4, %xmm3
983 jmp L(loop_ashr_5)
984
985 .p2align 4
986 L(nibble_ashr_5):
987 pcmpeqb %xmm3, %xmm0
988 pmovmskb %xmm0, %esi
989 test $0xffe0, %esi
990 jnz L(ashr_5_exittail)
991
992 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
993 cmp $11, REM
994 jbe L(ashr_5_exittail)
995 #endif
996 pxor %xmm0, %xmm0
997 sub $0x1000, %edi
998 jmp L(gobble_ashr_5)
999
1000 .p2align 4
1001 L(ashr_5_exittail):
1002 movdqa (%eax, %ecx), %xmm1
1003 psrldq $5, %xmm0
1004 psrldq $5, %xmm3
1005 jmp L(aftertail)
1006
1007 /*
1008 * The following cases will be handled by ashr_6
1009 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
1010 * n(10~15) n -10 5(15 +(n-10) - n) ashr_6
1011 */
1012
1013 .p2align 4
1014 L(ashr_6):
1015 mov $0xffff, %esi
1016 pxor %xmm0, %xmm0
1017 movdqa (%edx), %xmm2
1018 movdqa (%eax), %xmm1
1019 pcmpeqb %xmm1, %xmm0
1020 pslldq $10, %xmm2
1021 TOLOWER (%xmm1, %xmm2)
1022 pcmpeqb %xmm1, %xmm2
1023 psubb %xmm0, %xmm2
1024 pmovmskb %xmm2, %edi
1025 shr %cl, %esi
1026 shr %cl, %edi
1027 sub %edi, %esi
1028 lea -10(%ecx), %edi
1029 jnz L(less32bytes)
1030
1031 UPDATE_STRNCMP_COUNTER
1032
1033 movdqa (%edx), %xmm3
1034 pxor %xmm0, %xmm0
1035 mov $16, %ecx
1036 orl $6, FLAGS
1037 lea 6(%edx), %edi
1038 and $0xfff, %edi
1039 sub $0x1000, %edi
1040
1041 .p2align 4
1042 L(loop_ashr_6):
1043 add $16, %edi
1044 jg L(nibble_ashr_6)
1045
1046 L(gobble_ashr_6):
1047 movdqa (%eax, %ecx), %xmm1
1048 movdqa (%edx, %ecx), %xmm2
1049 movdqa %xmm2, %xmm4
1050
1051 palignr $6, %xmm3, %xmm2
1052 TOLOWER (%xmm1, %xmm2)
1053
1054 pcmpeqb %xmm1, %xmm0
1055 pcmpeqb %xmm2, %xmm1
1056 psubb %xmm0, %xmm1
1057 pmovmskb %xmm1, %esi
1058 sub $0xffff, %esi
1059 jnz L(exit)
1060
1061 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1062 cmp $16, REM
1063 lea -16(REM), REM
1064 jbe L(more8byteseq)
1065 #endif
1066
1067 add $16, %ecx
1068 movdqa %xmm4, %xmm3
1069
1070 add $16, %edi
1071 jg L(nibble_ashr_6)
1072
1073 movdqa (%eax, %ecx), %xmm1
1074 movdqa (%edx, %ecx), %xmm2
1075 movdqa %xmm2, %xmm4
1076
1077 palignr $6, %xmm3, %xmm2
1078 TOLOWER (%xmm1, %xmm2)
1079
1080 pcmpeqb %xmm1, %xmm0
1081 pcmpeqb %xmm2, %xmm1
1082 psubb %xmm0, %xmm1
1083 pmovmskb %xmm1, %esi
1084 sub $0xffff, %esi
1085 jnz L(exit)
1086 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1087 cmp $16, REM
1088 lea -16(REM), REM
1089 jbe L(more8byteseq)
1090 #endif
1091
1092 add $16, %ecx
1093 movdqa %xmm4, %xmm3
1094 jmp L(loop_ashr_6)
1095
1096 .p2align 4
1097 L(nibble_ashr_6):
1098 pcmpeqb %xmm3, %xmm0
1099 pmovmskb %xmm0, %esi
1100 test $0xffc0, %esi
1101 jnz L(ashr_6_exittail)
1102
1103 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1104 cmp $10, REM
1105 jbe L(ashr_6_exittail)
1106 #endif
1107 pxor %xmm0, %xmm0
1108 sub $0x1000, %edi
1109 jmp L(gobble_ashr_6)
1110
1111 .p2align 4
1112 L(ashr_6_exittail):
1113 movdqa (%eax, %ecx), %xmm1
1114 psrldq $6, %xmm0
1115 psrldq $6, %xmm3
1116 jmp L(aftertail)
1117
1118 /*
1119 * The following cases will be handled by ashr_7
1120 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
1121 * n(9~15) n - 9 6(15 +(n-9) - n) ashr_7
1122 */
1123
1124 .p2align 4
1125 L(ashr_7):
1126 mov $0xffff, %esi
1127 pxor %xmm0, %xmm0
1128 movdqa (%edx), %xmm2
1129 movdqa (%eax), %xmm1
1130 pcmpeqb %xmm1, %xmm0
1131 pslldq $9, %xmm2
1132 TOLOWER (%xmm1, %xmm2)
1133 pcmpeqb %xmm1, %xmm2
1134 psubb %xmm0, %xmm2
1135 pmovmskb %xmm2, %edi
1136 shr %cl, %esi
1137 shr %cl, %edi
1138 sub %edi, %esi
1139 lea -9(%ecx), %edi
1140 jnz L(less32bytes)
1141
1142 UPDATE_STRNCMP_COUNTER
1143
1144 movdqa (%edx), %xmm3
1145 pxor %xmm0, %xmm0
1146 mov $16, %ecx
1147 orl $7, FLAGS
1148 lea 8(%edx), %edi
1149 and $0xfff, %edi
1150 sub $0x1000, %edi
1151
1152 .p2align 4
1153 L(loop_ashr_7):
1154 add $16, %edi
1155 jg L(nibble_ashr_7)
1156
1157 L(gobble_ashr_7):
1158 movdqa (%eax, %ecx), %xmm1
1159 movdqa (%edx, %ecx), %xmm2
1160 movdqa %xmm2, %xmm4
1161
1162 palignr $7, %xmm3, %xmm2
1163 TOLOWER (%xmm1, %xmm2)
1164
1165 pcmpeqb %xmm1, %xmm0
1166 pcmpeqb %xmm2, %xmm1
1167 psubb %xmm0, %xmm1
1168 pmovmskb %xmm1, %esi
1169 sub $0xffff, %esi
1170 jnz L(exit)
1171
1172 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1173 cmp $16, REM
1174 lea -16(REM), REM
1175 jbe L(more8byteseq)
1176 #endif
1177
1178 add $16, %ecx
1179 movdqa %xmm4, %xmm3
1180
1181 add $16, %edi
1182 jg L(nibble_ashr_7)
1183
1184 movdqa (%eax, %ecx), %xmm1
1185 movdqa (%edx, %ecx), %xmm2
1186 movdqa %xmm2, %xmm4
1187
1188 palignr $7, %xmm3, %xmm2
1189 TOLOWER (%xmm1, %xmm2)
1190
1191 pcmpeqb %xmm1, %xmm0
1192 pcmpeqb %xmm2, %xmm1
1193 psubb %xmm0, %xmm1
1194 pmovmskb %xmm1, %esi
1195 sub $0xffff, %esi
1196 jnz L(exit)
1197
1198 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1199 cmp $16, REM
1200 lea -16(REM), REM
1201 jbe L(more8byteseq)
1202 #endif
1203
1204 add $16, %ecx
1205 movdqa %xmm4, %xmm3
1206 jmp L(loop_ashr_7)
1207
1208 .p2align 4
1209 L(nibble_ashr_7):
1210 pcmpeqb %xmm3, %xmm0
1211 pmovmskb %xmm0, %esi
1212 test $0xff80, %esi
1213 jnz L(ashr_7_exittail)
1214
1215 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1216 cmp $9, REM
1217 jbe L(ashr_7_exittail)
1218 #endif
1219 pxor %xmm0, %xmm0
1220 pxor %xmm0, %xmm0
1221 sub $0x1000, %edi
1222 jmp L(gobble_ashr_7)
1223
1224 .p2align 4
1225 L(ashr_7_exittail):
1226 movdqa (%eax, %ecx), %xmm1
1227 psrldq $7, %xmm0
1228 psrldq $7, %xmm3
1229 jmp L(aftertail)
1230
1231 /*
1232 * The following cases will be handled by ashr_8
1233 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
1234 * n(8~15) n - 8 7(15 +(n-8) - n) ashr_8
1235 */
1236 .p2align 4
1237 L(ashr_8):
1238 mov $0xffff, %esi
1239 pxor %xmm0, %xmm0
1240 movdqa (%edx), %xmm2
1241 movdqa (%eax), %xmm1
1242 pcmpeqb %xmm1, %xmm0
1243 pslldq $8, %xmm2
1244 TOLOWER (%xmm1, %xmm2)
1245 pcmpeqb %xmm1, %xmm2
1246 psubb %xmm0, %xmm2
1247 pmovmskb %xmm2, %edi
1248 shr %cl, %esi
1249 shr %cl, %edi
1250 sub %edi, %esi
1251 lea -8(%ecx), %edi
1252 jnz L(less32bytes)
1253
1254 UPDATE_STRNCMP_COUNTER
1255
1256 movdqa (%edx), %xmm3
1257 pxor %xmm0, %xmm0
1258 mov $16, %ecx
1259 orl $8, FLAGS
1260 lea 8(%edx), %edi
1261 and $0xfff, %edi
1262 sub $0x1000, %edi
1263
1264 .p2align 4
1265 L(loop_ashr_8):
1266 add $16, %edi
1267 jg L(nibble_ashr_8)
1268
1269 L(gobble_ashr_8):
1270 movdqa (%eax, %ecx), %xmm1
1271 movdqa (%edx, %ecx), %xmm2
1272 movdqa %xmm2, %xmm4
1273
1274 palignr $8, %xmm3, %xmm2
1275 TOLOWER (%xmm1, %xmm2)
1276
1277 pcmpeqb %xmm1, %xmm0
1278 pcmpeqb %xmm2, %xmm1
1279 psubb %xmm0, %xmm1
1280 pmovmskb %xmm1, %esi
1281 sub $0xffff, %esi
1282 jnz L(exit)
1283
1284 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1285 cmp $16, REM
1286 lea -16(REM), REM
1287 jbe L(more8byteseq)
1288 #endif
1289 add $16, %ecx
1290 movdqa %xmm4, %xmm3
1291
1292 add $16, %edi
1293 jg L(nibble_ashr_8)
1294
1295 movdqa (%eax, %ecx), %xmm1
1296 movdqa (%edx, %ecx), %xmm2
1297 movdqa %xmm2, %xmm4
1298
1299 palignr $8, %xmm3, %xmm2
1300 TOLOWER (%xmm1, %xmm2)
1301
1302 pcmpeqb %xmm1, %xmm0
1303 pcmpeqb %xmm2, %xmm1
1304 psubb %xmm0, %xmm1
1305 pmovmskb %xmm1, %esi
1306 sub $0xffff, %esi
1307 jnz L(exit)
1308
1309 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1310 cmp $16, REM
1311 lea -16(REM), REM
1312 jbe L(more8byteseq)
1313 #endif
1314 add $16, %ecx
1315 movdqa %xmm4, %xmm3
1316 jmp L(loop_ashr_8)
1317
1318 .p2align 4
1319 L(nibble_ashr_8):
1320 pcmpeqb %xmm3, %xmm0
1321 pmovmskb %xmm0, %esi
1322 test $0xff00, %esi
1323 jnz L(ashr_8_exittail)
1324
1325 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1326 cmp $8, REM
1327 jbe L(ashr_8_exittail)
1328 #endif
1329 pxor %xmm0, %xmm0
1330 pxor %xmm0, %xmm0
1331 sub $0x1000, %edi
1332 jmp L(gobble_ashr_8)
1333
1334 .p2align 4
1335 L(ashr_8_exittail):
1336 movdqa (%eax, %ecx), %xmm1
1337 psrldq $8, %xmm0
1338 psrldq $8, %xmm3
1339 jmp L(aftertail)
1340
1341 /*
1342 * The following cases will be handled by ashr_9
1343 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
1344 * n(7~15) n - 7 8(15 +(n-7) - n) ashr_9
1345 */
1346 .p2align 4
1347 L(ashr_9):
1348 mov $0xffff, %esi
1349 pxor %xmm0, %xmm0
1350 movdqa (%edx), %xmm2
1351 movdqa (%eax), %xmm1
1352 pcmpeqb %xmm1, %xmm0
1353 pslldq $7, %xmm2
1354 TOLOWER (%xmm1, %xmm2)
1355 pcmpeqb %xmm1, %xmm2
1356 psubb %xmm0, %xmm2
1357 pmovmskb %xmm2, %edi
1358 shr %cl, %esi
1359 shr %cl, %edi
1360 sub %edi, %esi
1361 lea -7(%ecx), %edi
1362 jnz L(less32bytes)
1363
1364 UPDATE_STRNCMP_COUNTER
1365
1366 movdqa (%edx), %xmm3
1367 pxor %xmm0, %xmm0
1368 mov $16, %ecx
1369 orl $9, FLAGS
1370 lea 9(%edx), %edi
1371 and $0xfff, %edi
1372 sub $0x1000, %edi
1373
1374 .p2align 4
1375 L(loop_ashr_9):
1376 add $16, %edi
1377 jg L(nibble_ashr_9)
1378
1379 L(gobble_ashr_9):
1380 movdqa (%eax, %ecx), %xmm1
1381 movdqa (%edx, %ecx), %xmm2
1382 movdqa %xmm2, %xmm4
1383
1384 palignr $9, %xmm3, %xmm2
1385 TOLOWER (%xmm1, %xmm2)
1386
1387 pcmpeqb %xmm1, %xmm0
1388 pcmpeqb %xmm2, %xmm1
1389 psubb %xmm0, %xmm1
1390 pmovmskb %xmm1, %esi
1391 sub $0xffff, %esi
1392 jnz L(exit)
1393
1394 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1395 cmp $16, REM
1396 lea -16(REM), REM
1397 jbe L(more8byteseq)
1398 #endif
1399 add $16, %ecx
1400 movdqa %xmm4, %xmm3
1401
1402 add $16, %edi
1403 jg L(nibble_ashr_9)
1404
1405 movdqa (%eax, %ecx), %xmm1
1406 movdqa (%edx, %ecx), %xmm2
1407 movdqa %xmm2, %xmm4
1408
1409 palignr $9, %xmm3, %xmm2
1410 TOLOWER (%xmm1, %xmm2)
1411
1412 pcmpeqb %xmm1, %xmm0
1413 pcmpeqb %xmm2, %xmm1
1414 psubb %xmm0, %xmm1
1415 pmovmskb %xmm1, %esi
1416 sub $0xffff, %esi
1417 jnz L(exit)
1418
1419 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1420 cmp $16, REM
1421 lea -16(REM), REM
1422 jbe L(more8byteseq)
1423 #endif
1424 add $16, %ecx
1425 movdqa %xmm4, %xmm3
1426 jmp L(loop_ashr_9)
1427
1428 .p2align 4
1429 L(nibble_ashr_9):
1430 pcmpeqb %xmm3, %xmm0
1431 pmovmskb %xmm0, %esi
1432 test $0xfe00, %esi
1433 jnz L(ashr_9_exittail)
1434
1435 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1436 cmp $7, REM
1437 jbe L(ashr_9_exittail)
1438 #endif
1439 pxor %xmm0, %xmm0
1440 sub $0x1000, %edi
1441 jmp L(gobble_ashr_9)
1442
1443 .p2align 4
1444 L(ashr_9_exittail):
1445 movdqa (%eax, %ecx), %xmm1
1446 psrldq $9, %xmm0
1447 psrldq $9, %xmm3
1448 jmp L(aftertail)
1449
1450 /*
1451 * The following cases will be handled by ashr_10
1452 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
1453 * n(6~15) n - 6 9(15 +(n-6) - n) ashr_10
1454 */
1455 .p2align 4
1456 L(ashr_10):
1457 mov $0xffff, %esi
1458 pxor %xmm0, %xmm0
1459 movdqa (%edx), %xmm2
1460 movdqa (%eax), %xmm1
1461 pcmpeqb %xmm1, %xmm0
1462 pslldq $6, %xmm2
1463 TOLOWER (%xmm1, %xmm2)
1464 pcmpeqb %xmm1, %xmm2
1465 psubb %xmm0, %xmm2
1466 pmovmskb %xmm2, %edi
1467 shr %cl, %esi
1468 shr %cl, %edi
1469 sub %edi, %esi
1470 lea -6(%ecx), %edi
1471 jnz L(less32bytes)
1472
1473 UPDATE_STRNCMP_COUNTER
1474
1475 movdqa (%edx), %xmm3
1476 pxor %xmm0, %xmm0
1477 mov $16, %ecx
1478 orl $10, FLAGS
1479 lea 10(%edx), %edi
1480 and $0xfff, %edi
1481 sub $0x1000, %edi
1482
1483 .p2align 4
1484 L(loop_ashr_10):
1485 add $16, %edi
1486 jg L(nibble_ashr_10)
1487
1488 L(gobble_ashr_10):
1489 movdqa (%eax, %ecx), %xmm1
1490 movdqa (%edx, %ecx), %xmm2
1491 movdqa %xmm2, %xmm4
1492
1493 palignr $10, %xmm3, %xmm2
1494 TOLOWER (%xmm1, %xmm2)
1495
1496 pcmpeqb %xmm1, %xmm0
1497 pcmpeqb %xmm2, %xmm1
1498 psubb %xmm0, %xmm1
1499 pmovmskb %xmm1, %esi
1500 sub $0xffff, %esi
1501 jnz L(exit)
1502
1503 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1504 cmp $16, REM
1505 lea -16(REM), REM
1506 jbe L(more8byteseq)
1507 #endif
1508 add $16, %ecx
1509 movdqa %xmm4, %xmm3
1510
1511 add $16, %edi
1512 jg L(nibble_ashr_10)
1513
1514 movdqa (%eax, %ecx), %xmm1
1515 movdqa (%edx, %ecx), %xmm2
1516 movdqa %xmm2, %xmm4
1517
1518 palignr $10, %xmm3, %xmm2
1519 TOLOWER (%xmm1, %xmm2)
1520
1521 pcmpeqb %xmm1, %xmm0
1522 pcmpeqb %xmm2, %xmm1
1523 psubb %xmm0, %xmm1
1524 pmovmskb %xmm1, %esi
1525 sub $0xffff, %esi
1526 jnz L(exit)
1527
1528 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1529 cmp $16, REM
1530 lea -16(REM), REM
1531 jbe L(more8byteseq)
1532 #endif
1533 add $16, %ecx
1534 movdqa %xmm4, %xmm3
1535 jmp L(loop_ashr_10)
1536
1537 .p2align 4
1538 L(nibble_ashr_10):
1539 pcmpeqb %xmm3, %xmm0
1540 pmovmskb %xmm0, %esi
1541 test $0xfc00, %esi
1542 jnz L(ashr_10_exittail)
1543
1544 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1545 cmp $6, REM
1546 jbe L(ashr_10_exittail)
1547 #endif
1548 pxor %xmm0, %xmm0
1549 sub $0x1000, %edi
1550 jmp L(gobble_ashr_10)
1551
1552 .p2align 4
1553 L(ashr_10_exittail):
1554 movdqa (%eax, %ecx), %xmm1
1555 psrldq $10, %xmm0
1556 psrldq $10, %xmm3
1557 jmp L(aftertail)
1558
1559 /*
1560 * The following cases will be handled by ashr_11
1561 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
1562 * n(5~15) n - 5 10(15 +(n-5) - n) ashr_11
1563 */
1564 .p2align 4
1565 L(ashr_11):
1566 mov $0xffff, %esi
1567 pxor %xmm0, %xmm0
1568 movdqa (%edx), %xmm2
1569 movdqa (%eax), %xmm1
1570 pcmpeqb %xmm1, %xmm0
1571 pslldq $5, %xmm2
1572 TOLOWER (%xmm1, %xmm2)
1573 pcmpeqb %xmm1, %xmm2
1574 psubb %xmm0, %xmm2
1575 pmovmskb %xmm2, %edi
1576 shr %cl, %esi
1577 shr %cl, %edi
1578 sub %edi, %esi
1579 lea -5(%ecx), %edi
1580 jnz L(less32bytes)
1581
1582 UPDATE_STRNCMP_COUNTER
1583
1584 movdqa (%edx), %xmm3
1585 pxor %xmm0, %xmm0
1586 mov $16, %ecx
1587 orl $11, FLAGS
1588 lea 11(%edx), %edi
1589 and $0xfff, %edi
1590 sub $0x1000, %edi
1591
1592 .p2align 4
1593 L(loop_ashr_11):
1594 add $16, %edi
1595 jg L(nibble_ashr_11)
1596
1597 L(gobble_ashr_11):
1598 movdqa (%eax, %ecx), %xmm1
1599 movdqa (%edx, %ecx), %xmm2
1600 movdqa %xmm2, %xmm4
1601
1602 palignr $11, %xmm3, %xmm2
1603 TOLOWER (%xmm1, %xmm2)
1604
1605 pcmpeqb %xmm1, %xmm0
1606 pcmpeqb %xmm2, %xmm1
1607 psubb %xmm0, %xmm1
1608 pmovmskb %xmm1, %esi
1609 sub $0xffff, %esi
1610 jnz L(exit)
1611
1612 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1613 cmp $16, REM
1614 lea -16(REM), REM
1615 jbe L(more8byteseq)
1616 #endif
1617 add $16, %ecx
1618 movdqa %xmm4, %xmm3
1619
1620 add $16, %edi
1621 jg L(nibble_ashr_11)
1622
1623 movdqa (%eax, %ecx), %xmm1
1624 movdqa (%edx, %ecx), %xmm2
1625 movdqa %xmm2, %xmm4
1626
1627 palignr $11, %xmm3, %xmm2
1628 TOLOWER (%xmm1, %xmm2)
1629
1630 pcmpeqb %xmm1, %xmm0
1631 pcmpeqb %xmm2, %xmm1
1632 psubb %xmm0, %xmm1
1633 pmovmskb %xmm1, %esi
1634 sub $0xffff, %esi
1635 jnz L(exit)
1636
1637 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1638 cmp $16, REM
1639 lea -16(REM), REM
1640 jbe L(more8byteseq)
1641 #endif
1642 add $16, %ecx
1643 movdqa %xmm4, %xmm3
1644 jmp L(loop_ashr_11)
1645
1646 .p2align 4
1647 L(nibble_ashr_11):
1648 pcmpeqb %xmm3, %xmm0
1649 pmovmskb %xmm0, %esi
1650 test $0xf800, %esi
1651 jnz L(ashr_11_exittail)
1652
1653 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1654 cmp $5, REM
1655 jbe L(ashr_11_exittail)
1656 #endif
1657 pxor %xmm0, %xmm0
1658 sub $0x1000, %edi
1659 jmp L(gobble_ashr_11)
1660
1661 .p2align 4
1662 L(ashr_11_exittail):
1663 movdqa (%eax, %ecx), %xmm1
1664 psrldq $11, %xmm0
1665 psrldq $11, %xmm3
1666 jmp L(aftertail)
1667
1668 /*
1669 * The following cases will be handled by ashr_12
1670 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
1671 * n(4~15) n - 4 11(15 +(n-4) - n) ashr_12
1672 */
1673 .p2align 4
1674 L(ashr_12):
1675 mov $0xffff, %esi
1676 pxor %xmm0, %xmm0
1677 movdqa (%edx), %xmm2
1678 movdqa (%eax), %xmm1
1679 pcmpeqb %xmm1, %xmm0
1680 pslldq $4, %xmm2
1681 TOLOWER (%xmm1, %xmm2)
1682 pcmpeqb %xmm1, %xmm2
1683 psubb %xmm0, %xmm2
1684 pmovmskb %xmm2, %edi
1685 shr %cl, %esi
1686 shr %cl, %edi
1687 sub %edi, %esi
1688 lea -4(%ecx), %edi
1689 jnz L(less32bytes)
1690
1691 UPDATE_STRNCMP_COUNTER
1692
1693 movdqa (%edx), %xmm3
1694 pxor %xmm0, %xmm0
1695 mov $16, %ecx
1696 orl $12, FLAGS
1697 lea 12(%edx), %edi
1698 and $0xfff, %edi
1699 sub $0x1000, %edi
1700
1701 .p2align 4
1702 L(loop_ashr_12):
1703 add $16, %edi
1704 jg L(nibble_ashr_12)
1705
1706 L(gobble_ashr_12):
1707 movdqa (%eax, %ecx), %xmm1
1708 movdqa (%edx, %ecx), %xmm2
1709 movdqa %xmm2, %xmm4
1710
1711 palignr $12, %xmm3, %xmm2
1712 TOLOWER (%xmm1, %xmm2)
1713
1714 pcmpeqb %xmm1, %xmm0
1715 pcmpeqb %xmm2, %xmm1
1716 psubb %xmm0, %xmm1
1717 pmovmskb %xmm1, %esi
1718 sub $0xffff, %esi
1719 jnz L(exit)
1720
1721 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1722 cmp $16, REM
1723 lea -16(REM), REM
1724 jbe L(more8byteseq)
1725 #endif
1726
1727 add $16, %ecx
1728 movdqa %xmm4, %xmm3
1729
1730 add $16, %edi
1731 jg L(nibble_ashr_12)
1732
1733 movdqa (%eax, %ecx), %xmm1
1734 movdqa (%edx, %ecx), %xmm2
1735 movdqa %xmm2, %xmm4
1736
1737 palignr $12, %xmm3, %xmm2
1738 TOLOWER (%xmm1, %xmm2)
1739
1740 pcmpeqb %xmm1, %xmm0
1741 pcmpeqb %xmm2, %xmm1
1742 psubb %xmm0, %xmm1
1743 pmovmskb %xmm1, %esi
1744 sub $0xffff, %esi
1745 jnz L(exit)
1746
1747 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1748 cmp $16, REM
1749 lea -16(REM), REM
1750 jbe L(more8byteseq)
1751 #endif
1752 add $16, %ecx
1753 movdqa %xmm4, %xmm3
1754 jmp L(loop_ashr_12)
1755
1756 .p2align 4
1757 L(nibble_ashr_12):
1758 pcmpeqb %xmm3, %xmm0
1759 pmovmskb %xmm0, %esi
1760 test $0xf000, %esi
1761 jnz L(ashr_12_exittail)
1762
1763 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1764 cmp $4, REM
1765 jbe L(ashr_12_exittail)
1766 #endif
1767 pxor %xmm0, %xmm0
1768 sub $0x1000, %edi
1769 jmp L(gobble_ashr_12)
1770
1771 .p2align 4
1772 L(ashr_12_exittail):
1773 movdqa (%eax, %ecx), %xmm1
1774 psrldq $12, %xmm0
1775 psrldq $12, %xmm3
1776 jmp L(aftertail)
1777
1778 /*
1779 * The following cases will be handled by ashr_13
1780 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
1781 * n(3~15) n - 3 12(15 +(n-3) - n) ashr_13
1782 */
1783 .p2align 4
1784 L(ashr_13):
1785 mov $0xffff, %esi
1786 pxor %xmm0, %xmm0
1787 movdqa (%edx), %xmm2
1788 movdqa (%eax), %xmm1
1789 pcmpeqb %xmm1, %xmm0
1790 pslldq $3, %xmm2
1791 TOLOWER (%xmm1, %xmm2)
1792 pcmpeqb %xmm1, %xmm2
1793 psubb %xmm0, %xmm2
1794 pmovmskb %xmm2, %edi
1795 shr %cl, %esi
1796 shr %cl, %edi
1797 sub %edi, %esi
1798 lea -3(%ecx), %edi
1799 jnz L(less32bytes)
1800
1801 UPDATE_STRNCMP_COUNTER
1802
1803 movdqa (%edx), %xmm3
1804 pxor %xmm0, %xmm0
1805 mov $16, %ecx
1806 orl $13, FLAGS
1807 lea 13(%edx), %edi
1808 and $0xfff, %edi
1809 sub $0x1000, %edi
1810
1811 .p2align 4
1812 L(loop_ashr_13):
1813 add $16, %edi
1814 jg L(nibble_ashr_13)
1815
1816 L(gobble_ashr_13):
1817 movdqa (%eax, %ecx), %xmm1
1818 movdqa (%edx, %ecx), %xmm2
1819 movdqa %xmm2, %xmm4
1820
1821 palignr $13, %xmm3, %xmm2
1822 TOLOWER (%xmm1, %xmm2)
1823
1824 pcmpeqb %xmm1, %xmm0
1825 pcmpeqb %xmm2, %xmm1
1826 psubb %xmm0, %xmm1
1827 pmovmskb %xmm1, %esi
1828 sub $0xffff, %esi
1829 jnz L(exit)
1830
1831 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1832 cmp $16, REM
1833 lea -16(REM), REM
1834 jbe L(more8byteseq)
1835 #endif
1836 add $16, %ecx
1837 movdqa %xmm4, %xmm3
1838
1839 add $16, %edi
1840 jg L(nibble_ashr_13)
1841
1842 movdqa (%eax, %ecx), %xmm1
1843 movdqa (%edx, %ecx), %xmm2
1844 movdqa %xmm2, %xmm4
1845
1846 palignr $13, %xmm3, %xmm2
1847 TOLOWER (%xmm1, %xmm2)
1848
1849 pcmpeqb %xmm1, %xmm0
1850 pcmpeqb %xmm2, %xmm1
1851 psubb %xmm0, %xmm1
1852 pmovmskb %xmm1, %esi
1853 sub $0xffff, %esi
1854 jnz L(exit)
1855
1856 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1857 cmp $16, REM
1858 lea -16(REM), REM
1859 jbe L(more8byteseq)
1860 #endif
1861 add $16, %ecx
1862 movdqa %xmm4, %xmm3
1863 jmp L(loop_ashr_13)
1864
1865 .p2align 4
1866 L(nibble_ashr_13):
1867 pcmpeqb %xmm3, %xmm0
1868 pmovmskb %xmm0, %esi
1869 test $0xe000, %esi
1870 jnz L(ashr_13_exittail)
1871
1872 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1873 cmp $3, REM
1874 jbe L(ashr_13_exittail)
1875 #endif
1876 pxor %xmm0, %xmm0
1877 sub $0x1000, %edi
1878 jmp L(gobble_ashr_13)
1879
1880 .p2align 4
1881 L(ashr_13_exittail):
1882 movdqa (%eax, %ecx), %xmm1
1883 psrldq $13, %xmm0
1884 psrldq $13, %xmm3
1885 jmp L(aftertail)
1886
1887 /*
1888 * The following cases will be handled by ashr_14
1889 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
1890 * n(2~15) n - 2 13(15 +(n-2) - n) ashr_14
1891 */
1892 .p2align 4
1893 L(ashr_14):
1894 mov $0xffff, %esi
1895 pxor %xmm0, %xmm0
1896 movdqa (%edx), %xmm2
1897 movdqa (%eax), %xmm1
1898 pcmpeqb %xmm1, %xmm0
1899 pslldq $2, %xmm2
1900 TOLOWER (%xmm1, %xmm2)
1901 pcmpeqb %xmm1, %xmm2
1902 psubb %xmm0, %xmm2
1903 pmovmskb %xmm2, %edi
1904 shr %cl, %esi
1905 shr %cl, %edi
1906 sub %edi, %esi
1907 lea -2(%ecx), %edi
1908 jnz L(less32bytes)
1909
1910 UPDATE_STRNCMP_COUNTER
1911
1912 movdqa (%edx), %xmm3
1913 pxor %xmm0, %xmm0
1914 mov $16, %ecx
1915 orl $14, FLAGS
1916 lea 14(%edx), %edi
1917 and $0xfff, %edi
1918 sub $0x1000, %edi
1919
1920 .p2align 4
1921 L(loop_ashr_14):
1922 add $16, %edi
1923 jg L(nibble_ashr_14)
1924
1925 L(gobble_ashr_14):
1926 movdqa (%eax, %ecx), %xmm1
1927 movdqa (%edx, %ecx), %xmm2
1928 movdqa %xmm2, %xmm4
1929
1930 palignr $14, %xmm3, %xmm2
1931 TOLOWER (%xmm1, %xmm2)
1932
1933 pcmpeqb %xmm1, %xmm0
1934 pcmpeqb %xmm2, %xmm1
1935 psubb %xmm0, %xmm1
1936 pmovmskb %xmm1, %esi
1937 sub $0xffff, %esi
1938 jnz L(exit)
1939
1940 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1941 cmp $16, REM
1942 lea -16(REM), REM
1943 jbe L(more8byteseq)
1944 #endif
1945 add $16, %ecx
1946 movdqa %xmm4, %xmm3
1947
1948 add $16, %edi
1949 jg L(nibble_ashr_14)
1950
1951 movdqa (%eax, %ecx), %xmm1
1952 movdqa (%edx, %ecx), %xmm2
1953 movdqa %xmm2, %xmm4
1954
1955 palignr $14, %xmm3, %xmm2
1956 TOLOWER (%xmm1, %xmm2)
1957
1958 pcmpeqb %xmm1, %xmm0
1959 pcmpeqb %xmm2, %xmm1
1960 psubb %xmm0, %xmm1
1961 pmovmskb %xmm1, %esi
1962 sub $0xffff, %esi
1963 jnz L(exit)
1964
1965 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1966 cmp $16, REM
1967 lea -16(REM), REM
1968 jbe L(more8byteseq)
1969 #endif
1970 add $16, %ecx
1971 movdqa %xmm4, %xmm3
1972 jmp L(loop_ashr_14)
1973
1974 .p2align 4
1975 L(nibble_ashr_14):
1976 pcmpeqb %xmm3, %xmm0
1977 pmovmskb %xmm0, %esi
1978 test $0xc000, %esi
1979 jnz L(ashr_14_exittail)
1980
1981 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1982 cmp $2, REM
1983 jbe L(ashr_14_exittail)
1984 #endif
1985 pxor %xmm0, %xmm0
1986 sub $0x1000, %edi
1987 jmp L(gobble_ashr_14)
1988
1989 .p2align 4
1990 L(ashr_14_exittail):
1991 movdqa (%eax, %ecx), %xmm1
1992 psrldq $14, %xmm0
1993 psrldq $14, %xmm3
1994 jmp L(aftertail)
1995
1996 /*
1997 * The following cases will be handled by ashr_14
1998 * ecx(offset of esi) eax(offset of edi) relative offset corresponding case
1999 * n(1~15) n - 1 14(15 +(n-1) - n) ashr_15
2000 */
2001
2002 .p2align 4
2003 L(ashr_15):
2004 mov $0xffff, %esi
2005 pxor %xmm0, %xmm0
2006 movdqa (%edx), %xmm2
2007 movdqa (%eax), %xmm1
2008 pcmpeqb %xmm1, %xmm0
2009 pslldq $1, %xmm2
2010 TOLOWER (%xmm1, %xmm2)
2011 pcmpeqb %xmm1, %xmm2
2012 psubb %xmm0, %xmm2
2013 pmovmskb %xmm2, %edi
2014 shr %cl, %esi
2015 shr %cl, %edi
2016 sub %edi, %esi
2017 lea -1(%ecx), %edi
2018 jnz L(less32bytes)
2019
2020 UPDATE_STRNCMP_COUNTER
2021
2022 movdqa (%edx), %xmm3
2023 pxor %xmm0, %xmm0
2024 mov $16, %ecx
2025 orl $15, FLAGS
2026 lea 15(%edx), %edi
2027 and $0xfff, %edi
2028 sub $0x1000, %edi
2029
2030 .p2align 4
2031 L(loop_ashr_15):
2032 add $16, %edi
2033 jg L(nibble_ashr_15)
2034
2035 L(gobble_ashr_15):
2036 movdqa (%eax, %ecx), %xmm1
2037 movdqa (%edx, %ecx), %xmm2
2038 movdqa %xmm2, %xmm4
2039
2040 palignr $15, %xmm3, %xmm2
2041 TOLOWER (%xmm1, %xmm2)
2042
2043 pcmpeqb %xmm1, %xmm0
2044 pcmpeqb %xmm2, %xmm1
2045 psubb %xmm0, %xmm1
2046 pmovmskb %xmm1, %esi
2047 sub $0xffff, %esi
2048 jnz L(exit)
2049
2050 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2051 cmp $16, REM
2052 lea -16(REM), REM
2053 jbe L(more8byteseq)
2054 #endif
2055 add $16, %ecx
2056 movdqa %xmm4, %xmm3
2057
2058 add $16, %edi
2059 jg L(nibble_ashr_15)
2060
2061 movdqa (%eax, %ecx), %xmm1
2062 movdqa (%edx, %ecx), %xmm2
2063 movdqa %xmm2, %xmm4
2064
2065 palignr $15, %xmm3, %xmm2
2066 TOLOWER (%xmm1, %xmm2)
2067
2068 pcmpeqb %xmm1, %xmm0
2069 pcmpeqb %xmm2, %xmm1
2070 psubb %xmm0, %xmm1
2071 pmovmskb %xmm1, %esi
2072 sub $0xffff, %esi
2073 jnz L(exit)
2074
2075 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2076 cmp $16, REM
2077 lea -16(REM), REM
2078 jbe L(more8byteseq)
2079 #endif
2080 add $16, %ecx
2081 movdqa %xmm4, %xmm3
2082 jmp L(loop_ashr_15)
2083
2084 .p2align 4
2085 L(nibble_ashr_15):
2086 pcmpeqb %xmm3, %xmm0
2087 pmovmskb %xmm0, %esi
2088 test $0x8000, %esi
2089 jnz L(ashr_15_exittail)
2090
2091 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2092 cmp $1, REM
2093 jbe L(ashr_15_exittail)
2094 #endif
2095 pxor %xmm0, %xmm0
2096 sub $0x1000, %edi
2097 jmp L(gobble_ashr_15)
2098
2099 .p2align 4
2100 L(ashr_15_exittail):
2101 movdqa (%eax, %ecx), %xmm1
2102 psrldq $15, %xmm0
2103 psrldq $15, %xmm3
2104 jmp L(aftertail)
2105
2106 .p2align 4
2107 L(aftertail):
2108 TOLOWER (%xmm1, %xmm3)
2109 pcmpeqb %xmm3, %xmm1
2110 psubb %xmm0, %xmm1
2111 pmovmskb %xmm1, %esi
2112 not %esi
2113 L(exit):
2114 mov FLAGS, %edi
2115 and $0x1f, %edi
2116 lea -16(%edi, %ecx), %edi
2117 L(less32bytes):
2118 add %edi, %edx
2119 add %ecx, %eax
2120 testl $0x20, FLAGS
2121 jz L(ret2)
2122 xchg %eax, %edx
2123
2124 .p2align 4
2125 L(ret2):
2126 mov %esi, %ecx
2127 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2128 addl $4, %esp
2129 cfi_adjust_cfa_offset (-4)
2130 #endif
2131 POP (%esi)
2132 POP (%edi)
2133 #if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
2134 POP (FLAGS)
2135 #endif
2136 L(less16bytes):
2137 test %cl, %cl
2138 jz L(2next_8_bytes)
2139
2140 test $0x01, %cl
2141 jnz L(Byte0)
2142
2143 test $0x02, %cl
2144 jnz L(Byte1)
2145
2146 test $0x04, %cl
2147 jnz L(Byte2)
2148
2149 test $0x08, %cl
2150 jnz L(Byte3)
2151
2152 test $0x10, %cl
2153 jnz L(Byte4)
2154
2155 test $0x20, %cl
2156 jnz L(Byte5)
2157
2158 test $0x40, %cl
2159 jnz L(Byte6)
2160 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2161 cmp $7, REM
2162 jbe L(eq)
2163 #endif
2164
2165 movzx 7(%eax), %ecx
2166 movzx 7(%edx), %eax
2167 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2168 # ifdef PIC
2169 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2170 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
2171 # else
2172 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2173 movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
2174 # endif
2175 #endif
2176
2177 sub %ecx, %eax
2178 RETURN
2179
2180 L(Byte0):
2181 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2182 cmp $0, REM
2183 jbe L(eq)
2184 #endif
2185 movzx (%eax), %ecx
2186 movzx (%edx), %eax
2187
2188 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2189 # ifdef PIC
2190 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2191 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
2192 # else
2193 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2194 movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
2195 # endif
2196 #endif
2197
2198 sub %ecx, %eax
2199 RETURN
2200
2201 L(Byte1):
2202 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2203 cmp $1, REM
2204 jbe L(eq)
2205 #endif
2206 movzx 1(%eax), %ecx
2207 movzx 1(%edx), %eax
2208
2209 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2210 # ifdef PIC
2211 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2212 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
2213 # else
2214 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2215 movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
2216 # endif
2217 #endif
2218
2219 sub %ecx, %eax
2220 RETURN
2221
2222 L(Byte2):
2223 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2224 cmp $2, REM
2225 jbe L(eq)
2226 #endif
2227 movzx 2(%eax), %ecx
2228 movzx 2(%edx), %eax
2229
2230 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2231 # ifdef PIC
2232 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2233 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
2234 # else
2235 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2236 movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
2237 # endif
2238 #endif
2239
2240 sub %ecx, %eax
2241 RETURN
2242
2243 L(Byte3):
2244 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2245 cmp $3, REM
2246 jbe L(eq)
2247 #endif
2248 movzx 3(%eax), %ecx
2249 movzx 3(%edx), %eax
2250
2251 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2252 # ifdef PIC
2253 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2254 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
2255 # else
2256 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2257 movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
2258 # endif
2259 #endif
2260
2261 sub %ecx, %eax
2262 RETURN
2263
2264 L(Byte4):
2265 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2266 cmp $4, REM
2267 jbe L(eq)
2268 #endif
2269 movzx 4(%eax), %ecx
2270 movzx 4(%edx), %eax
2271
2272 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2273 # ifdef PIC
2274 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2275 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
2276 # else
2277 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2278 movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
2279 # endif
2280 #endif
2281
2282 sub %ecx, %eax
2283 RETURN
2284
2285 L(Byte5):
2286 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2287 cmp $5, REM
2288 jbe L(eq)
2289 #endif
2290 movzx 5(%eax), %ecx
2291 movzx 5(%edx), %eax
2292
2293 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2294 # ifdef PIC
2295 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2296 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
2297 # else
2298 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2299 movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
2300 # endif
2301 #endif
2302
2303 sub %ecx, %eax
2304 RETURN
2305
2306 L(Byte6):
2307 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2308 cmp $6, REM
2309 jbe L(eq)
2310 #endif
2311 movzx 6(%eax), %ecx
2312 movzx 6(%edx), %eax
2313
2314 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2315 # ifdef PIC
2316 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2317 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
2318 # else
2319 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2320 movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
2321 # endif
2322 #endif
2323
2324 sub %ecx, %eax
2325 RETURN
2326
2327 L(2next_8_bytes):
2328 add $8, %eax
2329 add $8, %edx
2330 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2331 cmp $8, REM
2332 lea -8(REM), REM
2333 jbe L(eq)
2334 #endif
2335
2336 test $0x01, %ch
2337 jnz L(Byte0)
2338
2339 test $0x02, %ch
2340 jnz L(Byte1)
2341
2342 test $0x04, %ch
2343 jnz L(Byte2)
2344
2345 test $0x08, %ch
2346 jnz L(Byte3)
2347
2348 test $0x10, %ch
2349 jnz L(Byte4)
2350
2351 test $0x20, %ch
2352 jnz L(Byte5)
2353
2354 test $0x40, %ch
2355 jnz L(Byte6)
2356
2357 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2358 cmp $7, REM
2359 jbe L(eq)
2360 #endif
2361 movzx 7(%eax), %ecx
2362 movzx 7(%edx), %eax
2363
2364 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2365 # ifdef PIC
2366 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2367 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
2368 # else
2369 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2370 movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
2371 # endif
2372 #endif
2373
2374 sub %ecx, %eax
2375 RETURN
2376
2377 #ifdef USE_AS_STRNCMP
2378 L(neq_sncmp):
2379 #endif
2380 L(neq):
2381 mov $1, %eax
2382 ja L(neq_bigger)
2383 neg %eax
2384 L(neq_bigger):
2385 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2386 addl $4, %esp
2387 cfi_adjust_cfa_offset (-4)
2388 #endif
2389 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2390 POP (REM)
2391 #endif
2392 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2393 # ifdef PIC
2394 POP (%ebx)
2395 # endif
2396 #endif
2397 ret
2398
2399 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2400 .p2align 4
2401 cfi_restore_state
2402 L(more8byteseq):
2403
2404 # ifdef USE_AS_STRNCASECMP_L
2405 addl $4, %esp
2406 cfi_adjust_cfa_offset (-4)
2407 # endif
2408 POP (%esi)
2409 POP (%edi)
2410 # ifdef USE_AS_STRNCMP
2411 POP (FLAGS)
2412 # endif
2413 #endif
2414
2415 #ifdef USE_AS_STRNCMP
2416 L(eq_sncmp):
2417 #endif
2418 L(eq):
2419
2420 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2421 POP (REM)
2422 #endif
2423 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2424 # ifdef PIC
2425 POP (%ebx)
2426 # endif
2427 #endif
2428 xorl %eax, %eax
2429 ret
2430
2431 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2432 .p2align 4
2433 # if defined USE_AS_STRNCASECMP_L && defined PIC
2434 CFI_PUSH (%ebx)
2435 # endif
2436 CFI_PUSH (REM)
2437 L(less16bytes_sncmp):
2438 # ifdef USE_AS_STRNCASECMP_L
2439 PUSH (%esi)
2440 # endif
2441 test REM, REM
2442 jz L(eq_sncmp)
2443
2444 movzbl (%eax), %ecx
2445 # ifdef USE_AS_STRNCASECMP_L
2446 movzbl (%edx), %esi
2447 # ifdef PIC
2448 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2449 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2450 # else
2451 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2452 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2453 # endif
2454 cmpl %ecx, %esi
2455 # else
2456 cmpb %cl, (%edx)
2457 # endif
2458 jne L(neq_sncmp)
2459 test %cl, %cl
2460 je L(eq_sncmp)
2461
2462 cmp $1, REM
2463 je L(eq_sncmp)
2464
2465 movzbl 1(%eax), %ecx
2466 # ifdef USE_AS_STRNCASECMP_L
2467 movzbl 1(%edx), %esi
2468 # ifdef PIC
2469 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2470 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2471 # else
2472 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2473 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2474 # endif
2475 cmpl %ecx, %esi
2476 # else
2477 cmpb %cl, 1(%edx)
2478 # endif
2479 jne L(neq_sncmp)
2480 test %cl, %cl
2481 je L(eq_sncmp)
2482
2483 cmp $2, REM
2484 je L(eq_sncmp)
2485
2486 movzbl 2(%eax), %ecx
2487 # ifdef USE_AS_STRNCASECMP_L
2488 movzbl 2(%edx), %esi
2489 # ifdef PIC
2490 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2491 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2492 # else
2493 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2494 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2495 # endif
2496 cmpl %ecx, %esi
2497 # else
2498 cmpb %cl, 2(%edx)
2499 # endif
2500 jne L(neq_sncmp)
2501 test %cl, %cl
2502 je L(eq_sncmp)
2503
2504 cmp $3, REM
2505 je L(eq_sncmp)
2506
2507 movzbl 3(%eax), %ecx
2508 # ifdef USE_AS_STRNCASECMP_L
2509 movzbl 3(%edx), %esi
2510 # ifdef PIC
2511 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2512 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2513 # else
2514 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2515 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2516 # endif
2517 cmpl %ecx, %esi
2518 # else
2519 cmpb %cl, 3(%edx)
2520 # endif
2521 jne L(neq_sncmp)
2522 test %cl, %cl
2523 je L(eq_sncmp)
2524
2525 cmp $4, REM
2526 je L(eq_sncmp)
2527
2528 movzbl 4(%eax), %ecx
2529 # ifdef USE_AS_STRNCASECMP_L
2530 movzbl 4(%edx), %esi
2531 # ifdef PIC
2532 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2533 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2534 # else
2535 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2536 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2537 # endif
2538 cmpl %ecx, %esi
2539 # else
2540 cmpb %cl, 4(%edx)
2541 # endif
2542 jne L(neq_sncmp)
2543 test %cl, %cl
2544 je L(eq_sncmp)
2545
2546 cmp $5, REM
2547 je L(eq_sncmp)
2548
2549 movzbl 5(%eax), %ecx
2550 # ifdef USE_AS_STRNCASECMP_L
2551 movzbl 5(%edx), %esi
2552 # ifdef PIC
2553 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2554 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2555 # else
2556 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2557 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2558 # endif
2559 cmpl %ecx, %esi
2560 # else
2561 cmpb %cl, 5(%edx)
2562 # endif
2563 jne L(neq_sncmp)
2564 test %cl, %cl
2565 je L(eq_sncmp)
2566
2567 cmp $6, REM
2568 je L(eq_sncmp)
2569
2570 movzbl 6(%eax), %ecx
2571 # ifdef USE_AS_STRNCASECMP_L
2572 movzbl 6(%edx), %esi
2573 # ifdef PIC
2574 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2575 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2576 # else
2577 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2578 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2579 # endif
2580 cmpl %ecx, %esi
2581 # else
2582 cmpb %cl, 6(%edx)
2583 # endif
2584 jne L(neq_sncmp)
2585 test %cl, %cl
2586 je L(eq_sncmp)
2587
2588 cmp $7, REM
2589 je L(eq_sncmp)
2590
2591 movzbl 7(%eax), %ecx
2592 # ifdef USE_AS_STRNCASECMP_L
2593 movzbl 7(%edx), %esi
2594 # ifdef PIC
2595 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2596 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2597 # else
2598 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2599 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2600 # endif
2601 cmpl %ecx, %esi
2602 # else
2603 cmpb %cl, 7(%edx)
2604 # endif
2605 jne L(neq_sncmp)
2606 test %cl, %cl
2607 je L(eq_sncmp)
2608
2609
2610 cmp $8, REM
2611 je L(eq_sncmp)
2612
2613 movzbl 8(%eax), %ecx
2614 # ifdef USE_AS_STRNCASECMP_L
2615 movzbl 8(%edx), %esi
2616 # ifdef PIC
2617 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2618 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2619 # else
2620 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2621 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2622 # endif
2623 cmpl %ecx, %esi
2624 # else
2625 cmpb %cl, 8(%edx)
2626 # endif
2627 jne L(neq_sncmp)
2628 test %cl, %cl
2629 je L(eq_sncmp)
2630
2631 cmp $9, REM
2632 je L(eq_sncmp)
2633
2634 movzbl 9(%eax), %ecx
2635 # ifdef USE_AS_STRNCASECMP_L
2636 movzbl 9(%edx), %esi
2637 # ifdef PIC
2638 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2639 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2640 # else
2641 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2642 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2643 # endif
2644 cmpl %ecx, %esi
2645 # else
2646 cmpb %cl, 9(%edx)
2647 # endif
2648 jne L(neq_sncmp)
2649 test %cl, %cl
2650 je L(eq_sncmp)
2651
2652 cmp $10, REM
2653 je L(eq_sncmp)
2654
2655 movzbl 10(%eax), %ecx
2656 # ifdef USE_AS_STRNCASECMP_L
2657 movzbl 10(%edx), %esi
2658 # ifdef PIC
2659 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2660 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2661 # else
2662 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2663 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2664 # endif
2665 cmpl %ecx, %esi
2666 # else
2667 cmpb %cl, 10(%edx)
2668 # endif
2669 jne L(neq_sncmp)
2670 test %cl, %cl
2671 je L(eq_sncmp)
2672
2673 cmp $11, REM
2674 je L(eq_sncmp)
2675
2676 movzbl 11(%eax), %ecx
2677 # ifdef USE_AS_STRNCASECMP_L
2678 movzbl 11(%edx), %esi
2679 # ifdef PIC
2680 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2681 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2682 # else
2683 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2684 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2685 # endif
2686 cmpl %ecx, %esi
2687 # else
2688 cmpb %cl, 11(%edx)
2689 # endif
2690 jne L(neq_sncmp)
2691 test %cl, %cl
2692 je L(eq_sncmp)
2693
2694
2695 cmp $12, REM
2696 je L(eq_sncmp)
2697
2698 movzbl 12(%eax), %ecx
2699 # ifdef USE_AS_STRNCASECMP_L
2700 movzbl 12(%edx), %esi
2701 # ifdef PIC
2702 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2703 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2704 # else
2705 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2706 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2707 # endif
2708 cmpl %ecx, %esi
2709 # else
2710 cmpb %cl, 12(%edx)
2711 # endif
2712 jne L(neq_sncmp)
2713 test %cl, %cl
2714 je L(eq_sncmp)
2715
2716 cmp $13, REM
2717 je L(eq_sncmp)
2718
2719 movzbl 13(%eax), %ecx
2720 # ifdef USE_AS_STRNCASECMP_L
2721 movzbl 13(%edx), %esi
2722 # ifdef PIC
2723 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2724 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2725 # else
2726 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2727 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2728 # endif
2729 cmpl %ecx, %esi
2730 # else
2731 cmpb %cl, 13(%edx)
2732 # endif
2733 jne L(neq_sncmp)
2734 test %cl, %cl
2735 je L(eq_sncmp)
2736
2737 cmp $14, REM
2738 je L(eq_sncmp)
2739
2740 movzbl 14(%eax), %ecx
2741 # ifdef USE_AS_STRNCASECMP_L
2742 movzbl 14(%edx), %esi
2743 # ifdef PIC
2744 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2745 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2746 # else
2747 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2748 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2749 # endif
2750 cmpl %ecx, %esi
2751 # else
2752 cmpb %cl, 14(%edx)
2753 # endif
2754 jne L(neq_sncmp)
2755 test %cl, %cl
2756 je L(eq_sncmp)
2757
2758 cmp $15, REM
2759 je L(eq_sncmp)
2760
2761 movzbl 15(%eax), %ecx
2762 # ifdef USE_AS_STRNCASECMP_L
2763 movzbl 15(%edx), %esi
2764 # ifdef PIC
2765 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2766 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2767 # else
2768 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2769 movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2770 # endif
2771 cmpl %ecx, %esi
2772 # else
2773 cmpb %cl, 15(%edx)
2774 # endif
2775 jne L(neq_sncmp)
2776
2777 # ifdef USE_AS_STRNCASECMP_L
2778 L(eq_sncmp):
2779 POP (%esi)
2780 # endif
2781 POP (REM)
2782 # if defined USE_AS_STRNCASECMP_L && defined PIC
2783 POP (%ebx)
2784 # endif
2785 xor %eax, %eax
2786 ret
2787
2788 # ifdef USE_AS_STRNCASECMP_L
2789 .p2align 4
2790 # ifdef PIC
2791 CFI_PUSH (%ebx)
2792 # endif
2793 CFI_PUSH (REM)
2794 CFI_PUSH (%esi)
2795 L(neq_sncmp):
2796 mov $1, %eax
2797 mov $-1, %edx
2798 cmovna %edx, %eax
2799 POP (%esi)
2800 POP (REM)
2801 # ifdef PIC
2802 POP (%ebx)
2803 # endif
2804 ret
2805 # endif
2806 #endif
2807
2808 END (STRCMP)
2809
2810 #endif