]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
x86-64: Require BMI1/BMI2 for AVX2 strrchr and wcsrchr implementations
authorAurelien Jarno <aurelien@aurel32.net>
Mon, 3 Oct 2022 21:16:46 +0000 (23:16 +0200)
committerAurelien Jarno <aurelien@aurel32.net>
Mon, 3 Oct 2022 21:53:40 +0000 (23:53 +0200)
The AVX2 strrchr and wcsrchr implementation uses the 'blsmsk'
instruction which belongs to the BMI1 CPU feature and the 'shrx'
instruction, which belongs to the BMI2 CPU feature.

Fixes: df7e295d18ff ("x86: Optimize {str|wcs}rchr-avx2")
Partially resolves: BZ #29611

Reviewed-by: Noah Goldstein <goldstein.w.n@gmail.com>
(cherry picked from commit 7e8283170c5d6805b609a040801d819e362a6292)

sysdeps/x86_64/multiarch/ifunc-avx2.h
sysdeps/x86_64/multiarch/ifunc-impl-list.c

index 5cc1e4b0bc32abd1a0082b63805286232a7a65da..0456fa6efe1e2db34828fe932e8d8742b41de27b 100644 (file)
@@ -30,6 +30,7 @@ IFUNC_SELECTOR (void)
   const struct cpu_features* cpu_features = __get_cpu_features ();
 
   if (CPU_FEATURE_USABLE_P (cpu_features, AVX2)
+      && CPU_FEATURE_USABLE_P (cpu_features, BMI1)
       && CPU_FEATURE_USABLE_P (cpu_features, BMI2)
       && CPU_FEATURE_USABLE_P (cpu_features, LZCNT)
       && CPU_FEATURES_ARCH_P (cpu_features, AVX_Fast_Unaligned_Load))
index a7c8ebbe850d654dd0dede6df1b5fc20e97fad4b..b224e6a644fc7c3215914f9223f23cd5ed2eb282 100644 (file)
@@ -516,15 +516,21 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
   /* Support sysdeps/x86_64/multiarch/strrchr.c.  */
   IFUNC_IMPL (i, name, strrchr,
              IFUNC_IMPL_ADD (array, i, strrchr,
-                             CPU_FEATURE_USABLE (AVX2),
+                             (CPU_FEATURE_USABLE (AVX2)
+                              && CPU_FEATURE_USABLE (BMI1)
+                              && CPU_FEATURE_USABLE (BMI2)),
                              __strrchr_avx2)
              IFUNC_IMPL_ADD (array, i, strrchr,
                              (CPU_FEATURE_USABLE (AVX2)
+                              && CPU_FEATURE_USABLE (BMI1)
+                              && CPU_FEATURE_USABLE (BMI2)
                               && CPU_FEATURE_USABLE (RTM)),
                              __strrchr_avx2_rtm)
              IFUNC_IMPL_ADD (array, i, strrchr,
                              (CPU_FEATURE_USABLE (AVX512VL)
-                              && CPU_FEATURE_USABLE (AVX512BW)),
+                              && CPU_FEATURE_USABLE (AVX512BW)
+                              && CPU_FEATURE_USABLE (BMI1)
+                              && CPU_FEATURE_USABLE (BMI2)),
                              __strrchr_evex)
              IFUNC_IMPL_ADD (array, i, strrchr, 1, __strrchr_sse2))
 
@@ -705,15 +711,20 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
   /* Support sysdeps/x86_64/multiarch/wcsrchr.c.  */
   IFUNC_IMPL (i, name, wcsrchr,
              IFUNC_IMPL_ADD (array, i, wcsrchr,
-                             CPU_FEATURE_USABLE (AVX2),
+                             (CPU_FEATURE_USABLE (AVX2)
+                              && CPU_FEATURE_USABLE (BMI1)
+                              && CPU_FEATURE_USABLE (BMI2)),
                              __wcsrchr_avx2)
              IFUNC_IMPL_ADD (array, i, wcsrchr,
                              (CPU_FEATURE_USABLE (AVX2)
+                              && CPU_FEATURE_USABLE (BMI1)
+                              && CPU_FEATURE_USABLE (BMI2)
                               && CPU_FEATURE_USABLE (RTM)),
                              __wcsrchr_avx2_rtm)
              IFUNC_IMPL_ADD (array, i, wcsrchr,
                              (CPU_FEATURE_USABLE (AVX512VL)
                               && CPU_FEATURE_USABLE (AVX512BW)
+                              && CPU_FEATURE_USABLE (BMI1)
                               && CPU_FEATURE_USABLE (BMI2)),
                              __wcsrchr_evex)
              IFUNC_IMPL_ADD (array, i, wcsrchr, 1, __wcsrchr_sse2))