17#include "llvm/ADT/StringExtras.h"
18#include "llvm/ADT/StringRef.h"
19#include "llvm/ADT/StringSwitch.h"
20#include "llvm/TargetParser/X86TargetParser.h"
27#define BUILTIN(ID, TYPE, ATTRS) \
28 {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
29#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
30 {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
31#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
32 {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::HEADER, LANGS},
33#include "clang/Basic/BuiltinsX86.inc"
35#define BUILTIN(ID, TYPE, ATTRS) \
36 {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
37#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
38 {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
39#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
40 {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::HEADER, LANGS},
41#include "clang/Basic/BuiltinsX86_64.inc"
45 "ax",
"dx",
"cx",
"bx",
"si",
"di",
"bp",
"sp",
46 "st",
"st(1)",
"st(2)",
"st(3)",
"st(4)",
"st(5)",
"st(6)",
"st(7)",
47 "argp",
"flags",
"fpcr",
"fpsr",
"dirflag",
"frame",
"xmm0",
"xmm1",
48 "xmm2",
"xmm3",
"xmm4",
"xmm5",
"xmm6",
"xmm7",
"mm0",
"mm1",
49 "mm2",
"mm3",
"mm4",
"mm5",
"mm6",
"mm7",
"r8",
"r9",
50 "r10",
"r11",
"r12",
"r13",
"r14",
"r15",
"xmm8",
"xmm9",
51 "xmm10",
"xmm11",
"xmm12",
"xmm13",
"xmm14",
"xmm15",
"ymm0",
"ymm1",
52 "ymm2",
"ymm3",
"ymm4",
"ymm5",
"ymm6",
"ymm7",
"ymm8",
"ymm9",
53 "ymm10",
"ymm11",
"ymm12",
"ymm13",
"ymm14",
"ymm15",
"xmm16",
"xmm17",
54 "xmm18",
"xmm19",
"xmm20",
"xmm21",
"xmm22",
"xmm23",
"xmm24",
"xmm25",
55 "xmm26",
"xmm27",
"xmm28",
"xmm29",
"xmm30",
"xmm31",
"ymm16",
"ymm17",
56 "ymm18",
"ymm19",
"ymm20",
"ymm21",
"ymm22",
"ymm23",
"ymm24",
"ymm25",
57 "ymm26",
"ymm27",
"ymm28",
"ymm29",
"ymm30",
"ymm31",
"zmm0",
"zmm1",
58 "zmm2",
"zmm3",
"zmm4",
"zmm5",
"zmm6",
"zmm7",
"zmm8",
"zmm9",
59 "zmm10",
"zmm11",
"zmm12",
"zmm13",
"zmm14",
"zmm15",
"zmm16",
"zmm17",
60 "zmm18",
"zmm19",
"zmm20",
"zmm21",
"zmm22",
"zmm23",
"zmm24",
"zmm25",
61 "zmm26",
"zmm27",
"zmm28",
"zmm29",
"zmm30",
"zmm31",
"k0",
"k1",
62 "k2",
"k3",
"k4",
"k5",
"k6",
"k7",
63 "cr0",
"cr2",
"cr3",
"cr4",
"cr8",
64 "dr0",
"dr1",
"dr2",
"dr3",
"dr6",
"dr7",
65 "bnd0",
"bnd1",
"bnd2",
"bnd3",
66 "tmm0",
"tmm1",
"tmm2",
"tmm3",
"tmm4",
"tmm5",
"tmm6",
"tmm7",
67 "r16",
"r17",
"r18",
"r19",
"r20",
"r21",
"r22",
"r23",
68 "r24",
"r25",
"r26",
"r27",
"r28",
"r29",
"r30",
"r31",
72 {{
"al",
"ah",
"eax",
"rax"}, 0},
73 {{
"bl",
"bh",
"ebx",
"rbx"}, 3},
74 {{
"cl",
"ch",
"ecx",
"rcx"}, 2},
75 {{
"dl",
"dh",
"edx",
"rdx"}, 1},
80 {{
"r8d",
"r8w",
"r8b"}, 38},
81 {{
"r9d",
"r9w",
"r9b"}, 39},
82 {{
"r10d",
"r10w",
"r10b"}, 40},
83 {{
"r11d",
"r11w",
"r11b"}, 41},
84 {{
"r12d",
"r12w",
"r12b"}, 42},
85 {{
"r13d",
"r13w",
"r13b"}, 43},
86 {{
"r14d",
"r14w",
"r14b"}, 44},
87 {{
"r15d",
"r15w",
"r15b"}, 45},
88 {{
"r16d",
"r16w",
"r16b"}, 165},
89 {{
"r17d",
"r17w",
"r17b"}, 166},
90 {{
"r18d",
"r18w",
"r18b"}, 167},
91 {{
"r19d",
"r19w",
"r19b"}, 168},
92 {{
"r20d",
"r20w",
"r20b"}, 169},
93 {{
"r21d",
"r21w",
"r21b"}, 170},
94 {{
"r22d",
"r22w",
"r22b"}, 171},
95 {{
"r23d",
"r23w",
"r23b"}, 172},
96 {{
"r24d",
"r24w",
"r24b"}, 173},
97 {{
"r25d",
"r25w",
"r25b"}, 174},
98 {{
"r26d",
"r26w",
"r26b"}, 175},
99 {{
"r27d",
"r27w",
"r27b"}, 176},
100 {{
"r28d",
"r28w",
"r28b"}, 177},
101 {{
"r29d",
"r29w",
"r29b"}, 178},
102 {{
"r30d",
"r30w",
"r30b"}, 179},
103 {{
"r31d",
"r31w",
"r31b"}, 180},
108using namespace clang;
125 const std::vector<std::string> &FeaturesVec)
const {
128 if (
getTriple().getArch() == llvm::Triple::x86_64)
131 using namespace llvm::X86;
134 getFeaturesForCPU(
CPU, CPUFeatures);
135 for (
auto &F : CPUFeatures)
138 std::vector<std::string> UpdatedFeaturesVec;
139 std::vector<std::string> UpdatedAVX10FeaturesVec;
140 enum { FE_NOSET = -1, FE_FALSE, FE_TRUE };
141 int HasEVEX512 = FE_NOSET;
142 bool HasAVX512F = Features.lookup(
"avx512f");
143 bool HasAVX10 = Features.lookup(
"avx10.1-256");
144 bool HasAVX10_512 = Features.lookup(
"avx10.1-512");
145 std::string LastAVX10;
146 std::string LastAVX512;
147 for (
const auto &Feature : FeaturesVec) {
149 if (Feature ==
"+general-regs-only") {
150 UpdatedFeaturesVec.push_back(
"-x87");
151 UpdatedFeaturesVec.push_back(
"-mmx");
152 UpdatedFeaturesVec.push_back(
"-sse");
156 if (Feature.substr(1, 6) ==
"avx10.") {
157 if (Feature[0] ==
'+') {
159 if (StringRef(Feature).ends_with(
"512"))
162 }
else if (HasAVX10 && Feature ==
"-avx10.1-256") {
164 HasAVX10_512 =
false;
165 }
else if (HasAVX10_512 && Feature ==
"-avx10.1-512") {
166 HasAVX10_512 =
false;
169 UpdatedAVX10FeaturesVec.push_back(Feature);
171 }
else if (!HasAVX512F && StringRef(Feature).starts_with(
"+avx512")) {
173 LastAVX512 = Feature;
174 }
else if (HasAVX512F && Feature ==
"-avx512f") {
176 }
else if (HasEVEX512 != FE_TRUE && Feature ==
"+evex512") {
177 HasEVEX512 = FE_TRUE;
179 }
else if (HasEVEX512 != FE_FALSE && Feature ==
"-evex512") {
180 HasEVEX512 = FE_FALSE;
184 UpdatedFeaturesVec.push_back(Feature);
186 llvm::append_range(UpdatedFeaturesVec, UpdatedAVX10FeaturesVec);
189 if (!HasAVX10_512 && HasAVX512F) {
190 UpdatedFeaturesVec.push_back(HasEVEX512 == FE_FALSE ?
"-evex512"
192 if (HasAVX10 && HasEVEX512 != FE_FALSE)
193 Diags.
Report(diag::warn_invalid_feature_combination)
194 << LastAVX512 +
" " + LastAVX10 +
"; will be promoted to avx10.1-512";
195 }
else if (HasAVX10) {
196 if (!HasAVX512F && HasEVEX512 != FE_NOSET)
197 Diags.
Report(diag::warn_invalid_feature_combination)
198 << LastAVX10 + (HasEVEX512 == FE_TRUE ?
" +evex512" :
" -evex512");
199 UpdatedFeaturesVec.push_back(HasAVX10_512 ?
"+evex512" :
"-evex512");
209 auto I = Features.find(
"sse4.2");
210 if (I != Features.end() && I->getValue() &&
211 !llvm::is_contained(UpdatedFeaturesVec,
"-popcnt"))
212 Features[
"popcnt"] =
true;
216 I = Features.find(
"sse");
217 if (I != Features.end() && I->getValue() &&
218 !llvm::is_contained(UpdatedFeaturesVec,
"-mmx"))
219 Features[
"mmx"] =
true;
222 I = Features.find(
"avx");
223 if (I != Features.end() && I->getValue() &&
224 !llvm::is_contained(UpdatedFeaturesVec,
"-xsave"))
225 Features[
"xsave"] =
true;
228 I = Features.find(
"sse4.2");
229 if (I != Features.end() && I->getValue() &&
230 !llvm::is_contained(UpdatedFeaturesVec,
"-crc32"))
231 Features[
"crc32"] =
true;
237 StringRef Name,
bool Enabled)
const {
238 if (Name ==
"sse4") {
249 Features[Name] = Enabled;
250 llvm::X86::updateImpliedFeatures(Name, Enabled, Features);
257 for (
const auto &Feature : Features) {
258 if (Feature[0] !=
'+')
261 if (Feature ==
"+mmx") {
263 }
else if (Feature ==
"+aes") {
265 }
else if (Feature ==
"+vaes") {
267 }
else if (Feature ==
"+pclmul") {
269 }
else if (Feature ==
"+vpclmulqdq") {
270 HasVPCLMULQDQ =
true;
271 }
else if (Feature ==
"+lzcnt") {
273 }
else if (Feature ==
"+rdrnd") {
275 }
else if (Feature ==
"+fsgsbase") {
277 }
else if (Feature ==
"+bmi") {
279 }
else if (Feature ==
"+bmi2") {
281 }
else if (Feature ==
"+popcnt") {
283 }
else if (Feature ==
"+rtm") {
285 }
else if (Feature ==
"+prfchw") {
287 }
else if (Feature ==
"+rdseed") {
289 }
else if (Feature ==
"+adx") {
291 }
else if (Feature ==
"+tbm") {
293 }
else if (Feature ==
"+lwp") {
295 }
else if (Feature ==
"+fma") {
297 }
else if (Feature ==
"+f16c") {
299 }
else if (Feature ==
"+gfni") {
301 }
else if (Feature ==
"+evex512") {
303 }
else if (Feature ==
"+avx10.1-256") {
305 }
else if (Feature ==
"+avx10.1-512") {
306 HasAVX10_1_512 =
true;
307 }
else if (Feature ==
"+avx10.2-256") {
310 }
else if (Feature ==
"+avx10.2-512") {
311 HasAVX10_2_512 =
true;
312 }
else if (Feature ==
"+avx512cd") {
314 }
else if (Feature ==
"+avx512vpopcntdq") {
315 HasAVX512VPOPCNTDQ =
true;
316 }
else if (Feature ==
"+avx512vnni") {
317 HasAVX512VNNI =
true;
318 }
else if (Feature ==
"+avx512bf16") {
319 HasAVX512BF16 =
true;
320 }
else if (Feature ==
"+avx512fp16") {
321 HasAVX512FP16 =
true;
323 }
else if (Feature ==
"+avx512dq") {
325 }
else if (Feature ==
"+avx512bitalg") {
326 HasAVX512BITALG =
true;
327 }
else if (Feature ==
"+avx512bw") {
329 }
else if (Feature ==
"+avx512vl") {
331 }
else if (Feature ==
"+avx512vbmi") {
332 HasAVX512VBMI =
true;
333 }
else if (Feature ==
"+avx512vbmi2") {
334 HasAVX512VBMI2 =
true;
335 }
else if (Feature ==
"+avx512ifma") {
336 HasAVX512IFMA =
true;
337 }
else if (Feature ==
"+avx512vp2intersect") {
338 HasAVX512VP2INTERSECT =
true;
339 }
else if (Feature ==
"+sha") {
341 }
else if (Feature ==
"+sha512") {
343 }
else if (Feature ==
"+shstk") {
345 }
else if (Feature ==
"+sm3") {
347 }
else if (Feature ==
"+sm4") {
349 }
else if (Feature ==
"+movbe") {
351 }
else if (Feature ==
"+movrs") {
353 }
else if (Feature ==
"+sgx") {
355 }
else if (Feature ==
"+cx8") {
357 }
else if (Feature ==
"+cx16") {
359 }
else if (Feature ==
"+fxsr") {
361 }
else if (Feature ==
"+xsave") {
363 }
else if (Feature ==
"+xsaveopt") {
365 }
else if (Feature ==
"+xsavec") {
367 }
else if (Feature ==
"+xsaves") {
369 }
else if (Feature ==
"+mwaitx") {
371 }
else if (Feature ==
"+pku") {
373 }
else if (Feature ==
"+clflushopt") {
374 HasCLFLUSHOPT =
true;
375 }
else if (Feature ==
"+clwb") {
377 }
else if (Feature ==
"+wbnoinvd") {
379 }
else if (Feature ==
"+prefetchi") {
381 }
else if (Feature ==
"+clzero") {
383 }
else if (Feature ==
"+cldemote") {
385 }
else if (Feature ==
"+rdpid") {
387 }
else if (Feature ==
"+rdpru") {
389 }
else if (Feature ==
"+kl") {
391 }
else if (Feature ==
"+widekl") {
393 }
else if (Feature ==
"+retpoline-external-thunk") {
394 HasRetpolineExternalThunk =
true;
395 }
else if (Feature ==
"+sahf") {
397 }
else if (Feature ==
"+waitpkg") {
399 }
else if (Feature ==
"+movdiri") {
401 }
else if (Feature ==
"+movdir64b") {
403 }
else if (Feature ==
"+pconfig") {
405 }
else if (Feature ==
"+ptwrite") {
407 }
else if (Feature ==
"+invpcid") {
409 }
else if (Feature ==
"+enqcmd") {
411 }
else if (Feature ==
"+hreset") {
413 }
else if (Feature ==
"+amx-bf16") {
415 }
else if (Feature ==
"+amx-fp16") {
417 }
else if (Feature ==
"+amx-int8") {
419 }
else if (Feature ==
"+amx-tile") {
421 }
else if (Feature ==
"+amx-complex") {
422 HasAMXCOMPLEX =
true;
423 }
else if (Feature ==
"+amx-fp8") {
425 }
else if (Feature ==
"+amx-movrs") {
427 }
else if (Feature ==
"+amx-transpose") {
428 HasAMXTRANSPOSE =
true;
429 }
else if (Feature ==
"+amx-avx512") {
431 }
else if (Feature ==
"+amx-tf32") {
433 }
else if (Feature ==
"+cmpccxadd") {
435 }
else if (Feature ==
"+raoint") {
437 }
else if (Feature ==
"+avxifma") {
439 }
else if (Feature ==
"+avxneconvert") {
440 HasAVXNECONVERT=
true;
441 }
else if (Feature ==
"+avxvnni") {
443 }
else if (Feature ==
"+avxvnniint16") {
444 HasAVXVNNIINT16 =
true;
445 }
else if (Feature ==
"+avxvnniint8") {
446 HasAVXVNNIINT8 =
true;
447 }
else if (Feature ==
"+serialize") {
449 }
else if (Feature ==
"+tsxldtrk") {
451 }
else if (Feature ==
"+uintr") {
453 }
else if (Feature ==
"+usermsr") {
455 }
else if (Feature ==
"+crc32") {
457 }
else if (Feature ==
"+x87") {
459 }
else if (Feature ==
"+fullbf16") {
461 }
else if (Feature ==
"+egpr") {
463 }
else if (Feature ==
"+inline-asm-use-gpr32") {
464 HasInlineAsmUseGPR32 =
true;
465 }
else if (Feature ==
"+push2pop2") {
467 }
else if (Feature ==
"+ppx") {
469 }
else if (Feature ==
"+ndd") {
471 }
else if (Feature ==
"+ccmp") {
473 }
else if (Feature ==
"+nf") {
475 }
else if (Feature ==
"+cf") {
477 }
else if (Feature ==
"+zu") {
479 }
else if (Feature ==
"+branch-hint") {
480 HasBranchHint =
true;
483 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
484 .Case(
"+avx512f", AVX512F)
487 .Case(
"+sse4.2", SSE42)
488 .Case(
"+sse4.1", SSE41)
489 .Case(
"+ssse3", SSSE3)
494 SSELevel = std::max(SSELevel, Level);
509 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
512 .Case(
"+sse4a", SSE4A)
514 XOPLevel = std::max(XOPLevel, XLevel);
521 Diags.
Report(diag::err_target_unsupported_fpmath)
539 Builder.defineMacro(
"__GCC_ASM_FLAG_OUTPUTS__");
542 if (CodeModel ==
"default")
544 Builder.defineMacro(
"__code_model_" + CodeModel +
"__");
547 if (
getTriple().getArch() == llvm::Triple::x86_64) {
548 Builder.defineMacro(
"__amd64__");
549 Builder.defineMacro(
"__amd64");
550 Builder.defineMacro(
"__x86_64");
551 Builder.defineMacro(
"__x86_64__");
552 if (
getTriple().getArchName() ==
"x86_64h") {
553 Builder.defineMacro(
"__x86_64h");
554 Builder.defineMacro(
"__x86_64h__");
560 Builder.defineMacro(
"__SEG_GS");
561 Builder.defineMacro(
"__SEG_FS");
562 Builder.defineMacro(
"__seg_gs",
"__attribute__((address_space(256)))");
563 Builder.defineMacro(
"__seg_fs",
"__attribute__((address_space(257)))");
568 using namespace llvm::X86;
574 Builder.defineMacro(
"__tune_i386__");
583 Builder.defineMacro(
"__pentium_mmx__");
584 Builder.defineMacro(
"__tune_pentium_mmx__");
593 Builder.defineMacro(
"__tune_pentium3__");
597 Builder.defineMacro(
"__tune_pentium2__");
625 case CK_GoldmontPlus:
639 case CK_SkylakeClient:
640 case CK_SkylakeServer:
644 case CK_IcelakeClient:
646 case CK_IcelakeServer:
648 case CK_SapphireRapids:
656 case CK_Sierraforest:
658 case CK_Graniterapids:
659 case CK_GraniterapidsD:
660 case CK_Emeraldrapids:
661 case CK_Clearwaterforest:
662 case CK_Diamondrapids:
676 Builder.defineMacro(
"__tune_lakemont__");
679 Builder.defineMacro(
"__k6_2__");
680 Builder.defineMacro(
"__tune_k6_2__");
683 if (
CPU != CK_K6_2) {
687 Builder.defineMacro(
"__k6_3__");
688 Builder.defineMacro(
"__tune_k6_3__");
697 if (SSELevel != NoSSE) {
698 Builder.defineMacro(
"__athlon_sse__");
699 Builder.defineMacro(
"__tune_athlon_sse__");
753 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
758 Builder.defineMacro(
"__NO_MATH_INLINES");
761 Builder.defineMacro(
"__AES__");
764 Builder.defineMacro(
"__VAES__");
767 Builder.defineMacro(
"__PCLMUL__");
770 Builder.defineMacro(
"__VPCLMULQDQ__");
774 if (HasLAHFSAHF ||
getTriple().getArch() == llvm::Triple::x86)
775 Builder.defineMacro(
"__LAHF_SAHF__");
778 Builder.defineMacro(
"__LZCNT__");
781 Builder.defineMacro(
"__RDRND__");
784 Builder.defineMacro(
"__FSGSBASE__");
787 Builder.defineMacro(
"__BMI__");
790 Builder.defineMacro(
"__BMI2__");
793 Builder.defineMacro(
"__POPCNT__");
796 Builder.defineMacro(
"__RTM__");
799 Builder.defineMacro(
"__PRFCHW__");
802 Builder.defineMacro(
"__RDSEED__");
805 Builder.defineMacro(
"__ADX__");
808 Builder.defineMacro(
"__TBM__");
811 Builder.defineMacro(
"__LWP__");
814 Builder.defineMacro(
"__MWAITX__");
817 Builder.defineMacro(
"__MOVBE__");
821 Builder.defineMacro(
"__XOP__");
824 Builder.defineMacro(
"__FMA4__");
827 Builder.defineMacro(
"__SSE4A__");
834 Builder.defineMacro(
"__FMA__");
837 Builder.defineMacro(
"__F16C__");
840 Builder.defineMacro(
"__GFNI__");
843 Builder.defineMacro(
"__EVEX512__");
845 Builder.defineMacro(
"__AVX10_1__");
847 Builder.defineMacro(
"__AVX10_1_512__");
849 Builder.defineMacro(
"__AVX10_2__");
851 Builder.defineMacro(
"__AVX10_2_512__");
853 Builder.defineMacro(
"__AVX512CD__");
854 if (HasAVX512VPOPCNTDQ)
855 Builder.defineMacro(
"__AVX512VPOPCNTDQ__");
857 Builder.defineMacro(
"__AVX512VNNI__");
859 Builder.defineMacro(
"__AVX512BF16__");
861 Builder.defineMacro(
"__AVX512FP16__");
863 Builder.defineMacro(
"__AVX512DQ__");
865 Builder.defineMacro(
"__AVX512BITALG__");
867 Builder.defineMacro(
"__AVX512BW__");
869 Builder.defineMacro(
"__AVX512VL__");
870 Builder.defineMacro(
"__EVEX256__");
873 Builder.defineMacro(
"__AVX512VBMI__");
875 Builder.defineMacro(
"__AVX512VBMI2__");
877 Builder.defineMacro(
"__AVX512IFMA__");
878 if (HasAVX512VP2INTERSECT)
879 Builder.defineMacro(
"__AVX512VP2INTERSECT__");
881 Builder.defineMacro(
"__SHA__");
883 Builder.defineMacro(
"__SHA512__");
886 Builder.defineMacro(
"__FXSR__");
888 Builder.defineMacro(
"__XSAVE__");
890 Builder.defineMacro(
"__XSAVEOPT__");
892 Builder.defineMacro(
"__XSAVEC__");
894 Builder.defineMacro(
"__XSAVES__");
896 Builder.defineMacro(
"__PKU__");
898 Builder.defineMacro(
"__CLFLUSHOPT__");
900 Builder.defineMacro(
"__CLWB__");
902 Builder.defineMacro(
"__WBNOINVD__");
904 Builder.defineMacro(
"__SHSTK__");
906 Builder.defineMacro(
"__SGX__");
908 Builder.defineMacro(
"__SM3__");
910 Builder.defineMacro(
"__SM4__");
912 Builder.defineMacro(
"__PREFETCHI__");
914 Builder.defineMacro(
"__CLZERO__");
916 Builder.defineMacro(
"__KL__");
918 Builder.defineMacro(
"__WIDEKL__");
920 Builder.defineMacro(
"__RDPID__");
922 Builder.defineMacro(
"__RDPRU__");
924 Builder.defineMacro(
"__CLDEMOTE__");
926 Builder.defineMacro(
"__WAITPKG__");
928 Builder.defineMacro(
"__MOVDIRI__");
930 Builder.defineMacro(
"__MOVDIR64B__");
932 Builder.defineMacro(
"__MOVRS__");
934 Builder.defineMacro(
"__PCONFIG__");
936 Builder.defineMacro(
"__PTWRITE__");
938 Builder.defineMacro(
"__INVPCID__");
940 Builder.defineMacro(
"__ENQCMD__");
942 Builder.defineMacro(
"__HRESET__");
944 Builder.defineMacro(
"__AMX_TILE__");
946 Builder.defineMacro(
"__AMX_INT8__");
948 Builder.defineMacro(
"__AMX_BF16__");
950 Builder.defineMacro(
"__AMX_FP16__");
952 Builder.defineMacro(
"__AMX_COMPLEX__");
954 Builder.defineMacro(
"__AMX_FP8__");
956 Builder.defineMacro(
"__AMX_MOVRS__");
958 Builder.defineMacro(
"__AMX_TRANSPOSE__");
960 Builder.defineMacro(
"__AMX_AVX512__");
962 Builder.defineMacro(
"__AMX_TF32__");
964 Builder.defineMacro(
"__CMPCCXADD__");
966 Builder.defineMacro(
"__RAOINT__");
968 Builder.defineMacro(
"__AVXIFMA__");
970 Builder.defineMacro(
"__AVXNECONVERT__");
972 Builder.defineMacro(
"__AVXVNNI__");
974 Builder.defineMacro(
"__AVXVNNIINT16__");
976 Builder.defineMacro(
"__AVXVNNIINT8__");
978 Builder.defineMacro(
"__SERIALIZE__");
980 Builder.defineMacro(
"__TSXLDTRK__");
982 Builder.defineMacro(
"__UINTR__");
984 Builder.defineMacro(
"__USERMSR__");
986 Builder.defineMacro(
"__CRC32__");
988 Builder.defineMacro(
"__EGPR__");
990 Builder.defineMacro(
"__PUSH2POP2__");
992 Builder.defineMacro(
"__PPX__");
994 Builder.defineMacro(
"__NDD__");
996 Builder.defineMacro(
"__CCMP__");
998 Builder.defineMacro(
"__NF__");
1000 Builder.defineMacro(
"__CF__");
1002 Builder.defineMacro(
"__ZU__");
1003 if (HasEGPR && HasPush2Pop2 && HasPPX && HasNDD && HasCCMP && HasNF &&
1005 Builder.defineMacro(
"__APX_F__");
1006 if (HasEGPR && HasInlineAsmUseGPR32)
1007 Builder.defineMacro(
"__APX_INLINE_ASM_USE_GPR32__");
1012 Builder.defineMacro(
"__AVX512F__");
1015 Builder.defineMacro(
"__AVX2__");
1018 Builder.defineMacro(
"__AVX__");
1021 Builder.defineMacro(
"__SSE4_2__");
1024 Builder.defineMacro(
"__SSE4_1__");
1027 Builder.defineMacro(
"__SSSE3__");
1030 Builder.defineMacro(
"__SSE3__");
1033 Builder.defineMacro(
"__SSE2__");
1034 Builder.defineMacro(
"__SSE2_MATH__");
1037 Builder.defineMacro(
"__SSE__");
1038 Builder.defineMacro(
"__SSE_MATH__");
1044 if (Opts.MicrosoftExt &&
getTriple().getArch() == llvm::Triple::x86) {
1054 Builder.defineMacro(
"_M_IX86_FP", Twine(2));
1057 Builder.defineMacro(
"_M_IX86_FP", Twine(1));
1060 Builder.defineMacro(
"_M_IX86_FP", Twine(0));
1067 Builder.defineMacro(
"__MMX__");
1070 if (
CPU >= CK_i486 ||
CPU == CK_None) {
1071 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1072 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1073 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1076 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
1077 if (HasCX16 &&
getTriple().getArch() == llvm::Triple::x86_64)
1078 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
1081 Builder.defineMacro(
"__SIZEOF_FLOAT128__",
"16");
1085 return llvm::StringSwitch<bool>(Name)
1088 .Case(
"amx-avx512",
true)
1089 .Case(
"amx-bf16",
true)
1090 .Case(
"amx-complex",
true)
1091 .Case(
"amx-fp16",
true)
1092 .Case(
"amx-fp8",
true)
1093 .Case(
"amx-int8",
true)
1094 .Case(
"amx-movrs",
true)
1095 .Case(
"amx-tf32",
true)
1096 .Case(
"amx-tile",
true)
1097 .Case(
"amx-transpose",
true)
1099 .Case(
"avx10.1-256",
true)
1100 .Case(
"avx10.1-512",
true)
1101 .Case(
"avx10.2-256",
true)
1102 .Case(
"avx10.2-512",
true)
1104 .Case(
"avx512f",
true)
1105 .Case(
"avx512cd",
true)
1106 .Case(
"avx512vpopcntdq",
true)
1107 .Case(
"avx512vnni",
true)
1108 .Case(
"avx512bf16",
true)
1109 .Case(
"avx512fp16",
true)
1110 .Case(
"avx512dq",
true)
1111 .Case(
"avx512bitalg",
true)
1112 .Case(
"avx512bw",
true)
1113 .Case(
"avx512vl",
true)
1114 .Case(
"avx512vbmi",
true)
1115 .Case(
"avx512vbmi2",
true)
1116 .Case(
"avx512ifma",
true)
1117 .Case(
"avx512vp2intersect",
true)
1118 .Case(
"avxifma",
true)
1119 .Case(
"avxneconvert",
true)
1120 .Case(
"avxvnni",
true)
1121 .Case(
"avxvnniint16",
true)
1122 .Case(
"avxvnniint8",
true)
1125 .Case(
"cldemote",
true)
1126 .Case(
"clflushopt",
true)
1128 .Case(
"clzero",
true)
1129 .Case(
"cmpccxadd",
true)
1130 .Case(
"crc32",
true)
1132 .Case(
"enqcmd",
true)
1133 .Case(
"evex512",
true)
1137 .Case(
"fsgsbase",
true)
1139 .Case(
"general-regs-only",
true)
1141 .Case(
"hreset",
true)
1142 .Case(
"invpcid",
true)
1144 .Case(
"widekl",
true)
1146 .Case(
"lzcnt",
true)
1148 .Case(
"movbe",
true)
1149 .Case(
"movrs",
true)
1150 .Case(
"movdiri",
true)
1151 .Case(
"movdir64b",
true)
1152 .Case(
"mwaitx",
true)
1153 .Case(
"pclmul",
true)
1154 .Case(
"pconfig",
true)
1156 .Case(
"popcnt",
true)
1157 .Case(
"prefer-256-bit",
true)
1158 .Case(
"prefetchi",
true)
1159 .Case(
"prfchw",
true)
1160 .Case(
"ptwrite",
true)
1161 .Case(
"raoint",
true)
1162 .Case(
"rdpid",
true)
1163 .Case(
"rdpru",
true)
1164 .Case(
"rdrnd",
true)
1165 .Case(
"rdseed",
true)
1168 .Case(
"serialize",
true)
1171 .Case(
"sha512",
true)
1172 .Case(
"shstk",
true)
1178 .Case(
"ssse3",
true)
1180 .Case(
"sse4.1",
true)
1181 .Case(
"sse4.2",
true)
1182 .Case(
"sse4a",
true)
1184 .Case(
"tsxldtrk",
true)
1185 .Case(
"uintr",
true)
1186 .Case(
"usermsr",
true)
1188 .Case(
"vpclmulqdq",
true)
1189 .Case(
"wbnoinvd",
true)
1190 .Case(
"waitpkg",
true)
1193 .Case(
"xsave",
true)
1194 .Case(
"xsavec",
true)
1195 .Case(
"xsaves",
true)
1196 .Case(
"xsaveopt",
true)
1198 .Case(
"push2pop2",
true)
1209 return llvm::StringSwitch<bool>(Feature)
1210 .Case(
"adx", HasADX)
1211 .Case(
"aes", HasAES)
1212 .Case(
"amx-avx512", HasAMXAVX512)
1213 .Case(
"amx-bf16", HasAMXBF16)
1214 .Case(
"amx-complex", HasAMXCOMPLEX)
1215 .Case(
"amx-fp16", HasAMXFP16)
1216 .Case(
"amx-fp8", HasAMXFP8)
1217 .Case(
"amx-int8", HasAMXINT8)
1218 .Case(
"amx-movrs", HasAMXMOVRS)
1219 .Case(
"amx-tf32", HasAMXTF32)
1220 .Case(
"amx-tile", HasAMXTILE)
1221 .Case(
"amx-transpose", HasAMXTRANSPOSE)
1222 .Case(
"avx", SSELevel >= AVX)
1223 .Case(
"avx10.1-256", HasAVX10_1)
1224 .Case(
"avx10.1-512", HasAVX10_1_512)
1225 .Case(
"avx10.2-256", HasAVX10_2)
1226 .Case(
"avx10.2-512", HasAVX10_2_512)
1227 .Case(
"avx2", SSELevel >= AVX2)
1228 .Case(
"avx512f", SSELevel >= AVX512F)
1229 .Case(
"avx512cd", HasAVX512CD)
1230 .Case(
"avx512vpopcntdq", HasAVX512VPOPCNTDQ)
1231 .Case(
"avx512vnni", HasAVX512VNNI)
1232 .Case(
"avx512bf16", HasAVX512BF16)
1233 .Case(
"avx512fp16", HasAVX512FP16)
1234 .Case(
"avx512dq", HasAVX512DQ)
1235 .Case(
"avx512bitalg", HasAVX512BITALG)
1236 .Case(
"avx512bw", HasAVX512BW)
1237 .Case(
"avx512vl", HasAVX512VL)
1238 .Case(
"avx512vbmi", HasAVX512VBMI)
1239 .Case(
"avx512vbmi2", HasAVX512VBMI2)
1240 .Case(
"avx512ifma", HasAVX512IFMA)
1241 .Case(
"avx512vp2intersect", HasAVX512VP2INTERSECT)
1242 .Case(
"avxifma", HasAVXIFMA)
1243 .Case(
"avxneconvert", HasAVXNECONVERT)
1244 .Case(
"avxvnni", HasAVXVNNI)
1245 .Case(
"avxvnniint16", HasAVXVNNIINT16)
1246 .Case(
"avxvnniint8", HasAVXVNNIINT8)
1247 .Case(
"bmi", HasBMI)
1248 .Case(
"bmi2", HasBMI2)
1249 .Case(
"cldemote", HasCLDEMOTE)
1250 .Case(
"clflushopt", HasCLFLUSHOPT)
1251 .Case(
"clwb", HasCLWB)
1252 .Case(
"clzero", HasCLZERO)
1253 .Case(
"cmpccxadd", HasCMPCCXADD)
1254 .Case(
"crc32", HasCRC32)
1255 .Case(
"cx8", HasCX8)
1256 .Case(
"cx16", HasCX16)
1257 .Case(
"enqcmd", HasENQCMD)
1258 .Case(
"evex512", HasEVEX512)
1259 .Case(
"f16c", HasF16C)
1260 .Case(
"fma", HasFMA)
1261 .Case(
"fma4", XOPLevel >= FMA4)
1262 .Case(
"fsgsbase", HasFSGSBASE)
1263 .Case(
"fxsr", HasFXSR)
1264 .Case(
"gfni", HasGFNI)
1265 .Case(
"hreset", HasHRESET)
1266 .Case(
"invpcid", HasINVPCID)
1268 .Case(
"widekl", HasWIDEKL)
1269 .Case(
"lwp", HasLWP)
1270 .Case(
"lzcnt", HasLZCNT)
1271 .Case(
"mmx", HasMMX)
1272 .Case(
"movbe", HasMOVBE)
1273 .Case(
"movrs", HasMOVRS)
1274 .Case(
"movdiri", HasMOVDIRI)
1275 .Case(
"movdir64b", HasMOVDIR64B)
1276 .Case(
"mwaitx", HasMWAITX)
1277 .Case(
"pclmul", HasPCLMUL)
1278 .Case(
"pconfig", HasPCONFIG)
1279 .Case(
"pku", HasPKU)
1280 .Case(
"popcnt", HasPOPCNT)
1281 .Case(
"prefetchi", HasPREFETCHI)
1282 .Case(
"prfchw", HasPRFCHW)
1283 .Case(
"ptwrite", HasPTWRITE)
1284 .Case(
"raoint", HasRAOINT)
1285 .Case(
"rdpid", HasRDPID)
1286 .Case(
"rdpru", HasRDPRU)
1287 .Case(
"rdrnd", HasRDRND)
1288 .Case(
"rdseed", HasRDSEED)
1289 .Case(
"retpoline-external-thunk", HasRetpolineExternalThunk)
1290 .Case(
"rtm", HasRTM)
1291 .Case(
"sahf", HasLAHFSAHF)
1292 .Case(
"serialize", HasSERIALIZE)
1293 .Case(
"sgx", HasSGX)
1294 .Case(
"sha", HasSHA)
1295 .Case(
"sha512", HasSHA512)
1296 .Case(
"shstk", HasSHSTK)
1297 .Case(
"sm3", HasSM3)
1298 .Case(
"sm4", HasSM4)
1299 .Case(
"sse", SSELevel >= SSE1)
1300 .Case(
"sse2", SSELevel >= SSE2)
1301 .Case(
"sse3", SSELevel >= SSE3)
1302 .Case(
"ssse3", SSELevel >= SSSE3)
1303 .Case(
"sse4.1", SSELevel >= SSE41)
1304 .Case(
"sse4.2", SSELevel >= SSE42)
1305 .Case(
"sse4a", XOPLevel >= SSE4A)
1306 .Case(
"tbm", HasTBM)
1307 .Case(
"tsxldtrk", HasTSXLDTRK)
1308 .Case(
"uintr", HasUINTR)
1309 .Case(
"usermsr", HasUSERMSR)
1310 .Case(
"vaes", HasVAES)
1311 .Case(
"vpclmulqdq", HasVPCLMULQDQ)
1312 .Case(
"wbnoinvd", HasWBNOINVD)
1313 .Case(
"waitpkg", HasWAITPKG)
1315 .Case(
"x86_32",
getTriple().getArch() == llvm::Triple::x86)
1316 .Case(
"x86_64",
getTriple().getArch() == llvm::Triple::x86_64)
1317 .Case(
"x87", HasX87)
1318 .Case(
"xop", XOPLevel >= XOP)
1319 .Case(
"xsave", HasXSAVE)
1320 .Case(
"xsavec", HasXSAVEC)
1321 .Case(
"xsaves", HasXSAVES)
1322 .Case(
"xsaveopt", HasXSAVEOPT)
1324 .Case(
"egpr", HasEGPR)
1325 .Case(
"push2pop2", HasPush2Pop2)
1326 .Case(
"ppx", HasPPX)
1327 .Case(
"ndd", HasNDD)
1328 .Case(
"ccmp", HasCCMP)
1332 .Case(
"branch-hint", HasBranchHint)
1342 return llvm::StringSwitch<bool>(FeatureStr)
1343#define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY) .Case(STR, true)
1344#define X86_MICROARCH_LEVEL(ENUM, STR, PRIORITY) .Case(STR, true)
1345#include "llvm/TargetParser/X86TargetParser.def"
1350 return llvm::StringSwitch<llvm::X86::ProcessorFeatures>(Name)
1351#define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY) \
1352 .Case(STR, llvm::X86::FEATURE_##ENUM)
1354#include "llvm/TargetParser/X86TargetParser.def"
1361 auto getPriority = [](StringRef Feature) ->
unsigned {
1364 using namespace llvm::X86;
1365 CPUKind Kind = parseArchX86(Feature);
1366 if (Kind != CK_None) {
1367 ProcessorFeatures KeyFeature = getKeyFeature(Kind);
1368 return (getFeaturePriority(KeyFeature) << 1) + 1;
1372 return getFeaturePriority(
getFeature(Feature)) << 1;
1376 for (StringRef Feature : Features)
1377 if (!Feature.empty())
1383 return llvm::X86::validateCPUSpecificCPUDispatch(Name);
1387 return llvm::X86::getCPUDispatchMangling(Name);
1393 llvm::X86::getFeaturesForCPU(Name, TargetCPUFeatures,
true);
1394 for (
auto &F : TargetCPUFeatures)
1395 Features.push_back(F);
1403 return llvm::StringSwitch<bool>(FeatureStr)
1404#define X86_VENDOR(ENUM, STRING) .Case(STRING, true)
1405#define X86_CPU_TYPE_ALIAS(ENUM, ALIAS) .Case(ALIAS, true)
1406#define X86_CPU_TYPE(ENUM, STR) .Case(STR, true)
1407#define X86_CPU_SUBTYPE_ALIAS(ENUM, ALIAS) .Case(ALIAS, true)
1408#define X86_CPU_SUBTYPE(ENUM, STR) .Case(STR, true)
1409#include "llvm/TargetParser/X86TargetParser.def"
1414 auto RV = llvm::StringSwitch<unsigned>(Name)
1582 using namespace llvm::X86;
1622 case CK_GoldmontPlus:
1627 case CK_SandyBridge:
1631 case CK_SkylakeClient:
1632 case CK_SkylakeServer:
1633 case CK_Cascadelake:
1638 case CK_SapphireRapids:
1639 case CK_IcelakeClient:
1641 case CK_IcelakeServer:
1648 case CK_Pantherlake:
1649 case CK_Sierraforest:
1651 case CK_Graniterapids:
1652 case CK_GraniterapidsD:
1653 case CK_Emeraldrapids:
1654 case CK_Clearwaterforest:
1655 case CK_Diamondrapids:
1692 return std::nullopt;
1694 llvm_unreachable(
"Unknown CPU kind");
1698 StringRef Constraint,
1699 unsigned Size)
const {
1701 Constraint = Constraint.ltrim(
"=+&");
1707 StringRef Constraint,
1708 unsigned Size)
const {
1713 StringRef Constraint,
1714 unsigned Size)
const {
1715 switch (Constraint[0]) {
1728 switch (Constraint[1]) {
1740 return Size <= 512U;
1743 return Size <= 256U;
1745 return Size <= 128U;
1751 if (SSELevel < SSE2)
1762 return Size <= 512U;
1765 return Size <= 256U;
1766 return Size <= 128U;
1774 switch (*Constraint) {
1777 std::string Converted =
"{" + std::string(Constraint, Len) +
"}";
1778 Constraint += Len - 1;
1781 return std::string(1, *Constraint);
1783 return std::string(
"{ax}");
1785 return std::string(
"{bx}");
1787 return std::string(
"{cx}");
1789 return std::string(
"{dx}");
1791 return std::string(
"{si}");
1793 return std::string(
"{di}");
1795 return std::string(
"p");
1797 return std::string(
"{st}");
1799 return std::string(
"{st(1)}");
1801 assert(Constraint[1] ==
's');
1802 return '^' + std::string(Constraint++, 2);
1804 switch (Constraint[1]) {
1819 return std::string(
"^") + std::string(Constraint++, 2);
1823 switch (Constraint[1]) {
1834 return std::string(
"^") + std::string(Constraint++, 2);
1838 return std::string(1, *Constraint);
1843 bool Only64Bit =
getTriple().getArch() != llvm::Triple::x86;
1844 llvm::X86::fillValidCPUArchList(Values, Only64Bit);
1848 llvm::X86::fillValidTuneCPUList(Values);
Defines the Diagnostic-related interfaces.
static unsigned matchAsmCCConstraint(const char *Name)
static llvm::X86::ProcessorFeatures getFeature(StringRef Name)
Defines enum values for all the target-independent builtin functions.
Enumerates target-specific builtins in their own namespaces within namespace clang.
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
TargetOptions & getTargetOpts() const
Retrieve the target options.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual bool hasFeatureEnabled(const llvm::StringMap< bool > &Features, StringRef Name) const
Check if target has a given feature enabled.
virtual bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeatureVec) const
Initialize the map with the default set of target features for the CPU this should include all legal ...
enum clang::targets::X86TargetInfo::FPMathKind FPMath
bool handleTargetFeatures(std::vector< std::string > &Features, DiagnosticsEngine &Diags) override
handleTargetFeatures - Perform initialization based on the user configured set of features.
std::optional< unsigned > getCPUCacheLineSize() const override
bool validateAsmConstraint(const char *&Name, TargetInfo::ConstraintInfo &info) const override
bool setFPMath(StringRef Name) override
Use the specified unit for FP math.
ArrayRef< const char * > getGCCRegNames() const override
char CPUSpecificManglingCharacter(StringRef Name) const override
std::string convertConstraint(const char *&Constraint) const override
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro definitions for this parti...
bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeaturesVec) const override
Initialize the map with the default set of target features for the CPU this should include all legal ...
void getCPUSpecificCPUDispatchFeatures(StringRef Name, llvm::SmallVectorImpl< StringRef > &Features) const override
bool validateCpuIs(StringRef FeatureStr) const override
bool validateOutputSize(const llvm::StringMap< bool > &FeatureMap, StringRef Constraint, unsigned Size) const override
virtual bool validateOperandSize(const llvm::StringMap< bool > &FeatureMap, StringRef Constraint, unsigned Size) const
void fillValidTuneCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values for tuning CPU.
bool validateCPUSpecificCPUDispatch(StringRef Name) const override
bool validateCpuSupports(StringRef FeatureStr) const override
bool isValidFeatureName(StringRef Name) const override
Determine whether this TargetInfo supports the given feature.
bool hasFeature(StringRef Feature) const final
Determine whether the given target has the given feature.
void setFeatureEnabled(llvm::StringMap< bool > &Features, StringRef Name, bool Enabled) const final
Enable or disable a specific target feature; the feature name must be valid.
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
ArrayRef< TargetInfo::AddlRegName > getGCCAddlRegNames() const override
bool validateInputSize(const llvm::StringMap< bool > &FeatureMap, StringRef Constraint, unsigned Size) const override
unsigned getFMVPriority(ArrayRef< StringRef > Features) const override
ArrayRef< Builtin::Info > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
ArrayRef< Builtin::Info > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
LLVM_LIBRARY_VISIBILITY void defineCPUMacros(clang::MacroBuilder &Builder, llvm::StringRef CPUName, bool Tuning=true)
static constexpr Builtin::Info BuiltinInfoX86[]
const TargetInfo::AddlRegName AddlRegNames[]
static const char *const GCCRegNames[]
LLVM_LIBRARY_VISIBILITY void DefineStd(clang::MacroBuilder &Builder, llvm::StringRef MacroName, const clang::LangOptions &Opts)
Define a macro name and standard variants.
The JSON file list parser is used to communicate input to InstallAPI.
std::string ConstraintStr
void setRequiresImmediate(int Min, int Max)
const llvm::fltSemantics * LongDoubleFormat