Merge branch 'x32-strcase'

Conflicts:
	ChangeLog
This commit is contained in:
Ulrich Drepper 2011-11-14 18:39:05 -05:00
commit 8e3f3f8fda
18 changed files with 1556 additions and 347 deletions

View File

@ -3,6 +3,42 @@
* malloc/arena.c (arena_get2): Don't call reused_arena when * malloc/arena.c (arena_get2): Don't call reused_arena when
_int_new_arena failed. _int_new_arena failed.
2011-11-14 Ulrich Drepper <drepper@gmail.com>
* sysdeps/i386/i686/multiarch/Makefile [subdir=string]
(sysdep_routines): Add strcasecmp_l-sse4 and strncase_l-sse4.
* sysdeps/i386/i686/multiarch/strcasecmp.S: Re-enable SSE4.2 code.
* sysdeps/i386/i686/multiarch/strcmp.S: Likewise.
* sysdeps/i386/i686/multiarch/strncase.S: Likewise.
* sysdeps/i386/i686/multiarch/strcmp-sse4.S: Change to allow reuse
to compile strcasecmp and strncasecmp.
* sysdeps/i386/i686/multiarch/strcasecmp_l-sse4.S: New file.
* sysdeps/i386/i686/multiarch/strncase_l-sse4.S: New file.
* sysdeps/i386/i686/multiarch/strcmp-ssse3.S: Use L macro consistently.
2011-11-13 Ulrich Drepper <drepper@gmail.com>
* sysdeps/i386/i686/multiarch/Makefile [subdir=string]: Add
locale-defines.sym to gen-as-const-headers.
(sysdep_routines): Add strcasecmp_l-c, strcasecmp-c,
strcasecmp_l-ssse3, strncase_l-c, strncase-c, and strncase_l-ssse3.
* sysdeps/i386/i686/multiarch/strcmp-ssse3.S: Change to allow reuse
to compile strcasecmp and strncasecmp.
* sysdeps/i386/i686/multiarch/strcmp.S: Allow to use for
strcasecmp_l and strncasecmp_l.
* sysdeps/i386/i686/multiarch/locale-defines.sym: New file.
* sysdeps/i386/i686/multiarch/strcasecmp-c.c: New file.
* sysdeps/i386/i686/multiarch/strcasecmp.S: New file.
* sysdeps/i386/i686/multiarch/strcasecmp_l-c.c: New file.
* sysdeps/i386/i686/multiarch/strcasecmp_l-ssse3.S: New file.
* sysdeps/i386/i686/multiarch/strcasecmp_l.S: New file.
* sysdeps/i386/i686/multiarch/strncase-c.c: New file.
* sysdeps/i386/i686/multiarch/strncase.S: New file.
* sysdeps/i386/i686/multiarch/strncase_l-c.c: New file.
* sysdeps/i386/i686/multiarch/strncase_l-ssse3.S: New file.
* sysdeps/i386/i686/multiarch/strncase_l.S: New file.
2011-11-12 Ulrich Drepper <drepper@gmail.com> 2011-11-12 Ulrich Drepper <drepper@gmail.com>
* sysdeps/unix/clock_gettime.c (clock_gettime): No need to assign * sysdeps/unix/clock_gettime.c (clock_gettime): No need to assign

View File

@ -4,6 +4,7 @@ gen-as-const-headers += ifunc-defines.sym
endif endif
ifeq ($(subdir),string) ifeq ($(subdir),string)
gen-as-const-headers += locale-defines.sym
sysdep_routines += bzero-sse2 memset-sse2 memcpy-ssse3 mempcpy-ssse3 \ sysdep_routines += bzero-sse2 memset-sse2 memcpy-ssse3 mempcpy-ssse3 \
memmove-ssse3 memcpy-ssse3-rep mempcpy-ssse3-rep \ memmove-ssse3 memcpy-ssse3-rep mempcpy-ssse3-rep \
memmove-ssse3-rep bcopy-ssse3 bcopy-ssse3-rep \ memmove-ssse3-rep bcopy-ssse3 bcopy-ssse3-rep \
@ -18,7 +19,10 @@ sysdep_routines += bzero-sse2 memset-sse2 memcpy-ssse3 mempcpy-ssse3 \
memchr-sse2 memchr-sse2-bsf \ memchr-sse2 memchr-sse2-bsf \
memrchr-sse2 memrchr-sse2-bsf memrchr-c \ memrchr-sse2 memrchr-sse2-bsf memrchr-c \
rawmemchr-sse2 rawmemchr-sse2-bsf \ rawmemchr-sse2 rawmemchr-sse2-bsf \
strnlen-sse2 strnlen-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)) ifeq (yes,$(config-cflags-sse4))
sysdep_routines += strcspn-c strpbrk-c strspn-c strstr-c strcasestr-c sysdep_routines += strcspn-c strpbrk-c strspn-c strstr-c strcasestr-c
CFLAGS-varshift.c += -msse4 CFLAGS-varshift.c += -msse4

View File

@ -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])

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -0,0 +1,2 @@
#define USE_AS_STRCASECMP_L 1
#include "strcmp-sse4.S"

View File

@ -0,0 +1,2 @@
#define USE_AS_STRCASECMP_L 1
#include "strcmp-ssse3.S"

View File

@ -0,0 +1,5 @@
#define STRCMP __strcasecmp_l
#define USE_AS_STRCASECMP_L
#include "strcmp.S"
weak_alias (__strcasecmp_l, strcasecmp_l)

View File

@ -1,5 +1,5 @@
/* strcmp with SSE4.2 /* strcmp with SSE4.2
Copyright (C) 2010 Free Software Foundation, Inc. Copyright (C) 2010, 2011 Free Software Foundation, Inc.
Contributed by Intel Corporation. Contributed by Intel Corporation.
This file is part of the GNU C Library. This file is part of the GNU C Library.
@ -34,33 +34,156 @@
#define PUSH(REG) pushl REG; CFI_PUSH (REG) #define PUSH(REG) pushl REG; CFI_PUSH (REG)
#define POP(REG) popl REG; CFI_POP (REG) #define POP(REG) popl REG; CFI_POP (REG)
#ifndef USE_AS_STRNCMP #ifdef USE_AS_STRNCMP
# ifndef STRCMP
# define STRCMP __strcmp_sse4_2
# endif
# define STR1 4
# define STR2 STR1+4
# define RETURN ret; .p2align 4
#else
# ifndef STRCMP # ifndef STRCMP
# define STRCMP __strncmp_sse4_2 # define STRCMP __strncmp_sse4_2
# endif # endif
# define STR1 8 # define STR1 8
# define STR2 STR1+4 # define STR2 STR1+4
# define CNT STR2+4 # define CNT STR2+4
# define RETURN POP (%ebp); ret; .p2align 4; CFI_PUSH (%ebp) # 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 __strcasecmp_l_sse4_2
# endif
# define STR1 12
# 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
# define STR1 16
# define STR2 STR1+4
# define CNT STR2+4
# 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 #endif
.section .text.sse4.2,"ax",@progbits .section .text.sse4.2,"ax",@progbits
ENTRY (STRCMP)
#ifdef USE_AS_STRNCMP #ifdef USE_AS_STRCASECMP_L
PUSH (%ebp) 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
# else
movl __libc_tsd_LOCALE@NTPOFF, %eax
# endif
movl %gs:(%eax), %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 __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
# else
movl __libc_tsd_LOCALE@NTPOFF, %eax
# endif
movl %gs:(%eax), %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 __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 #endif
mov STR1(%esp), %edx mov STR1(%esp), %edx
mov STR2(%esp), %eax mov STR2(%esp), %eax
#ifdef USE_AS_STRNCMP #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
movl CNT(%esp), %ebp movl CNT(%esp), REM
test %ebp, %ebp test REM, REM
je L(eq) je L(eq)
#endif #endif
mov %dx, %cx mov %dx, %cx
@ -72,10 +195,40 @@ ENTRY (STRCMP)
and $0xfff, %ecx and $0xfff, %ecx
cmp $0xff0, %ecx cmp $0xff0, %ecx
ja L(first4bytes) 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 movd %xmm2, %ecx
cmp (%eax), %ecx cmp (%eax), %ecx
#endif
jne L(less4bytes) jne L(less4bytes)
#if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
movdqu (%eax), %xmm1 movdqu (%eax), %xmm1
#endif
pxor %xmm2, %xmm1 pxor %xmm2, %xmm1
pxor %xmm0, %xmm0 pxor %xmm0, %xmm0
ptest %xmm1, %xmm0 ptest %xmm1, %xmm0
@ -84,113 +237,210 @@ ENTRY (STRCMP)
ptest %xmm2, %xmm0 ptest %xmm2, %xmm0
jnc L(less16bytes) jnc L(less16bytes)
#ifdef USE_AS_STRNCMP #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
sub $16, %ebp sub $16, REM
jbe L(eq) jbe L(eq)
#endif #endif
add $16, %edx add $16, %edx
add $16, %eax add $16, %eax
L(first4bytes): L(first4bytes):
movzbl (%eax), %ecx 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) cmpb %cl, (%edx)
#endif
jne L(neq) jne L(neq)
cmpl $0, %ecx cmpl $0, %ecx
je L(eq) je L(eq)
#ifdef USE_AS_STRNCMP #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
cmp $1, %ebp cmp $1, REM
je L(eq) je L(eq)
#endif #endif
movzbl 1(%eax), %ecx 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) cmpb %cl, 1(%edx)
#endif
jne L(neq) jne L(neq)
cmpl $0, %ecx cmpl $0, %ecx
je L(eq) je L(eq)
#ifdef USE_AS_STRNCMP #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
cmp $2, %ebp cmp $2, REM
je L(eq) je L(eq)
#endif #endif
movzbl 2(%eax), %ecx 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) cmpb %cl, 2(%edx)
#endif
jne L(neq) jne L(neq)
cmpl $0, %ecx cmpl $0, %ecx
je L(eq) je L(eq)
#ifdef USE_AS_STRNCMP #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
cmp $3, %ebp cmp $3, REM
je L(eq) je L(eq)
#endif #endif
movzbl 3(%eax), %ecx 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) cmpb %cl, 3(%edx)
#endif
jne L(neq) jne L(neq)
cmpl $0, %ecx cmpl $0, %ecx
je L(eq) je L(eq)
#ifdef USE_AS_STRNCMP #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
cmp $4, %ebp cmp $4, REM
je L(eq) je L(eq)
#endif #endif
movzbl 4(%eax), %ecx 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) cmpb %cl, 4(%edx)
#endif
jne L(neq) jne L(neq)
cmpl $0, %ecx cmpl $0, %ecx
je L(eq) je L(eq)
#ifdef USE_AS_STRNCMP #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
cmp $5, %ebp cmp $5, REM
je L(eq) je L(eq)
#endif #endif
movzbl 5(%eax), %ecx 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) cmpb %cl, 5(%edx)
#endif
jne L(neq) jne L(neq)
cmpl $0, %ecx cmpl $0, %ecx
je L(eq) je L(eq)
#ifdef USE_AS_STRNCMP #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
cmp $6, %ebp cmp $6, REM
je L(eq) je L(eq)
#endif #endif
movzbl 6(%eax), %ecx 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) cmpb %cl, 6(%edx)
#endif
jne L(neq) jne L(neq)
cmpl $0, %ecx cmpl $0, %ecx
je L(eq) je L(eq)
#ifdef USE_AS_STRNCMP #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
cmp $7, %ebp cmp $7, REM
je L(eq) je L(eq)
#endif #endif
movzbl 7(%eax), %ecx 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) cmpb %cl, 7(%edx)
#endif
jne L(neq) jne L(neq)
cmpl $0, %ecx cmpl $0, %ecx
je L(eq) je L(eq)
#ifdef USE_AS_STRNCMP #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
sub $8, %ebp sub $8, REM
je L(eq) je L(eq)
#endif #endif
add $8, %eax add $8, %eax
add $8, %edx add $8, %edx
PUSH (%ebx) #if !defined USE_AS_STRCASECMP_L && !defined USE_AS_STRNCASECMP_L
PUSH (%edi) PUSH (%edi)
#endif
PUSH (%esi) PUSH (%esi)
#ifdef USE_AS_STRNCMP #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
cfi_remember_state cfi_remember_state
#endif #endif
mov %edx, %edi mov %edx, %edi
mov %eax, %esi mov %eax, %esi
xorl %eax, %eax xorl %eax, %eax
L(check_offset): L(check_offset):
movl %edi, %ebx movl %edi, %edx
movl %esi, %ecx movl %esi, %ecx
andl $0xfff, %ebx andl $0xfff, %edx
andl $0xfff, %ecx andl $0xfff, %ecx
cmpl %ebx, %ecx cmpl %edx, %ecx
cmovl %ebx, %ecx cmovl %edx, %ecx
lea -0xff0(%ecx), %edx lea -0xff0(%ecx), %edx
sub %edx, %edi sub %edx, %edi
sub %edx, %esi sub %edx, %esi
@ -199,11 +449,12 @@ L(check_offset):
L(loop): L(loop):
movdqu (%esi,%edx), %xmm2 movdqu (%esi,%edx), %xmm2
movdqu (%edi,%edx), %xmm1 movdqu (%edi,%edx), %xmm1
TOLOWER (%xmm2, %xmm1)
pcmpistri $0x1a, %xmm2, %xmm1 pcmpistri $0x1a, %xmm2, %xmm1
jbe L(end) jbe L(end)
#ifdef USE_AS_STRNCMP #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
sub $16, %ebp sub $16, REM
jbe L(more16byteseq) jbe L(more16byteseq)
#endif #endif
@ -211,13 +462,22 @@ L(loop):
jle L(loop) jle L(loop)
L(crosspage): L(crosspage):
movzbl (%edi,%edx), %eax movzbl (%edi,%edx), %eax
movzbl (%esi,%edx), %ebx movzbl (%esi,%edx), %ecx
subl %ebx, %eax #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) jne L(ret)
testl %ebx, %ebx testl %ecx, %ecx
je L(ret) je L(ret)
#ifdef USE_AS_STRNCMP #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
sub $1, %ebp sub $1, REM
jbe L(more16byteseq) jbe L(more16byteseq)
#endif #endif
inc %edx inc %edx
@ -230,30 +490,44 @@ L(crosspage):
.p2align 4 .p2align 4
L(end): L(end):
jnc L(ret) jnc L(ret)
#ifdef USE_AS_STRNCMP #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
sub %ecx, %ebp sub %ecx, REM
jbe L(more16byteseq) jbe L(more16byteseq)
#endif #endif
lea (%ecx,%edx), %ebx lea (%ecx,%edx), %ecx
movzbl (%edi,%ebx), %eax movzbl (%edi,%ecx), %eax
movzbl (%esi,%ebx), %ecx 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 subl %ecx, %eax
L(ret): L(ret):
POP (%esi) POP (%esi)
POP (%edi) 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) POP (%ebx)
#ifdef USE_AS_STRNCMP # endif
POP (%ebp)
#endif #endif
ret ret
.p2align 4 .p2align 4
#ifdef USE_AS_STRNCMP #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
cfi_restore_state cfi_restore_state
L(more16byteseq): L(more16byteseq):
POP (%esi) POP (%esi)
# ifdef USE_AS_STRNCMP
POP (%edi) POP (%edi)
POP (%ebx) # endif
#endif #endif
L(eq): L(eq):
xorl %eax, %eax xorl %eax, %eax
@ -269,27 +543,45 @@ L(neq_bigger):
L(less16bytes): L(less16bytes):
add $0xfefefeff, %ecx add $0xfefefeff, %ecx
jnc L(less4bytes) jnc L(less4bytes)
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
movd %xmm3, %edi
xor %edi, %ecx
#else
xor (%edx), %ecx xor (%edx), %ecx
#endif
or $0xfefefeff, %ecx or $0xfefefeff, %ecx
add $1, %ecx add $1, %ecx
jnz L(less4bytes) jnz L(less4bytes)
#ifdef USE_AS_STRNCMP #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
cmp $4, %ebp cmp $4, REM
jbe L(eq) jbe L(eq)
#endif #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 mov 4(%edx), %ecx
cmp 4(%eax), %ecx cmp 4(%eax), %ecx
#endif
jne L(more4bytes) jne L(more4bytes)
add $0xfefefeff, %ecx add $0xfefefeff, %ecx
jnc L(more4bytes) jnc L(more4bytes)
#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
xor %edi, %ecx
#else
xor 4(%edx), %ecx xor 4(%edx), %ecx
#endif
or $0xfefefeff, %ecx or $0xfefefeff, %ecx
add $1, %ecx add $1, %ecx
jnz L(more4bytes) jnz L(more4bytes)
#ifdef USE_AS_STRNCMP #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
sub $8, %ebp sub $8, REM
jbe L(eq) jbe L(eq)
#endif #endif
@ -298,80 +590,176 @@ L(less16bytes):
L(less4bytes): L(less4bytes):
movzbl (%eax), %ecx 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) cmpb %cl, (%edx)
#endif
jne L(neq) jne L(neq)
cmpl $0, %ecx cmpl $0, %ecx
je L(eq) je L(eq)
#ifdef USE_AS_STRNCMP #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
cmp $1, %ebp cmp $1, REM
je L(eq) je L(eq)
#endif #endif
movzbl 1(%eax), %ecx 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) cmpb %cl, 1(%edx)
#endif
jne L(neq) jne L(neq)
cmpl $0, %ecx cmpl $0, %ecx
je L(eq) je L(eq)
#ifdef USE_AS_STRNCMP #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
cmp $2, %ebp cmp $2, REM
je L(eq) je L(eq)
#endif #endif
movzbl 2(%eax), %ecx 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) cmpb %cl, 2(%edx)
#endif
jne L(neq) jne L(neq)
cmpl $0, %ecx cmpl $0, %ecx
je L(eq) je L(eq)
#ifdef USE_AS_STRNCMP #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
cmp $3, %ebp cmp $3, REM
je L(eq) je L(eq)
#endif #endif
movzbl 3(%eax), %ecx 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) cmpb %cl, 3(%edx)
#endif
jne L(neq) jne L(neq)
cmpl $0, %ecx cmpl $0, %ecx
je L(eq) je L(eq)
L(more4bytes): L(more4bytes):
#ifdef USE_AS_STRNCMP #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
cmp $4, %ebp cmp $4, REM
je L(eq) je L(eq)
#endif #endif
movzbl 4(%eax), %ecx 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) cmpb %cl, 4(%edx)
#endif
jne L(neq) jne L(neq)
cmpl $0, %ecx cmpl $0, %ecx
je L(eq) je L(eq)
#ifdef USE_AS_STRNCMP #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
cmp $5, %ebp cmp $5, REM
je L(eq) je L(eq)
#endif #endif
movzbl 5(%eax), %ecx 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) cmpb %cl, 5(%edx)
#endif
jne L(neq) jne L(neq)
cmpl $0, %ecx cmpl $0, %ecx
je L(eq) je L(eq)
#ifdef USE_AS_STRNCMP #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
cmp $6, %ebp cmp $6, REM
je L(eq) je L(eq)
#endif #endif
movzbl 6(%eax), %ecx 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) cmpb %cl, 6(%edx)
#endif
jne L(neq) jne L(neq)
cmpl $0, %ecx cmpl $0, %ecx
je L(eq) je L(eq)
#ifdef USE_AS_STRNCMP #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
cmp $7, %ebp cmp $7, REM
je L(eq) je L(eq)
#endif #endif
movzbl 7(%eax), %ecx 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) cmpb %cl, 7(%edx)
#endif
jne L(neq) jne L(neq)
jmp L(eq) jmp L(eq)

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
/* Multiple versions of strcmp /* Multiple versions of strcmp
Copyright (C) 2010 Free Software Foundation, Inc. Copyright (C) 2010, 2011 Free Software Foundation, Inc.
Contributed by Intel Corporation. Contributed by Intel Corporation.
This file is part of the GNU C Library. This file is part of the GNU C Library.
@ -21,18 +21,30 @@
#include <sysdep.h> #include <sysdep.h>
#include <init-arch.h> #include <init-arch.h>
#ifndef USE_AS_STRNCMP #ifdef 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
# define STRCMP strncmp # define STRCMP strncmp
# define __GI_STRCMP __GI_strncmp # define __GI_STRCMP __GI_strncmp
# define __STRCMP_IA32 __strncmp_ia32 # define __STRCMP_IA32 __strncmp_ia32
# define __STRCMP_SSSE3 __strncmp_ssse3 # define __STRCMP_SSSE3 __strncmp_ssse3
# define __STRCMP_SSE4_2 __strncmp_sse4_2 # 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 #endif
/* Define multiple versions only for the definition in libc. Don't /* Define multiple versions only for the definition in libc. Don't

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -0,0 +1,2 @@
#define USE_AS_STRNCASECMP_L 1
#include "strcmp-sse4.S"

View File

@ -0,0 +1,2 @@
#define USE_AS_STRNCASECMP_L 1
#include "strcmp-ssse3.S"

View File

@ -0,0 +1,5 @@
#define STRCMP __strncasecmp_l
#define USE_AS_STRNCASECMP_L
#include "strcmp.S"
weak_alias (__strncasecmp_l, strncasecmp_l)