Skip to content

Commit e3044cd

Browse files
[X86] Sync multiversion features with libgcc and refactor internal feature tables (#168750)
Compiler-rt internal feature table is synced with the one in libgcc (common/config/i386/i386-cpuinfo.h). LLVM internal feature table is refactored to include a field ABI_VALUE, so we won't be relying on ordering to keep the values correct. The table is also synced to the one in compiler-rt.
1 parent 47ae3ea commit e3044cd

File tree

5 files changed

+175
-182
lines changed

5 files changed

+175
-182
lines changed

clang/lib/Basic/Targets/X86.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1302,15 +1302,15 @@ bool X86TargetInfo::hasFeature(StringRef Feature) const {
13021302
// X86TargetInfo::hasFeature for a somewhat comprehensive list).
13031303
bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
13041304
return llvm::StringSwitch<bool>(FeatureStr)
1305-
#define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY) .Case(STR, true)
1306-
#define X86_MICROARCH_LEVEL(ENUM, STR, PRIORITY) .Case(STR, true)
1305+
#define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY, ABI_VALUE) .Case(STR, true)
1306+
#define X86_MICROARCH_LEVEL(ENUM, STR, PRIORITY, ABI_VALUE) .Case(STR, true)
13071307
#include "llvm/TargetParser/X86TargetParser.def"
13081308
.Default(false);
13091309
}
13101310

13111311
static llvm::X86::ProcessorFeatures getFeature(StringRef Name) {
13121312
return llvm::StringSwitch<llvm::X86::ProcessorFeatures>(Name)
1313-
#define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY) \
1313+
#define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY, ABI_VALUE) \
13141314
.Case(STR, llvm::X86::FEATURE_##ENUM)
13151315

13161316
#include "llvm/TargetParser/X86TargetParser.def"

compiler-rt/lib/builtins/cpu_model/x86.c

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -135,13 +135,9 @@ enum ProcessorFeatures {
135135
FEATURE_AVX512BW,
136136
FEATURE_AVX512DQ,
137137
FEATURE_AVX512CD,
138-
FEATURE_AVX512ER,
139-
FEATURE_AVX512PF,
140-
FEATURE_AVX512VBMI,
138+
FEATURE_AVX512VBMI = 26,
141139
FEATURE_AVX512IFMA,
142-
FEATURE_AVX5124VNNIW,
143-
FEATURE_AVX5124FMAPS,
144-
FEATURE_AVX512VPOPCNTDQ,
140+
FEATURE_AVX512VPOPCNTDQ = 30,
145141
FEATURE_AVX512VBMI2,
146142
FEATURE_GFNI,
147143
FEATURE_VPCLMULQDQ,
@@ -181,8 +177,7 @@ enum ProcessorFeatures {
181177
// FEATURE_OSXSAVE,
182178
FEATURE_PCONFIG = 63,
183179
FEATURE_PKU,
184-
FEATURE_PREFETCHWT1,
185-
FEATURE_PRFCHW,
180+
FEATURE_PRFCHW = 66,
186181
FEATURE_PTWRITE,
187182
FEATURE_RDPID,
188183
FEATURE_RDRND,
@@ -231,7 +226,11 @@ enum ProcessorFeatures {
231226
FEATURE_USERMSR,
232227
FEATURE_AVX10_1 = 114,
233228
FEATURE_AVX10_2 = 116,
229+
FEATURE_AMX_AVX512,
230+
FEATURE_AMX_TF32,
231+
FEATURE_AMX_FP8 = 120,
234232
FEATURE_MOVRS,
233+
FEATURE_AMX_MOVRS,
235234
CPU_FEATURE_MAX
236235
};
237236

@@ -961,10 +960,6 @@ static void getAvailableFeatures(unsigned ECX, unsigned EDX, unsigned MaxLeaf,
961960
setFeature(FEATURE_AVX512IFMA);
962961
if (HasLeaf7 && ((EBX >> 24) & 1))
963962
setFeature(FEATURE_CLWB);
964-
if (HasLeaf7 && ((EBX >> 26) & 1) && HasAVX512Save)
965-
setFeature(FEATURE_AVX512PF);
966-
if (HasLeaf7 && ((EBX >> 27) & 1) && HasAVX512Save)
967-
setFeature(FEATURE_AVX512ER);
968963
if (HasLeaf7 && ((EBX >> 28) & 1) && HasAVX512Save)
969964
setFeature(FEATURE_AVX512CD);
970965
if (HasLeaf7 && ((EBX >> 29) & 1))
@@ -974,8 +969,6 @@ static void getAvailableFeatures(unsigned ECX, unsigned EDX, unsigned MaxLeaf,
974969
if (HasLeaf7 && ((EBX >> 31) & 1) && HasAVX512Save)
975970
setFeature(FEATURE_AVX512VL);
976971

977-
if (HasLeaf7 && ((ECX >> 0) & 1))
978-
setFeature(FEATURE_PREFETCHWT1);
979972
if (HasLeaf7 && ((ECX >> 1) & 1) && HasAVX512Save)
980973
setFeature(FEATURE_AVX512VBMI);
981974
if (HasLeaf7 && ((ECX >> 4) & 1))
@@ -1011,10 +1004,6 @@ static void getAvailableFeatures(unsigned ECX, unsigned EDX, unsigned MaxLeaf,
10111004
if (HasLeaf7 && ((ECX >> 29) & 1))
10121005
setFeature(FEATURE_ENQCMD);
10131006

1014-
if (HasLeaf7 && ((EDX >> 2) & 1) && HasAVX512Save)
1015-
setFeature(FEATURE_AVX5124VNNIW);
1016-
if (HasLeaf7 && ((EDX >> 3) & 1) && HasAVX512Save)
1017-
setFeature(FEATURE_AVX5124FMAPS);
10181007
if (HasLeaf7 && ((EDX >> 5) & 1))
10191008
setFeature(FEATURE_UINTR);
10201009
if (HasLeaf7 && ((EDX >> 8) & 1) && HasAVX512Save)
@@ -1088,6 +1077,17 @@ static void getAvailableFeatures(unsigned ECX, unsigned EDX, unsigned MaxLeaf,
10881077
if (HasLeafD && ((EAX >> 3) & 1) && HasAVXSave)
10891078
setFeature(FEATURE_XSAVES);
10901079

1080+
bool HasLeaf1E = MaxLevel >= 0x1e &&
1081+
!getX86CpuIDAndInfoEx(0x1e, 0x1, &EAX, &EBX, &ECX, &EDX);
1082+
if (HasLeaf1E && (EAX & 0x10))
1083+
setFeature(FEATURE_AMX_FP8);
1084+
if (HasLeaf1E && (EAX & 0x40))
1085+
setFeature(FEATURE_AMX_TF32);
1086+
if (HasLeaf1E && (EAX & 0x80))
1087+
setFeature(FEATURE_AMX_AVX512);
1088+
if (HasLeaf1E && (EAX & 0x100))
1089+
setFeature(FEATURE_AMX_MOVRS);
1090+
10911091
bool HasLeaf24 =
10921092
MaxLevel >= 0x24 && !getX86CpuIDAndInfo(0x24, &EAX, &EBX, &ECX, &EDX);
10931093
if (HasLeaf7Subleaf1 && ((EDX >> 19) & 1) && HasLeaf24) {

0 commit comments

Comments
 (0)