mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-28 00:21:52 +03:00
Improve generic strpbrk performance
With now a faster strcspn implementation, it is faster to just use it with some return tests than reimplementing strpbrk itself. As for strcspn optimization, it is generally at least 10 times faster than the existing implementation on bench-strspn on a few AArch64 implementations. Also the string/bits/string2.h inlines make no longer sense, as current implementation will already implement most of the optimizations. Tested on x86_64, i386, and aarch64. * string/strpbrk.c (strpbrk): Rewrite function. * string/bits/string2.h (strpbrk): Use __builtin_strpbrk. (__strpbrk_c2): Likewise. (__strpbrk_c3): Likewise. * string/string-inlines.c [SHLIB_COMPAT(libc, GLIBC_2_1_1, GLIBC_2_24)] (__strpbrk_c2): Likewise. [SHLIB_COMPAT(libc, GLIBC_2_1_1, GLIBC_2_24)] (__strpbrk_c3): Likewise.
This commit is contained in:
@ -107,4 +107,25 @@ __old_strspn_c3 (const char *__s, int __accept1, int __accept2,
|
||||
}
|
||||
compat_symbol (libc, __old_strspn_c3, __strspn_c3, GLIBC_2_1_1);
|
||||
|
||||
char *
|
||||
__strpbrk_c2 (const char *__s, int __accept1, int __accept2)
|
||||
{
|
||||
/* Please note that __accept1 and __accept2 never can be '\0'. */
|
||||
while (*__s != '\0' && *__s != __accept1 && *__s != __accept2)
|
||||
++__s;
|
||||
return *__s == '\0' ? NULL : (char *) (size_t) __s;
|
||||
}
|
||||
compat_symbol (libc, __old_strpbrk_c2, __strpbrk_c2, GLIBC_2_1_1);
|
||||
|
||||
char *
|
||||
__strpbrk_c3 (const char *__s, int __accept1, int __accept2, int __accept3)
|
||||
{
|
||||
/* Please note that __accept1 to __accept3 never can be '\0'. */
|
||||
while (*__s != '\0' && *__s != __accept1 && *__s != __accept2
|
||||
&& *__s != __accept3)
|
||||
++__s;
|
||||
return *__s == '\0' ? NULL : (char *) (size_t) __s;
|
||||
}
|
||||
compat_symbol (libc, __old_strpbrk_c3, __strpbrk_c3, GLIBC_2_1_1);
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user