2 Copyright (C) 2010-2024 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
22 #include "asm-syntax.h"
24 #define CFI_PUSH(REG) \
25 cfi_adjust_cfa_offset (4); \
26 cfi_rel_offset (REG, 0)
28 #define CFI_POP(REG) \
29 cfi_adjust_cfa_offset (-4); \
32 #define PUSH(REG) pushl REG; CFI_PUSH (REG)
33 #define POP(REG) popl REG; CFI_POP (REG)
37 # define STRCMP __strncmp_sse4_2
42 # define RETURN POP (REM); ret; .p2align 4; CFI_PUSH (REM)
44 #elif defined USE_AS_STRCASECMP_L
45 # include "locale-defines.h"
47 # define STRCMP __strcasecmp_l_sse4_2
55 # define LOCALE 12 /* Loaded before the adjustment. */
57 # define RETURN POP (%edi); POP (%ebx); ret; \
58 .p2align 4; CFI_PUSH (%ebx); CFI_PUSH (%edi)
60 # define RETURN POP (%edi); ret; .p2align 4; CFI_PUSH (%edi)
62 # define NONASCII __strcasecmp_nonascii
63 #elif defined USE_AS_STRNCASECMP_L
64 # include "locale-defines.h"
66 # define STRCMP __strncasecmp_l_sse4_2
75 # define LOCALE 16 /* Loaded before the adjustment. */
77 # define RETURN POP (%edi); POP (REM); POP (%ebx); ret; \
79 CFI_PUSH (%ebx); CFI_PUSH (REM); CFI_PUSH (%edi)
81 # define RETURN POP (%edi); POP (REM); ret; \
82 .p2align 4; CFI_PUSH (REM); CFI_PUSH (%edi)
85 # define NONASCII __strncasecmp_nonascii
88 # define STRCMP __strcmp_sse4_2
92 # define RETURN ret; .p2align 4
95 .section .text.sse4.2,"ax",@progbits
97 #ifdef USE_AS_STRCASECMP_L
98 ENTRY (__strcasecmp_sse4_2)
102 movl __libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
103 movl %gs:(%eax), %eax
105 movl %gs:__libc_tsd_LOCALE@NTPOFF, %eax
107 # if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
108 movl LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
112 testl $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
116 jmp __strcasecmp_nonascii
118 jne __strcasecmp_nonascii
121 END (__strcasecmp_sse4_2)
124 #ifdef USE_AS_STRNCASECMP_L
125 ENTRY (__strncasecmp_sse4_2)
129 movl __libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
130 movl %gs:(%eax), %eax
132 movl %gs:__libc_tsd_LOCALE@NTPOFF, %eax
134 # if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
135 movl LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
139 testl $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
143 jmp __strncasecmp_nonascii
145 jne __strncasecmp_nonascii
148 END (__strncasecmp_sse4_2)
152 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
153 movl LOCALE(%esp), %eax
154 # if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
155 movl LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
159 testl $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
167 .section .rodata.cst16,"aM",@progbits,16
170 .quad 0x4040404040404040
171 .quad 0x4040404040404040
173 .quad 0x5b5b5b5b5b5b5b5b
174 .quad 0x5b5b5b5b5b5b5b5b
176 .quad 0x2020202020202020
177 .quad 0x2020202020202020
181 # define UCLOW_reg .Lbelowupper@GOTOFF(%ebx)
182 # define UCHIGH_reg .Ltopupper@GOTOFF(%ebx)
183 # define LCQWORD_reg .Ltouppermask@GOTOFF(%ebx)
185 # define UCLOW_reg .Lbelowupper
186 # define UCHIGH_reg .Ltopupper
187 # define LCQWORD_reg .Ltouppermask
191 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
194 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
199 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
213 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
214 # define TOLOWER(reg1, reg2) \
215 movdqa reg1, %xmm3; \
216 movdqa UCHIGH_reg, %xmm4; \
217 movdqa reg2, %xmm5; \
218 movdqa UCHIGH_reg, %xmm6; \
219 pcmpgtb UCLOW_reg, %xmm3; \
220 pcmpgtb reg1, %xmm4; \
221 pcmpgtb UCLOW_reg, %xmm5; \
222 pcmpgtb reg2, %xmm6; \
225 pand LCQWORD_reg, %xmm3; \
226 pand LCQWORD_reg, %xmm5; \
231 TOLOWER (%xmm2, %xmm1)
238 # define TOLOWER(reg1, reg)
244 #if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
255 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
263 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
266 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
267 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
269 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
270 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
280 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
286 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
289 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
290 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
292 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
293 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
303 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
308 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
311 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
312 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
314 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
315 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
325 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
330 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
333 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
334 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
336 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
337 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
347 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
352 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
355 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
356 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
358 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
359 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
369 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
374 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
377 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
378 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
380 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
381 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
391 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
396 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
399 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
400 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
402 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
403 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
413 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
418 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
421 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
422 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
424 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
425 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
435 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
442 #if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
446 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
459 lea -0xff0(%ecx), %edx
465 movdqu (%esi,%edx), %xmm2
466 movdqu (%edi,%edx), %xmm1
467 TOLOWER (%xmm2, %xmm1)
468 pcmpistri $0x1a, %xmm2, %xmm1
471 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
479 movzbl (%edi,%edx), %eax
480 movzbl (%esi,%edx), %ecx
481 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
483 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
484 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
486 movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
487 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
494 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
508 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
512 lea (%ecx,%edx), %ecx
513 movzbl (%edi,%ecx), %eax
514 movzbl (%esi,%ecx), %ecx
515 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
517 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
518 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
520 movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
521 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
528 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
531 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
539 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
543 # ifdef USE_AS_STRNCMP
559 add $0xfefefeff, %ecx
561 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
571 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
575 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
587 add $0xfefefeff, %ecx
589 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
598 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
608 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
611 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
612 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
614 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
615 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
625 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
630 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
633 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
634 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
636 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
637 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
647 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
653 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
656 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
657 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
659 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
660 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
670 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
675 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
678 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
679 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
681 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
682 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
693 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
698 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
701 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
702 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
704 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
705 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
716 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
721 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
724 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
725 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
727 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
728 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
738 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
743 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
746 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
747 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
749 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
750 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
760 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
765 #if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
768 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
769 movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
771 movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
772 movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi