]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
x86-64: Require BMI2 and LZCNT for AVX2 memrchr implementation
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:32 +0000 (23:53 +0200)
The AVX2 memrchr implementation uses the 'shlxl' instruction, which
belongs to the BMI2 CPU feature and uses the 'lzcnt' instruction, which
belongs to the LZCNT CPU feature.

Fixes: af5306a735eb ("x86: Optimize memrchr-avx2.S")
Partially resolves: BZ #29611

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

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

index 4289df29ecbbb7211f6b48d8d113f24bb1394b80..5cc1e4b0bc32abd1a0082b63805286232a7a65da 100644 (file)
@@ -31,6 +31,7 @@ IFUNC_SELECTOR (void)
 
   if (CPU_FEATURE_USABLE_P (cpu_features, AVX2)
       && CPU_FEATURE_USABLE_P (cpu_features, BMI2)
+      && CPU_FEATURE_USABLE_P (cpu_features, LZCNT)
       && CPU_FEATURES_ARCH_P (cpu_features, AVX_Fast_Unaligned_Load))
     {
       if (CPU_FEATURE_USABLE_P (cpu_features, AVX512VL)
index 9959f7b2286bef2413a16205365841f61cfbbc47..a7c8ebbe850d654dd0dede6df1b5fc20e97fad4b 100644 (file)
@@ -192,15 +192,21 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
   /* Support sysdeps/x86_64/multiarch/memrchr.c.  */
   IFUNC_IMPL (i, name, memrchr,
              IFUNC_IMPL_ADD (array, i, memrchr,
-                             CPU_FEATURE_USABLE (AVX2),
+                             (CPU_FEATURE_USABLE (AVX2)
+                              && CPU_FEATURE_USABLE (BMI2)
+                              && CPU_FEATURE_USABLE (LZCNT)),
                              __memrchr_avx2)
              IFUNC_IMPL_ADD (array, i, memrchr,
                              (CPU_FEATURE_USABLE (AVX2)
+                              && CPU_FEATURE_USABLE (BMI2)
+                              && CPU_FEATURE_USABLE (LZCNT)
                               && CPU_FEATURE_USABLE (RTM)),
                              __memrchr_avx2_rtm)
              IFUNC_IMPL_ADD (array, i, memrchr,
                              (CPU_FEATURE_USABLE (AVX512VL)
-                              && CPU_FEATURE_USABLE (AVX512BW)),
+                              && CPU_FEATURE_USABLE (AVX512BW)
+                              && CPU_FEATURE_USABLE (BMI2)
+                              && CPU_FEATURE_USABLE (LZCNT)),
                              __memrchr_evex)
 
              IFUNC_IMPL_ADD (array, i, memrchr, 1, __memrchr_sse2))