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/>. */
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); \
33 #define PUSH(REG) pushl REG; CFI_PUSH (REG)
34 #define POP(REG) popl REG; CFI_POP (REG)
38 # define STRCMP __strncmp_sse4_2
43 # define RETURN POP (REM); ret; .p2align 4; CFI_PUSH (REM)
45 #elif defined USE_AS_STRCASECMP_L
46 # include "locale-defines.h"
48 # define STRCMP __strcasecmp_l_sse4_2
56 # define LOCALE 12 /* Loaded before the adjustment. */
58 # define RETURN POP (%edi); POP (%ebx); ret; \
59 .p2align 4; CFI_PUSH (%ebx); CFI_PUSH (%edi)
61 # define RETURN POP (%edi); ret; .p2align 4; CFI_PUSH (%edi)
63 # define NONASCII __strcasecmp_nonascii
64 #elif defined USE_AS_STRNCASECMP_L
65 # include "locale-defines.h"
67 # define STRCMP __strncasecmp_l_sse4_2
76 # define LOCALE 16 /* Loaded before the adjustment. */
78 # define RETURN POP (%edi); POP (REM); POP (%ebx); ret; \
80 CFI_PUSH (%ebx); CFI_PUSH (REM); CFI_PUSH (%edi)
82 # define RETURN POP (%edi); POP (REM); ret; \
83 .p2align 4; CFI_PUSH (REM); CFI_PUSH (%edi)
86 # define NONASCII __strncasecmp_nonascii
89 # define STRCMP __strcmp_sse4_2
93 # define RETURN ret; .p2align 4
96 .section .text.sse4.2,"ax",@progbits
98 #ifdef USE_AS_STRCASECMP_L
99 ENTRY (__strcasecmp_sse4_2)
103 movl __libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
104 # ifdef NO_TLS_DIRECT_SEG_REFS
108 movl %gs:(%eax), %eax
111 # ifdef NO_TLS_DIRECT_SEG_REFS
113 movl __libc_tsd_LOCALE@NTPOFF(%eax), %eax
115 movl %gs:__libc_tsd_LOCALE@NTPOFF, %eax
118 # if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
119 movl LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
123 testl $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
127 jmp __strcasecmp_nonascii
129 jne __strcasecmp_nonascii
132 END (__strcasecmp_sse4_2)
135 #ifdef USE_AS_STRNCASECMP_L
136 ENTRY (__strncasecmp_sse4_2)
140 movl __libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
141 # ifdef NO_TLS_DIRECT_SEG_REFS
145 movl %gs:(%eax), %eax
148 # ifdef NO_TLS_DIRECT_SEG_REFS
150 movl __libc_tsd_LOCALE@NTPOFF(%eax), %eax
152 movl %gs:__libc_tsd_LOCALE@NTPOFF, %eax
155 # if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
156 movl LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
160 testl $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
164 jmp __strncasecmp_nonascii
166 jne __strncasecmp_nonascii
169 END (__strncasecmp_sse4_2)
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
180 testl $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
188 .section .rodata.cst16,"aM",@progbits,16
191 .quad 0x4040404040404040
192 .quad 0x4040404040404040
194 .quad 0x5b5b5b5b5b5b5b5b
195 .quad 0x5b5b5b5b5b5b5b5b
197 .quad 0x2020202020202020
198 .quad 0x2020202020202020
202 # define UCLOW_reg .Lbelowupper@GOTOFF(%ebx)
203 # define UCHIGH_reg .Ltopupper@GOTOFF(%ebx)
204 # define LCQWORD_reg .Ltouppermask@GOTOFF(%ebx)
206 # define UCLOW_reg .Lbelowupper
207 # define UCHIGH_reg .Ltopupper
208 # define LCQWORD_reg .Ltouppermask
212 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
215 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
220 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
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; \
246 pand LCQWORD_reg, %xmm3; \
247 pand LCQWORD_reg, %xmm5; \
252 TOLOWER (%xmm2, %xmm1)
259 # define TOLOWER(reg1, reg)
265 #if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
276 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
284 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
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
290 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
291 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
301 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
307 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
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
313 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
314 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
324 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
329 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
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
335 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
336 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
346 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
351 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
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
357 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
358 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
368 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
373 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
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
379 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
380 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
390 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
395 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
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
401 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
402 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
412 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
417 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
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
423 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
424 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
434 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
439 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
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
445 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
446 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
456 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
463 #if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
467 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
480 lea -0xff0(%ecx), %edx
486 movdqu (%esi,%edx), %xmm2
487 movdqu (%edi,%edx), %xmm1
488 TOLOWER (%xmm2, %xmm1)
489 pcmpistri $0x1a, %xmm2, %xmm1
492 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
500 movzbl (%edi,%edx), %eax
501 movzbl (%esi,%edx), %ecx
502 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
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
507 movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
508 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
515 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
529 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
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
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
541 movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
542 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
549 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
552 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
560 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
564 # ifdef USE_AS_STRNCMP
580 add $0xfefefeff, %ecx
582 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
592 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
596 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
608 add $0xfefefeff, %ecx
610 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
619 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
629 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
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
635 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
636 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
646 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
651 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
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
657 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
658 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
668 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
674 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
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
680 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
681 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
691 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
696 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
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
702 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
703 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
714 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
719 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
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
725 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
726 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
737 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
742 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
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
748 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
749 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
759 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
764 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
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
770 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
771 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
781 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
786 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
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
792 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
793 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi