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