Skip to content

Commit f3a4de3

Browse files
authored
[X86] Support "f16c" and "avx512fp16" for __builtin_cpu_supports (llvm#78384)
This resolves issue llvm#65320. This also supports clarify sapphirerapids and cooperlake for cpu_specific/dispatch.
1 parent aa02002 commit f3a4de3

File tree

5 files changed

+16
-10
lines changed

5 files changed

+16
-10
lines changed

clang/test/CodeGen/target-builtin-noerror.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ void verifyfeaturestrings(void) {
8282
(void)__builtin_cpu_supports("avx512bitalg");
8383
(void)__builtin_cpu_supports("avx512bf16");
8484
(void)__builtin_cpu_supports("avx512vp2intersect");
85+
(void)__builtin_cpu_supports("f16c");
86+
(void)__builtin_cpu_supports("avx512fp16");
8587
}
8688

8789
void verifycpustrings(void) {

clang/test/CodeGenCXX/attr-cpuspecific-outoflinedefs.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,17 +80,17 @@ OutOfLineDefs::foo(int, int, int) {
8080
// LINUX: define dso_local noundef i32 @_ZN13OutOfLineDefs3fooEiii.S
8181
// LINUX: define dso_local noundef i32 @_ZN13OutOfLineDefs3fooEiii.R
8282
// LINUX: define weak_odr ptr @_ZN13OutOfLineDefs3fooEiii.resolver()
83-
// LINUX: ret ptr @_ZN13OutOfLineDefs3fooEiii.R
8483
// LINUX: ret ptr @_ZN13OutOfLineDefs3fooEiii.S
84+
// LINUX: ret ptr @_ZN13OutOfLineDefs3fooEiii.R
8585
// LINUX: ret ptr @_ZN13OutOfLineDefs3fooEiii.O
8686
// LINUX: call void @llvm.trap
8787
// LINUX: define linkonce_odr noundef i32 @_ZN13OutOfLineDefs3fooEiii.O
8888

8989
// WINDOWS: define dso_local noundef i32 @"?foo@OutOfLineDefs@@[email protected]"
9090
// WINDOWS: define dso_local noundef i32 @"?foo@OutOfLineDefs@@[email protected]"
9191
// WINDOWS: define weak_odr dso_local i32 @"?foo@OutOfLineDefs@@QEAAHHHH@Z"(ptr %0, i32 %1, i32 %2, i32 %3)
92-
// WINDOWS: musttail call i32 @"?foo@OutOfLineDefs@@[email protected]"(ptr %0, i32 %1, i32 %2, i32 %3)
9392
// WINDOWS: musttail call i32 @"?foo@OutOfLineDefs@@[email protected]"(ptr %0, i32 %1, i32 %2, i32 %3)
93+
// WINDOWS: musttail call i32 @"?foo@OutOfLineDefs@@[email protected]"(ptr %0, i32 %1, i32 %2, i32 %3)
9494
// WINDOWS: musttail call i32 @"?foo@OutOfLineDefs@@[email protected]"(ptr %0, i32 %1, i32 %2, i32 %3)
9595
// WINDOWS: call void @llvm.trap
9696
// WINDOWS: define linkonce_odr dso_local noundef i32 @"?foo@OutOfLineDefs@@[email protected]"

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,8 @@ enum ProcessorFeatures {
148148
FEATURE_LZCNT,
149149
FEATURE_MOVBE,
150150

151-
FEATURE_X86_64_BASELINE = 95,
151+
FEATURE_AVX512FP16 = 94,
152+
FEATURE_X86_64_BASELINE,
152153
FEATURE_X86_64_V2,
153154
FEATURE_X86_64_V3,
154155
FEATURE_X86_64_V4,
@@ -812,6 +813,8 @@ static void getAvailableFeatures(unsigned ECX, unsigned EDX, unsigned MaxLeaf,
812813
setFeature(FEATURE_AVX5124FMAPS);
813814
if (HasLeaf7 && ((EDX >> 8) & 1) && HasAVX512Save)
814815
setFeature(FEATURE_AVX512VP2INTERSECT);
816+
if (HasLeaf7 && ((EDX >> 23) & 1) && HasAVX512Save)
817+
setFeature(FEATURE_AVX512FP16);
815818

816819
// EAX from subleaf 0 is the maximum subleaf supported. Some CPUs don't
817820
// return all 0s for invalid subleaves so check the limit.

llvm/include/llvm/TargetParser/X86TargetParser.def

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ X86_CPU_SUBTYPE_ALIAS(INTEL_COREI7_ALDERLAKE, "gracemont")
122122
//
123123
// We cannot just re-sort the list though because its order is dictated by the
124124
// order of bits in CodeGenFunction::GetX86CpuSupportsMask.
125+
// We cannot re-adjust the position of X86_FEATURE_COMPAT at the whole list.
125126
#ifndef X86_FEATURE_COMPAT
126127
#define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY) X86_FEATURE(ENUM, STR)
127128
#endif
@@ -184,12 +185,12 @@ X86_FEATURE (AMX_TILE, "amx-tile")
184185
X86_FEATURE (CLDEMOTE, "cldemote")
185186
X86_FEATURE (CLFLUSHOPT, "clflushopt")
186187
X86_FEATURE (CLWB, "clwb")
188+
X86_FEATURE_COMPAT(F16C, "f16c", 38)
187189
X86_FEATURE (CLZERO, "clzero")
188190
X86_FEATURE (CMPXCHG16B, "cx16")
189191
X86_FEATURE (CMPXCHG8B, "cx8")
190192
X86_FEATURE (CRC32, "crc32")
191193
X86_FEATURE (ENQCMD, "enqcmd")
192-
X86_FEATURE (F16C, "f16c")
193194
X86_FEATURE (FSGSBASE, "fsgsbase")
194195
X86_FEATURE (FXSR, "fxsr")
195196
X86_FEATURE (INVPCID, "invpcid")
@@ -229,9 +230,9 @@ X86_FEATURE (XSAVE, "xsave")
229230
X86_FEATURE (XSAVEC, "xsavec")
230231
X86_FEATURE (XSAVEOPT, "xsaveopt")
231232
X86_FEATURE (XSAVES, "xsaves")
233+
X86_FEATURE_COMPAT(AVX512FP16, "avx512fp16", 39)
232234
X86_FEATURE (HRESET, "hreset")
233235
X86_FEATURE (RAOINT, "raoint")
234-
X86_FEATURE (AVX512FP16, "avx512fp16")
235236
X86_FEATURE (AMX_FP16, "amx-fp16")
236237
X86_FEATURE (CMPCCXADD, "cmpccxadd")
237238
X86_FEATURE (AVXNECONVERT, "avxneconvert")

llvm/lib/TargetParser/X86TargetParser.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ constexpr ProcInfo Processors[] = {
347347
// Tigerlake microarchitecture based processors.
348348
{ {"tigerlake"}, CK_Tigerlake, FEATURE_AVX512VP2INTERSECT, FeaturesTigerlake, 'l', false },
349349
// Sapphire Rapids microarchitecture based processors.
350-
{ {"sapphirerapids"}, CK_SapphireRapids, FEATURE_AVX512BF16, FeaturesSapphireRapids, 'n', false },
350+
{ {"sapphirerapids"}, CK_SapphireRapids, FEATURE_AVX512FP16, FeaturesSapphireRapids, 'n', false },
351351
// Alderlake microarchitecture based processors.
352352
{ {"alderlake"}, CK_Alderlake, FEATURE_AVX2, FeaturesAlderlake, 'p', false },
353353
// Raptorlake microarchitecture based processors.
@@ -369,12 +369,12 @@ constexpr ProcInfo Processors[] = {
369369
// Grandridge microarchitecture based processors.
370370
{ {"grandridge"}, CK_Grandridge, FEATURE_AVX2, FeaturesSierraforest, 'p', false },
371371
// Granite Rapids microarchitecture based processors.
372-
{ {"graniterapids"}, CK_Graniterapids, FEATURE_AVX512BF16, FeaturesGraniteRapids, 'n', false },
372+
{ {"graniterapids"}, CK_Graniterapids, FEATURE_AVX512FP16, FeaturesGraniteRapids, 'n', false },
373373
// Granite Rapids D microarchitecture based processors.
374-
{ {"graniterapids-d"}, CK_GraniterapidsD, FEATURE_AVX512BF16, FeaturesGraniteRapids | FeatureAMX_COMPLEX, '\0', false },
375-
{ {"graniterapids_d"}, CK_GraniterapidsD, FEATURE_AVX512BF16, FeaturesGraniteRapids | FeatureAMX_COMPLEX, 'n', true },
374+
{ {"graniterapids-d"}, CK_GraniterapidsD, FEATURE_AVX512FP16, FeaturesGraniteRapids | FeatureAMX_COMPLEX, '\0', false },
375+
{ {"graniterapids_d"}, CK_GraniterapidsD, FEATURE_AVX512FP16, FeaturesGraniteRapids | FeatureAMX_COMPLEX, 'n', true },
376376
// Emerald Rapids microarchitecture based processors.
377-
{ {"emeraldrapids"}, CK_Emeraldrapids, FEATURE_AVX512BF16, FeaturesSapphireRapids, 'n', false },
377+
{ {"emeraldrapids"}, CK_Emeraldrapids, FEATURE_AVX512FP16, FeaturesSapphireRapids, 'n', false },
378378
// Clearwaterforest microarchitecture based processors.
379379
{ {"clearwaterforest"}, CK_Lunarlake, FEATURE_AVX2, FeaturesClearwaterforest, 'p', false },
380380
// Knights Landing processor.

0 commit comments

Comments
 (0)