[clang] [compiler-rt] [llvm] [X86] Sync multiversion features with libgcc and refactor internal feature tables (PR #168750)
Evgenii Kudriashov via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 21 06:33:32 PST 2025
================
@@ -121,168 +121,162 @@ X86_CPU_SUBTYPE_ALIAS(INTEL_COREI7_PANTHERLAKE, "wildcatlake")
#undef X86_CPU_SUBTYPE_ALIAS
#undef X86_CPU_SUBTYPE
-// This macro is used for cpu types present in compiler-rt/libgcc. The third
-// parameter PRIORITY is as required by the attribute 'target' checking. Note
-// that not all are supported/prioritized by GCC, so synchronization with GCC's
-// implementation may require changing some existing values.
-//
-// We cannot just re-sort the list though because its order is dictated by the
-// order of bits in CodeGenFunction::GetX86CpuSupportsMask.
-// We cannot re-adjust the position of X86_FEATURE_COMPAT at the whole list.
+// X86_FEATURE_COMPAT is used for cpu types present in compiler-rt/libgcc (i.e.
+// types we can multiversion on). The third parameter PRIORITY is required
+// by the attribute 'target' checking.
+
+// Order of bits has to match what's implemented in compiler-rt/libgcc. That's what the
+// ABI_VALUE is for - CodeGenFunction::GetX86CpuSupportsMask uses it.
#ifndef X86_FEATURE_COMPAT
-#define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY) X86_FEATURE(ENUM, STR)
+#define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY, ABI_VALUE) X86_FEATURE(ENUM, STR)
#endif
#ifndef X86_FEATURE
#define X86_FEATURE(ENUM, STR)
#endif
#ifndef X86_MICROARCH_LEVEL
-#define X86_MICROARCH_LEVEL(ENUM, STR, PRIORITY)
+#define X86_MICROARCH_LEVEL(ENUM, STR, PRIORITY, ABI_VALUE)
#endif
-X86_FEATURE_COMPAT(CMOV, "cmov", 0)
-X86_FEATURE_COMPAT(MMX, "mmx", 1)
-X86_FEATURE_COMPAT(POPCNT, "popcnt", 9)
-X86_FEATURE_COMPAT(SSE, "sse", 2)
-X86_FEATURE_COMPAT(SSE2, "sse2", 3)
-X86_FEATURE_COMPAT(SSE3, "sse3", 4)
-X86_FEATURE_COMPAT(SSSE3, "ssse3", 5)
-X86_FEATURE_COMPAT(SSE4_1, "sse4.1", 7)
-X86_FEATURE_COMPAT(SSE4_2, "sse4.2", 8)
-X86_FEATURE_COMPAT(AVX, "avx", 12)
-X86_FEATURE_COMPAT(AVX2, "avx2", 18)
-X86_FEATURE_COMPAT(SSE4_A, "sse4a", 6)
-X86_FEATURE_COMPAT(FMA4, "fma4", 14)
-X86_FEATURE_COMPAT(XOP, "xop", 15)
-X86_FEATURE_COMPAT(FMA, "fma", 16)
-X86_FEATURE_COMPAT(AVX512F, "avx512f", 19)
-X86_FEATURE_COMPAT(BMI, "bmi", 13)
-X86_FEATURE_COMPAT(BMI2, "bmi2", 17)
-X86_FEATURE_COMPAT(AES, "aes", 10)
-X86_FEATURE_COMPAT(PCLMUL, "pclmul", 11)
-X86_FEATURE_COMPAT(AVX512VL, "avx512vl", 20)
-X86_FEATURE_COMPAT(AVX512BW, "avx512bw", 21)
-X86_FEATURE_COMPAT(AVX512DQ, "avx512dq", 22)
-X86_FEATURE_COMPAT(AVX512CD, "avx512cd", 23)
+X86_FEATURE_COMPAT(CMOV, "cmov", 0, 0)
+X86_FEATURE_COMPAT(MMX, "mmx", 1, 1)
+X86_FEATURE_COMPAT(POPCNT, "popcnt", 9, 2)
+X86_FEATURE_COMPAT(SSE, "sse", 2, 3)
+X86_FEATURE_COMPAT(SSE2, "sse2", 3, 4)
+X86_FEATURE_COMPAT(SSE3, "sse3", 4, 5)
+X86_FEATURE_COMPAT(SSSE3, "ssse3", 5, 6)
+X86_FEATURE_COMPAT(SSE4_1, "sse4.1", 7, 7)
+X86_FEATURE_COMPAT(SSE4_2, "sse4.2", 8, 8)
+X86_FEATURE_COMPAT(AVX, "avx", 12, 9)
+X86_FEATURE_COMPAT(AVX2, "avx2", 18, 10)
+X86_FEATURE_COMPAT(SSE4_A, "sse4a", 6, 11)
+X86_FEATURE_COMPAT(FMA4, "fma4", 14, 12)
+X86_FEATURE_COMPAT(XOP, "xop", 15, 13)
+X86_FEATURE_COMPAT(FMA, "fma", 16, 14)
+X86_FEATURE_COMPAT(AVX512F, "avx512f", 19, 15)
+X86_FEATURE_COMPAT(BMI, "bmi", 13, 16)
+X86_FEATURE_COMPAT(BMI2, "bmi2", 17, 17)
+X86_FEATURE_COMPAT(AES, "aes", 10, 18)
+X86_FEATURE_COMPAT(PCLMUL, "pclmul", 11, 19)
+X86_FEATURE_COMPAT(AVX512VL, "avx512vl", 20, 20)
+X86_FEATURE_COMPAT(AVX512BW, "avx512bw", 21, 21)
+X86_FEATURE_COMPAT(AVX512DQ, "avx512dq", 22, 22)
+X86_FEATURE_COMPAT(AVX512CD, "avx512cd", 23, 23)
X86_FEATURE (NF, "nf")
X86_FEATURE (CF, "cf")
-X86_FEATURE_COMPAT(AVX512VBMI, "avx512vbmi", 24)
-X86_FEATURE_COMPAT(AVX512IFMA, "avx512ifma", 25)
-X86_FEATURE_COMPAT(AVX5124VNNIW, "avx5124vnniw", 26)
-X86_FEATURE_COMPAT(AVX5124FMAPS, "avx5124fmaps", 27)
-X86_FEATURE_COMPAT(AVX512VPOPCNTDQ, "avx512vpopcntdq", 28)
-X86_FEATURE_COMPAT(AVX512VBMI2, "avx512vbmi2", 29)
-X86_FEATURE_COMPAT(GFNI, "gfni", 30)
-X86_FEATURE_COMPAT(VPCLMULQDQ, "vpclmulqdq", 31)
-X86_FEATURE_COMPAT(AVX512VNNI, "avx512vnni", 32)
-X86_FEATURE_COMPAT(AVX512BITALG, "avx512bitalg", 33)
-X86_FEATURE_COMPAT(AVX512BF16, "avx512bf16", 34)
-X86_FEATURE_COMPAT(AVX512VP2INTERSECT, "avx512vp2intersect", 35)
+X86_FEATURE_COMPAT(AVX512VBMI, "avx512vbmi", 24, 26)
+X86_FEATURE_COMPAT(AVX512IFMA, "avx512ifma", 25, 27)
+X86_FEATURE(AVX5124VNNIW, "avx5124vnniw")
+X86_FEATURE(AVX5124FMAPS, "avx5124fmaps")
+X86_FEATURE_COMPAT(AVX512VPOPCNTDQ, "avx512vpopcntdq", 26, 30)
+X86_FEATURE_COMPAT(AVX512VBMI2, "avx512vbmi2", 27, 31)
+X86_FEATURE_COMPAT(GFNI, "gfni", 28, 32)
+X86_FEATURE_COMPAT(VPCLMULQDQ, "vpclmulqdq", 29, 33)
+X86_FEATURE_COMPAT(AVX512VNNI, "avx512vnni", 30, 34)
+X86_FEATURE_COMPAT(AVX512BITALG, "avx512bitalg", 31, 35)
+X86_FEATURE_COMPAT(AVX512BF16, "avx512bf16", 32, 36)
+X86_FEATURE_COMPAT(AVX512VP2INTERSECT, "avx512vp2intersect", 33, 37)
----------------
e-kud wrote:
Just as an idea, if we are touching all these lines, maybe align the second argument column among all entries?
https://github.com/llvm/llvm-project/pull/168750
More information about the llvm-commits
mailing list