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