diff options
author | Ulrich Drepper <drepper@redhat.com> | 2010-07-16 15:37:38 -0700 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2010-07-16 15:37:38 -0700 |
commit | cc9f2e47a0a1b4ab0d78ff1d036ec7f8ebc74294 (patch) | |
tree | 271302a0acea6e4053d3af307011e9494b8d267c /sysdeps/x86_64/multiarch/strcasestr-nonascii.c | |
parent | 9b059f977477351b1660cf50f6925e1eb0ec498b (diff) | |
download | glibc-cc9f2e47a0a1b4ab0d78ff1d036ec7f8ebc74294.tar.gz |
Speed up SSE4.2 strcasestr by avoiding indirect function call.
Diffstat (limited to 'sysdeps/x86_64/multiarch/strcasestr-nonascii.c')
-rw-r--r-- | sysdeps/x86_64/multiarch/strcasestr-nonascii.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/sysdeps/x86_64/multiarch/strcasestr-nonascii.c b/sysdeps/x86_64/multiarch/strcasestr-nonascii.c new file mode 100644 index 0000000000..0804e96de7 --- /dev/null +++ b/sysdeps/x86_64/multiarch/strcasestr-nonascii.c @@ -0,0 +1,50 @@ +/* strstr with SSE4.2 intrinsics + Copyright (C) 2010 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 <ctype.h> + + +/* Similar to __m128i_strloadu. Convert to lower case for none-POSIX/C + locale. */ +static inline __m128i +__m128i_strloadu_tolower (const unsigned char * p) +{ + union + { + char b[16]; + __m128i x; + } u; + + for (int i = 0; i < 16; ++i) + if (p[i] == 0) + { + u.b[i] = 0; + break; + } + else + u.b[i] = tolower (p[i]); + + return u.x; +} + + +#define STRCASESTR_NONASCII +#define USE_AS_STRCASESTR +#define STRSTR_SSE42 attribute_hidden __strcasestr_sse42_nonascii +#include "strstr.c" |