mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-27 15:30:07 +00:00
d3496c9f4f
Improve strcspn performance using a much faster algorithm. It is kept simple so it works well on most targets. It is generally at least 10 times faster than the existing implementation on bench-strcspn on a few AArch64 implementations, and for some tests 100 times as fast (repeatedly calling strchr on a small string is extremely slow...). In fact the string/bits/string2.h inlines make no longer sense, as GCC already uses strlen if reject is an empty string, strchrnul is 5 times as fast as __strcspn_c1, while __strcspn_c2 and __strcspn_c3 are slower than the strcspn main loop for large strings (though reject length 2-4 could be special cased in the future to gain even more performance). Tested on x86_64, i686, and aarch64. * string/Version (libc): Add GLIBC_2.24. * string/strcspn.c (strcspn): Rewrite function. * string/bits/string2.h (strcspn): Use __builtin_strcspn. (__strcspn_c1): Remove inline function. (__strcspn_c2): Likewise. (__strcspn_c3): Likewise. * string/string-inline.c [SHLIB_COMPAT(libc, GLIBC_2_1_1, GLIBC_2_24)] (__strcspn_c1): Add compatibility symbol. [SHLIB_COMPAT(libc, GLIBC_2_1_1, GLIBC_2_24)] (__strcspn_c2): Likewise. [SHLIB_COMPAT(libc, GLIBC_2_1_1, GLIBC_2_24)] (__strcspn_c3): Likewise. * sysdeps/i386/string-inlines.c: Include generic string-inlines.c.
48 lines
1.4 KiB
C
48 lines
1.4 KiB
C
/* Copyright (C) 1999-2016 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, see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
/* This is to avoid PLT entries for the x86 version. */
|
|
#define __memcpy_g __memcpy_g_internal
|
|
#define __strchr_g __strchr_g_internal
|
|
#include <string/string-inlines.c>
|
|
|
|
void *
|
|
(__memcpy_c) (void *d, const void *s, size_t n)
|
|
{
|
|
return memcpy (d, s, n);
|
|
}
|
|
|
|
void *
|
|
__memset_cc (void *s, unsigned long int pattern, size_t n)
|
|
{
|
|
return memset (s, pattern & 0xff, n);
|
|
}
|
|
strong_alias (__memset_cc, __memset_cg)
|
|
|
|
void *
|
|
__memset_gg (void *s, char c, size_t n)
|
|
{
|
|
return memset (s, c, n);
|
|
}
|
|
|
|
#ifdef __memcpy_c
|
|
# undef __memcpy_g
|
|
strong_alias (__memcpy_g_internal, __memcpy_g)
|
|
# undef __strchr_g
|
|
strong_alias (__strchr_g_internal, __strchr_g)
|
|
#endif
|