diff options
author | Noah Goldstein <goldstein.w.n@gmail.com> | 2022-07-05 17:06:41 -0700 |
---|---|---|
committer | Noah Goldstein <goldstein.w.n@gmail.com> | 2022-07-12 11:44:12 -0700 |
commit | 9c38deec96ebe1b052a0c1bef137b90967755f18 (patch) | |
tree | ae940cf21e7ecbef92e0028f10b7c0dc5a6400c6 /sysdeps/x86_64/multiarch/ifunc-strncpy.h | |
parent | c5bec9d491c5d066dd238ccafcdec78cd4592e8e (diff) | |
download | glibc-9c38deec96ebe1b052a0c1bef137b90967755f18.tar.gz glibc-9c38deec96ebe1b052a0c1bef137b90967755f18.tar.xz glibc-9c38deec96ebe1b052a0c1bef137b90967755f18.zip |
x86: Remove generic strncat, strncpy, and stpncpy implementations
These functions all have optimized versions: __strncat_sse2_unaligned, __strncpy_sse2_unaligned, and stpncpy_sse2_unaligned which are faster than their respective generic implementations. Since the sse2 versions can run on baseline x86_64, we should use these as the baseline implementation and can remove the generic implementations. Geometric mean of N=20 runs of the entire benchmark suite on: 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz (Tigerlake) __strncat_sse2_unaligned / __strncat_generic: .944 __strncpy_sse2_unaligned / __strncpy_generic: .726 __stpncpy_sse2_unaligned / __stpncpy_generic: .650 Tested build with and without multiarch and full check with multiarch.
Diffstat (limited to 'sysdeps/x86_64/multiarch/ifunc-strncpy.h')
-rw-r--r-- | sysdeps/x86_64/multiarch/ifunc-strncpy.h | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/sysdeps/x86_64/multiarch/ifunc-strncpy.h b/sysdeps/x86_64/multiarch/ifunc-strncpy.h new file mode 100644 index 0000000000..323225af4d --- /dev/null +++ b/sysdeps/x86_64/multiarch/ifunc-strncpy.h @@ -0,0 +1,48 @@ +/* Common definition for ifunc st{r|p}n{cpy|cat} + All versions must be listed in ifunc-impl-list.c. + Copyright (C) 2022 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 + <https://www.gnu.org/licenses/>. */ + +#include <init-arch.h> + +extern __typeof (REDIRECT_NAME) OPTIMIZE (sse2_unaligned) + attribute_hidden; +extern __typeof (REDIRECT_NAME) OPTIMIZE (avx2) attribute_hidden; +extern __typeof (REDIRECT_NAME) OPTIMIZE (avx2_rtm) attribute_hidden; +extern __typeof (REDIRECT_NAME) OPTIMIZE (evex) attribute_hidden; + +static inline void * +IFUNC_SELECTOR (void) +{ + const struct cpu_features* cpu_features = __get_cpu_features (); + + if (CPU_FEATURE_USABLE_P (cpu_features, AVX2) + && CPU_FEATURES_ARCH_P (cpu_features, AVX_Fast_Unaligned_Load)) + { + if (CPU_FEATURE_USABLE_P (cpu_features, AVX512VL) + && CPU_FEATURE_USABLE_P (cpu_features, AVX512BW)) + return OPTIMIZE (evex); + + if (CPU_FEATURE_USABLE_P (cpu_features, RTM)) + return OPTIMIZE (avx2_rtm); + + if (!CPU_FEATURES_ARCH_P (cpu_features, Prefer_No_VZEROUPPER)) + return OPTIMIZE (avx2); + } + + return OPTIMIZE (sse2_unaligned); +} |