1feee8
commit e570b865b53f33453d97160791a7d97e38bcc6e8
1feee8
Author: Aurelien Jarno <aurelien@aurel32.net>
1feee8
Date:   Mon Oct 3 23:16:46 2022 +0200
1feee8
1feee8
    x86-64: Require BMI1/BMI2 for AVX2 strrchr and wcsrchr implementations
1feee8
    
1feee8
    The AVX2 strrchr and wcsrchr implementation uses the 'blsmsk'
1feee8
    instruction which belongs to the BMI1 CPU feature and the 'shrx'
1feee8
    instruction, which belongs to the BMI2 CPU feature.
1feee8
    
1feee8
    Fixes: df7e295d18ff ("x86: Optimize {str|wcs}rchr-avx2")
1feee8
    Partially resolves: BZ #29611
1feee8
    
1feee8
    Reviewed-by: Noah Goldstein  <goldstein.w.n@gmail.com>
1feee8
    (cherry picked from commit 7e8283170c5d6805b609a040801d819e362a6292)
1feee8
1feee8
diff --git a/sysdeps/x86_64/multiarch/ifunc-avx2.h b/sysdeps/x86_64/multiarch/ifunc-avx2.h
1feee8
index 52bd00ea5cab6b22..877f007dd6e38fe8 100644
1feee8
--- a/sysdeps/x86_64/multiarch/ifunc-avx2.h
1feee8
+++ b/sysdeps/x86_64/multiarch/ifunc-avx2.h
1feee8
@@ -30,6 +30,7 @@ IFUNC_SELECTOR (void)
1feee8
   const struct cpu_features* cpu_features = __get_cpu_features ();
1feee8
 
1feee8
   if (CPU_FEATURE_USABLE_P (cpu_features, AVX2)
1feee8
+      && CPU_FEATURE_USABLE_P (cpu_features, BMI1)
1feee8
       && CPU_FEATURE_USABLE_P (cpu_features, BMI2)
1feee8
       && CPU_FEATURE_USABLE_P (cpu_features, LZCNT)
1feee8
       && CPU_FEATURES_ARCH_P (cpu_features, AVX_Fast_Unaligned_Load))
1feee8
diff --git a/sysdeps/x86_64/multiarch/ifunc-impl-list.c b/sysdeps/x86_64/multiarch/ifunc-impl-list.c
1feee8
index d1fc1e75d6706413..84f9e73e2b7df816 100644
1feee8
--- a/sysdeps/x86_64/multiarch/ifunc-impl-list.c
1feee8
+++ b/sysdeps/x86_64/multiarch/ifunc-impl-list.c
1feee8
@@ -498,15 +498,21 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
1feee8
   /* Support sysdeps/x86_64/multiarch/strrchr.c.  */
1feee8
   IFUNC_IMPL (i, name, strrchr,
1feee8
 	      IFUNC_IMPL_ADD (array, i, strrchr,
1feee8
-			      CPU_FEATURE_USABLE (AVX2),
1feee8
+			      (CPU_FEATURE_USABLE (AVX2)
1feee8
+			       && CPU_FEATURE_USABLE (BMI1)
1feee8
+			       && CPU_FEATURE_USABLE (BMI2)),
1feee8
 			      __strrchr_avx2)
1feee8
 	      IFUNC_IMPL_ADD (array, i, strrchr,
1feee8
 			      (CPU_FEATURE_USABLE (AVX2)
1feee8
+			       && CPU_FEATURE_USABLE (BMI1)
1feee8
+			       && CPU_FEATURE_USABLE (BMI2)
1feee8
 			       && CPU_FEATURE_USABLE (RTM)),
1feee8
 			      __strrchr_avx2_rtm)
1feee8
 	      IFUNC_IMPL_ADD (array, i, strrchr,
1feee8
 			      (CPU_FEATURE_USABLE (AVX512VL)
1feee8
-			       && CPU_FEATURE_USABLE (AVX512BW)),
1feee8
+			       && CPU_FEATURE_USABLE (AVX512BW)
1feee8
+			       && CPU_FEATURE_USABLE (BMI1)
1feee8
+			       && CPU_FEATURE_USABLE (BMI2)),
1feee8
 			      __strrchr_evex)
1feee8
 	      IFUNC_IMPL_ADD (array, i, strrchr, 1, __strrchr_sse2))
1feee8
 
1feee8
@@ -687,15 +693,20 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
1feee8
   /* Support sysdeps/x86_64/multiarch/wcsrchr.c.  */
1feee8
   IFUNC_IMPL (i, name, wcsrchr,
1feee8
 	      IFUNC_IMPL_ADD (array, i, wcsrchr,
1feee8
-			      CPU_FEATURE_USABLE (AVX2),
1feee8
+			      (CPU_FEATURE_USABLE (AVX2)
1feee8
+			       && CPU_FEATURE_USABLE (BMI1)
1feee8
+			       && CPU_FEATURE_USABLE (BMI2)),
1feee8
 			      __wcsrchr_avx2)
1feee8
 	      IFUNC_IMPL_ADD (array, i, wcsrchr,
1feee8
 			      (CPU_FEATURE_USABLE (AVX2)
1feee8
+			       && CPU_FEATURE_USABLE (BMI1)
1feee8
+			       && CPU_FEATURE_USABLE (BMI2)
1feee8
 			       && CPU_FEATURE_USABLE (RTM)),
1feee8
 			      __wcsrchr_avx2_rtm)
1feee8
 	      IFUNC_IMPL_ADD (array, i, wcsrchr,
1feee8
 			      (CPU_FEATURE_USABLE (AVX512VL)
1feee8
 			       && CPU_FEATURE_USABLE (AVX512BW)
1feee8
+			       && CPU_FEATURE_USABLE (BMI1)
1feee8
 			       && CPU_FEATURE_USABLE (BMI2)),
1feee8
 			      __wcsrchr_evex)
1feee8
 	      IFUNC_IMPL_ADD (array, i, wcsrchr, 1, __wcsrchr_sse2))