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