Better check for optimization in new x86-64 strstr/strcasestr.
This commit is contained in:
parent
2b7a8664fa
commit
a8f895ebe1
|
@ -1,3 +1,9 @@
|
||||||
|
2009-07-20 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* sysdeps/x86_64/multiarch/strstr.c [USE_AS_STRCASESTR] (STRSTR_SSE42):
|
||||||
|
Use NONASCII_CASE information provided by the locale to determine
|
||||||
|
whether optimized string load function can be used. Minor cleanups.
|
||||||
|
|
||||||
2009-07-20 H.J. Lu <hongjiu.lu@intel.com>
|
2009-07-20 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* string/strcasestr.c (STRCASESTR): New macro.
|
* string/strcasestr.c (STRCASESTR): New macro.
|
||||||
|
|
|
@ -26,8 +26,7 @@
|
||||||
|
|
||||||
#ifdef USE_AS_STRCASESTR
|
#ifdef USE_AS_STRCASESTR
|
||||||
# include <ctype.h>
|
# include <ctype.h>
|
||||||
# include <locale.h>
|
# include <locale/localeinfo.h>
|
||||||
# include <string.h>
|
|
||||||
|
|
||||||
# define LOADBYTE(C) tolower (C)
|
# define LOADBYTE(C) tolower (C)
|
||||||
# define CMPBYTE(C1, C2) \
|
# define CMPBYTE(C1, C2) \
|
||||||
|
@ -257,12 +256,20 @@ char *
|
||||||
__attribute__ ((section (".text.sse4.2")))
|
__attribute__ ((section (".text.sse4.2")))
|
||||||
STRSTR_SSE42 (const unsigned char *s1, const unsigned char *s2)
|
STRSTR_SSE42 (const unsigned char *s1, const unsigned char *s2)
|
||||||
{
|
{
|
||||||
int len, len1;
|
int len;
|
||||||
|
int len1;
|
||||||
const unsigned char *p1 = s1;
|
const unsigned char *p1 = s1;
|
||||||
const unsigned char *p2 = s2;
|
const unsigned char *p2 = s2;
|
||||||
__m128i frag1, frag2, zero;
|
__m128i frag1;
|
||||||
int cmp, cmp_c, cmp_z, cmp_s;
|
__m128i frag2;
|
||||||
int kmp_fwd, bmsk, bmsk1;
|
__m128i zero;
|
||||||
|
int cmp;
|
||||||
|
int cmp_c;
|
||||||
|
int cmp_z;
|
||||||
|
int cmp_s;
|
||||||
|
int kmp_fwd;
|
||||||
|
int bmsk;
|
||||||
|
int bmsk1;
|
||||||
const unsigned char *pt;
|
const unsigned char *pt;
|
||||||
|
|
||||||
if (!p2[0])
|
if (!p2[0])
|
||||||
|
@ -277,11 +284,8 @@ STRSTR_SSE42 (const unsigned char *s1, const unsigned char *s2)
|
||||||
|
|
||||||
#ifdef USE_AS_STRCASESTR
|
#ifdef USE_AS_STRCASESTR
|
||||||
__m128i (*strloadu) (const unsigned char *);
|
__m128i (*strloadu) (const unsigned char *);
|
||||||
const char *used_locale = setlocale (LC_CTYPE, NULL);
|
|
||||||
|
|
||||||
if (!used_locale
|
if (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_NONASCII_CASE) == 0)
|
||||||
|| (used_locale[0] == 'C' && used_locale[1] == '\0')
|
|
||||||
|| strcmp (used_locale, "POSIX") == 0)
|
|
||||||
strloadu = __m128i_strloadu_tolower_posix;
|
strloadu = __m128i_strloadu_tolower_posix;
|
||||||
else
|
else
|
||||||
strloadu = __m128i_strloadu_tolower;
|
strloadu = __m128i_strloadu_tolower;
|
||||||
|
|
Loading…
Reference in New Issue