summaryrefslogtreecommitdiff
path: root/libc/sysdeps/i386
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/i386')
-rw-r--r--libc/sysdeps/i386/i686/multiarch/Makefile14
-rw-r--r--libc/sysdeps/i386/i686/multiarch/locale-defines.sym11
-rw-r--r--libc/sysdeps/i386/i686/multiarch/strcasecmp-c.c12
-rw-r--r--libc/sysdeps/i386/i686/multiarch/strcasecmp.S68
-rw-r--r--libc/sysdeps/i386/i686/multiarch/strcasecmp_l-c.c11
-rw-r--r--libc/sysdeps/i386/i686/multiarch/strcasecmp_l-sse4.S2
-rw-r--r--libc/sysdeps/i386/i686/multiarch/strcasecmp_l-ssse3.S2
-rw-r--r--libc/sysdeps/i386/i686/multiarch/strcasecmp_l.S5
-rw-r--r--libc/sysdeps/i386/i686/multiarch/strcmp-sse4.S562
-rw-r--r--libc/sysdeps/i386/i686/multiarch/strcmp-ssse3.S1108
-rw-r--r--libc/sysdeps/i386/i686/multiarch/strcmp.S28
-rw-r--r--libc/sysdeps/i386/i686/multiarch/strncase-c.c8
-rw-r--r--libc/sysdeps/i386/i686/multiarch/strncase.S68
-rw-r--r--libc/sysdeps/i386/i686/multiarch/strncase_l-c.c11
-rw-r--r--libc/sysdeps/i386/i686/multiarch/strncase_l-sse4.S2
-rw-r--r--libc/sysdeps/i386/i686/multiarch/strncase_l-ssse3.S2
-rw-r--r--libc/sysdeps/i386/i686/multiarch/strncase_l.S5
-rw-r--r--libc/sysdeps/i386/i686/multiarch/strnlen-c.c6
-rw-r--r--libc/sysdeps/i386/i686/multiarch/wcscmp-c.c8
-rw-r--r--libc/sysdeps/i386/i686/multiarch/wcslen-c.c4
-rw-r--r--libc/sysdeps/i386/i686/multiarch/wmemcmp-c.c4
21 files changed, 1591 insertions, 350 deletions
diff --git a/libc/sysdeps/i386/i686/multiarch/Makefile b/libc/sysdeps/i386/i686/multiarch/Makefile
index 5f1853877..426b718e4 100644
--- a/libc/sysdeps/i386/i686/multiarch/Makefile
+++ b/libc/sysdeps/i386/i686/multiarch/Makefile
@@ -4,6 +4,7 @@ gen-as-const-headers += ifunc-defines.sym
endif
ifeq ($(subdir),string)
+gen-as-const-headers += locale-defines.sym
sysdep_routines += bzero-sse2 memset-sse2 memcpy-ssse3 mempcpy-ssse3 \
memmove-ssse3 memcpy-ssse3-rep mempcpy-ssse3-rep \
memmove-ssse3-rep bcopy-ssse3 bcopy-ssse3-rep \
@@ -15,11 +16,13 @@ sysdep_routines += bzero-sse2 memset-sse2 memcpy-ssse3 mempcpy-ssse3 \
strncpy-sse2 stpcpy-sse2 stpncpy-sse2 strcat-ssse3 \
strcat-sse2 strncat-ssse3 strncat-sse2 strncat-c \
strchr-sse2 strrchr-sse2 strchr-sse2-bsf strrchr-sse2-bsf \
- wcscmp-sse2 wcscmp-c memchr-sse2 memchr-sse2-bsf \
+ memchr-sse2 memchr-sse2-bsf \
memrchr-sse2 memrchr-sse2-bsf memrchr-c \
rawmemchr-sse2 rawmemchr-sse2-bsf \
- strnlen-sse2 strnlen-c wcslen-sse2 wcslen-c \
- wmemcmp-sse4 wmemcmp-ssse3 wmemcmp-c
+ strnlen-sse2 strnlen-c \
+ strcasecmp_l-c strcasecmp-c strcasecmp_l-ssse3 \
+ strncase_l-c strncase-c strncase_l-ssse3 \
+ strcasecmp_l-sse4 strncase_l-sse4
ifeq (yes,$(config-cflags-sse4))
sysdep_routines += strcspn-c strpbrk-c strspn-c strstr-c strcasestr-c
CFLAGS-varshift.c += -msse4
@@ -32,6 +35,11 @@ CFLAGS-strcasestr-nonascii.c += -msse4
endif
endif
+ifeq ($(subdir),wcsmbs)
+sysdep_routines += wcscmp-sse2 wcscmp-c wcslen-sse2 wcslen-c \
+ wmemcmp-sse4 wmemcmp-ssse3 wmemcmp-c
+endif
+
ifeq (mathyes,$(subdir)$(config-cflags-avx))
libm-sysdep_routines += s_fma-fma s_fmaf-fma
CFLAGS-s_fma-fma.c += -mavx -mfpmath=sse
diff --git a/libc/sysdeps/i386/i686/multiarch/locale-defines.sym b/libc/sysdeps/i386/i686/multiarch/locale-defines.sym
new file mode 100644
index 000000000..aebff9a4f
--- /dev/null
+++ b/libc/sysdeps/i386/i686/multiarch/locale-defines.sym
@@ -0,0 +1,11 @@
+#include <locale/localeinfo.h>
+#include <langinfo.h>
+#include <stddef.h>
+
+--
+
+LOCALE_T___LOCALES offsetof (struct __locale_struct, __locales)
+LC_CTYPE
+_NL_CTYPE_NONASCII_CASE
+LOCALE_DATA_VALUES offsetof (struct __locale_data, values)
+SIZEOF_VALUES sizeof (((struct __locale_data *) 0)->values[0])
diff --git a/libc/sysdeps/i386/i686/multiarch/strcasecmp-c.c b/libc/sysdeps/i386/i686/multiarch/strcasecmp-c.c
new file mode 100644
index 000000000..753c6ec84
--- /dev/null
+++ b/libc/sysdeps/i386/i686/multiarch/strcasecmp-c.c
@@ -0,0 +1,12 @@
+#include <string.h>
+
+extern __typeof (strcasecmp) __strcasecmp_nonascii;
+
+#define __strcasecmp __strcasecmp_nonascii
+#include <string/strcasecmp.c>
+
+strong_alias (__strcasecmp_nonascii, __strcasecmp_ia32)
+
+/* The needs of strcasecmp in libc are minimal, no need to go through
+ the IFUNC. */
+strong_alias (__strcasecmp_nonascii, __GI___strcasecmp)
diff --git a/libc/sysdeps/i386/i686/multiarch/strcasecmp.S b/libc/sysdeps/i386/i686/multiarch/strcasecmp.S
new file mode 100644
index 000000000..97603d884
--- /dev/null
+++ b/libc/sysdeps/i386/i686/multiarch/strcasecmp.S
@@ -0,0 +1,68 @@
+/* Entry point for multi-version x86 strcasecmp.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sysdep.h>
+#include <init-arch.h>
+
+#ifdef SHARED
+ .text
+ENTRY(__strcasecmp)
+ .type __strcasecmp, @gnu_indirect_function
+ pushl %ebx
+ cfi_adjust_cfa_offset (4)
+ cfi_rel_offset (ebx, 0)
+ call __i686.get_pc_thunk.bx
+ addl $_GLOBAL_OFFSET_TABLE_, %ebx
+ cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
+ jne 1f
+ call __init_cpu_features
+1: leal __strcasecmp_ia32@GOTOFF(%ebx), %eax
+ testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx)
+ jz 2f
+ leal __strcasecmp_ssse3@GOTOFF(%ebx), %eax
+ testl $bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features@GOTOFF(%ebx)
+ jz 2f
+ leal __strcasecmp_sse4_2@GOTOFF(%ebx), %eax
+2: popl %ebx
+ cfi_adjust_cfa_offset (-4)
+ cfi_restore (ebx)
+ ret
+END(__strcasecmp)
+#else
+ .text
+ENTRY(__strcasecmp)
+ .type __strcasecmp, @gnu_indirect_function
+ cmpl $0, KIND_OFFSET+__cpu_features
+ jne 1f
+ call __init_cpu_features
+1: leal __strcasecmp_ia32, %eax
+ testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features
+ jz 2f
+ leal __strcasecmp_ssse3, %eax
+#if 0
+ // XXX Temporarily
+ testl $bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features
+ jz 2f
+ leal __strcasecmp_sse4_2, %eax
+#endif
+2: ret
+END(__strcasecmp)
+#endif
+
+weak_alias (__strcasecmp, strcasecmp)
diff --git a/libc/sysdeps/i386/i686/multiarch/strcasecmp_l-c.c b/libc/sysdeps/i386/i686/multiarch/strcasecmp_l-c.c
new file mode 100644
index 000000000..d10e87256
--- /dev/null
+++ b/libc/sysdeps/i386/i686/multiarch/strcasecmp_l-c.c
@@ -0,0 +1,11 @@
+#include <string.h>
+
+extern __typeof (strcasecmp_l) __strcasecmp_l_nonascii;
+
+#define __strcasecmp_l __strcasecmp_l_nonascii
+#define USE_IN_EXTENDED_LOCALE_MODEL 1
+#include <string/strcasecmp.c>
+
+/* The needs of strcasecmp in libc are minimal, no need to go through
+ the IFUNC. */
+strong_alias (__strcasecmp_l_nonascii, __GI___strcasecmp_l)
diff --git a/libc/sysdeps/i386/i686/multiarch/strcasecmp_l-sse4.S b/libc/sysdeps/i386/i686/multiarch/strcasecmp_l-sse4.S
new file mode 100644
index 000000000..411d4153f
--- /dev/null
+++ b/libc/sysdeps/i386/i686/multiarch/strcasecmp_l-sse4.S
@@ -0,0 +1,2 @@
+#define USE_AS_STRCASECMP_L 1
+#include "strcmp-sse4.S"
diff --git a/libc/sysdeps/i386/i686/multiarch/strcasecmp_l-ssse3.S b/libc/sysdeps/i386/i686/multiarch/strcasecmp_l-ssse3.S
new file mode 100644
index 000000000..a22b93c51
--- /dev/null
+++ b/libc/sysdeps/i386/i686/multiarch/strcasecmp_l-ssse3.S
@@ -0,0 +1,2 @@
+#define USE_AS_STRCASECMP_L 1
+#include "strcmp-ssse3.S"
diff --git a/libc/sysdeps/i386/i686/multiarch/strcasecmp_l.S b/libc/sysdeps/i386/i686/multiarch/strcasecmp_l.S
new file mode 100644
index 000000000..1322bd86d
--- /dev/null
+++ b/libc/sysdeps/i386/i686/multiarch/strcasecmp_l.S
@@ -0,0 +1,5 @@
+#define STRCMP __strcasecmp_l
+#define USE_AS_STRCASECMP_L
+#include "strcmp.S"
+
+weak_alias (__strcasecmp_l, strcasecmp_l)
diff --git a/libc/sysdeps/i386/i686/multiarch/strcmp-sse4.S b/libc/sysdeps/i386/i686/multiarch/strcmp-sse4.S
index 0de0a113c..c9e0317b6 100644
--- a/libc/sysdeps/i386/i686/multiarch/strcmp-sse4.S
+++ b/libc/sysdeps/i386/i686/multiarch/strcmp-sse4.S
@@ -1,5 +1,5 @@
/* strcmp with SSE4.2
- Copyright (C) 2010 Free Software Foundation, Inc.
+ Copyright (C) 2010, 2011 Free Software Foundation, Inc.
Contributed by Intel Corporation.
This file is part of the GNU C Library.
@@ -34,33 +34,184 @@
#define PUSH(REG) pushl REG; CFI_PUSH (REG)
#define POP(REG) popl REG; CFI_POP (REG)
-#ifndef USE_AS_STRNCMP
+#ifdef USE_AS_STRNCMP
# ifndef STRCMP
-# define STRCMP __strcmp_sse4_2
+# define STRCMP __strncmp_sse4_2
# endif
-# define STR1 4
+# define STR1 8
# define STR2 STR1+4
-# define RETURN ret; .p2align 4
-#else
+# define CNT STR2+4
+# define RETURN POP (REM); ret; .p2align 4; CFI_PUSH (REM)
+# define REM %ebp
+#elif defined USE_AS_STRCASECMP_L
+# include "locale-defines.h"
# ifndef STRCMP
-# define STRCMP __strncmp_sse4_2
+# define STRCMP __strcasecmp_l_sse4_2
+# endif
+# ifdef PIC
+# define STR1 12
+# else
+# define STR1 8
+# endif
+# define STR2 STR1+4
+# define LOCALE 12 /* Loaded before the adjustement. */
+# ifdef PIC
+# define RETURN POP (%edi); POP (%ebx); ret; \
+ .p2align 4; CFI_PUSH (%ebx); CFI_PUSH (%edi)
+# else
+# define RETURN POP (%edi); ret; .p2align 4; CFI_PUSH (%edi)
+# endif
+# define NONASCII __strcasecmp_nonascii
+#elif defined USE_AS_STRNCASECMP_L
+# include "locale-defines.h"
+# ifndef STRCMP
+# define STRCMP __strncasecmp_l_sse4_2
+# endif
+# ifdef PIC
+# define STR1 16
+# else
+# define STR1 12
# endif
-# define STR1 8
# define STR2 STR1+4
# define CNT STR2+4
-# define RETURN POP (%ebp); ret; .p2align 4; CFI_PUSH (%ebp)
+# define LOCALE 16 /* Loaded before the adjustement. */
+# ifdef PIC
+# define RETURN POP (%edi); POP (REM); POP (%ebx); ret; \
+ .p2align 4; \
+ CFI_PUSH (%ebx); CFI_PUSH (REM); CFI_PUSH (%edi)
+# else
+# define RETURN POP (%edi); POP (REM); ret; \
+ .p2align 4; CFI_PUSH (REM); CFI_PUSH (%edi)
+# endif
+# define REM %ebp
+# define NONASCII __strncasecmp_nonascii
+#else
+# ifndef STRCMP
+# define STRCMP __strcmp_sse4_2
+# endif
+# define STR1 4
+# define STR2 STR1+4
+# define RETURN ret; .p2align 4
#endif
.section .text.sse4.2,"ax",@progbits
-ENTRY (STRCMP)
-#ifdef USE_AS_STRNCMP
- PUSH (%ebp)
+
+#ifdef USE_AS_STRCASECMP_L
+ENTRY (__strcasecmp_sse4_2)
+# ifdef PIC
+ PUSH (%ebx)
+ call __i686.get_pc_thunk.bx
+ addl $_GLOBAL_OFFSET_TABLE_, %ebx
+ movl __libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
+# ifdef NO_TLS_DIRECT_SEG_REFS
+ addl %gs:0, %eax
+ movl (%eax), %eax
+# else
+ movl %gs:(%eax), %eax
+# endif
+# else
+# ifdef NO_TLS_DIRECT_SEG_REFS
+ movl %gs:0, %eax
+ movl __libc_tsd_LOCALE@NTPOFF(%eax), %eax
+# else
+ movl %gs:__libc_tsd_LOCALE@NTPOFF, %eax
+# endif
+# endif
+# if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
+ movl LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
+# else
+ movl (%eax), %eax
+# endif
+ testl $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
+ jne __strcasecmp_nonascii
+ jmp L(ascii)
+END (__strcasecmp_sse4_2)
+#endif
+
+#ifdef USE_AS_STRNCASECMP_L
+ENTRY (__strncasecmp_sse4_2)
+# ifdef PIC
+ PUSH (%ebx)
+ call __i686.get_pc_thunk.bx
+ addl $_GLOBAL_OFFSET_TABLE_, %ebx
+ movl __libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
+# ifdef NO_TLS_DIRECT_SEG_REFS
+ addl %gs:0, %eax
+ movl (%eax), %eax
+# else
+ movl %gs:(%eax), %eax
+# endif
+# else
+# ifdef NO_TLS_DIRECT_SEG_REFS
+ movl %gs:0, %eax
+ movl __libc_tsd_LOCALE@NTPOFF(%eax), %eax
+# else
+ movl %gs:__libc_tsd_LOCALE@NTPOFF, %eax
+# endif
+# endif
+# if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
+ movl LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
+# else
+ movl (%eax), %eax
+# endif
+ testl $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
+ jne __strncasecmp_nonascii
+ jmp L(ascii)
+END (__strncasecmp_sse4_2)
+#endif
+
+ ENTRY (STRCMP)
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ movl LOCALE(%esp), %eax
+# if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
+ movl LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
+# else
+ movl (%eax), %eax
+# endif
+ testl $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
+ jne NONASCII
+
+# ifdef PIC
+ PUSH (%ebx)
+ call __i686.get_pc_thunk.bx
+ addl $_GLOBAL_OFFSET_TABLE_, %ebx
+# endif
+L(ascii):
+ .section .rodata.cst16,"aM",@progbits,16
+ .align 16
+.Lbelowupper:
+ .quad 0x4040404040404040
+ .quad 0x4040404040404040
+.Ltopupper:
+ .quad 0x5b5b5b5b5b5b5b5b
+ .quad 0x5b5b5b5b5b5b5b5b
+.Ltouppermask:
+ .quad 0x2020202020202020
+ .quad 0x2020202020202020
+ .previous
+
+# ifdef PIC
+# define UCLOW_reg .Lbelowupper@GOTOFF(%ebx)
+# define UCHIGH_reg .Ltopupper@GOTOFF(%ebx)
+# define LCQWORD_reg .Ltouppermask@GOTOFF(%ebx)
+# else
+# define UCLOW_reg .Lbelowupper
+# define UCHIGH_reg .Ltopupper
+# define LCQWORD_reg .Ltouppermask
+# endif
+#endif
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ PUSH (REM)
+#endif
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ PUSH (%edi)
#endif
mov STR1(%esp), %edx
mov STR2(%esp), %eax
-#ifdef USE_AS_STRNCMP
- movl CNT(%esp), %ebp
- test %ebp, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ movl CNT(%esp), REM
+ test REM, REM
je L(eq)
#endif
mov %dx, %cx
@@ -72,10 +223,40 @@ ENTRY (STRCMP)
and $0xfff, %ecx
cmp $0xff0, %ecx
ja L(first4bytes)
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# define TOLOWER(reg1, reg2) \
+ movdqa reg1, %xmm3; \
+ movdqa UCHIGH_reg, %xmm4; \
+ movdqa reg2, %xmm5; \
+ movdqa UCHIGH_reg, %xmm6; \
+ pcmpgtb UCLOW_reg, %xmm3; \
+ pcmpgtb reg1, %xmm4; \
+ pcmpgtb UCLOW_reg, %xmm5; \
+ pcmpgtb reg2, %xmm6; \
+ pand %xmm4, %xmm3; \
+ pand %xmm6, %xmm5; \
+ pand LCQWORD_reg, %xmm3; \
+ pand LCQWORD_reg, %xmm5; \
+ por %xmm3, reg1; \
+ por %xmm5, reg2
+
+ movdqu (%eax), %xmm1
+ TOLOWER (%xmm2, %xmm1)
+ movd %xmm2, %ecx
+ movd %xmm1, %edi
+ movdqa %xmm2, %xmm3
+ movdqa %xmm1, %xmm4
+ cmpl %edi, %ecx
+#else
+# define TOLOWER(reg1, reg)
+
movd %xmm2, %ecx
cmp (%eax), %ecx
+#endif
jne L(less4bytes)
+#if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
movdqu (%eax), %xmm1
+#endif
pxor %xmm2, %xmm1
pxor %xmm0, %xmm0
ptest %xmm1, %xmm0
@@ -84,113 +265,210 @@ ENTRY (STRCMP)
ptest %xmm2, %xmm0
jnc L(less16bytes)
-#ifdef USE_AS_STRNCMP
- sub $16, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ sub $16, REM
jbe L(eq)
#endif
add $16, %edx
add $16, %eax
L(first4bytes):
movzbl (%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ movzbl (%edx), %edi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+ cmpl %ecx, %edi
+#else
cmpb %cl, (%edx)
+#endif
jne L(neq)
cmpl $0, %ecx
je L(eq)
-#ifdef USE_AS_STRNCMP
- cmp $1, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $1, REM
je L(eq)
#endif
movzbl 1(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ movzbl 1(%edx), %edi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+ cmpl %ecx, %edi
+#else
cmpb %cl, 1(%edx)
+#endif
jne L(neq)
cmpl $0, %ecx
je L(eq)
-#ifdef USE_AS_STRNCMP
- cmp $2, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $2, REM
je L(eq)
#endif
movzbl 2(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ movzbl 2(%edx), %edi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+ cmpl %ecx, %edi
+#else
cmpb %cl, 2(%edx)
+#endif
jne L(neq)
cmpl $0, %ecx
je L(eq)
-#ifdef USE_AS_STRNCMP
- cmp $3, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $3, REM
je L(eq)
#endif
movzbl 3(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ movzbl 3(%edx), %edi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+ cmpl %ecx, %edi
+#else
cmpb %cl, 3(%edx)
+#endif
jne L(neq)
cmpl $0, %ecx
je L(eq)
-#ifdef USE_AS_STRNCMP
- cmp $4, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $4, REM
je L(eq)
#endif
movzbl 4(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ movzbl 4(%edx), %edi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+ cmpl %ecx, %edi
+#else
cmpb %cl, 4(%edx)
+#endif
jne L(neq)
cmpl $0, %ecx
je L(eq)
-#ifdef USE_AS_STRNCMP
- cmp $5, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $5, REM
je L(eq)
#endif
movzbl 5(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ movzbl 5(%edx), %edi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+ cmpl %ecx, %edi
+#else
cmpb %cl, 5(%edx)
+#endif
jne L(neq)
cmpl $0, %ecx
je L(eq)
-#ifdef USE_AS_STRNCMP
- cmp $6, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $6, REM
je L(eq)
#endif
movzbl 6(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ movzbl 6(%edx), %edi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+ cmpl %ecx, %edi
+#else
cmpb %cl, 6(%edx)
+#endif
jne L(neq)
cmpl $0, %ecx
je L(eq)
-#ifdef USE_AS_STRNCMP
- cmp $7, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $7, REM
je L(eq)
#endif
movzbl 7(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ movzbl 7(%edx), %edi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+ cmpl %ecx, %edi
+#else
cmpb %cl, 7(%edx)
+#endif
jne L(neq)
cmpl $0, %ecx
je L(eq)
-#ifdef USE_AS_STRNCMP
- sub $8, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ sub $8, REM
je L(eq)
#endif
add $8, %eax
add $8, %edx
- PUSH (%ebx)
+#if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
PUSH (%edi)
+#endif
PUSH (%esi)
-#ifdef USE_AS_STRNCMP
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
cfi_remember_state
#endif
mov %edx, %edi
mov %eax, %esi
xorl %eax, %eax
L(check_offset):
- movl %edi, %ebx
+ movl %edi, %edx
movl %esi, %ecx
- andl $0xfff, %ebx
+ andl $0xfff, %edx
andl $0xfff, %ecx
- cmpl %ebx, %ecx
- cmovl %ebx, %ecx
+ cmpl %edx, %ecx
+ cmovl %edx, %ecx
lea -0xff0(%ecx), %edx
sub %edx, %edi
sub %edx, %esi
@@ -199,11 +477,12 @@ L(check_offset):
L(loop):
movdqu (%esi,%edx), %xmm2
movdqu (%edi,%edx), %xmm1
+ TOLOWER (%xmm2, %xmm1)
pcmpistri $0x1a, %xmm2, %xmm1
jbe L(end)
-#ifdef USE_AS_STRNCMP
- sub $16, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ sub $16, REM
jbe L(more16byteseq)
#endif
@@ -211,13 +490,22 @@ L(loop):
jle L(loop)
L(crosspage):
movzbl (%edi,%edx), %eax
- movzbl (%esi,%edx), %ebx
- subl %ebx, %eax
+ movzbl (%esi,%edx), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+# endif
+#endif
+ subl %ecx, %eax
jne L(ret)
- testl %ebx, %ebx
+ testl %ecx, %ecx
je L(ret)
-#ifdef USE_AS_STRNCMP
- sub $1, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ sub $1, REM
jbe L(more16byteseq)
#endif
inc %edx
@@ -230,30 +518,44 @@ L(crosspage):
.p2align 4
L(end):
jnc L(ret)
-#ifdef USE_AS_STRNCMP
- sub %ecx, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ sub %ecx, REM
jbe L(more16byteseq)
#endif
- lea (%ecx,%edx), %ebx
- movzbl (%edi,%ebx), %eax
- movzbl (%esi,%ebx), %ecx
+ lea (%ecx,%edx), %ecx
+ movzbl (%edi,%ecx), %eax
+ movzbl (%esi,%ecx), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+# endif
+#endif
subl %ecx, %eax
L(ret):
POP (%esi)
POP (%edi)
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ POP (REM)
+#endif
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
POP (%ebx)
-#ifdef USE_AS_STRNCMP
- POP (%ebp)
+# endif
#endif
ret
.p2align 4
-#ifdef USE_AS_STRNCMP
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
cfi_restore_state
L(more16byteseq):
POP (%esi)
+# ifdef USE_AS_STRNCMP
POP (%edi)
- POP (%ebx)
+# endif
#endif
L(eq):
xorl %eax, %eax
@@ -269,27 +571,45 @@ L(neq_bigger):
L(less16bytes):
add $0xfefefeff, %ecx
jnc L(less4bytes)
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ movd %xmm3, %edi
+ xor %edi, %ecx
+#else
xor (%edx), %ecx
+#endif
or $0xfefefeff, %ecx
add $1, %ecx
jnz L(less4bytes)
-#ifdef USE_AS_STRNCMP
- cmp $4, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $4, REM
jbe L(eq)
#endif
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ psrldq $4, %xmm3
+ psrldq $4, %xmm4
+ movd %xmm3, %ecx
+ movd %xmm4, %edi
+ cmp %edi, %ecx
+ mov %ecx, %edi
+#else
mov 4(%edx), %ecx
cmp 4(%eax), %ecx
+#endif
jne L(more4bytes)
add $0xfefefeff, %ecx
jnc L(more4bytes)
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ xor %edi, %ecx
+#else
xor 4(%edx), %ecx
+#endif
or $0xfefefeff, %ecx
add $1, %ecx
jnz L(more4bytes)
-#ifdef USE_AS_STRNCMP
- sub $8, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ sub $8, REM
jbe L(eq)
#endif
@@ -298,80 +618,176 @@ L(less16bytes):
L(less4bytes):
movzbl (%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ movzbl (%edx), %edi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+ cmpl %ecx, %edi
+#else
cmpb %cl, (%edx)
+#endif
jne L(neq)
cmpl $0, %ecx
je L(eq)
-#ifdef USE_AS_STRNCMP
- cmp $1, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $1, REM
je L(eq)
#endif
movzbl 1(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ movzbl 1(%edx), %edi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+ cmpl %ecx, %edi
+#else
cmpb %cl, 1(%edx)
+#endif
jne L(neq)
cmpl $0, %ecx
je L(eq)
-#ifdef USE_AS_STRNCMP
- cmp $2, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $2, REM
je L(eq)
#endif
movzbl 2(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ movzbl 2(%edx), %edi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+ cmpl %ecx, %edi
+#else
cmpb %cl, 2(%edx)
+#endif
jne L(neq)
cmpl $0, %ecx
je L(eq)
-#ifdef USE_AS_STRNCMP
- cmp $3, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $3, REM
je L(eq)
#endif
movzbl 3(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ movzbl 3(%edx), %edi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+ cmpl %ecx, %edi
+#else
cmpb %cl, 3(%edx)
+#endif
jne L(neq)
cmpl $0, %ecx
je L(eq)
L(more4bytes):
-#ifdef USE_AS_STRNCMP
- cmp $4, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $4, REM
je L(eq)
#endif
movzbl 4(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ movzbl 4(%edx), %edi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+ cmpl %ecx, %edi
+#else
cmpb %cl, 4(%edx)
+#endif
jne L(neq)
cmpl $0, %ecx
je L(eq)
-#ifdef USE_AS_STRNCMP
- cmp $5, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $5, REM
je L(eq)
#endif
movzbl 5(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ movzbl 5(%edx), %edi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+ cmpl %ecx, %edi
+#else
cmpb %cl, 5(%edx)
+#endif
jne L(neq)
cmpl $0, %ecx
je L(eq)
-#ifdef USE_AS_STRNCMP
- cmp $6, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $6, REM
je L(eq)
#endif
movzbl 6(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ movzbl 6(%edx), %edi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+ cmpl %ecx, %edi
+#else
cmpb %cl, 6(%edx)
+#endif
jne L(neq)
cmpl $0, %ecx
je L(eq)
-#ifdef USE_AS_STRNCMP
- cmp $7, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $7, REM
je L(eq)
#endif
movzbl 7(%eax), %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ movzbl 7(%edx), %edi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%edi,4), %edi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%edi,4), %edi
+# endif
+ cmpl %ecx, %edi
+#else
cmpb %cl, 7(%edx)
+#endif
jne L(neq)
jmp L(eq)
diff --git a/libc/sysdeps/i386/i686/multiarch/strcmp-ssse3.S b/libc/sysdeps/i386/i686/multiarch/strcmp-ssse3.S
index 607b69b6f..cbba46550 100644
--- a/libc/sysdeps/i386/i686/multiarch/strcmp-ssse3.S
+++ b/libc/sysdeps/i386/i686/multiarch/strcmp-ssse3.S
@@ -1,5 +1,5 @@
/* strcmp with SSSE3
- Copyright (C) 2010 Free Software Foundation, Inc.
+ Copyright (C) 2010, 2011 Free Software Foundation, Inc.
Contributed by Intel Corporation.
This file is part of the GNU C Library.
@@ -34,43 +34,201 @@
#define PUSH(REG) pushl REG; CFI_PUSH (REG)
#define POP(REG) popl REG; CFI_POP (REG)
-#ifndef USE_AS_STRNCMP
+#ifdef USE_AS_STRNCMP
# ifndef STRCMP
-# define STRCMP __strcmp_ssse3
+# define STRCMP __strncmp_ssse3
# endif
-# define STR1 4
+# define STR1 8
# define STR2 STR1+4
-# define RETURN ret; .p2align 4
+# define CNT STR2+4
+# define RETURN POP (REM); ret; .p2align 4; CFI_PUSH (REM)
+# define UPDATE_STRNCMP_COUNTER \
+ /* calculate left number to compare */ \
+ mov $16, %esi; \
+ sub %ecx, %esi; \
+ cmp %esi, REM; \
+ jbe L(more8byteseq); \
+ sub %esi, REM
+# define FLAGS %ebx
+# define REM %ebp
+#elif defined USE_AS_STRCASECMP_L
+# include "locale-defines.h"
+# ifndef STRCMP
+# define STRCMP __strcasecmp_l_ssse3
+# endif
+# ifdef PIC
+# define STR1 8
+# else
+# define STR1 4
+# endif
+# define STR2 STR1+4
+# define LOCALE 12 /* Loaded before the adjustement. */
+# ifdef PIC
+# define RETURN POP (%ebx); ret; .p2align 4; CFI_PUSH (%ebx)
+# else
+# define RETURN ret; .p2align 4
+# endif
# define UPDATE_STRNCMP_COUNTER
-#else
+# define FLAGS (%esp)
+# define NONASCII __strcasecmp_nonascii
+#elif defined USE_AS_STRNCASECMP_L
+# include "locale-defines.h"
# ifndef STRCMP
-# define STRCMP __strncmp_ssse3
+# define STRCMP __strncasecmp_l_ssse3
+# endif
+# ifdef PIC
+# define STR1 12
+# else
+# define STR1 8
# endif
-# define STR1 8
# define STR2 STR1+4
# define CNT STR2+4
-# define RETURN POP (%ebp); ret; .p2align 4; CFI_PUSH (%ebp)
+# define LOCALE 16 /* Loaded before the adjustement. */
+# ifdef PIC
+# define RETURN POP (REM); POP (%ebx); ret; \
+ .p2align 4; CFI_PUSH (%ebx); CFI_PUSH (REM)
+# else
+# define RETURN POP (REM); ret; .p2align 4; CFI_PUSH (REM)
+# endif
# define UPDATE_STRNCMP_COUNTER \
/* calculate left number to compare */ \
mov $16, %esi; \
sub %ecx, %esi; \
- cmp %esi, %ebp; \
+ cmp %esi, REM; \
jbe L(more8byteseq); \
- sub %esi, %ebp
+ sub %esi, REM
+# define FLAGS (%esp)
+# define REM %ebp
+# define NONASCII __strncasecmp_nonascii
+#else
+# ifndef STRCMP
+# define STRCMP __strcmp_ssse3
+# endif
+# define STR1 4
+# define STR2 STR1+4
+# define RETURN ret; .p2align 4
+# define UPDATE_STRNCMP_COUNTER
+# define FLAGS %ebx
#endif
.section .text.ssse3,"ax",@progbits
+
+#ifdef USE_AS_STRCASECMP_L
+ENTRY (__strcasecmp_ssse3)
+# ifdef PIC
+ PUSH (%ebx)
+ call __i686.get_pc_thunk.bx
+ addl $_GLOBAL_OFFSET_TABLE_, %ebx
+ movl __libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
+# ifdef NO_TLS_DIRECT_SEG_REFS
+ addl %gs:0, %eax
+ movl (%eax), %eax
+# else
+ movl %gs:(%eax), %eax
+# endif
+# else
+# ifdef NO_TLS_DIRECT_SEG_REFS
+ movl %gs:0, %eax
+ movl __libc_tsd_LOCALE@NTPOFF(%eax), %eax
+# else
+ movl %gs:__libc_tsd_LOCALE@NTPOFF, %eax
+# endif
+# endif
+# if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
+ movl LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
+# else
+ movl (%eax), %eax
+# endif
+ testl $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
+ jne __strcasecmp_nonascii
+ jmp L(ascii)
+END (__strcasecmp_ssse3)
+#endif
+
+#ifdef USE_AS_STRNCASECMP_L
+ENTRY (__strncasecmp_ssse3)
+# ifdef PIC
+ PUSH (%ebx)
+ call __i686.get_pc_thunk.bx
+ addl $_GLOBAL_OFFSET_TABLE_, %ebx
+ movl __libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
+# ifdef NO_TLS_DIRECT_SEG_REFS
+ addl %gs:0, %eax
+ movl (%eax), %eax
+# else
+ movl %gs:(%eax), %eax
+# endif
+# else
+# ifdef NO_TLS_DIRECT_SEG_REFS
+ movl %gs:0, %eax
+ movl __libc_tsd_LOCALE@NTPOFF(%eax), %eax
+# else
+ movl %gs:__libc_tsd_LOCALE@NTPOFF, %eax
+# endif
+# endif
+# if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
+ movl LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
+# else
+ movl (%eax), %eax
+# endif
+ testl $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
+ jne __strncasecmp_nonascii
+ jmp L(ascii)
+END (__strncasecmp_ssse3)
+#endif
+
ENTRY (STRCMP)
-#ifdef USE_AS_STRNCMP
- PUSH (%ebp)
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ movl LOCALE(%esp), %eax
+# if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
+ movl LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
+# else
+ movl (%eax), %eax
+# endif
+ testl $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
+ jne NONASCII
+
+# ifdef PIC
+ PUSH (%ebx)
+ call __i686.get_pc_thunk.bx
+ addl $_GLOBAL_OFFSET_TABLE_, %ebx
+# endif
+L(ascii):
+ .section .rodata.cst16,"aM",@progbits,16
+ .align 16
+.Lbelowupper:
+ .quad 0x4040404040404040
+ .quad 0x4040404040404040
+.Ltopupper:
+ .quad 0x5b5b5b5b5b5b5b5b
+ .quad 0x5b5b5b5b5b5b5b5b
+.Ltouppermask:
+ .quad 0x2020202020202020
+ .quad 0x2020202020202020
+ .previous
+
+# ifdef PIC
+# define UCLOW_reg .Lbelowupper@GOTOFF(%ebx)
+# define UCHIGH_reg .Ltopupper@GOTOFF(%ebx)
+# define LCQWORD_reg .Ltouppermask@GOTOFF(%ebx)
+# else
+# define UCLOW_reg .Lbelowupper
+# define UCHIGH_reg .Ltopupper
+# define LCQWORD_reg .Ltouppermask
+# endif
#endif
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ PUSH (REM)
+#endif
+
movl STR1(%esp), %edx
movl STR2(%esp), %eax
-#ifdef USE_AS_STRNCMP
- movl CNT(%esp), %ebp
- cmp $16, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ movl CNT(%esp), REM
+ cmp $16, REM
jb L(less16bytes_sncmp)
-#else
+#elif !defined USE_AS_STRCASECMP_L
movzbl (%eax), %ecx
cmpb %cl, (%edx)
jne L(neq)
@@ -135,15 +293,35 @@ ENTRY (STRCMP)
movlpd (%edx), %xmm2
movhpd 8(%eax), %xmm1
movhpd 8(%edx), %xmm2
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# define TOLOWER(reg1, reg2) \
+ movdqa reg1, %xmm5; \
+ movdqa reg2, %xmm7; \
+ movdqa UCHIGH_reg, %xmm6; \
+ pcmpgtb UCLOW_reg, %xmm5; \
+ pcmpgtb UCLOW_reg, %xmm7; \
+ pcmpgtb reg1, %xmm6; \
+ pand %xmm6, %xmm5; \
+ movdqa UCHIGH_reg, %xmm6; \
+ pcmpgtb reg2, %xmm6; \
+ pand %xmm6, %xmm7; \
+ pand LCQWORD_reg, %xmm5; \
+ por %xmm5, reg1; \
+ pand LCQWORD_reg, %xmm7; \
+ por %xmm7, reg2
+ TOLOWER (%xmm1, %xmm2)
+#else
+# define TOLOWER(reg1, reg2)
+#endif
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
psubb %xmm0, %xmm1
pmovmskb %xmm1, %ecx
sub $0xffff, %ecx
jnz L(less16bytes)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(eq)
#endif
add $16, %eax
@@ -151,10 +329,16 @@ ENTRY (STRCMP)
L(crosspage):
- PUSH (%ebx)
+#if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
+ PUSH (FLAGS)
+#endif
PUSH (%edi)
PUSH (%esi)
-#ifdef USE_AS_STRNCMP
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ pushl $0
+ cfi_adjust_cfa_offset (4)
+#endif
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
cfi_remember_state
#endif
@@ -164,11 +348,13 @@ L(crosspage):
and $0xf, %edi
xor %ecx, %eax
xor %edi, %edx
- xor %ebx, %ebx
+#if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
+ xor FLAGS, FLAGS
+#endif
cmp %edi, %ecx
je L(ashr_0)
ja L(bigger)
- or $0x20, %ebx
+ orl $0x20, FLAGS
xchg %edx, %eax
xchg %ecx, %edi
L(bigger):
@@ -218,7 +404,13 @@ L(ashr_0):
movdqa (%eax), %xmm1
pxor %xmm0, %xmm0
pcmpeqb %xmm1, %xmm0
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ movdqa (%edx), %xmm2
+ TOLOWER (%xmm1, %xmm2)
+ pcmpeqb %xmm2, %xmm1
+#else
pcmpeqb (%edx), %xmm1
+#endif
psubb %xmm0, %xmm1
pmovmskb %xmm1, %edi
shr %cl, %esi
@@ -227,23 +419,29 @@ L(ashr_0):
mov %ecx, %edi
jne L(less32bytes)
UPDATE_STRNCMP_COUNTER
- mov $0x10, %ebx
+ movl $0x10, FLAGS
mov $0x10, %ecx
pxor %xmm0, %xmm0
.p2align 4
L(loop_ashr_0):
movdqa (%eax, %ecx), %xmm1
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
movdqa (%edx, %ecx), %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
+#else
+ pcmpeqb %xmm1, %xmm0
+ pcmpeqb (%edx, %ecx), %xmm1
+#endif
psubb %xmm0, %xmm1
pmovmskb %xmm1, %esi
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
add $16, %ecx
@@ -262,6 +460,7 @@ L(ashr_1):
movdqa (%eax), %xmm1
pcmpeqb %xmm1, %xmm0
pslldq $15, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm2
psubb %xmm0, %xmm2
pmovmskb %xmm2, %edi
@@ -276,7 +475,7 @@ L(ashr_1):
movdqa (%edx), %xmm3
pxor %xmm0, %xmm0
mov $16, %ecx
- or $1, %ebx
+ orl $1, FLAGS
lea 1(%edx), %edi
and $0xfff, %edi
sub $0x1000, %edi
@@ -292,6 +491,7 @@ L(gobble_ashr_1):
movdqa %xmm2, %xmm4
palignr $1, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -299,9 +499,9 @@ L(gobble_ashr_1):
pmovmskb %xmm1, %esi
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
@@ -316,6 +516,7 @@ L(gobble_ashr_1):
movdqa %xmm2, %xmm4
palignr $1, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -324,9 +525,9 @@ L(gobble_ashr_1):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
add $16, %ecx
@@ -340,8 +541,8 @@ L(nibble_ashr_1):
test $0xfffe, %esi
jnz L(ashr_1_exittail)
-#ifdef USE_AS_STRNCMP
- cmp $15, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $15, REM
jbe L(ashr_1_exittail)
#endif
pxor %xmm0, %xmm0
@@ -368,6 +569,7 @@ L(ashr_2):
movdqa (%eax), %xmm1
pcmpeqb %xmm1, %xmm0
pslldq $14, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm2
psubb %xmm0, %xmm2
pmovmskb %xmm2, %edi
@@ -382,7 +584,7 @@ L(ashr_2):
movdqa (%edx), %xmm3
pxor %xmm0, %xmm0
mov $16, %ecx
- or $2, %ebx
+ orl $2, FLAGS
lea 2(%edx), %edi
and $0xfff, %edi
sub $0x1000, %edi
@@ -398,6 +600,7 @@ L(gobble_ashr_2):
movdqa %xmm2, %xmm4
palignr $2, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -406,9 +609,9 @@ L(gobble_ashr_2):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
add $16, %ecx
@@ -422,6 +625,7 @@ L(gobble_ashr_2):
movdqa %xmm2, %xmm4
palignr $2, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -430,9 +634,9 @@ L(gobble_ashr_2):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
add $16, %ecx
@@ -446,8 +650,8 @@ L(nibble_ashr_2):
test $0xfffc, %esi
jnz L(ashr_2_exittail)
-#ifdef USE_AS_STRNCMP
- cmp $14, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $14, REM
jbe L(ashr_2_exittail)
#endif
@@ -475,6 +679,7 @@ L(ashr_3):
movdqa (%eax), %xmm1
pcmpeqb %xmm1, %xmm0
pslldq $13, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm2
psubb %xmm0, %xmm2
pmovmskb %xmm2, %edi
@@ -489,7 +694,7 @@ L(ashr_3):
movdqa (%edx), %xmm3
pxor %xmm0, %xmm0
mov $16, %ecx
- or $3, %ebx
+ orl $3, FLAGS
lea 3(%edx), %edi
and $0xfff, %edi
sub $0x1000, %edi
@@ -505,6 +710,7 @@ L(gobble_ashr_3):
movdqa %xmm2, %xmm4
palignr $3, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -513,9 +719,9 @@ L(gobble_ashr_3):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
add $16, %ecx
@@ -529,6 +735,7 @@ L(gobble_ashr_3):
movdqa %xmm2, %xmm4
palignr $3, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -537,9 +744,9 @@ L(gobble_ashr_3):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
add $16, %ecx
@@ -553,8 +760,8 @@ L(nibble_ashr_3):
test $0xfff8, %esi
jnz L(ashr_3_exittail)
-#ifdef USE_AS_STRNCMP
- cmp $13, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $13, REM
jbe L(ashr_3_exittail)
#endif
pxor %xmm0, %xmm0
@@ -581,6 +788,7 @@ L(ashr_4):
movdqa (%eax), %xmm1
pcmpeqb %xmm1, %xmm0
pslldq $12, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm2
psubb %xmm0, %xmm2
pmovmskb %xmm2, %edi
@@ -595,7 +803,7 @@ L(ashr_4):
movdqa (%edx), %xmm3
pxor %xmm0, %xmm0
mov $16, %ecx
- or $4, %ebx
+ orl $4, FLAGS
lea 4(%edx), %edi
and $0xfff, %edi
sub $0x1000, %edi
@@ -611,6 +819,7 @@ L(gobble_ashr_4):
movdqa %xmm2, %xmm4
palignr $4, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -619,9 +828,9 @@ L(gobble_ashr_4):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
@@ -636,6 +845,7 @@ L(gobble_ashr_4):
movdqa %xmm2, %xmm4
palignr $4, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -644,9 +854,9 @@ L(gobble_ashr_4):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
@@ -661,8 +871,8 @@ L(nibble_ashr_4):
test $0xfff0, %esi
jnz L(ashr_4_exittail)
-#ifdef USE_AS_STRNCMP
- cmp $12, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $12, REM
jbe L(ashr_4_exittail)
#endif
@@ -690,6 +900,7 @@ L(ashr_5):
movdqa (%eax), %xmm1
pcmpeqb %xmm1, %xmm0
pslldq $11, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm2
psubb %xmm0, %xmm2
pmovmskb %xmm2, %edi
@@ -704,7 +915,7 @@ L(ashr_5):
movdqa (%edx), %xmm3
pxor %xmm0, %xmm0
mov $16, %ecx
- or $5, %ebx
+ orl $5, FLAGS
lea 5(%edx), %edi
and $0xfff, %edi
sub $0x1000, %edi
@@ -720,6 +931,7 @@ L(gobble_ashr_5):
movdqa %xmm2, %xmm4
palignr $5, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -728,9 +940,9 @@ L(gobble_ashr_5):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
add $16, %ecx
@@ -744,6 +956,7 @@ L(gobble_ashr_5):
movdqa %xmm2, %xmm4
palignr $5, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -752,9 +965,9 @@ L(gobble_ashr_5):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
add $16, %ecx
@@ -768,8 +981,8 @@ L(nibble_ashr_5):
test $0xffe0, %esi
jnz L(ashr_5_exittail)
-#ifdef USE_AS_STRNCMP
- cmp $11, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $11, REM
jbe L(ashr_5_exittail)
#endif
pxor %xmm0, %xmm0
@@ -797,6 +1010,7 @@ L(ashr_6):
movdqa (%eax), %xmm1
pcmpeqb %xmm1, %xmm0
pslldq $10, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm2
psubb %xmm0, %xmm2
pmovmskb %xmm2, %edi
@@ -811,7 +1025,7 @@ L(ashr_6):
movdqa (%edx), %xmm3
pxor %xmm0, %xmm0
mov $16, %ecx
- or $6, %ebx
+ orl $6, FLAGS
lea 6(%edx), %edi
and $0xfff, %edi
sub $0x1000, %edi
@@ -827,6 +1041,7 @@ L(gobble_ashr_6):
movdqa %xmm2, %xmm4
palignr $6, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -835,9 +1050,9 @@ L(gobble_ashr_6):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
@@ -852,6 +1067,7 @@ L(gobble_ashr_6):
movdqa %xmm2, %xmm4
palignr $6, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -859,9 +1075,9 @@ L(gobble_ashr_6):
pmovmskb %xmm1, %esi
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
@@ -876,8 +1092,8 @@ L(nibble_ashr_6):
test $0xffc0, %esi
jnz L(ashr_6_exittail)
-#ifdef USE_AS_STRNCMP
- cmp $10, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $10, REM
jbe L(ashr_6_exittail)
#endif
pxor %xmm0, %xmm0
@@ -905,6 +1121,7 @@ L(ashr_7):
movdqa (%eax), %xmm1
pcmpeqb %xmm1, %xmm0
pslldq $9, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm2
psubb %xmm0, %xmm2
pmovmskb %xmm2, %edi
@@ -919,7 +1136,7 @@ L(ashr_7):
movdqa (%edx), %xmm3
pxor %xmm0, %xmm0
mov $16, %ecx
- or $7, %ebx
+ orl $7, FLAGS
lea 8(%edx), %edi
and $0xfff, %edi
sub $0x1000, %edi
@@ -935,6 +1152,7 @@ L(gobble_ashr_7):
movdqa %xmm2, %xmm4
palignr $7, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -943,9 +1161,9 @@ L(gobble_ashr_7):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
@@ -960,6 +1178,7 @@ L(gobble_ashr_7):
movdqa %xmm2, %xmm4
palignr $7, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -968,9 +1187,9 @@ L(gobble_ashr_7):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
@@ -985,8 +1204,8 @@ L(nibble_ashr_7):
test $0xff80, %esi
jnz L(ashr_7_exittail)
-#ifdef USE_AS_STRNCMP
- cmp $9, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $9, REM
jbe L(ashr_7_exittail)
#endif
pxor %xmm0, %xmm0
@@ -1014,6 +1233,7 @@ L(ashr_8):
movdqa (%eax), %xmm1
pcmpeqb %xmm1, %xmm0
pslldq $8, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm2
psubb %xmm0, %xmm2
pmovmskb %xmm2, %edi
@@ -1028,7 +1248,7 @@ L(ashr_8):
movdqa (%edx), %xmm3
pxor %xmm0, %xmm0
mov $16, %ecx
- or $8, %ebx
+ orl $8, FLAGS
lea 8(%edx), %edi
and $0xfff, %edi
sub $0x1000, %edi
@@ -1044,6 +1264,7 @@ L(gobble_ashr_8):
movdqa %xmm2, %xmm4
palignr $8, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -1052,9 +1273,9 @@ L(gobble_ashr_8):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
add $16, %ecx
@@ -1068,6 +1289,7 @@ L(gobble_ashr_8):
movdqa %xmm2, %xmm4
palignr $8, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -1076,9 +1298,9 @@ L(gobble_ashr_8):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
add $16, %ecx
@@ -1092,8 +1314,8 @@ L(nibble_ashr_8):
test $0xff00, %esi
jnz L(ashr_8_exittail)
-#ifdef USE_AS_STRNCMP
- cmp $8, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $8, REM
jbe L(ashr_8_exittail)
#endif
pxor %xmm0, %xmm0
@@ -1121,6 +1343,7 @@ L(ashr_9):
movdqa (%eax), %xmm1
pcmpeqb %xmm1, %xmm0
pslldq $7, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm2
psubb %xmm0, %xmm2
pmovmskb %xmm2, %edi
@@ -1135,7 +1358,7 @@ L(ashr_9):
movdqa (%edx), %xmm3
pxor %xmm0, %xmm0
mov $16, %ecx
- or $9, %ebx
+ orl $9, FLAGS
lea 9(%edx), %edi
and $0xfff, %edi
sub $0x1000, %edi
@@ -1151,6 +1374,7 @@ L(gobble_ashr_9):
movdqa %xmm2, %xmm4
palignr $9, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -1159,9 +1383,9 @@ L(gobble_ashr_9):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
add $16, %ecx
@@ -1175,6 +1399,7 @@ L(gobble_ashr_9):
movdqa %xmm2, %xmm4
palignr $9, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -1183,9 +1408,9 @@ L(gobble_ashr_9):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
add $16, %ecx
@@ -1199,8 +1424,8 @@ L(nibble_ashr_9):
test $0xfe00, %esi
jnz L(ashr_9_exittail)
-#ifdef USE_AS_STRNCMP
- cmp $7, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $7, REM
jbe L(ashr_9_exittail)
#endif
pxor %xmm0, %xmm0
@@ -1227,6 +1452,7 @@ L(ashr_10):
movdqa (%eax), %xmm1
pcmpeqb %xmm1, %xmm0
pslldq $6, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm2
psubb %xmm0, %xmm2
pmovmskb %xmm2, %edi
@@ -1241,7 +1467,7 @@ L(ashr_10):
movdqa (%edx), %xmm3
pxor %xmm0, %xmm0
mov $16, %ecx
- or $10, %ebx
+ orl $10, FLAGS
lea 10(%edx), %edi
and $0xfff, %edi
sub $0x1000, %edi
@@ -1257,6 +1483,7 @@ L(gobble_ashr_10):
movdqa %xmm2, %xmm4
palignr $10, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -1265,9 +1492,9 @@ L(gobble_ashr_10):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
add $16, %ecx
@@ -1281,6 +1508,7 @@ L(gobble_ashr_10):
movdqa %xmm2, %xmm4
palignr $10, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -1289,9 +1517,9 @@ L(gobble_ashr_10):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
add $16, %ecx
@@ -1305,8 +1533,8 @@ L(nibble_ashr_10):
test $0xfc00, %esi
jnz L(ashr_10_exittail)
-#ifdef USE_AS_STRNCMP
- cmp $6, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $6, REM
jbe L(ashr_10_exittail)
#endif
pxor %xmm0, %xmm0
@@ -1333,6 +1561,7 @@ L(ashr_11):
movdqa (%eax), %xmm1
pcmpeqb %xmm1, %xmm0
pslldq $5, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm2
psubb %xmm0, %xmm2
pmovmskb %xmm2, %edi
@@ -1347,7 +1576,7 @@ L(ashr_11):
movdqa (%edx), %xmm3
pxor %xmm0, %xmm0
mov $16, %ecx
- or $11, %ebx
+ orl $11, FLAGS
lea 11(%edx), %edi
and $0xfff, %edi
sub $0x1000, %edi
@@ -1363,6 +1592,7 @@ L(gobble_ashr_11):
movdqa %xmm2, %xmm4
palignr $11, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -1371,9 +1601,9 @@ L(gobble_ashr_11):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
add $16, %ecx
@@ -1387,6 +1617,7 @@ L(gobble_ashr_11):
movdqa %xmm2, %xmm4
palignr $11, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -1395,9 +1626,9 @@ L(gobble_ashr_11):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
add $16, %ecx
@@ -1411,8 +1642,8 @@ L(nibble_ashr_11):
test $0xf800, %esi
jnz L(ashr_11_exittail)
-#ifdef USE_AS_STRNCMP
- cmp $5, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $5, REM
jbe L(ashr_11_exittail)
#endif
pxor %xmm0, %xmm0
@@ -1439,6 +1670,7 @@ L(ashr_12):
movdqa (%eax), %xmm1
pcmpeqb %xmm1, %xmm0
pslldq $4, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm2
psubb %xmm0, %xmm2
pmovmskb %xmm2, %edi
@@ -1453,7 +1685,7 @@ L(ashr_12):
movdqa (%edx), %xmm3
pxor %xmm0, %xmm0
mov $16, %ecx
- or $12, %ebx
+ orl $12, FLAGS
lea 12(%edx), %edi
and $0xfff, %edi
sub $0x1000, %edi
@@ -1469,6 +1701,7 @@ L(gobble_ashr_12):
movdqa %xmm2, %xmm4
palignr $12, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -1477,9 +1710,9 @@ L(gobble_ashr_12):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
@@ -1494,6 +1727,7 @@ L(gobble_ashr_12):
movdqa %xmm2, %xmm4
palignr $12, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -1502,9 +1736,9 @@ L(gobble_ashr_12):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
add $16, %ecx
@@ -1518,8 +1752,8 @@ L(nibble_ashr_12):
test $0xf000, %esi
jnz L(ashr_12_exittail)
-#ifdef USE_AS_STRNCMP
- cmp $4, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $4, REM
jbe L(ashr_12_exittail)
#endif
pxor %xmm0, %xmm0
@@ -1546,6 +1780,7 @@ L(ashr_13):
movdqa (%eax), %xmm1
pcmpeqb %xmm1, %xmm0
pslldq $3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm2
psubb %xmm0, %xmm2
pmovmskb %xmm2, %edi
@@ -1560,7 +1795,7 @@ L(ashr_13):
movdqa (%edx), %xmm3
pxor %xmm0, %xmm0
mov $16, %ecx
- or $13, %ebx
+ orl $13, FLAGS
lea 13(%edx), %edi
and $0xfff, %edi
sub $0x1000, %edi
@@ -1576,6 +1811,7 @@ L(gobble_ashr_13):
movdqa %xmm2, %xmm4
palignr $13, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -1584,9 +1820,9 @@ L(gobble_ashr_13):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
add $16, %ecx
@@ -1600,6 +1836,7 @@ L(gobble_ashr_13):
movdqa %xmm2, %xmm4
palignr $13, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -1608,9 +1845,9 @@ L(gobble_ashr_13):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
add $16, %ecx
@@ -1624,8 +1861,8 @@ L(nibble_ashr_13):
test $0xe000, %esi
jnz L(ashr_13_exittail)
-#ifdef USE_AS_STRNCMP
- cmp $3, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $3, REM
jbe L(ashr_13_exittail)
#endif
pxor %xmm0, %xmm0
@@ -1652,6 +1889,7 @@ L(ashr_14):
movdqa (%eax), %xmm1
pcmpeqb %xmm1, %xmm0
pslldq $2, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm2
psubb %xmm0, %xmm2
pmovmskb %xmm2, %edi
@@ -1666,7 +1904,7 @@ L(ashr_14):
movdqa (%edx), %xmm3
pxor %xmm0, %xmm0
mov $16, %ecx
- or $14, %ebx
+ orl $14, FLAGS
lea 14(%edx), %edi
and $0xfff, %edi
sub $0x1000, %edi
@@ -1682,6 +1920,7 @@ L(gobble_ashr_14):
movdqa %xmm2, %xmm4
palignr $14, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -1690,9 +1929,9 @@ L(gobble_ashr_14):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
add $16, %ecx
@@ -1706,6 +1945,7 @@ L(gobble_ashr_14):
movdqa %xmm2, %xmm4
palignr $14, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -1714,9 +1954,9 @@ L(gobble_ashr_14):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
add $16, %ecx
@@ -1730,8 +1970,8 @@ L(nibble_ashr_14):
test $0xc000, %esi
jnz L(ashr_14_exittail)
-#ifdef USE_AS_STRNCMP
- cmp $2, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $2, REM
jbe L(ashr_14_exittail)
#endif
pxor %xmm0, %xmm0
@@ -1759,6 +1999,7 @@ L(ashr_15):
movdqa (%eax), %xmm1
pcmpeqb %xmm1, %xmm0
pslldq $1, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm2
psubb %xmm0, %xmm2
pmovmskb %xmm2, %edi
@@ -1773,7 +2014,7 @@ L(ashr_15):
movdqa (%edx), %xmm3
pxor %xmm0, %xmm0
mov $16, %ecx
- or $15, %ebx
+ orl $15, FLAGS
lea 15(%edx), %edi
and $0xfff, %edi
sub $0x1000, %edi
@@ -1789,6 +2030,7 @@ L(gobble_ashr_15):
movdqa %xmm2, %xmm4
palignr $15, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -1797,9 +2039,9 @@ L(gobble_ashr_15):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
add $16, %ecx
@@ -1813,6 +2055,7 @@ L(gobble_ashr_15):
movdqa %xmm2, %xmm4
palignr $15, %xmm3, %xmm2
+ TOLOWER (%xmm1, %xmm2)
pcmpeqb %xmm1, %xmm0
pcmpeqb %xmm2, %xmm1
@@ -1821,9 +2064,9 @@ L(gobble_ashr_15):
sub $0xffff, %esi
jnz L(exit)
-#ifdef USE_AS_STRNCMP
- cmp $16, %ebp
- lea -16(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $16, REM
+ lea -16(REM), REM
jbe L(more8byteseq)
#endif
add $16, %ecx
@@ -1837,8 +2080,8 @@ L(nibble_ashr_15):
test $0x8000, %esi
jnz L(ashr_15_exittail)
-#ifdef USE_AS_STRNCMP
- cmp $1, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $1, REM
jbe L(ashr_15_exittail)
#endif
pxor %xmm0, %xmm0
@@ -1854,27 +2097,34 @@ L(ashr_15_exittail):
.p2align 4
L(aftertail):
+ TOLOWER (%xmm1, %xmm3)
pcmpeqb %xmm3, %xmm1
psubb %xmm0, %xmm1
pmovmskb %xmm1, %esi
not %esi
L(exit):
- mov %ebx, %edi
+ mov FLAGS, %edi
and $0x1f, %edi
lea -16(%edi, %ecx), %edi
L(less32bytes):
add %edi, %edx
add %ecx, %eax
- test $0x20, %ebx
+ testl $0x20, FLAGS
jz L(ret2)
xchg %eax, %edx
.p2align 4
L(ret2):
mov %esi, %ecx
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ addl $4, %esp
+ cfi_adjust_cfa_offset (-4)
+#endif
POP (%esi)
POP (%edi)
- POP (%ebx)
+#if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
+ POP (FLAGS)
+#endif
L(less16bytes):
test %cl, %cl
jz L(2next_8_bytes)
@@ -1899,100 +2149,179 @@ L(less16bytes):
test $0x40, %cl
jnz L(Byte6)
-#ifdef USE_AS_STRNCMP
- cmp $7, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $7, REM
jbe L(eq)
#endif
movzx 7(%eax), %ecx
movzx 7(%edx), %eax
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
+# endif
+#endif
sub %ecx, %eax
RETURN
L(Byte0):
-#ifdef USE_AS_STRNCMP
- cmp $0, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $0, REM
jbe L(eq)
#endif
movzx (%eax), %ecx
movzx (%edx), %eax
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
+# endif
+#endif
+
sub %ecx, %eax
RETURN
L(Byte1):
-#ifdef USE_AS_STRNCMP
- cmp $1, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $1, REM
jbe L(eq)
#endif
movzx 1(%eax), %ecx
movzx 1(%edx), %eax
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
+# endif
+#endif
+
sub %ecx, %eax
RETURN
L(Byte2):
-#ifdef USE_AS_STRNCMP
- cmp $2, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $2, REM
jbe L(eq)
#endif
movzx 2(%eax), %ecx
movzx 2(%edx), %eax
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
+# endif
+#endif
+
sub %ecx, %eax
RETURN
L(Byte3):
-#ifdef USE_AS_STRNCMP
- cmp $3, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $3, REM
jbe L(eq)
#endif
movzx 3(%eax), %ecx
movzx 3(%edx), %eax
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
+# endif
+#endif
+
sub %ecx, %eax
RETURN
L(Byte4):
-#ifdef USE_AS_STRNCMP
- cmp $4, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $4, REM
jbe L(eq)
#endif
movzx 4(%eax), %ecx
movzx 4(%edx), %eax
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
+# endif
+#endif
+
sub %ecx, %eax
RETURN
L(Byte5):
-#ifdef USE_AS_STRNCMP
- cmp $5, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $5, REM
jbe L(eq)
#endif
movzx 5(%eax), %ecx
movzx 5(%edx), %eax
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
+# endif
+#endif
+
sub %ecx, %eax
RETURN
L(Byte6):
-#ifdef USE_AS_STRNCMP
- cmp $6, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $6, REM
jbe L(eq)
#endif
movzx 6(%eax), %ecx
movzx 6(%edx), %eax
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
+# endif
+#endif
+
sub %ecx, %eax
RETURN
L(2next_8_bytes):
add $8, %eax
add $8, %edx
-#ifdef USE_AS_STRNCMP
- cmp $8, %ebp
- lea -8(%ebp), %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $8, REM
+ lea -8(REM), REM
jbe L(eq)
#endif
@@ -2017,196 +2346,455 @@ L(2next_8_bytes):
test $0x40, %ch
jnz L(Byte6)
-#ifdef USE_AS_STRNCMP
- cmp $7, %ebp
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ cmp $7, REM
jbe L(eq)
#endif
movzx 7(%eax), %ecx
movzx 7(%edx), %eax
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%eax,4), %eax
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%eax,4), %eax
+# endif
+#endif
+
sub %ecx, %eax
RETURN
+#ifdef USE_AS_STRNCMP
+L(neq_sncmp):
+#endif
L(neq):
mov $1, %eax
ja L(neq_bigger)
neg %eax
L(neq_bigger):
-#ifdef USE_AS_STRNCMP
- POP (%ebp)
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+ addl $4, %esp
+ cfi_adjust_cfa_offset (-4)
+#endif
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ POP (REM)
+#endif
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+ POP (%ebx)
+# endif
#endif
ret
-#ifdef USE_AS_STRNCMP
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
.p2align 4
cfi_restore_state
L(more8byteseq):
+
+# ifdef USE_AS_STRNCASECMP_L
+ addl $4, %esp
+ cfi_adjust_cfa_offset (-4)
+# endif
POP (%esi)
POP (%edi)
- POP (%ebx)
+# ifdef USE_AS_STRNCMP
+ POP (FLAGS)
+# endif
#endif
+#ifdef USE_AS_STRNCMP
+L(eq_sncmp):
+#endif
L(eq):
-#ifdef USE_AS_STRNCMP
- POP (%ebp)
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+ POP (REM)
+#endif
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# ifdef PIC
+ POP (%ebx)
+# endif
#endif
xorl %eax, %eax
ret
-#ifdef USE_AS_STRNCMP
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
.p2align 4
- CFI_PUSH (%ebp)
+# if defined USE_AS_STRNCASECMP_L && defined PIC
+ CFI_PUSH (%ebx)
+# endif
+ CFI_PUSH (REM)
L(less16bytes_sncmp):
- test %ebp, %ebp
- jz L(eq)
+# ifdef USE_AS_STRNCASECMP_L
+ PUSH (%esi)
+# endif
+ test REM, REM
+ jz L(eq_sncmp)
movzbl (%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+ movzbl (%edx), %esi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+# endif
+ cmpl %ecx, %esi
+# else
cmpb %cl, (%edx)
- jne L(neq)
+# endif
+ jne L(neq_sncmp)
test %cl, %cl
je L(eq)
- cmp $1, %ebp
- je L(eq)
+ cmp $1, REM
+ je L(eq_sncmp)
movzbl 1(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+ movzbl 1(%edx), %esi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+# endif
+ cmpl %ecx, %esi
+# else
cmpb %cl, 1(%edx)
- jne L(neq)
+# endif
+ jne L(neq_sncmp)
test %cl, %cl
- je L(eq)
+ je L(eq_sncmp)
- cmp $2, %ebp
- je L(eq)
+ cmp $2, REM
+ je L(eq_sncmp)
movzbl 2(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+ movzbl 2(%edx), %esi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+# endif
+ cmpl %ecx, %esi
+# else
cmpb %cl, 2(%edx)
- jne L(neq)
+# endif
+ jne L(neq_sncmp)
test %cl, %cl
- je L(eq)
+ je L(eq_sncmp)
- cmp $3, %ebp
- je L(eq)
+ cmp $3, REM
+ je L(eq_sncmp)
movzbl 3(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+ movzbl 3(%edx), %esi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+# endif
+ cmpl %ecx, %esi
+# else
cmpb %cl, 3(%edx)
- jne L(neq)
+# endif
+ jne L(neq_sncmp)
test %cl, %cl
- je L(eq)
+ je L(eq_sncmp)
- cmp $4, %ebp
- je L(eq)
+ cmp $4, REM
+ je L(eq_sncmp)
movzbl 4(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+ movzbl 4(%edx), %esi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+# endif
+ cmpl %ecx, %esi
+# else
cmpb %cl, 4(%edx)
- jne L(neq)
+# endif
+ jne L(neq_sncmp)
test %cl, %cl
- je L(eq)
+ je L(eq_sncmp)
- cmp $5, %ebp
- je L(eq)
+ cmp $5, REM
+ je L(eq_sncmp)
movzbl 5(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+ movzbl 5(%edx), %esi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+# endif
+ cmpl %ecx, %esi
+# else
cmpb %cl, 5(%edx)
- jne L(neq)
+# endif
+ jne L(neq_sncmp)
test %cl, %cl
- je L(eq)
+ je L(eq_sncmp)
- cmp $6, %ebp
- je L(eq)
+ cmp $6, REM
+ je L(eq_sncmp)
movzbl 6(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+ movzbl 6(%edx), %esi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+# endif
+ cmpl %ecx, %esi
+# else
cmpb %cl, 6(%edx)
- jne L(neq)
+# endif
+ jne L(neq_sncmp)
test %cl, %cl
- je L(eq)
+ je L(eq_sncmp)
- cmp $7, %ebp
- je L(eq)
+ cmp $7, REM
+ je L(eq_sncmp)
movzbl 7(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+ movzbl 7(%edx), %esi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+# endif
+ cmpl %ecx, %esi
+# else
cmpb %cl, 7(%edx)
- jne L(neq)
+# endif
+ jne L(neq_sncmp)
test %cl, %cl
- je L(eq)
+ je L(eq_sncmp)
- cmp $8, %ebp
- je L(eq)
+ cmp $8, REM
+ je L(eq_sncmp)
movzbl 8(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+ movzbl 8(%edx), %esi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+# endif
+ cmpl %ecx, %esi
+# else
cmpb %cl, 8(%edx)
- jne L(neq)
+# endif
+ jne L(neq_sncmp)
test %cl, %cl
- je L(eq)
+ je L(eq_sncmp)
- cmp $9, %ebp
- je L(eq)
+ cmp $9, REM
+ je L(eq_sncmp)
movzbl 9(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+ movzbl 9(%edx), %esi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+# endif
+ cmpl %ecx, %esi
+# else
cmpb %cl, 9(%edx)
- jne L(neq)
+# endif
+ jne L(neq_sncmp)
test %cl, %cl
- je L(eq)
+ je L(eq_sncmp)
- cmp $10, %ebp
- je L(eq)
+ cmp $10, REM
+ je L(eq_sncmp)
movzbl 10(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+ movzbl 10(%edx), %esi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+# endif
+ cmpl %ecx, %esi
+# else
cmpb %cl, 10(%edx)
- jne L(neq)
+# endif
+ jne L(neq_sncmp)
test %cl, %cl
- je L(eq)
+ je L(eq_sncmp)
- cmp $11, %ebp
- je L(eq)
+ cmp $11, REM
+ je L(eq_sncmp)
movzbl 11(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+ movzbl 11(%edx), %esi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+# endif
+ cmpl %ecx, %esi
+# else
cmpb %cl, 11(%edx)
- jne L(neq)
+# endif
+ jne L(neq_sncmp)
test %cl, %cl
- je L(eq)
+ je L(eq_sncmp)
- cmp $12, %ebp
- je L(eq)
+ cmp $12, REM
+ je L(eq_sncmp)
movzbl 12(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+ movzbl 12(%edx), %esi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+# endif
+ cmpl %ecx, %esi
+# else
cmpb %cl, 12(%edx)
- jne L(neq)
+# endif
+ jne L(neq_sncmp)
test %cl, %cl
- je L(eq)
+ je L(eq_sncmp)
- cmp $13, %ebp
- je L(eq)
+ cmp $13, REM
+ je L(eq_sncmp)
movzbl 13(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+ movzbl 13(%edx), %esi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+# endif
+ cmpl %ecx, %esi
+# else
cmpb %cl, 13(%edx)
- jne L(neq)
+# endif
+ jne L(neq_sncmp)
test %cl, %cl
- je L(eq)
+ je L(eq_sncmp)
- cmp $14, %ebp
- je L(eq)
+ cmp $14, REM
+ je L(eq_sncmp)
movzbl 14(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+ movzbl 14(%edx), %esi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+# endif
+ cmpl %ecx, %esi
+# else
cmpb %cl, 14(%edx)
- jne L(neq)
+# endif
+ jne L(neq_sncmp)
test %cl, %cl
- je L(eq)
+ je L(eq_sncmp)
- cmp $15, %ebp
- je L(eq)
+ cmp $15, REM
+ je L(eq_sncmp)
movzbl 15(%eax), %ecx
+# ifdef USE_AS_STRNCASECMP_L
+ movzbl 15(%edx), %esi
+# ifdef PIC
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower@GOTOFF+128*4(%ebx,%esi,4), %esi
+# else
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%ecx,4), %ecx
+ movl _nl_C_LC_CTYPE_tolower+128*4(,%esi,4), %esi
+# endif
+ cmpl %ecx, %esi
+# else
cmpb %cl, 15(%edx)
- jne L(neq)
- test %cl, %cl
- je L(eq)
+# endif
+ jne L(neq_sncmp)
- POP (%ebp)
+# ifdef USE_AS_STRNCASECMP_L
+L(eq_sncmp):
+ POP (%esi)
+# endif
+ POP (REM)
+# if defined USE_AS_STRNCASECMP_L && defined PIC
+ POP (%ebx)
+# endif
xor %eax, %eax
ret
+
+# ifdef USE_AS_STRNCASECMP_L
+ .p2align 4
+# ifdef PIC
+ CFI_PUSH (%ebx)
+# endif
+ CFI_PUSH (REM)
+ CFI_PUSH (%esi)
+L(neq_sncmp):
+ mov $1, %eax
+ mov $-1, %edx
+ cmovna %edx, %eax
+ POP (%esi)
+ POP (REM)
+# ifdef PIC
+ POP (%ebx)
+# endif
+ ret
+# endif
#endif
END (STRCMP)
diff --git a/libc/sysdeps/i386/i686/multiarch/strcmp.S b/libc/sysdeps/i386/i686/multiarch/strcmp.S
index 7136d47e8..28e2d6154 100644
--- a/libc/sysdeps/i386/i686/multiarch/strcmp.S
+++ b/libc/sysdeps/i386/i686/multiarch/strcmp.S
@@ -1,5 +1,5 @@
/* Multiple versions of strcmp
- Copyright (C) 2010 Free Software Foundation, Inc.
+ Copyright (C) 2010, 2011 Free Software Foundation, Inc.
Contributed by Intel Corporation.
This file is part of the GNU C Library.
@@ -21,18 +21,30 @@
#include <sysdep.h>
#include <init-arch.h>
-#ifndef USE_AS_STRNCMP
-# define STRCMP strcmp
-# define __GI_STRCMP __GI_strcmp
-# define __STRCMP_IA32 __strcmp_ia32
-# define __STRCMP_SSSE3 __strcmp_ssse3
-# define __STRCMP_SSE4_2 __strcmp_sse4_2
-#else
+#ifdef USE_AS_STRNCMP
# define STRCMP strncmp
# define __GI_STRCMP __GI_strncmp
# define __STRCMP_IA32 __strncmp_ia32
# define __STRCMP_SSSE3 __strncmp_ssse3
# define __STRCMP_SSE4_2 __strncmp_sse4_2
+#elif defined USE_AS_STRCASECMP_L
+# define STRCMP __strcasecmp_l
+# define __GI_STRCMP __GI_strcasecmp_l
+# define __STRCMP_IA32 __strcasecmp_l_ia32
+# define __STRCMP_SSSE3 __strcasecmp_l_ssse3
+# define __STRCMP_SSE4_2 __strcasecmp_l_sse4_2
+#elif defined USE_AS_STRNCASECMP_L
+# define STRCMP __strncasecmp_l
+# define __GI_STRCMP __GI_strncasecmp_l
+# define __STRCMP_IA32 __strncasecmp_l_ia32
+# define __STRCMP_SSSE3 __strncasecmp_l_ssse3
+# define __STRCMP_SSE4_2 __strncasecmp_l_sse4_2
+#else
+# define STRCMP strcmp
+# define __GI_STRCMP __GI_strcmp
+# define __STRCMP_IA32 __strcmp_ia32
+# define __STRCMP_SSSE3 __strcmp_ssse3
+# define __STRCMP_SSE4_2 __strcmp_sse4_2
#endif
/* Define multiple versions only for the definition in libc. Don't
diff --git a/libc/sysdeps/i386/i686/multiarch/strncase-c.c b/libc/sysdeps/i386/i686/multiarch/strncase-c.c
new file mode 100644
index 000000000..76581eb62
--- /dev/null
+++ b/libc/sysdeps/i386/i686/multiarch/strncase-c.c
@@ -0,0 +1,8 @@
+#include <string.h>
+
+extern __typeof (strncasecmp) __strncasecmp_nonascii;
+
+#define __strncasecmp __strncasecmp_nonascii
+#include <string/strncase.c>
+
+strong_alias (__strncasecmp_nonascii, __strncasecmp_ia32)
diff --git a/libc/sysdeps/i386/i686/multiarch/strncase.S b/libc/sysdeps/i386/i686/multiarch/strncase.S
new file mode 100644
index 000000000..d20532f99
--- /dev/null
+++ b/libc/sysdeps/i386/i686/multiarch/strncase.S
@@ -0,0 +1,68 @@
+/* Entry point for multi-version x86 strncasecmp.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <sysdep.h>
+#include <init-arch.h>
+
+#ifdef SHARED
+ .text
+ENTRY(__strncasecmp)
+ .type __strncasecmp, @gnu_indirect_function
+ pushl %ebx
+ cfi_adjust_cfa_offset (4)
+ cfi_rel_offset (ebx, 0)
+ call __i686.get_pc_thunk.bx
+ addl $_GLOBAL_OFFSET_TABLE_, %ebx
+ cmpl $0, KIND_OFFSET+__cpu_features@GOTOFF(%ebx)
+ jne 1f
+ call __init_cpu_features
+1: leal __strncasecmp_ia32@GOTOFF(%ebx), %eax
+ testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features@GOTOFF(%ebx)
+ jz 2f
+ leal __strncasecmp_ssse3@GOTOFF(%ebx), %eax
+ testl $bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features@GOTOFF(%ebx)
+ jz 2f
+ leal __strncasecmp_sse4_2@GOTOFF(%ebx), %eax
+2: popl %ebx
+ cfi_adjust_cfa_offset (-4)
+ cfi_restore (ebx)
+ ret
+END(__strncasecmp)
+#else
+ .text
+ENTRY(__strncasecmp)
+ .type __strncasecmp, @gnu_indirect_function
+ cmpl $0, KIND_OFFSET+__cpu_features
+ jne 1f
+ call __init_cpu_features
+1: leal __strncasecmp_ia32, %eax
+ testl $bit_SSSE3, CPUID_OFFSET+index_SSSE3+__cpu_features
+ jz 2f
+ leal __strncasecmp_ssse3, %eax
+#if 0
+ // XXX Temporarily
+ testl $bit_SSE4_2, CPUID_OFFSET+index_SSE4_2+__cpu_features
+ jz 2f
+ leal __strncasecmp_sse4_2, %eax
+#endif
+2: ret
+END(__strncasecmp)
+#endif
+
+weak_alias (__strncasecmp, strncasecmp)
diff --git a/libc/sysdeps/i386/i686/multiarch/strncase_l-c.c b/libc/sysdeps/i386/i686/multiarch/strncase_l-c.c
new file mode 100644
index 000000000..0c68b8d1c
--- /dev/null
+++ b/libc/sysdeps/i386/i686/multiarch/strncase_l-c.c
@@ -0,0 +1,11 @@
+#include <string.h>
+
+extern __typeof (strncasecmp_l) __strncasecmp_l_nonascii;
+
+#define __strncasecmp_l __strncasecmp_l_nonascii
+#define USE_IN_EXTENDED_LOCALE_MODEL 1
+#include <string/strncase.c>
+
+/* The needs of strcasecmp in libc are minimal, no need to go through
+ the IFUNC. */
+strong_alias (__strncasecmp_l_nonascii, __GI___strncasecmp_l)
diff --git a/libc/sysdeps/i386/i686/multiarch/strncase_l-sse4.S b/libc/sysdeps/i386/i686/multiarch/strncase_l-sse4.S
new file mode 100644
index 000000000..557210832
--- /dev/null
+++ b/libc/sysdeps/i386/i686/multiarch/strncase_l-sse4.S
@@ -0,0 +1,2 @@
+#define USE_AS_STRNCASECMP_L 1
+#include "strcmp-sse4.S"
diff --git a/libc/sysdeps/i386/i686/multiarch/strncase_l-ssse3.S b/libc/sysdeps/i386/i686/multiarch/strncase_l-ssse3.S
new file mode 100644
index 000000000..d438a1ae3
--- /dev/null
+++ b/libc/sysdeps/i386/i686/multiarch/strncase_l-ssse3.S
@@ -0,0 +1,2 @@
+#define USE_AS_STRNCASECMP_L 1
+#include "strcmp-ssse3.S"
diff --git a/libc/sysdeps/i386/i686/multiarch/strncase_l.S b/libc/sysdeps/i386/i686/multiarch/strncase_l.S
new file mode 100644
index 000000000..a808c8cd7
--- /dev/null
+++ b/libc/sysdeps/i386/i686/multiarch/strncase_l.S
@@ -0,0 +1,5 @@
+#define STRCMP __strncasecmp_l
+#define USE_AS_STRNCASECMP_L
+#include "strcmp.S"
+
+weak_alias (__strncasecmp_l, strncasecmp_l)
diff --git a/libc/sysdeps/i386/i686/multiarch/strnlen-c.c b/libc/sysdeps/i386/i686/multiarch/strnlen-c.c
index 567af2c81..f02465d6a 100644
--- a/libc/sysdeps/i386/i686/multiarch/strnlen-c.c
+++ b/libc/sysdeps/i386/i686/multiarch/strnlen-c.c
@@ -1,6 +1,6 @@
-#ifndef NOT_IN_libc
-# define STRNLEN __strnlen_ia32
-# undef libc_hidden_builtin_def
+#define STRNLEN __strnlen_ia32
+#ifdef SHARED
+# undef libc_hidden_def
# define libc_hidden_def(name) \
__hidden_ver1 (__strnlen_ia32, __GI_strnlen, __strnlen_ia32);
#endif
diff --git a/libc/sysdeps/i386/i686/multiarch/wcscmp-c.c b/libc/sysdeps/i386/i686/multiarch/wcscmp-c.c
index 9592455d0..165c56afb 100644
--- a/libc/sysdeps/i386/i686/multiarch/wcscmp-c.c
+++ b/libc/sysdeps/i386/i686/multiarch/wcscmp-c.c
@@ -1,10 +1,12 @@
-#ifndef NOT_IN_libc
-
-# define WCSCMP __wcscmp_ia32
+#include <wchar.h>
+#define WCSCMP __wcscmp_ia32
+#ifdef SHARED
# undef libc_hidden_def
# define libc_hidden_def(name) \
__hidden_ver1 (__wcscmp_ia32, __GI_wcscmp, __wcscmp_ia32);
#endif
+extern __typeof (wcscmp) __wcscmp_ia32;
+
#include "wcsmbs/wcscmp.c"
diff --git a/libc/sysdeps/i386/i686/multiarch/wcslen-c.c b/libc/sysdeps/i386/i686/multiarch/wcslen-c.c
index 49f32a25e..8cebfea0e 100644
--- a/libc/sysdeps/i386/i686/multiarch/wcslen-c.c
+++ b/libc/sysdeps/i386/i686/multiarch/wcslen-c.c
@@ -1,5 +1,9 @@
+#include <wchar.h>
+
#ifndef NOT_IN_libc
# define WCSLEN __wcslen_ia32
#endif
+extern __typeof (wcslen) __wcslen_ia32;
+
#include "wcsmbs/wcslen.c"
diff --git a/libc/sysdeps/i386/i686/multiarch/wmemcmp-c.c b/libc/sysdeps/i386/i686/multiarch/wmemcmp-c.c
index 94ff6151f..bd37660fc 100644
--- a/libc/sysdeps/i386/i686/multiarch/wmemcmp-c.c
+++ b/libc/sysdeps/i386/i686/multiarch/wmemcmp-c.c
@@ -1,5 +1,9 @@
+#include <wchar.h>
+
#ifndef NOT_IN_libc
# define WMEMCMP __wmemcmp_ia32
#endif
+extern __typeof (wmemcmp) __wmemcmp_ia32;
+
#include "wcsmbs/wmemcmp.c"