x86: Add seperate non-temporal tunable for memset
[glibc.git] / sysdeps / i386 / i686 / multiarch / strcmp-ssse3.S
blobfc443cf7971f998e4db82423212fdcd843718c34
1 /* strcmp with SSSE3
2    Copyright (C) 2010-2024 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <https://www.gnu.org/licenses/>.  */
19 #if IS_IN (libc)
21 #include <sysdep.h>
22 #include "asm-syntax.h"
24 #define CFI_PUSH(REG)                                           \
25   cfi_adjust_cfa_offset (4);                                    \
26   cfi_rel_offset (REG, 0)
28 #define CFI_POP(REG)                                            \
29   cfi_adjust_cfa_offset (-4);                                   \
30   cfi_restore (REG)
32 #define PUSH(REG)       pushl REG; CFI_PUSH (REG)
33 #define POP(REG)        popl REG; CFI_POP (REG)
35 #ifdef USE_AS_STRNCMP
36 # ifndef STRCMP
37 #  define STRCMP        __strncmp_ssse3
38 # endif
39 # define STR1           8
40 # define STR2           STR1+4
41 # define CNT            STR2+4
42 # define RETURN         POP (REM); ret; .p2align 4; CFI_PUSH (REM)
43 # define UPDATE_STRNCMP_COUNTER                         \
44         /* calculate left number to compare */          \
45         mov     $16, %esi;                              \
46         sub     %ecx, %esi;                             \
47         cmp     %esi, REM;                              \
48         jbe     L(more8byteseq);                        \
49         sub     %esi, REM
50 # define FLAGS          %ebx
51 # define REM            %ebp
52 #elif defined USE_AS_STRCASECMP_L
53 # include "locale-defines.h"
54 # ifndef STRCMP
55 #  define STRCMP        __strcasecmp_l_ssse3
56 # endif
57 # ifdef PIC
58 #  define STR1          8
59 # else
60 #  define STR1          4
61 # endif
62 # define STR2           STR1+4
63 # define LOCALE         12      /* Loaded before the adjustment.  */
64 # ifdef PIC
65 #  define RETURN        POP (%ebx); ret; .p2align 4; CFI_PUSH (%ebx)
66 # else
67 #  define RETURN        ret; .p2align 4
68 # endif
69 # define UPDATE_STRNCMP_COUNTER
70 # define FLAGS          (%esp)
71 # define NONASCII       __strcasecmp_nonascii
72 #elif defined USE_AS_STRNCASECMP_L
73 # include "locale-defines.h"
74 # ifndef STRCMP
75 #  define STRCMP        __strncasecmp_l_ssse3
76 # endif
77 # ifdef PIC
78 #  define STR1          12
79 # else
80 #  define STR1          8
81 # endif
82 # define STR2           STR1+4
83 # define CNT            STR2+4
84 # define LOCALE         16      /* Loaded before the adjustment.  */
85 # ifdef PIC
86 #  define RETURN        POP (REM); POP (%ebx); ret; \
87                         .p2align 4; CFI_PUSH (%ebx); CFI_PUSH (REM)
88 # else
89 #  define RETURN        POP (REM); ret; .p2align 4; CFI_PUSH (REM)
90 # endif
91 # define UPDATE_STRNCMP_COUNTER                         \
92         /* calculate left number to compare */          \
93         mov     $16, %esi;                              \
94         sub     %ecx, %esi;                             \
95         cmp     %esi, REM;                              \
96         jbe     L(more8byteseq);                        \
97         sub     %esi, REM
98 # define FLAGS          (%esp)
99 # define REM            %ebp
100 # define NONASCII       __strncasecmp_nonascii
101 #else
102 # ifndef STRCMP
103 #  define STRCMP        __strcmp_ssse3
104 # endif
105 # define STR1           4
106 # define STR2           STR1+4
107 # define RETURN         ret; .p2align 4
108 # define UPDATE_STRNCMP_COUNTER
109 # define FLAGS          %ebx
110 #endif
112         .section .text.ssse3,"ax",@progbits
114 #ifdef USE_AS_STRCASECMP_L
115 ENTRY (__strcasecmp_ssse3)
116 # ifdef PIC
117         PUSH    (%ebx)
118         LOAD_PIC_REG(bx)
119         movl    __libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
120         movl    %gs:(%eax), %eax
121 # else
122         movl    %gs:__libc_tsd_LOCALE@NTPOFF, %eax
123 # endif
124 # if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
125         movl    LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
126 # else
127         movl    (%eax), %eax
128 # endif
129         testl   $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
130 # ifdef PIC
131         je      L(ascii)
132         POP     (%ebx)
133         jmp     __strcasecmp_nonascii
134 # else
135         jne     __strcasecmp_nonascii
136         jmp     L(ascii)
137 # endif
138 END (__strcasecmp_ssse3)
139 #endif
141 #ifdef USE_AS_STRNCASECMP_L
142 ENTRY (__strncasecmp_ssse3)
143 # ifdef PIC
144         PUSH    (%ebx)
145         LOAD_PIC_REG(bx)
146         movl    __libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
147         movl    %gs:(%eax), %eax
148 # else
149         movl    %gs:__libc_tsd_LOCALE@NTPOFF, %eax
150 # endif
151 # if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
152         movl    LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
153 # else
154         movl    (%eax), %eax
155 # endif
156         testl   $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
157 # ifdef PIC
158         je      L(ascii)
159         POP     (%ebx)
160         jmp     __strncasecmp_nonascii
161 # else
162         jne     __strncasecmp_nonascii
163         jmp     L(ascii)
164 # endif
165 END (__strncasecmp_ssse3)
166 #endif
168 ENTRY (STRCMP)
169 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
170         movl    LOCALE(%esp), %eax
171 # if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
172         movl    LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
173 # else
174         movl    (%eax), %eax
175 # endif
176         testl   $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
177         jne     NONASCII
179 # ifdef PIC
180         PUSH    (%ebx)
181         LOAD_PIC_REG(bx)
182 # endif
183 L(ascii):
184         .section .rodata.cst16,"aM",@progbits,16
185         .align 16
186 .Lbelowupper:
187         .quad   0x4040404040404040
188         .quad   0x4040404040404040
189 .Ltopupper:
190         .quad   0x5b5b5b5b5b5b5b5b
191         .quad   0x5b5b5b5b5b5b5b5b
192 .Ltouppermask:
193         .quad   0x2020202020202020
194         .quad   0x2020202020202020
195         .previous
197 # ifdef PIC
198 #  define UCLOW_reg .Lbelowupper@GOTOFF(%ebx)
199 #  define UCHIGH_reg .Ltopupper@GOTOFF(%ebx)
200 #  define LCQWORD_reg .Ltouppermask@GOTOFF(%ebx)
201 # else
202 #  define UCLOW_reg .Lbelowupper
203 #  define UCHIGH_reg .Ltopupper
204 #  define LCQWORD_reg .Ltouppermask
205 # endif
206 #endif
208 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
209         PUSH    (REM)
210 #endif
212         movl    STR1(%esp), %edx
213         movl    STR2(%esp), %eax
214 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
215         movl    CNT(%esp), REM
216         cmp     $16, REM
217         jb      L(less16bytes_sncmp)
218 #elif !defined USE_AS_STRCASECMP_L
219         movzbl  (%eax), %ecx
220         cmpb    %cl, (%edx)
221         jne     L(neq)
222         cmpl    $0, %ecx
223         je      L(eq)
225         movzbl  1(%eax), %ecx
226         cmpb    %cl, 1(%edx)
227         jne     L(neq)
228         cmpl    $0, %ecx
229         je      L(eq)
231         movzbl  2(%eax), %ecx
232         cmpb    %cl, 2(%edx)
233         jne     L(neq)
234         cmpl    $0, %ecx
235         je      L(eq)
237         movzbl  3(%eax), %ecx
238         cmpb    %cl, 3(%edx)
239         jne     L(neq)
240         cmpl    $0, %ecx
241         je      L(eq)
243         movzbl  4(%eax), %ecx
244         cmpb    %cl, 4(%edx)
245         jne     L(neq)
246         cmpl    $0, %ecx
247         je      L(eq)
249         movzbl  5(%eax), %ecx
250         cmpb    %cl, 5(%edx)
251         jne     L(neq)
252         cmpl    $0, %ecx
253         je      L(eq)
255         movzbl  6(%eax), %ecx
256         cmpb    %cl, 6(%edx)
257         jne     L(neq)
258         cmpl    $0, %ecx
259         je      L(eq)
261         movzbl  7(%eax), %ecx
262         cmpb    %cl, 7(%edx)
263         jne     L(neq)
264         cmpl    $0, %ecx
265         je      L(eq)
267         add     $8, %edx
268         add     $8, %eax
269 #endif
270         movl    %edx, %ecx
271         and     $0xfff, %ecx
272         cmp     $0xff0, %ecx
273         ja      L(crosspage)
274         mov     %eax, %ecx
275         and     $0xfff, %ecx
276         cmp     $0xff0, %ecx
277         ja      L(crosspage)
278         pxor    %xmm0, %xmm0
279         movlpd  (%eax), %xmm1
280         movlpd  (%edx), %xmm2
281         movhpd  8(%eax), %xmm1
282         movhpd  8(%edx), %xmm2
283 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
284 # define TOLOWER(reg1, reg2) \
285         movdqa  reg1, %xmm5;                                    \
286         movdqa  reg2, %xmm7;                                    \
287         movdqa  UCHIGH_reg, %xmm6;                              \
288         pcmpgtb UCLOW_reg, %xmm5;                               \
289         pcmpgtb UCLOW_reg, %xmm7;                               \
290         pcmpgtb reg1, %xmm6;                                    \
291         pand    %xmm6, %xmm5;                                   \
292         movdqa  UCHIGH_reg, %xmm6;                              \
293         pcmpgtb reg2, %xmm6;                                    \
294         pand    %xmm6, %xmm7;                                   \
295         pand    LCQWORD_reg, %xmm5;                             \
296         por     %xmm5, reg1;                                    \
297         pand    LCQWORD_reg, %xmm7;                             \
298         por     %xmm7, reg2
299         TOLOWER (%xmm1, %xmm2)
300 #else
301 # define TOLOWER(reg1, reg2)
302 #endif
303         pcmpeqb %xmm1, %xmm0
304         pcmpeqb %xmm2, %xmm1
305         psubb   %xmm0, %xmm1
306         pmovmskb %xmm1, %ecx
307         sub     $0xffff, %ecx
308         jnz     L(less16bytes)
309 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
310         cmp     $16, REM
311         lea     -16(REM), REM
312         jbe     L(eq)
313 #endif
314         add     $16, %eax
315         add     $16, %edx
317 L(crosspage):
319 #if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
320         PUSH    (FLAGS)
321 #endif
322         PUSH    (%edi)
323         PUSH    (%esi)
324 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
325         pushl   $0
326         cfi_adjust_cfa_offset (4)
327 #endif
328 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
329         cfi_remember_state
330 #endif
332         movl    %edx, %edi
333         movl    %eax, %ecx
334         and     $0xf, %ecx
335         and     $0xf, %edi
336         xor     %ecx, %eax
337         xor     %edi, %edx
338 #if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
339         xor     FLAGS, FLAGS
340 #endif
341         cmp     %edi, %ecx
342         je      L(ashr_0)
343         ja      L(bigger)
344         orl     $0x20, FLAGS
345         xchg    %edx, %eax
346         xchg    %ecx, %edi
347 L(bigger):
348         lea     15(%edi), %edi
349         sub     %ecx, %edi
350         cmp     $8, %edi
351         jle     L(ashr_less_8)
352         cmp     $14, %edi
353         je      L(ashr_15)
354         cmp     $13, %edi
355         je      L(ashr_14)
356         cmp     $12, %edi
357         je      L(ashr_13)
358         cmp     $11, %edi
359         je      L(ashr_12)
360         cmp     $10, %edi
361         je      L(ashr_11)
362         cmp     $9, %edi
363         je      L(ashr_10)
364 L(ashr_less_8):
365         je      L(ashr_9)
366         cmp     $7, %edi
367         je      L(ashr_8)
368         cmp     $6, %edi
369         je      L(ashr_7)
370         cmp     $5, %edi
371         je      L(ashr_6)
372         cmp     $4, %edi
373         je      L(ashr_5)
374         cmp     $3, %edi
375         je      L(ashr_4)
376         cmp     $2, %edi
377         je      L(ashr_3)
378         cmp     $1, %edi
379         je      L(ashr_2)
380         cmp     $0, %edi
381         je      L(ashr_1)
384  * The following cases will be handled by ashr_0
385  *  ecx(offset of esi)  eax(offset of edi)  relative offset  corresponding case
386  *        n(0~15)            n(0~15)           15(15+ n-n)         ashr_0
387  */
388         .p2align 4
389 L(ashr_0):
390         mov     $0xffff, %esi
391         movdqa  (%eax), %xmm1
392         pxor    %xmm0, %xmm0
393         pcmpeqb %xmm1, %xmm0
394 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
395         movdqa  (%edx), %xmm2
396         TOLOWER (%xmm1, %xmm2)
397         pcmpeqb %xmm2, %xmm1
398 #else
399         pcmpeqb (%edx), %xmm1
400 #endif
401         psubb   %xmm0, %xmm1
402         pmovmskb %xmm1, %edi
403         shr     %cl, %esi
404         shr     %cl, %edi
405         sub     %edi, %esi
406         mov     %ecx, %edi
407         jne     L(less32bytes)
408         UPDATE_STRNCMP_COUNTER
409         movl    $0x10, FLAGS
410         mov     $0x10, %ecx
411         pxor    %xmm0, %xmm0
412         .p2align 4
413 L(loop_ashr_0):
414         movdqa  (%eax, %ecx), %xmm1
415 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
416         movdqa  (%edx, %ecx), %xmm2
417         TOLOWER (%xmm1, %xmm2)
419         pcmpeqb %xmm1, %xmm0
420         pcmpeqb %xmm2, %xmm1
421 #else
422         pcmpeqb %xmm1, %xmm0
423         pcmpeqb (%edx, %ecx), %xmm1
424 #endif
425         psubb   %xmm0, %xmm1
426         pmovmskb %xmm1, %esi
427         sub     $0xffff, %esi
428         jnz     L(exit)
429 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
430         cmp     $16, REM
431         lea     -16(REM), REM
432         jbe     L(more8byteseq)
433 #endif
434         add     $16, %ecx
435         jmp     L(loop_ashr_0)
438  * The following cases will be handled by ashr_1
439  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
440  *        n(15)            n -15            0(15 +(n-15) - n)         ashr_1
441  */
442         .p2align 4
443 L(ashr_1):
444         mov     $0xffff, %esi
445         pxor    %xmm0, %xmm0
446         movdqa  (%edx), %xmm2
447         movdqa  (%eax), %xmm1
448         pcmpeqb %xmm1, %xmm0
449         pslldq  $15, %xmm2
450         TOLOWER (%xmm1, %xmm2)
451         pcmpeqb %xmm1, %xmm2
452         psubb   %xmm0, %xmm2
453         pmovmskb %xmm2, %edi
454         shr     %cl, %esi
455         shr     %cl, %edi
456         sub     %edi, %esi
457         lea     -15(%ecx), %edi
458         jnz     L(less32bytes)
460         UPDATE_STRNCMP_COUNTER
462         movdqa  (%edx), %xmm3
463         pxor    %xmm0, %xmm0
464         mov     $16, %ecx
465         orl     $1, FLAGS
466         lea     1(%edx), %edi
467         and     $0xfff, %edi
468         sub     $0x1000, %edi
470         .p2align 4
471 L(loop_ashr_1):
472         add     $16, %edi
473         jg      L(nibble_ashr_1)
475 L(gobble_ashr_1):
476         movdqa  (%eax, %ecx), %xmm1
477         movdqa  (%edx, %ecx), %xmm2
478         movdqa  %xmm2, %xmm4
480         palignr $1, %xmm3, %xmm2
481         TOLOWER (%xmm1, %xmm2)
483         pcmpeqb %xmm1, %xmm0
484         pcmpeqb %xmm2, %xmm1
485         psubb   %xmm0, %xmm1
486         pmovmskb %xmm1, %esi
487         sub     $0xffff, %esi
488         jnz     L(exit)
489 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
490         cmp     $16, REM
491         lea     -16(REM), REM
492         jbe     L(more8byteseq)
493 #endif
495         add     $16, %ecx
496         movdqa  %xmm4, %xmm3
498         add     $16, %edi
499         jg      L(nibble_ashr_1)
501         movdqa  (%eax, %ecx), %xmm1
502         movdqa  (%edx, %ecx), %xmm2
503         movdqa  %xmm2, %xmm4
505         palignr $1, %xmm3, %xmm2
506         TOLOWER (%xmm1, %xmm2)
508         pcmpeqb %xmm1, %xmm0
509         pcmpeqb %xmm2, %xmm1
510         psubb   %xmm0, %xmm1
511         pmovmskb %xmm1, %esi
512         sub     $0xffff, %esi
513         jnz     L(exit)
515 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
516         cmp     $16, REM
517         lea     -16(REM), REM
518         jbe     L(more8byteseq)
519 #endif
520         add     $16, %ecx
521         movdqa  %xmm4, %xmm3
522         jmp     L(loop_ashr_1)
524         .p2align 4
525 L(nibble_ashr_1):
526         pcmpeqb %xmm3, %xmm0
527         pmovmskb %xmm0, %esi
528         test    $0xfffe, %esi
529         jnz     L(ashr_1_exittail)
531 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
532         cmp     $15, REM
533         jbe     L(ashr_1_exittail)
534 #endif
535         pxor    %xmm0, %xmm0
536         sub     $0x1000, %edi
537         jmp     L(gobble_ashr_1)
539         .p2align 4
540 L(ashr_1_exittail):
541         movdqa  (%eax, %ecx), %xmm1
542         psrldq  $1, %xmm0
543         psrldq  $1, %xmm3
544         jmp     L(aftertail)
547  * The following cases will be handled by ashr_2
548  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
549  *        n(14~15)            n -14            1(15 +(n-14) - n)         ashr_2
550  */
551         .p2align 4
552 L(ashr_2):
553         mov     $0xffff, %esi
554         pxor    %xmm0, %xmm0
555         movdqa  (%edx), %xmm2
556         movdqa  (%eax), %xmm1
557         pcmpeqb %xmm1, %xmm0
558         pslldq  $14, %xmm2
559         TOLOWER (%xmm1, %xmm2)
560         pcmpeqb %xmm1, %xmm2
561         psubb   %xmm0, %xmm2
562         pmovmskb %xmm2, %edi
563         shr     %cl, %esi
564         shr     %cl, %edi
565         sub     %edi, %esi
566         lea     -14(%ecx), %edi
567         jnz     L(less32bytes)
569         UPDATE_STRNCMP_COUNTER
571         movdqa  (%edx), %xmm3
572         pxor    %xmm0, %xmm0
573         mov     $16, %ecx
574         orl     $2, FLAGS
575         lea     2(%edx), %edi
576         and     $0xfff, %edi
577         sub     $0x1000, %edi
579         .p2align 4
580 L(loop_ashr_2):
581         add     $16, %edi
582         jg      L(nibble_ashr_2)
584 L(gobble_ashr_2):
585         movdqa  (%eax, %ecx), %xmm1
586         movdqa  (%edx, %ecx), %xmm2
587         movdqa  %xmm2, %xmm4
589         palignr $2, %xmm3, %xmm2
590         TOLOWER (%xmm1, %xmm2)
592         pcmpeqb %xmm1, %xmm0
593         pcmpeqb %xmm2, %xmm1
594         psubb   %xmm0, %xmm1
595         pmovmskb %xmm1, %esi
596         sub     $0xffff, %esi
597         jnz     L(exit)
599 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
600         cmp     $16, REM
601         lea     -16(REM), REM
602         jbe     L(more8byteseq)
603 #endif
604         add     $16, %ecx
605         movdqa  %xmm4, %xmm3
607         add     $16, %edi
608         jg      L(nibble_ashr_2)
610         movdqa  (%eax, %ecx), %xmm1
611         movdqa  (%edx, %ecx), %xmm2
612         movdqa  %xmm2, %xmm4
614         palignr $2, %xmm3, %xmm2
615         TOLOWER (%xmm1, %xmm2)
617         pcmpeqb %xmm1, %xmm0
618         pcmpeqb %xmm2, %xmm1
619         psubb   %xmm0, %xmm1
620         pmovmskb %xmm1, %esi
621         sub     $0xffff, %esi
622         jnz     L(exit)
624 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
625         cmp     $16, REM
626         lea     -16(REM), REM
627         jbe     L(more8byteseq)
628 #endif
629         add     $16, %ecx
630         movdqa  %xmm4, %xmm3
631         jmp     L(loop_ashr_2)
633         .p2align 4
634 L(nibble_ashr_2):
635         pcmpeqb %xmm3, %xmm0
636         pmovmskb %xmm0, %esi
637         test    $0xfffc, %esi
638         jnz     L(ashr_2_exittail)
640 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
641         cmp     $14, REM
642         jbe     L(ashr_2_exittail)
643 #endif
645         pxor    %xmm0, %xmm0
646         sub     $0x1000, %edi
647         jmp     L(gobble_ashr_2)
649         .p2align 4
650 L(ashr_2_exittail):
651         movdqa  (%eax, %ecx), %xmm1
652         psrldq  $2, %xmm0
653         psrldq  $2, %xmm3
654         jmp     L(aftertail)
657  * The following cases will be handled by ashr_3
658  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
659  *        n(13~15)            n -13            2(15 +(n-13) - n)         ashr_3
660  */
661         .p2align 4
662 L(ashr_3):
663         mov     $0xffff, %esi
664         pxor    %xmm0, %xmm0
665         movdqa  (%edx), %xmm2
666         movdqa  (%eax), %xmm1
667         pcmpeqb %xmm1, %xmm0
668         pslldq  $13, %xmm2
669         TOLOWER (%xmm1, %xmm2)
670         pcmpeqb %xmm1, %xmm2
671         psubb   %xmm0, %xmm2
672         pmovmskb %xmm2, %edi
673         shr     %cl, %esi
674         shr     %cl, %edi
675         sub     %edi, %esi
676         lea     -13(%ecx), %edi
677         jnz     L(less32bytes)
679         UPDATE_STRNCMP_COUNTER
681         movdqa  (%edx), %xmm3
682         pxor    %xmm0, %xmm0
683         mov     $16, %ecx
684         orl     $3, FLAGS
685         lea     3(%edx), %edi
686         and     $0xfff, %edi
687         sub     $0x1000, %edi
689         .p2align 4
690 L(loop_ashr_3):
691         add     $16, %edi
692         jg      L(nibble_ashr_3)
694 L(gobble_ashr_3):
695         movdqa  (%eax, %ecx), %xmm1
696         movdqa  (%edx, %ecx), %xmm2
697         movdqa  %xmm2, %xmm4
699         palignr $3, %xmm3, %xmm2
700         TOLOWER (%xmm1, %xmm2)
702         pcmpeqb %xmm1, %xmm0
703         pcmpeqb %xmm2, %xmm1
704         psubb   %xmm0, %xmm1
705         pmovmskb %xmm1, %esi
706         sub     $0xffff, %esi
707         jnz     L(exit)
709 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
710         cmp     $16, REM
711         lea     -16(REM), REM
712         jbe     L(more8byteseq)
713 #endif
714         add     $16, %ecx
715         movdqa  %xmm4, %xmm3
717         add     $16, %edi
718         jg      L(nibble_ashr_3)
720         movdqa  (%eax, %ecx), %xmm1
721         movdqa  (%edx, %ecx), %xmm2
722         movdqa  %xmm2, %xmm4
724         palignr $3, %xmm3, %xmm2
725         TOLOWER (%xmm1, %xmm2)
727         pcmpeqb %xmm1, %xmm0
728         pcmpeqb %xmm2, %xmm1
729         psubb   %xmm0, %xmm1
730         pmovmskb %xmm1, %esi
731         sub     $0xffff, %esi
732         jnz     L(exit)
734 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
735         cmp     $16, REM
736         lea     -16(REM), REM
737         jbe     L(more8byteseq)
738 #endif
739         add     $16, %ecx
740         movdqa  %xmm4, %xmm3
741         jmp     L(loop_ashr_3)
743         .p2align 4
744 L(nibble_ashr_3):
745         pcmpeqb %xmm3, %xmm0
746         pmovmskb %xmm0, %esi
747         test    $0xfff8, %esi
748         jnz     L(ashr_3_exittail)
750 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
751         cmp     $13, REM
752         jbe     L(ashr_3_exittail)
753 #endif
754         pxor    %xmm0, %xmm0
755         sub     $0x1000, %edi
756         jmp     L(gobble_ashr_3)
758         .p2align 4
759 L(ashr_3_exittail):
760         movdqa  (%eax, %ecx), %xmm1
761         psrldq  $3, %xmm0
762         psrldq  $3, %xmm3
763         jmp     L(aftertail)
766  * The following cases will be handled by ashr_4
767  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
768  *        n(12~15)            n -12            3(15 +(n-12) - n)         ashr_4
769  */
770         .p2align 4
771 L(ashr_4):
772         mov     $0xffff, %esi
773         pxor    %xmm0, %xmm0
774         movdqa  (%edx), %xmm2
775         movdqa  (%eax), %xmm1
776         pcmpeqb %xmm1, %xmm0
777         pslldq  $12, %xmm2
778         TOLOWER (%xmm1, %xmm2)
779         pcmpeqb %xmm1, %xmm2
780         psubb   %xmm0, %xmm2
781         pmovmskb %xmm2, %edi
782         shr     %cl, %esi
783         shr     %cl, %edi
784         sub     %edi, %esi
785         lea     -12(%ecx), %edi
786         jnz     L(less32bytes)
788         UPDATE_STRNCMP_COUNTER
790         movdqa  (%edx), %xmm3
791         pxor    %xmm0, %xmm0
792         mov     $16, %ecx
793         orl     $4, FLAGS
794         lea     4(%edx), %edi
795         and     $0xfff, %edi
796         sub     $0x1000, %edi
798         .p2align 4
799 L(loop_ashr_4):
800         add     $16, %edi
801         jg      L(nibble_ashr_4)
803 L(gobble_ashr_4):
804         movdqa  (%eax, %ecx), %xmm1
805         movdqa  (%edx, %ecx), %xmm2
806         movdqa  %xmm2, %xmm4
808         palignr $4, %xmm3, %xmm2
809         TOLOWER (%xmm1, %xmm2)
811         pcmpeqb %xmm1, %xmm0
812         pcmpeqb %xmm2, %xmm1
813         psubb   %xmm0, %xmm1
814         pmovmskb %xmm1, %esi
815         sub     $0xffff, %esi
816         jnz     L(exit)
818 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
819         cmp     $16, REM
820         lea     -16(REM), REM
821         jbe     L(more8byteseq)
822 #endif
824         add     $16, %ecx
825         movdqa  %xmm4, %xmm3
827         add     $16, %edi
828         jg      L(nibble_ashr_4)
830         movdqa  (%eax, %ecx), %xmm1
831         movdqa  (%edx, %ecx), %xmm2
832         movdqa  %xmm2, %xmm4
834         palignr $4, %xmm3, %xmm2
835         TOLOWER (%xmm1, %xmm2)
837         pcmpeqb %xmm1, %xmm0
838         pcmpeqb %xmm2, %xmm1
839         psubb   %xmm0, %xmm1
840         pmovmskb %xmm1, %esi
841         sub     $0xffff, %esi
842         jnz     L(exit)
844 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
845         cmp     $16, REM
846         lea     -16(REM), REM
847         jbe     L(more8byteseq)
848 #endif
850         add     $16, %ecx
851         movdqa  %xmm4, %xmm3
852         jmp     L(loop_ashr_4)
854         .p2align 4
855 L(nibble_ashr_4):
856         pcmpeqb %xmm3, %xmm0
857         pmovmskb %xmm0, %esi
858         test    $0xfff0, %esi
859         jnz     L(ashr_4_exittail)
861 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
862         cmp     $12, REM
863         jbe     L(ashr_4_exittail)
864 #endif
866         pxor    %xmm0, %xmm0
867         sub     $0x1000, %edi
868         jmp     L(gobble_ashr_4)
870         .p2align 4
871 L(ashr_4_exittail):
872         movdqa  (%eax, %ecx), %xmm1
873         psrldq  $4, %xmm0
874         psrldq  $4, %xmm3
875         jmp     L(aftertail)
878  * The following cases will be handled by ashr_5
879  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
880  *        n(11~15)            n -11            4(15 +(n-11) - n)         ashr_5
881  */
882         .p2align 4
883 L(ashr_5):
884         mov     $0xffff, %esi
885         pxor    %xmm0, %xmm0
886         movdqa  (%edx), %xmm2
887         movdqa  (%eax), %xmm1
888         pcmpeqb %xmm1, %xmm0
889         pslldq  $11, %xmm2
890         TOLOWER (%xmm1, %xmm2)
891         pcmpeqb %xmm1, %xmm2
892         psubb   %xmm0, %xmm2
893         pmovmskb %xmm2, %edi
894         shr     %cl, %esi
895         shr     %cl, %edi
896         sub     %edi, %esi
897         lea     -11(%ecx), %edi
898         jnz     L(less32bytes)
900         UPDATE_STRNCMP_COUNTER
902         movdqa  (%edx), %xmm3
903         pxor    %xmm0, %xmm0
904         mov     $16, %ecx
905         orl     $5, FLAGS
906         lea     5(%edx), %edi
907         and     $0xfff, %edi
908         sub     $0x1000, %edi
910         .p2align 4
911 L(loop_ashr_5):
912         add     $16, %edi
913         jg      L(nibble_ashr_5)
915 L(gobble_ashr_5):
916         movdqa  (%eax, %ecx), %xmm1
917         movdqa  (%edx, %ecx), %xmm2
918         movdqa  %xmm2, %xmm4
920         palignr $5, %xmm3, %xmm2
921         TOLOWER (%xmm1, %xmm2)
923         pcmpeqb %xmm1, %xmm0
924         pcmpeqb %xmm2, %xmm1
925         psubb   %xmm0, %xmm1
926         pmovmskb %xmm1, %esi
927         sub     $0xffff, %esi
928         jnz     L(exit)
930 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
931         cmp     $16, REM
932         lea     -16(REM), REM
933         jbe     L(more8byteseq)
934 #endif
935         add     $16, %ecx
936         movdqa  %xmm4, %xmm3
938         add     $16, %edi
939         jg      L(nibble_ashr_5)
941         movdqa  (%eax, %ecx), %xmm1
942         movdqa  (%edx, %ecx), %xmm2
943         movdqa  %xmm2, %xmm4
945         palignr $5, %xmm3, %xmm2
946         TOLOWER (%xmm1, %xmm2)
948         pcmpeqb %xmm1, %xmm0
949         pcmpeqb %xmm2, %xmm1
950         psubb   %xmm0, %xmm1
951         pmovmskb %xmm1, %esi
952         sub     $0xffff, %esi
953         jnz     L(exit)
955 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
956         cmp     $16, REM
957         lea     -16(REM), REM
958         jbe     L(more8byteseq)
959 #endif
960         add     $16, %ecx
961         movdqa  %xmm4, %xmm3
962         jmp     L(loop_ashr_5)
964         .p2align 4
965 L(nibble_ashr_5):
966         pcmpeqb %xmm3, %xmm0
967         pmovmskb %xmm0, %esi
968         test    $0xffe0, %esi
969         jnz     L(ashr_5_exittail)
971 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
972         cmp     $11, REM
973         jbe     L(ashr_5_exittail)
974 #endif
975         pxor    %xmm0, %xmm0
976         sub     $0x1000, %edi
977         jmp     L(gobble_ashr_5)
979         .p2align 4
980 L(ashr_5_exittail):
981         movdqa  (%eax, %ecx), %xmm1
982         psrldq  $5, %xmm0
983         psrldq  $5, %xmm3
984         jmp     L(aftertail)
987  * The following cases will be handled by ashr_6
988  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
989  *        n(10~15)            n -10            5(15 +(n-10) - n)         ashr_6
990  */
992         .p2align 4
993 L(ashr_6):
994         mov     $0xffff, %esi
995         pxor    %xmm0, %xmm0
996         movdqa  (%edx), %xmm2
997         movdqa  (%eax), %xmm1
998         pcmpeqb %xmm1, %xmm0
999         pslldq  $10, %xmm2
1000         TOLOWER (%xmm1, %xmm2)
1001         pcmpeqb %xmm1, %xmm2
1002         psubb   %xmm0, %xmm2
1003         pmovmskb %xmm2, %edi
1004         shr     %cl, %esi
1005         shr     %cl, %edi
1006         sub     %edi, %esi
1007         lea     -10(%ecx), %edi
1008         jnz     L(less32bytes)
1010         UPDATE_STRNCMP_COUNTER
1012         movdqa  (%edx), %xmm3
1013         pxor    %xmm0, %xmm0
1014         mov     $16, %ecx
1015         orl     $6, FLAGS
1016         lea     6(%edx), %edi
1017         and     $0xfff, %edi
1018         sub     $0x1000, %edi
1020         .p2align 4
1021 L(loop_ashr_6):
1022         add     $16, %edi
1023         jg      L(nibble_ashr_6)
1025 L(gobble_ashr_6):
1026         movdqa  (%eax, %ecx), %xmm1
1027         movdqa  (%edx, %ecx), %xmm2
1028         movdqa  %xmm2, %xmm4
1030         palignr $6, %xmm3, %xmm2
1031         TOLOWER (%xmm1, %xmm2)
1033         pcmpeqb %xmm1, %xmm0
1034         pcmpeqb %xmm2, %xmm1
1035         psubb   %xmm0, %xmm1
1036         pmovmskb %xmm1, %esi
1037         sub     $0xffff, %esi
1038         jnz     L(exit)
1040 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1041         cmp     $16, REM
1042         lea     -16(REM), REM
1043         jbe     L(more8byteseq)
1044 #endif
1046         add     $16, %ecx
1047         movdqa  %xmm4, %xmm3
1049         add     $16, %edi
1050         jg      L(nibble_ashr_6)
1052         movdqa  (%eax, %ecx), %xmm1
1053         movdqa  (%edx, %ecx), %xmm2
1054         movdqa  %xmm2, %xmm4
1056         palignr $6, %xmm3, %xmm2
1057         TOLOWER (%xmm1, %xmm2)
1059         pcmpeqb %xmm1, %xmm0
1060         pcmpeqb %xmm2, %xmm1
1061         psubb   %xmm0, %xmm1
1062         pmovmskb %xmm1, %esi
1063         sub     $0xffff, %esi
1064         jnz     L(exit)
1065 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1066         cmp     $16, REM
1067         lea     -16(REM), REM
1068         jbe     L(more8byteseq)
1069 #endif
1071         add     $16, %ecx
1072         movdqa  %xmm4, %xmm3
1073         jmp     L(loop_ashr_6)
1075         .p2align 4
1076 L(nibble_ashr_6):
1077         pcmpeqb %xmm3, %xmm0
1078         pmovmskb %xmm0, %esi
1079         test    $0xffc0, %esi
1080         jnz     L(ashr_6_exittail)
1082 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1083         cmp     $10, REM
1084         jbe     L(ashr_6_exittail)
1085 #endif
1086         pxor    %xmm0, %xmm0
1087         sub     $0x1000, %edi
1088         jmp     L(gobble_ashr_6)
1090         .p2align 4
1091 L(ashr_6_exittail):
1092         movdqa  (%eax, %ecx), %xmm1
1093         psrldq  $6, %xmm0
1094         psrldq  $6, %xmm3
1095         jmp     L(aftertail)
1098  * The following cases will be handled by ashr_7
1099  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1100  *        n(9~15)            n - 9            6(15 +(n-9) - n)         ashr_7
1101  */
1103         .p2align 4
1104 L(ashr_7):
1105         mov     $0xffff, %esi
1106         pxor    %xmm0, %xmm0
1107         movdqa  (%edx), %xmm2
1108         movdqa  (%eax), %xmm1
1109         pcmpeqb %xmm1, %xmm0
1110         pslldq  $9, %xmm2
1111         TOLOWER (%xmm1, %xmm2)
1112         pcmpeqb %xmm1, %xmm2
1113         psubb   %xmm0, %xmm2
1114         pmovmskb %xmm2, %edi
1115         shr     %cl, %esi
1116         shr     %cl, %edi
1117         sub     %edi, %esi
1118         lea     -9(%ecx), %edi
1119         jnz     L(less32bytes)
1121         UPDATE_STRNCMP_COUNTER
1123         movdqa  (%edx), %xmm3
1124         pxor    %xmm0, %xmm0
1125         mov     $16, %ecx
1126         orl     $7, FLAGS
1127         lea     8(%edx), %edi
1128         and     $0xfff, %edi
1129         sub     $0x1000, %edi
1131         .p2align 4
1132 L(loop_ashr_7):
1133         add     $16, %edi
1134         jg      L(nibble_ashr_7)
1136 L(gobble_ashr_7):
1137         movdqa  (%eax, %ecx), %xmm1
1138         movdqa  (%edx, %ecx), %xmm2
1139         movdqa  %xmm2, %xmm4
1141         palignr $7, %xmm3, %xmm2
1142         TOLOWER (%xmm1, %xmm2)
1144         pcmpeqb %xmm1, %xmm0
1145         pcmpeqb %xmm2, %xmm1
1146         psubb   %xmm0, %xmm1
1147         pmovmskb %xmm1, %esi
1148         sub     $0xffff, %esi
1149         jnz     L(exit)
1151 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1152         cmp     $16, REM
1153         lea     -16(REM), REM
1154         jbe     L(more8byteseq)
1155 #endif
1157         add     $16, %ecx
1158         movdqa  %xmm4, %xmm3
1160         add     $16, %edi
1161         jg      L(nibble_ashr_7)
1163         movdqa  (%eax, %ecx), %xmm1
1164         movdqa  (%edx, %ecx), %xmm2
1165         movdqa  %xmm2, %xmm4
1167         palignr $7, %xmm3, %xmm2
1168         TOLOWER (%xmm1, %xmm2)
1170         pcmpeqb %xmm1, %xmm0
1171         pcmpeqb %xmm2, %xmm1
1172         psubb   %xmm0, %xmm1
1173         pmovmskb %xmm1, %esi
1174         sub     $0xffff, %esi
1175         jnz     L(exit)
1177 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1178         cmp     $16, REM
1179         lea     -16(REM), REM
1180         jbe     L(more8byteseq)
1181 #endif
1183         add     $16, %ecx
1184         movdqa  %xmm4, %xmm3
1185         jmp     L(loop_ashr_7)
1187         .p2align 4
1188 L(nibble_ashr_7):
1189         pcmpeqb %xmm3, %xmm0
1190         pmovmskb %xmm0, %esi
1191         test    $0xff80, %esi
1192         jnz     L(ashr_7_exittail)
1194 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1195         cmp     $9, REM
1196         jbe     L(ashr_7_exittail)
1197 #endif
1198         pxor    %xmm0, %xmm0
1199         pxor    %xmm0, %xmm0
1200         sub     $0x1000, %edi
1201         jmp     L(gobble_ashr_7)
1203         .p2align 4
1204 L(ashr_7_exittail):
1205         movdqa  (%eax, %ecx), %xmm1
1206         psrldq  $7, %xmm0
1207         psrldq  $7, %xmm3
1208         jmp     L(aftertail)
1211  * The following cases will be handled by ashr_8
1212  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1213  *        n(8~15)            n - 8            7(15 +(n-8) - n)         ashr_8
1214  */
1215         .p2align 4
1216 L(ashr_8):
1217         mov     $0xffff, %esi
1218         pxor    %xmm0, %xmm0
1219         movdqa  (%edx), %xmm2
1220         movdqa  (%eax), %xmm1
1221         pcmpeqb %xmm1, %xmm0
1222         pslldq  $8, %xmm2
1223         TOLOWER (%xmm1, %xmm2)
1224         pcmpeqb %xmm1, %xmm2
1225         psubb   %xmm0, %xmm2
1226         pmovmskb %xmm2, %edi
1227         shr     %cl, %esi
1228         shr     %cl, %edi
1229         sub     %edi, %esi
1230         lea     -8(%ecx), %edi
1231         jnz     L(less32bytes)
1233         UPDATE_STRNCMP_COUNTER
1235         movdqa  (%edx), %xmm3
1236         pxor    %xmm0, %xmm0
1237         mov     $16, %ecx
1238         orl     $8, FLAGS
1239         lea     8(%edx), %edi
1240         and     $0xfff, %edi
1241         sub     $0x1000, %edi
1243         .p2align 4
1244 L(loop_ashr_8):
1245         add     $16, %edi
1246         jg      L(nibble_ashr_8)
1248 L(gobble_ashr_8):
1249         movdqa  (%eax, %ecx), %xmm1
1250         movdqa  (%edx, %ecx), %xmm2
1251         movdqa  %xmm2, %xmm4
1253         palignr $8, %xmm3, %xmm2
1254         TOLOWER (%xmm1, %xmm2)
1256         pcmpeqb %xmm1, %xmm0
1257         pcmpeqb %xmm2, %xmm1
1258         psubb   %xmm0, %xmm1
1259         pmovmskb %xmm1, %esi
1260         sub     $0xffff, %esi
1261         jnz     L(exit)
1263 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1264         cmp     $16, REM
1265         lea     -16(REM), REM
1266         jbe     L(more8byteseq)
1267 #endif
1268         add     $16, %ecx
1269         movdqa  %xmm4, %xmm3
1271         add     $16, %edi
1272         jg      L(nibble_ashr_8)
1274         movdqa  (%eax, %ecx), %xmm1
1275         movdqa  (%edx, %ecx), %xmm2
1276         movdqa  %xmm2, %xmm4
1278         palignr $8, %xmm3, %xmm2
1279         TOLOWER (%xmm1, %xmm2)
1281         pcmpeqb %xmm1, %xmm0
1282         pcmpeqb %xmm2, %xmm1
1283         psubb   %xmm0, %xmm1
1284         pmovmskb %xmm1, %esi
1285         sub     $0xffff, %esi
1286         jnz     L(exit)
1288 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1289         cmp     $16, REM
1290         lea     -16(REM), REM
1291         jbe     L(more8byteseq)
1292 #endif
1293         add     $16, %ecx
1294         movdqa  %xmm4, %xmm3
1295         jmp     L(loop_ashr_8)
1297         .p2align 4
1298 L(nibble_ashr_8):
1299         pcmpeqb %xmm3, %xmm0
1300         pmovmskb %xmm0, %esi
1301         test    $0xff00, %esi
1302         jnz     L(ashr_8_exittail)
1304 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1305         cmp     $8, REM
1306         jbe     L(ashr_8_exittail)
1307 #endif
1308         pxor    %xmm0, %xmm0
1309         pxor    %xmm0, %xmm0
1310         sub     $0x1000, %edi
1311         jmp     L(gobble_ashr_8)
1313         .p2align 4
1314 L(ashr_8_exittail):
1315         movdqa  (%eax, %ecx), %xmm1
1316         psrldq  $8, %xmm0
1317         psrldq  $8, %xmm3
1318         jmp     L(aftertail)
1321  * The following cases will be handled by ashr_9
1322  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1323  *        n(7~15)            n - 7            8(15 +(n-7) - n)         ashr_9
1324  */
1325         .p2align 4
1326 L(ashr_9):
1327         mov     $0xffff, %esi
1328         pxor    %xmm0, %xmm0
1329         movdqa  (%edx), %xmm2
1330         movdqa  (%eax), %xmm1
1331         pcmpeqb %xmm1, %xmm0
1332         pslldq  $7, %xmm2
1333         TOLOWER (%xmm1, %xmm2)
1334         pcmpeqb %xmm1, %xmm2
1335         psubb   %xmm0, %xmm2
1336         pmovmskb %xmm2, %edi
1337         shr     %cl, %esi
1338         shr     %cl, %edi
1339         sub     %edi, %esi
1340         lea     -7(%ecx), %edi
1341         jnz     L(less32bytes)
1343         UPDATE_STRNCMP_COUNTER
1345         movdqa  (%edx), %xmm3
1346         pxor    %xmm0, %xmm0
1347         mov     $16, %ecx
1348         orl     $9, FLAGS
1349         lea     9(%edx), %edi
1350         and     $0xfff, %edi
1351         sub     $0x1000, %edi
1353         .p2align 4
1354 L(loop_ashr_9):
1355         add     $16, %edi
1356         jg      L(nibble_ashr_9)
1358 L(gobble_ashr_9):
1359         movdqa  (%eax, %ecx), %xmm1
1360         movdqa  (%edx, %ecx), %xmm2
1361         movdqa  %xmm2, %xmm4
1363         palignr $9, %xmm3, %xmm2
1364         TOLOWER (%xmm1, %xmm2)
1366         pcmpeqb %xmm1, %xmm0
1367         pcmpeqb %xmm2, %xmm1
1368         psubb   %xmm0, %xmm1
1369         pmovmskb %xmm1, %esi
1370         sub     $0xffff, %esi
1371         jnz     L(exit)
1373 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1374         cmp     $16, REM
1375         lea     -16(REM), REM
1376         jbe     L(more8byteseq)
1377 #endif
1378         add     $16, %ecx
1379         movdqa  %xmm4, %xmm3
1381         add     $16, %edi
1382         jg      L(nibble_ashr_9)
1384         movdqa  (%eax, %ecx), %xmm1
1385         movdqa  (%edx, %ecx), %xmm2
1386         movdqa  %xmm2, %xmm4
1388         palignr $9, %xmm3, %xmm2
1389         TOLOWER (%xmm1, %xmm2)
1391         pcmpeqb %xmm1, %xmm0
1392         pcmpeqb %xmm2, %xmm1
1393         psubb   %xmm0, %xmm1
1394         pmovmskb %xmm1, %esi
1395         sub     $0xffff, %esi
1396         jnz     L(exit)
1398 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1399         cmp     $16, REM
1400         lea     -16(REM), REM
1401         jbe     L(more8byteseq)
1402 #endif
1403         add     $16, %ecx
1404         movdqa  %xmm4, %xmm3
1405         jmp     L(loop_ashr_9)
1407         .p2align 4
1408 L(nibble_ashr_9):
1409         pcmpeqb %xmm3, %xmm0
1410         pmovmskb %xmm0, %esi
1411         test    $0xfe00, %esi
1412         jnz     L(ashr_9_exittail)
1414 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1415         cmp     $7, REM
1416         jbe     L(ashr_9_exittail)
1417 #endif
1418         pxor    %xmm0, %xmm0
1419         sub     $0x1000, %edi
1420         jmp     L(gobble_ashr_9)
1422         .p2align 4
1423 L(ashr_9_exittail):
1424         movdqa  (%eax, %ecx), %xmm1
1425         psrldq  $9, %xmm0
1426         psrldq  $9, %xmm3
1427         jmp     L(aftertail)
1430  * The following cases will be handled by ashr_10
1431  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1432  *        n(6~15)            n - 6            9(15 +(n-6) - n)         ashr_10
1433  */
1434         .p2align 4
1435 L(ashr_10):
1436         mov     $0xffff, %esi
1437         pxor    %xmm0, %xmm0
1438         movdqa  (%edx), %xmm2
1439         movdqa  (%eax), %xmm1
1440         pcmpeqb %xmm1, %xmm0
1441         pslldq  $6, %xmm2
1442         TOLOWER (%xmm1, %xmm2)
1443         pcmpeqb %xmm1, %xmm2
1444         psubb   %xmm0, %xmm2
1445         pmovmskb %xmm2, %edi
1446         shr     %cl, %esi
1447         shr     %cl, %edi
1448         sub     %edi, %esi
1449         lea     -6(%ecx), %edi
1450         jnz     L(less32bytes)
1452         UPDATE_STRNCMP_COUNTER
1454         movdqa  (%edx), %xmm3
1455         pxor    %xmm0, %xmm0
1456         mov     $16, %ecx
1457         orl     $10, FLAGS
1458         lea     10(%edx), %edi
1459         and     $0xfff, %edi
1460         sub     $0x1000, %edi
1462         .p2align 4
1463 L(loop_ashr_10):
1464         add     $16, %edi
1465         jg      L(nibble_ashr_10)
1467 L(gobble_ashr_10):
1468         movdqa  (%eax, %ecx), %xmm1
1469         movdqa  (%edx, %ecx), %xmm2
1470         movdqa  %xmm2, %xmm4
1472         palignr $10, %xmm3, %xmm2
1473         TOLOWER (%xmm1, %xmm2)
1475         pcmpeqb %xmm1, %xmm0
1476         pcmpeqb %xmm2, %xmm1
1477         psubb   %xmm0, %xmm1
1478         pmovmskb %xmm1, %esi
1479         sub     $0xffff, %esi
1480         jnz     L(exit)
1482 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1483         cmp     $16, REM
1484         lea     -16(REM), REM
1485         jbe     L(more8byteseq)
1486 #endif
1487         add     $16, %ecx
1488         movdqa  %xmm4, %xmm3
1490         add     $16, %edi
1491         jg      L(nibble_ashr_10)
1493         movdqa  (%eax, %ecx), %xmm1
1494         movdqa  (%edx, %ecx), %xmm2
1495         movdqa  %xmm2, %xmm4
1497         palignr $10, %xmm3, %xmm2
1498         TOLOWER (%xmm1, %xmm2)
1500         pcmpeqb %xmm1, %xmm0
1501         pcmpeqb %xmm2, %xmm1
1502         psubb   %xmm0, %xmm1
1503         pmovmskb %xmm1, %esi
1504         sub     $0xffff, %esi
1505         jnz     L(exit)
1507 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1508         cmp     $16, REM
1509         lea     -16(REM), REM
1510         jbe     L(more8byteseq)
1511 #endif
1512         add     $16, %ecx
1513         movdqa  %xmm4, %xmm3
1514         jmp     L(loop_ashr_10)
1516         .p2align 4
1517 L(nibble_ashr_10):
1518         pcmpeqb %xmm3, %xmm0
1519         pmovmskb %xmm0, %esi
1520         test    $0xfc00, %esi
1521         jnz     L(ashr_10_exittail)
1523 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1524         cmp     $6, REM
1525         jbe     L(ashr_10_exittail)
1526 #endif
1527         pxor    %xmm0, %xmm0
1528         sub     $0x1000, %edi
1529         jmp     L(gobble_ashr_10)
1531         .p2align 4
1532 L(ashr_10_exittail):
1533         movdqa  (%eax, %ecx), %xmm1
1534         psrldq  $10, %xmm0
1535         psrldq  $10, %xmm3
1536         jmp     L(aftertail)
1539  * The following cases will be handled by ashr_11
1540  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1541  *        n(5~15)            n - 5            10(15 +(n-5) - n)         ashr_11
1542  */
1543         .p2align 4
1544 L(ashr_11):
1545         mov     $0xffff, %esi
1546         pxor    %xmm0, %xmm0
1547         movdqa  (%edx), %xmm2
1548         movdqa  (%eax), %xmm1
1549         pcmpeqb %xmm1, %xmm0
1550         pslldq  $5, %xmm2
1551         TOLOWER (%xmm1, %xmm2)
1552         pcmpeqb %xmm1, %xmm2
1553         psubb   %xmm0, %xmm2
1554         pmovmskb %xmm2, %edi
1555         shr     %cl, %esi
1556         shr     %cl, %edi
1557         sub     %edi, %esi
1558         lea     -5(%ecx), %edi
1559         jnz     L(less32bytes)
1561         UPDATE_STRNCMP_COUNTER
1563         movdqa  (%edx), %xmm3
1564         pxor    %xmm0, %xmm0
1565         mov     $16, %ecx
1566         orl     $11, FLAGS
1567         lea     11(%edx), %edi
1568         and     $0xfff, %edi
1569         sub     $0x1000, %edi
1571         .p2align 4
1572 L(loop_ashr_11):
1573         add     $16, %edi
1574         jg      L(nibble_ashr_11)
1576 L(gobble_ashr_11):
1577         movdqa  (%eax, %ecx), %xmm1
1578         movdqa  (%edx, %ecx), %xmm2
1579         movdqa  %xmm2, %xmm4
1581         palignr $11, %xmm3, %xmm2
1582         TOLOWER (%xmm1, %xmm2)
1584         pcmpeqb %xmm1, %xmm0
1585         pcmpeqb %xmm2, %xmm1
1586         psubb   %xmm0, %xmm1
1587         pmovmskb %xmm1, %esi
1588         sub     $0xffff, %esi
1589         jnz     L(exit)
1591 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1592         cmp     $16, REM
1593         lea     -16(REM), REM
1594         jbe     L(more8byteseq)
1595 #endif
1596         add     $16, %ecx
1597         movdqa  %xmm4, %xmm3
1599         add     $16, %edi
1600         jg      L(nibble_ashr_11)
1602         movdqa  (%eax, %ecx), %xmm1
1603         movdqa  (%edx, %ecx), %xmm2
1604         movdqa  %xmm2, %xmm4
1606         palignr $11, %xmm3, %xmm2
1607         TOLOWER (%xmm1, %xmm2)
1609         pcmpeqb %xmm1, %xmm0
1610         pcmpeqb %xmm2, %xmm1
1611         psubb   %xmm0, %xmm1
1612         pmovmskb %xmm1, %esi
1613         sub     $0xffff, %esi
1614         jnz     L(exit)
1616 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1617         cmp     $16, REM
1618         lea     -16(REM), REM
1619         jbe     L(more8byteseq)
1620 #endif
1621         add     $16, %ecx
1622         movdqa  %xmm4, %xmm3
1623         jmp     L(loop_ashr_11)
1625         .p2align 4
1626 L(nibble_ashr_11):
1627         pcmpeqb %xmm3, %xmm0
1628         pmovmskb %xmm0, %esi
1629         test    $0xf800, %esi
1630         jnz     L(ashr_11_exittail)
1632 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1633         cmp     $5, REM
1634         jbe     L(ashr_11_exittail)
1635 #endif
1636         pxor    %xmm0, %xmm0
1637         sub     $0x1000, %edi
1638         jmp     L(gobble_ashr_11)
1640         .p2align 4
1641 L(ashr_11_exittail):
1642         movdqa  (%eax, %ecx), %xmm1
1643         psrldq  $11, %xmm0
1644         psrldq  $11, %xmm3
1645         jmp     L(aftertail)
1648  * The following cases will be handled by ashr_12
1649  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1650  *        n(4~15)            n - 4            11(15 +(n-4) - n)         ashr_12
1651  */
1652         .p2align 4
1653 L(ashr_12):
1654         mov     $0xffff, %esi
1655         pxor    %xmm0, %xmm0
1656         movdqa  (%edx), %xmm2
1657         movdqa  (%eax), %xmm1
1658         pcmpeqb %xmm1, %xmm0
1659         pslldq  $4, %xmm2
1660         TOLOWER (%xmm1, %xmm2)
1661         pcmpeqb %xmm1, %xmm2
1662         psubb   %xmm0, %xmm2
1663         pmovmskb %xmm2, %edi
1664         shr     %cl, %esi
1665         shr     %cl, %edi
1666         sub     %edi, %esi
1667         lea     -4(%ecx), %edi
1668         jnz     L(less32bytes)
1670         UPDATE_STRNCMP_COUNTER
1672         movdqa  (%edx), %xmm3
1673         pxor    %xmm0, %xmm0
1674         mov     $16, %ecx
1675         orl     $12, FLAGS
1676         lea     12(%edx), %edi
1677         and     $0xfff, %edi
1678         sub     $0x1000, %edi
1680         .p2align 4
1681 L(loop_ashr_12):
1682         add     $16, %edi
1683         jg      L(nibble_ashr_12)
1685 L(gobble_ashr_12):
1686         movdqa  (%eax, %ecx), %xmm1
1687         movdqa  (%edx, %ecx), %xmm2
1688         movdqa  %xmm2, %xmm4
1690         palignr $12, %xmm3, %xmm2
1691         TOLOWER (%xmm1, %xmm2)
1693         pcmpeqb %xmm1, %xmm0
1694         pcmpeqb %xmm2, %xmm1
1695         psubb   %xmm0, %xmm1
1696         pmovmskb %xmm1, %esi
1697         sub     $0xffff, %esi
1698         jnz     L(exit)
1700 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1701         cmp     $16, REM
1702         lea     -16(REM), REM
1703         jbe     L(more8byteseq)
1704 #endif
1706         add     $16, %ecx
1707         movdqa  %xmm4, %xmm3
1709         add     $16, %edi
1710         jg      L(nibble_ashr_12)
1712         movdqa  (%eax, %ecx), %xmm1
1713         movdqa  (%edx, %ecx), %xmm2
1714         movdqa  %xmm2, %xmm4
1716         palignr $12, %xmm3, %xmm2
1717         TOLOWER (%xmm1, %xmm2)
1719         pcmpeqb %xmm1, %xmm0
1720         pcmpeqb %xmm2, %xmm1
1721         psubb   %xmm0, %xmm1
1722         pmovmskb %xmm1, %esi
1723         sub     $0xffff, %esi
1724         jnz     L(exit)
1726 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1727         cmp     $16, REM
1728         lea     -16(REM), REM
1729         jbe     L(more8byteseq)
1730 #endif
1731         add     $16, %ecx
1732         movdqa  %xmm4, %xmm3
1733         jmp     L(loop_ashr_12)
1735         .p2align 4
1736 L(nibble_ashr_12):
1737         pcmpeqb %xmm3, %xmm0
1738         pmovmskb %xmm0, %esi
1739         test    $0xf000, %esi
1740         jnz     L(ashr_12_exittail)
1742 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1743         cmp     $4, REM
1744         jbe     L(ashr_12_exittail)
1745 #endif
1746         pxor    %xmm0, %xmm0
1747         sub     $0x1000, %edi
1748         jmp     L(gobble_ashr_12)
1750         .p2align 4
1751 L(ashr_12_exittail):
1752         movdqa  (%eax, %ecx), %xmm1
1753         psrldq  $12, %xmm0
1754         psrldq  $12, %xmm3
1755         jmp     L(aftertail)
1758  * The following cases will be handled by ashr_13
1759  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1760  *        n(3~15)            n - 3            12(15 +(n-3) - n)         ashr_13
1761  */
1762         .p2align 4
1763 L(ashr_13):
1764         mov     $0xffff, %esi
1765         pxor    %xmm0, %xmm0
1766         movdqa  (%edx), %xmm2
1767         movdqa  (%eax), %xmm1
1768         pcmpeqb %xmm1, %xmm0
1769         pslldq  $3, %xmm2
1770         TOLOWER (%xmm1, %xmm2)
1771         pcmpeqb %xmm1, %xmm2
1772         psubb   %xmm0, %xmm2
1773         pmovmskb %xmm2, %edi
1774         shr     %cl, %esi
1775         shr     %cl, %edi
1776         sub     %edi, %esi
1777         lea     -3(%ecx), %edi
1778         jnz     L(less32bytes)
1780         UPDATE_STRNCMP_COUNTER
1782         movdqa  (%edx), %xmm3
1783         pxor    %xmm0, %xmm0
1784         mov     $16, %ecx
1785         orl     $13, FLAGS
1786         lea     13(%edx), %edi
1787         and     $0xfff, %edi
1788         sub     $0x1000, %edi
1790         .p2align 4
1791 L(loop_ashr_13):
1792         add     $16, %edi
1793         jg      L(nibble_ashr_13)
1795 L(gobble_ashr_13):
1796         movdqa  (%eax, %ecx), %xmm1
1797         movdqa  (%edx, %ecx), %xmm2
1798         movdqa  %xmm2, %xmm4
1800         palignr $13, %xmm3, %xmm2
1801         TOLOWER (%xmm1, %xmm2)
1803         pcmpeqb %xmm1, %xmm0
1804         pcmpeqb %xmm2, %xmm1
1805         psubb   %xmm0, %xmm1
1806         pmovmskb %xmm1, %esi
1807         sub     $0xffff, %esi
1808         jnz     L(exit)
1810 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1811         cmp     $16, REM
1812         lea     -16(REM), REM
1813         jbe     L(more8byteseq)
1814 #endif
1815         add     $16, %ecx
1816         movdqa  %xmm4, %xmm3
1818         add     $16, %edi
1819         jg      L(nibble_ashr_13)
1821         movdqa  (%eax, %ecx), %xmm1
1822         movdqa  (%edx, %ecx), %xmm2
1823         movdqa  %xmm2, %xmm4
1825         palignr $13, %xmm3, %xmm2
1826         TOLOWER (%xmm1, %xmm2)
1828         pcmpeqb %xmm1, %xmm0
1829         pcmpeqb %xmm2, %xmm1
1830         psubb   %xmm0, %xmm1
1831         pmovmskb %xmm1, %esi
1832         sub     $0xffff, %esi
1833         jnz     L(exit)
1835 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1836         cmp     $16, REM
1837         lea     -16(REM), REM
1838         jbe     L(more8byteseq)
1839 #endif
1840         add     $16, %ecx
1841         movdqa  %xmm4, %xmm3
1842         jmp     L(loop_ashr_13)
1844         .p2align 4
1845 L(nibble_ashr_13):
1846         pcmpeqb %xmm3, %xmm0
1847         pmovmskb %xmm0, %esi
1848         test    $0xe000, %esi
1849         jnz     L(ashr_13_exittail)
1851 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1852         cmp     $3, REM
1853         jbe     L(ashr_13_exittail)
1854 #endif
1855         pxor    %xmm0, %xmm0
1856         sub     $0x1000, %edi
1857         jmp     L(gobble_ashr_13)
1859         .p2align 4
1860 L(ashr_13_exittail):
1861         movdqa  (%eax, %ecx), %xmm1
1862         psrldq  $13, %xmm0
1863         psrldq  $13, %xmm3
1864         jmp     L(aftertail)
1867  * The following cases will be handled by ashr_14
1868  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1869  *        n(2~15)            n - 2            13(15 +(n-2) - n)         ashr_14
1870  */
1871         .p2align 4
1872 L(ashr_14):
1873         mov     $0xffff, %esi
1874         pxor    %xmm0, %xmm0
1875         movdqa  (%edx), %xmm2
1876         movdqa  (%eax), %xmm1
1877         pcmpeqb %xmm1, %xmm0
1878         pslldq  $2, %xmm2
1879         TOLOWER (%xmm1, %xmm2)
1880         pcmpeqb %xmm1, %xmm2
1881         psubb   %xmm0, %xmm2
1882         pmovmskb %xmm2, %edi
1883         shr     %cl, %esi
1884         shr     %cl, %edi
1885         sub     %edi, %esi
1886         lea     -2(%ecx), %edi
1887         jnz     L(less32bytes)
1889         UPDATE_STRNCMP_COUNTER
1891         movdqa  (%edx), %xmm3
1892         pxor    %xmm0, %xmm0
1893         mov     $16, %ecx
1894         orl     $14, FLAGS
1895         lea     14(%edx), %edi
1896         and     $0xfff, %edi
1897         sub     $0x1000, %edi
1899         .p2align 4
1900 L(loop_ashr_14):
1901         add     $16, %edi
1902         jg      L(nibble_ashr_14)
1904 L(gobble_ashr_14):
1905         movdqa  (%eax, %ecx), %xmm1
1906         movdqa  (%edx, %ecx), %xmm2
1907         movdqa  %xmm2, %xmm4
1909         palignr $14, %xmm3, %xmm2
1910         TOLOWER (%xmm1, %xmm2)
1912         pcmpeqb %xmm1, %xmm0
1913         pcmpeqb %xmm2, %xmm1
1914         psubb   %xmm0, %xmm1
1915         pmovmskb %xmm1, %esi
1916         sub     $0xffff, %esi
1917         jnz     L(exit)
1919 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1920         cmp     $16, REM
1921         lea     -16(REM), REM
1922         jbe     L(more8byteseq)
1923 #endif
1924         add     $16, %ecx
1925         movdqa  %xmm4, %xmm3
1927         add     $16, %edi
1928         jg      L(nibble_ashr_14)
1930         movdqa  (%eax, %ecx), %xmm1
1931         movdqa  (%edx, %ecx), %xmm2
1932         movdqa  %xmm2, %xmm4
1934         palignr $14, %xmm3, %xmm2
1935         TOLOWER (%xmm1, %xmm2)
1937         pcmpeqb %xmm1, %xmm0
1938         pcmpeqb %xmm2, %xmm1
1939         psubb   %xmm0, %xmm1
1940         pmovmskb %xmm1, %esi
1941         sub     $0xffff, %esi
1942         jnz     L(exit)
1944 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1945         cmp     $16, REM
1946         lea     -16(REM), REM
1947         jbe     L(more8byteseq)
1948 #endif
1949         add     $16, %ecx
1950         movdqa  %xmm4, %xmm3
1951         jmp     L(loop_ashr_14)
1953         .p2align 4
1954 L(nibble_ashr_14):
1955         pcmpeqb %xmm3, %xmm0
1956         pmovmskb %xmm0, %esi
1957         test    $0xc000, %esi
1958         jnz     L(ashr_14_exittail)
1960 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
1961         cmp     $2, REM
1962         jbe     L(ashr_14_exittail)
1963 #endif
1964         pxor    %xmm0, %xmm0
1965         sub     $0x1000, %edi
1966         jmp     L(gobble_ashr_14)
1968         .p2align 4
1969 L(ashr_14_exittail):
1970         movdqa  (%eax, %ecx), %xmm1
1971         psrldq  $14, %xmm0
1972         psrldq  $14, %xmm3
1973         jmp     L(aftertail)
1976  * The following cases will be handled by ashr_14
1977  * ecx(offset of esi)  eax(offset of edi)   relative offset     corresponding case
1978  *        n(1~15)            n - 1            14(15 +(n-1) - n)         ashr_15
1979  */
1981         .p2align 4
1982 L(ashr_15):
1983         mov     $0xffff, %esi
1984         pxor    %xmm0, %xmm0
1985         movdqa  (%edx), %xmm2
1986         movdqa  (%eax), %xmm1
1987         pcmpeqb %xmm1, %xmm0
1988         pslldq  $1, %xmm2
1989         TOLOWER (%xmm1, %xmm2)
1990         pcmpeqb %xmm1, %xmm2
1991         psubb   %xmm0, %xmm2
1992         pmovmskb %xmm2, %edi
1993         shr     %cl, %esi
1994         shr     %cl, %edi
1995         sub     %edi, %esi
1996         lea     -1(%ecx), %edi
1997         jnz     L(less32bytes)
1999         UPDATE_STRNCMP_COUNTER
2001         movdqa  (%edx), %xmm3
2002         pxor    %xmm0, %xmm0
2003         mov     $16, %ecx
2004         orl     $15, FLAGS
2005         lea     15(%edx), %edi
2006         and     $0xfff, %edi
2007         sub     $0x1000, %edi
2009         .p2align 4
2010 L(loop_ashr_15):
2011         add     $16, %edi
2012         jg      L(nibble_ashr_15)
2014 L(gobble_ashr_15):
2015         movdqa  (%eax, %ecx), %xmm1
2016         movdqa  (%edx, %ecx), %xmm2
2017         movdqa  %xmm2, %xmm4
2019         palignr $15, %xmm3, %xmm2
2020         TOLOWER (%xmm1, %xmm2)
2022         pcmpeqb %xmm1, %xmm0
2023         pcmpeqb %xmm2, %xmm1
2024         psubb   %xmm0, %xmm1
2025         pmovmskb %xmm1, %esi
2026         sub     $0xffff, %esi
2027         jnz     L(exit)
2029 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2030         cmp     $16, REM
2031         lea     -16(REM), REM
2032         jbe     L(more8byteseq)
2033 #endif
2034         add     $16, %ecx
2035         movdqa  %xmm4, %xmm3
2037         add     $16, %edi
2038         jg      L(nibble_ashr_15)
2040         movdqa  (%eax, %ecx), %xmm1
2041         movdqa  (%edx, %ecx), %xmm2
2042         movdqa  %xmm2, %xmm4
2044         palignr $15, %xmm3, %xmm2
2045         TOLOWER (%xmm1, %xmm2)
2047         pcmpeqb %xmm1, %xmm0
2048         pcmpeqb %xmm2, %xmm1
2049         psubb   %xmm0, %xmm1
2050         pmovmskb %xmm1, %esi
2051         sub     $0xffff, %esi
2052         jnz     L(exit)
2054 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2055         cmp     $16, REM
2056         lea     -16(REM), REM
2057         jbe     L(more8byteseq)
2058 #endif
2059         add     $16, %ecx
2060         movdqa  %xmm4, %xmm3
2061         jmp     L(loop_ashr_15)
2063         .p2align 4
2064 L(nibble_ashr_15):
2065         pcmpeqb %xmm3, %xmm0
2066         pmovmskb %xmm0, %esi
2067         test    $0x8000, %esi
2068         jnz     L(ashr_15_exittail)
2070 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2071         cmp     $1, REM
2072         jbe     L(ashr_15_exittail)
2073 #endif
2074         pxor    %xmm0, %xmm0
2075         sub     $0x1000, %edi
2076         jmp     L(gobble_ashr_15)
2078         .p2align 4
2079 L(ashr_15_exittail):
2080         movdqa  (%eax, %ecx), %xmm1
2081         psrldq  $15, %xmm0
2082         psrldq  $15, %xmm3
2083         jmp     L(aftertail)
2085         .p2align 4
2086 L(aftertail):
2087         TOLOWER (%xmm1, %xmm3)
2088         pcmpeqb %xmm3, %xmm1
2089         psubb   %xmm0, %xmm1
2090         pmovmskb %xmm1, %esi
2091         not     %esi
2092 L(exit):
2093         mov     FLAGS, %edi
2094         and     $0x1f, %edi
2095         lea     -16(%edi, %ecx), %edi
2096 L(less32bytes):
2097         add     %edi, %edx
2098         add     %ecx, %eax
2099         testl   $0x20, FLAGS
2100         jz      L(ret2)
2101         xchg    %eax, %edx
2103         .p2align 4
2104 L(ret2):
2105         mov     %esi, %ecx
2106 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2107         addl    $4, %esp
2108         cfi_adjust_cfa_offset (-4)
2109 #endif
2110         POP     (%esi)
2111         POP     (%edi)
2112 #if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
2113         POP     (FLAGS)
2114 #endif
2115 L(less16bytes):
2116         test    %cl, %cl
2117         jz      L(2next_8_bytes)
2119         test    $0x01, %cl
2120         jnz     L(Byte0)
2122         test    $0x02, %cl
2123         jnz     L(Byte1)
2125         test    $0x04, %cl
2126         jnz     L(Byte2)
2128         test    $0x08, %cl
2129         jnz     L(Byte3)
2131         test    $0x10, %cl
2132         jnz     L(Byte4)
2134         test    $0x20, %cl
2135         jnz     L(Byte5)
2137         test    $0x40, %cl
2138         jnz     L(Byte6)
2139 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2140         cmp     $7, REM
2141         jbe     L(eq)
2142 #endif
2144         movzbl  7(%eax), %ecx
2145         movzbl  7(%edx), %eax
2146 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2147 # ifdef PIC
2148         movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2149         movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
2150 # else
2151         movl    _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2152         movl    _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
2153 # endif
2154 #endif
2156         sub     %ecx, %eax
2157         RETURN
2159 L(Byte0):
2160 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2161         cmp     $0, REM
2162         jbe     L(eq)
2163 #endif
2164         movzbl  (%eax), %ecx
2165         movzbl  (%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
2177         sub     %ecx, %eax
2178         RETURN
2180 L(Byte1):
2181 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2182         cmp     $1, REM
2183         jbe     L(eq)
2184 #endif
2185         movzbl  1(%eax), %ecx
2186         movzbl  1(%edx), %eax
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
2198         sub     %ecx, %eax
2199         RETURN
2201 L(Byte2):
2202 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2203         cmp     $2, REM
2204         jbe     L(eq)
2205 #endif
2206         movzbl  2(%eax), %ecx
2207         movzbl  2(%edx), %eax
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
2219         sub     %ecx, %eax
2220         RETURN
2222 L(Byte3):
2223 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2224         cmp     $3, REM
2225         jbe     L(eq)
2226 #endif
2227         movzbl  3(%eax), %ecx
2228         movzbl  3(%edx), %eax
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
2240         sub     %ecx, %eax
2241         RETURN
2243 L(Byte4):
2244 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2245         cmp     $4, REM
2246         jbe     L(eq)
2247 #endif
2248         movzbl  4(%eax), %ecx
2249         movzbl  4(%edx), %eax
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
2261         sub     %ecx, %eax
2262         RETURN
2264 L(Byte5):
2265 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2266         cmp     $5, REM
2267         jbe     L(eq)
2268 #endif
2269         movzbl  5(%eax), %ecx
2270         movzbl  5(%edx), %eax
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
2282         sub     %ecx, %eax
2283         RETURN
2285 L(Byte6):
2286 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2287         cmp     $6, REM
2288         jbe     L(eq)
2289 #endif
2290         movzbl  6(%eax), %ecx
2291         movzbl  6(%edx), %eax
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
2303         sub     %ecx, %eax
2304         RETURN
2306 L(2next_8_bytes):
2307         add     $8, %eax
2308         add     $8, %edx
2309 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2310         cmp     $8, REM
2311         lea     -8(REM), REM
2312         jbe     L(eq)
2313 #endif
2315         test    $0x01, %ch
2316         jnz     L(Byte0)
2318         test    $0x02, %ch
2319         jnz     L(Byte1)
2321         test    $0x04, %ch
2322         jnz     L(Byte2)
2324         test    $0x08, %ch
2325         jnz     L(Byte3)
2327         test    $0x10, %ch
2328         jnz     L(Byte4)
2330         test    $0x20, %ch
2331         jnz     L(Byte5)
2333         test    $0x40, %ch
2334         jnz     L(Byte6)
2336 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2337         cmp     $7, REM
2338         jbe     L(eq)
2339 #endif
2340         movzbl  7(%eax), %ecx
2341         movzbl  7(%edx), %eax
2343 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2344 # ifdef PIC
2345         movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2346         movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
2347 # else
2348         movl    _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2349         movl    _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
2350 # endif
2351 #endif
2353         sub     %ecx, %eax
2354         RETURN
2356 #ifdef USE_AS_STRNCMP
2357 L(neq_sncmp):
2358 #endif
2359 L(neq):
2360         mov     $1, %eax
2361         ja      L(neq_bigger)
2362         neg     %eax
2363 L(neq_bigger):
2364 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2365         addl    $4, %esp
2366         cfi_adjust_cfa_offset (-4)
2367 #endif
2368 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2369         POP     (REM)
2370 #endif
2371 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2372 # ifdef PIC
2373         POP     (%ebx)
2374 # endif
2375 #endif
2376         ret
2378 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2379         .p2align 4
2380         cfi_restore_state
2381 L(more8byteseq):
2383 # ifdef USE_AS_STRNCASECMP_L
2384         addl    $4, %esp
2385         cfi_adjust_cfa_offset (-4)
2386 # endif
2387         POP     (%esi)
2388         POP     (%edi)
2389 # ifdef USE_AS_STRNCMP
2390         POP     (FLAGS)
2391 # endif
2392 #endif
2394 #ifdef USE_AS_STRNCMP
2395 L(eq_sncmp):
2396 #endif
2397 L(eq):
2399 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2400         POP     (REM)
2401 #endif
2402 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
2403 # ifdef PIC
2404         POP     (%ebx)
2405 # endif
2406 #endif
2407         xorl    %eax, %eax
2408         ret
2410 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
2411         .p2align 4
2412 # if defined USE_AS_STRNCASECMP_L && defined PIC
2413         CFI_PUSH (%ebx)
2414 # endif
2415         CFI_PUSH (REM)
2416 L(less16bytes_sncmp):
2417 # ifdef USE_AS_STRNCASECMP_L
2418         PUSH    (%esi)
2419 # endif
2420         test    REM, REM
2421         jz      L(eq_sncmp)
2423         movzbl  (%eax), %ecx
2424 # ifdef USE_AS_STRNCASECMP_L
2425         movzbl  (%edx), %esi
2426 #  ifdef PIC
2427         movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2428         movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2429 #  else
2430         movl    _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2431         movl    _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2432 #  endif
2433         cmpl    %ecx, %esi
2434 # else
2435         cmpb    %cl, (%edx)
2436 # endif
2437         jne     L(neq_sncmp)
2438         test    %cl, %cl
2439         je      L(eq_sncmp)
2441         cmp     $1, REM
2442         je      L(eq_sncmp)
2444         movzbl  1(%eax), %ecx
2445 # ifdef USE_AS_STRNCASECMP_L
2446         movzbl  1(%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, 1(%edx)
2457 # endif
2458         jne     L(neq_sncmp)
2459         test    %cl, %cl
2460         je      L(eq_sncmp)
2462         cmp     $2, REM
2463         je      L(eq_sncmp)
2465         movzbl  2(%eax), %ecx
2466 # ifdef USE_AS_STRNCASECMP_L
2467         movzbl  2(%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, 2(%edx)
2478 # endif
2479         jne     L(neq_sncmp)
2480         test    %cl, %cl
2481         je      L(eq_sncmp)
2483         cmp     $3, REM
2484         je      L(eq_sncmp)
2486         movzbl  3(%eax), %ecx
2487 # ifdef USE_AS_STRNCASECMP_L
2488         movzbl  3(%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, 3(%edx)
2499 # endif
2500         jne     L(neq_sncmp)
2501         test    %cl, %cl
2502         je      L(eq_sncmp)
2504         cmp     $4, REM
2505         je      L(eq_sncmp)
2507         movzbl  4(%eax), %ecx
2508 # ifdef USE_AS_STRNCASECMP_L
2509         movzbl  4(%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, 4(%edx)
2520 # endif
2521         jne     L(neq_sncmp)
2522         test    %cl, %cl
2523         je      L(eq_sncmp)
2525         cmp     $5, REM
2526         je      L(eq_sncmp)
2528         movzbl  5(%eax), %ecx
2529 # ifdef USE_AS_STRNCASECMP_L
2530         movzbl  5(%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, 5(%edx)
2541 # endif
2542         jne     L(neq_sncmp)
2543         test    %cl, %cl
2544         je      L(eq_sncmp)
2546         cmp     $6, REM
2547         je      L(eq_sncmp)
2549         movzbl  6(%eax), %ecx
2550 # ifdef USE_AS_STRNCASECMP_L
2551         movzbl  6(%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, 6(%edx)
2562 # endif
2563         jne     L(neq_sncmp)
2564         test    %cl, %cl
2565         je      L(eq_sncmp)
2567         cmp     $7, REM
2568         je      L(eq_sncmp)
2570         movzbl  7(%eax), %ecx
2571 # ifdef USE_AS_STRNCASECMP_L
2572         movzbl  7(%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, 7(%edx)
2583 # endif
2584         jne     L(neq_sncmp)
2585         test    %cl, %cl
2586         je      L(eq_sncmp)
2589         cmp     $8, REM
2590         je      L(eq_sncmp)
2592         movzbl  8(%eax), %ecx
2593 # ifdef USE_AS_STRNCASECMP_L
2594         movzbl  8(%edx), %esi
2595 #  ifdef PIC
2596         movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2597         movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2598 #  else
2599         movl    _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2600         movl    _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2601 #  endif
2602         cmpl    %ecx, %esi
2603 # else
2604         cmpb    %cl, 8(%edx)
2605 # endif
2606         jne     L(neq_sncmp)
2607         test    %cl, %cl
2608         je      L(eq_sncmp)
2610         cmp     $9, REM
2611         je      L(eq_sncmp)
2613         movzbl  9(%eax), %ecx
2614 # ifdef USE_AS_STRNCASECMP_L
2615         movzbl  9(%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, 9(%edx)
2626 # endif
2627         jne     L(neq_sncmp)
2628         test    %cl, %cl
2629         je      L(eq_sncmp)
2631         cmp     $10, REM
2632         je      L(eq_sncmp)
2634         movzbl  10(%eax), %ecx
2635 # ifdef USE_AS_STRNCASECMP_L
2636         movzbl  10(%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, 10(%edx)
2647 # endif
2648         jne     L(neq_sncmp)
2649         test    %cl, %cl
2650         je      L(eq_sncmp)
2652         cmp     $11, REM
2653         je      L(eq_sncmp)
2655         movzbl  11(%eax), %ecx
2656 # ifdef USE_AS_STRNCASECMP_L
2657         movzbl  11(%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, 11(%edx)
2668 # endif
2669         jne     L(neq_sncmp)
2670         test    %cl, %cl
2671         je      L(eq_sncmp)
2674         cmp     $12, REM
2675         je      L(eq_sncmp)
2677         movzbl  12(%eax), %ecx
2678 # ifdef USE_AS_STRNCASECMP_L
2679         movzbl  12(%edx), %esi
2680 #  ifdef PIC
2681         movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
2682         movl    _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
2683 #  else
2684         movl    _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
2685         movl    _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
2686 #  endif
2687         cmpl    %ecx, %esi
2688 # else
2689         cmpb    %cl, 12(%edx)
2690 # endif
2691         jne     L(neq_sncmp)
2692         test    %cl, %cl
2693         je      L(eq_sncmp)
2695         cmp     $13, REM
2696         je      L(eq_sncmp)
2698         movzbl  13(%eax), %ecx
2699 # ifdef USE_AS_STRNCASECMP_L
2700         movzbl  13(%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, 13(%edx)
2711 # endif
2712         jne     L(neq_sncmp)
2713         test    %cl, %cl
2714         je      L(eq_sncmp)
2716         cmp     $14, REM
2717         je      L(eq_sncmp)
2719         movzbl  14(%eax), %ecx
2720 # ifdef USE_AS_STRNCASECMP_L
2721         movzbl  14(%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, 14(%edx)
2732 # endif
2733         jne     L(neq_sncmp)
2734         test    %cl, %cl
2735         je      L(eq_sncmp)
2737         cmp     $15, REM
2738         je      L(eq_sncmp)
2740         movzbl  15(%eax), %ecx
2741 # ifdef USE_AS_STRNCASECMP_L
2742         movzbl  15(%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, 15(%edx)
2753 # endif
2754         jne     L(neq_sncmp)
2756 # ifdef USE_AS_STRNCASECMP_L
2757 L(eq_sncmp):
2758         POP     (%esi)
2759 # endif
2760         POP     (REM)
2761 # if defined USE_AS_STRNCASECMP_L && defined PIC
2762         POP     (%ebx)
2763 # endif
2764         xor     %eax, %eax
2765         ret
2767 # ifdef USE_AS_STRNCASECMP_L
2768         .p2align 4
2769 #  ifdef PIC
2770         CFI_PUSH (%ebx)
2771 #  endif
2772         CFI_PUSH (REM)
2773         CFI_PUSH (%esi)
2774 L(neq_sncmp):
2775         mov     $1, %eax
2776         mov     $-1, %edx
2777         cmovna  %edx, %eax
2778         POP     (%esi)
2779         POP     (REM)
2780 #  ifdef PIC
2781         POP     (%ebx)
2782 #  endif
2783         ret
2784 # endif
2785 #endif
2787 END (STRCMP)
2789 #endif