076f82
commit a182bb7a3922404f79def09d79ef89678b4049f0
076f82
Author: H.J. Lu <hjl.tools@gmail.com>
076f82
Date:   Fri Oct 29 12:56:53 2021 -0700
076f82
076f82
    x86-64: Remove Prefer_AVX2_STRCMP
076f82
    
076f82
    Remove Prefer_AVX2_STRCMP to enable EVEX strcmp.  When comparing 2 32-byte
076f82
    strings, EVEX strcmp has been improved to require 1 load, 1 VPTESTM, 1
076f82
    VPCMP, 1 KMOVD and 1 INCL instead of 2 loads, 3 VPCMPs, 2 KORDs, 1 KMOVD
076f82
    and 1 TESTL while AVX2 strcmp requires 1 load, 2 VPCMPEQs, 1 VPMINU, 1
076f82
    VPMOVMSKB and 1 TESTL.  EVEX strcmp is now faster than AVX2 strcmp by up
076f82
    to 40% on Tiger Lake and Ice Lake.
076f82
    
076f82
    (cherry picked from commit 14dbbf46a007ae5df36646b51ad0c9e5f5259f30)
076f82
076f82
diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c
076f82
index de4e3c3b7258120d..f4d4049e391cbabd 100644
076f82
--- a/sysdeps/x86/cpu-features.c
076f82
+++ b/sysdeps/x86/cpu-features.c
076f82
@@ -574,14 +574,6 @@ disable_tsx:
076f82
 	  if (CPU_FEATURE_USABLE_P (cpu_features, RTM))
076f82
 	    cpu_features->preferred[index_arch_Prefer_No_VZEROUPPER]
076f82
 	      |= bit_arch_Prefer_No_VZEROUPPER;
076f82
-
076f82
-	  /* Since to compare 2 32-byte strings, 256-bit EVEX strcmp
076f82
-	     requires 2 loads, 3 VPCMPs and 2 KORDs while AVX2 strcmp
076f82
-	     requires 1 load, 2 VPCMPEQs, 1 VPMINU and 1 VPMOVMSKB,
076f82
-	     AVX2 strcmp is faster than EVEX strcmp.  */
076f82
-	  if (CPU_FEATURE_USABLE_P (cpu_features, AVX2))
076f82
-	    cpu_features->preferred[index_arch_Prefer_AVX2_STRCMP]
076f82
-	      |= bit_arch_Prefer_AVX2_STRCMP;
076f82
 	}
076f82
 
076f82
       /* Avoid avoid short distance REP MOVSB on processor with FSRM.  */
076f82
diff --git a/sysdeps/x86/cpu-tunables.c b/sysdeps/x86/cpu-tunables.c
076f82
index 58f2fad4323d5d91..957db3ad229ba39f 100644
076f82
--- a/sysdeps/x86/cpu-tunables.c
076f82
+++ b/sysdeps/x86/cpu-tunables.c
076f82
@@ -239,8 +239,6 @@ TUNABLE_CALLBACK (set_hwcaps) (tunable_val_t *valp)
076f82
 	      CHECK_GLIBC_IFUNC_PREFERRED_BOTH (n, cpu_features,
076f82
 						Fast_Copy_Backward,
076f82
 						disable, 18);
076f82
-	      CHECK_GLIBC_IFUNC_PREFERRED_NEED_BOTH
076f82
-		(n, cpu_features, Prefer_AVX2_STRCMP, AVX2, disable, 18);
076f82
 	    }
076f82
 	  break;
076f82
 	case 19:
076f82
diff --git a/sysdeps/x86/include/cpu-features-preferred_feature_index_1.def b/sysdeps/x86/include/cpu-features-preferred_feature_index_1.def
076f82
index 3bdc76cf71007948..8250bfcbecd29a9f 100644
076f82
--- a/sysdeps/x86/include/cpu-features-preferred_feature_index_1.def
076f82
+++ b/sysdeps/x86/include/cpu-features-preferred_feature_index_1.def
076f82
@@ -31,5 +31,4 @@ BIT (Prefer_ERMS)
076f82
 BIT (Prefer_No_AVX512)
076f82
 BIT (MathVec_Prefer_No_AVX512)
076f82
 BIT (Prefer_FSRM)
076f82
-BIT (Prefer_AVX2_STRCMP)
076f82
 BIT (Avoid_Short_Distance_REP_MOVSB)
076f82
diff --git a/sysdeps/x86_64/multiarch/strcmp.c b/sysdeps/x86_64/multiarch/strcmp.c
076f82
index 62b7abeeee646ab4..7c2901bf44456259 100644
076f82
--- a/sysdeps/x86_64/multiarch/strcmp.c
076f82
+++ b/sysdeps/x86_64/multiarch/strcmp.c
076f82
@@ -43,8 +43,7 @@ IFUNC_SELECTOR (void)
076f82
     {
076f82
       if (CPU_FEATURE_USABLE_P (cpu_features, AVX512VL)
076f82
 	  && CPU_FEATURE_USABLE_P (cpu_features, AVX512BW)
076f82
-	  && CPU_FEATURE_USABLE_P (cpu_features, BMI2)
076f82
-	  && !CPU_FEATURES_ARCH_P (cpu_features, Prefer_AVX2_STRCMP))
076f82
+	  && CPU_FEATURE_USABLE_P (cpu_features, BMI2))
076f82
 	return OPTIMIZE (evex);
076f82
 
076f82
       if (CPU_FEATURE_USABLE_P (cpu_features, RTM))
076f82
diff --git a/sysdeps/x86_64/multiarch/strncmp.c b/sysdeps/x86_64/multiarch/strncmp.c
076f82
index 60ba0fe356b31779..f94a421784bfe923 100644
076f82
--- a/sysdeps/x86_64/multiarch/strncmp.c
076f82
+++ b/sysdeps/x86_64/multiarch/strncmp.c
076f82
@@ -43,8 +43,7 @@ IFUNC_SELECTOR (void)
076f82
     {
076f82
       if (CPU_FEATURE_USABLE_P (cpu_features, AVX512VL)
076f82
 	  && CPU_FEATURE_USABLE_P (cpu_features, AVX512BW)
076f82
-	  && CPU_FEATURE_USABLE_P (cpu_features, BMI2)
076f82
-	  && !CPU_FEATURES_ARCH_P (cpu_features, Prefer_AVX2_STRCMP))
076f82
+	  && CPU_FEATURE_USABLE_P (cpu_features, BMI2))
076f82
 	return OPTIMIZE (evex);
076f82
 
076f82
       if (CPU_FEATURE_USABLE_P (cpu_features, RTM))