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.def"
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.def"
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);
190 UpdatedFeaturesVec.push_back(HasEVEX512 == FE_FALSE ?
"-evex512"
192 if (HasAVX10 && !HasAVX10_512 && 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 (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 ==
"+aes") {
263 }
else if (Feature ==
"+vaes") {
265 }
else if (Feature ==
"+pclmul") {
267 }
else if (Feature ==
"+vpclmulqdq") {
268 HasVPCLMULQDQ =
true;
269 }
else if (Feature ==
"+lzcnt") {
271 }
else if (Feature ==
"+rdrnd") {
273 }
else if (Feature ==
"+fsgsbase") {
275 }
else if (Feature ==
"+bmi") {
277 }
else if (Feature ==
"+bmi2") {
279 }
else if (Feature ==
"+popcnt") {
281 }
else if (Feature ==
"+rtm") {
283 }
else if (Feature ==
"+prfchw") {
285 }
else if (Feature ==
"+rdseed") {
287 }
else if (Feature ==
"+adx") {
289 }
else if (Feature ==
"+tbm") {
291 }
else if (Feature ==
"+lwp") {
293 }
else if (Feature ==
"+fma") {
295 }
else if (Feature ==
"+f16c") {
297 }
else if (Feature ==
"+gfni") {
299 }
else if (Feature ==
"+evex512") {
301 }
else if (Feature ==
"+avx10.1-256") {
303 }
else if (Feature ==
"+avx10.1-512") {
304 HasAVX10_1_512 =
true;
305 }
else if (Feature ==
"+avx512cd") {
307 }
else if (Feature ==
"+avx512vpopcntdq") {
308 HasAVX512VPOPCNTDQ =
true;
309 }
else if (Feature ==
"+avx512vnni") {
310 HasAVX512VNNI =
true;
311 }
else if (Feature ==
"+avx512bf16") {
312 HasAVX512BF16 =
true;
313 }
else if (Feature ==
"+avx512er") {
315 Diags.
Report(diag::warn_knl_knm_isa_support_removed);
316 }
else if (Feature ==
"+avx512fp16") {
317 HasAVX512FP16 =
true;
319 }
else if (Feature ==
"+avx512pf") {
321 Diags.
Report(diag::warn_knl_knm_isa_support_removed);
322 }
else if (Feature ==
"+avx512dq") {
324 }
else if (Feature ==
"+avx512bitalg") {
325 HasAVX512BITALG =
true;
326 }
else if (Feature ==
"+avx512bw") {
328 }
else if (Feature ==
"+avx512vl") {
330 }
else if (Feature ==
"+avx512vbmi") {
331 HasAVX512VBMI =
true;
332 }
else if (Feature ==
"+avx512vbmi2") {
333 HasAVX512VBMI2 =
true;
334 }
else if (Feature ==
"+avx512ifma") {
335 HasAVX512IFMA =
true;
336 }
else if (Feature ==
"+avx512vp2intersect") {
337 HasAVX512VP2INTERSECT =
true;
338 }
else if (Feature ==
"+sha") {
340 }
else if (Feature ==
"+sha512") {
342 }
else if (Feature ==
"+shstk") {
344 }
else if (Feature ==
"+sm3") {
346 }
else if (Feature ==
"+sm4") {
348 }
else if (Feature ==
"+movbe") {
350 }
else if (Feature ==
"+sgx") {
352 }
else if (Feature ==
"+cx8") {
354 }
else if (Feature ==
"+cx16") {
356 }
else if (Feature ==
"+fxsr") {
358 }
else if (Feature ==
"+xsave") {
360 }
else if (Feature ==
"+xsaveopt") {
362 }
else if (Feature ==
"+xsavec") {
364 }
else if (Feature ==
"+xsaves") {
366 }
else if (Feature ==
"+mwaitx") {
368 }
else if (Feature ==
"+pku") {
370 }
else if (Feature ==
"+clflushopt") {
371 HasCLFLUSHOPT =
true;
372 }
else if (Feature ==
"+clwb") {
374 }
else if (Feature ==
"+wbnoinvd") {
376 }
else if (Feature ==
"+prefetchi") {
378 }
else if (Feature ==
"+prefetchwt1") {
379 HasPREFETCHWT1 =
true;
380 Diags.
Report(diag::warn_knl_knm_isa_support_removed);
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 ==
"+cmpccxadd") {
425 }
else if (Feature ==
"+raoint") {
427 }
else if (Feature ==
"+avxifma") {
429 }
else if (Feature ==
"+avxneconvert") {
430 HasAVXNECONVERT=
true;
431 }
else if (Feature ==
"+avxvnni") {
433 }
else if (Feature ==
"+avxvnniint16") {
434 HasAVXVNNIINT16 =
true;
435 }
else if (Feature ==
"+avxvnniint8") {
436 HasAVXVNNIINT8 =
true;
437 }
else if (Feature ==
"+serialize") {
439 }
else if (Feature ==
"+tsxldtrk") {
441 }
else if (Feature ==
"+uintr") {
443 }
else if (Feature ==
"+usermsr") {
445 }
else if (Feature ==
"+crc32") {
447 }
else if (Feature ==
"+x87") {
449 }
else if (Feature ==
"+fullbf16") {
451 }
else if (Feature ==
"+egpr") {
453 }
else if (Feature ==
"+push2pop2") {
455 }
else if (Feature ==
"+ppx") {
457 }
else if (Feature ==
"+ndd") {
459 }
else if (Feature ==
"+ccmp") {
461 }
else if (Feature ==
"+nf") {
463 }
else if (Feature ==
"+cf") {
467 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
468 .Case(
"+avx512f", AVX512F)
471 .Case(
"+sse4.2", SSE42)
472 .Case(
"+sse4.1", SSE41)
473 .Case(
"+ssse3", SSSE3)
478 SSELevel = std::max(SSELevel, Level);
493 MMX3DNowEnum ThreeDNowLevel = llvm::StringSwitch<MMX3DNowEnum>(Feature)
494 .Case(
"+3dnowa", AMD3DNowAthlon)
495 .Case(
"+3dnow", AMD3DNow)
497 .Default(NoMMX3DNow);
498 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
500 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
503 .Case(
"+sse4a", SSE4A)
505 XOPLevel = std::max(XOPLevel, XLevel);
512 Diags.
Report(diag::err_target_unsupported_fpmath)
530 Builder.defineMacro(
"__GCC_ASM_FLAG_OUTPUTS__");
533 if (CodeModel ==
"default")
535 Builder.defineMacro(
"__code_model_" + CodeModel +
"__");
538 if (
getTriple().getArch() == llvm::Triple::x86_64) {
539 Builder.defineMacro(
"__amd64__");
540 Builder.defineMacro(
"__amd64");
541 Builder.defineMacro(
"__x86_64");
542 Builder.defineMacro(
"__x86_64__");
543 if (
getTriple().getArchName() ==
"x86_64h") {
544 Builder.defineMacro(
"__x86_64h");
545 Builder.defineMacro(
"__x86_64h__");
551 Builder.defineMacro(
"__SEG_GS");
552 Builder.defineMacro(
"__SEG_FS");
553 Builder.defineMacro(
"__seg_gs",
"__attribute__((address_space(256)))");
554 Builder.defineMacro(
"__seg_fs",
"__attribute__((address_space(257)))");
559 using namespace llvm::X86;
565 Builder.defineMacro(
"__tune_i386__");
574 Builder.defineMacro(
"__pentium_mmx__");
575 Builder.defineMacro(
"__tune_pentium_mmx__");
584 Builder.defineMacro(
"__tune_pentium3__");
588 Builder.defineMacro(
"__tune_pentium2__");
616 case CK_GoldmontPlus:
630 case CK_SkylakeClient:
631 case CK_SkylakeServer:
635 case CK_IcelakeClient:
637 case CK_IcelakeServer:
639 case CK_SapphireRapids:
647 case CK_Sierraforest:
649 case CK_Graniterapids:
650 case CK_GraniterapidsD:
651 case CK_Emeraldrapids:
652 case CK_Clearwaterforest:
666 Builder.defineMacro(
"__tune_lakemont__");
669 Builder.defineMacro(
"__k6_2__");
670 Builder.defineMacro(
"__tune_k6_2__");
673 if (
CPU != CK_K6_2) {
677 Builder.defineMacro(
"__k6_3__");
678 Builder.defineMacro(
"__tune_k6_3__");
687 if (SSELevel != NoSSE) {
688 Builder.defineMacro(
"__athlon_sse__");
689 Builder.defineMacro(
"__tune_athlon_sse__");
740 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
745 Builder.defineMacro(
"__NO_MATH_INLINES");
748 Builder.defineMacro(
"__AES__");
751 Builder.defineMacro(
"__VAES__");
754 Builder.defineMacro(
"__PCLMUL__");
757 Builder.defineMacro(
"__VPCLMULQDQ__");
761 if (HasLAHFSAHF ||
getTriple().getArch() == llvm::Triple::x86)
762 Builder.defineMacro(
"__LAHF_SAHF__");
765 Builder.defineMacro(
"__LZCNT__");
768 Builder.defineMacro(
"__RDRND__");
771 Builder.defineMacro(
"__FSGSBASE__");
774 Builder.defineMacro(
"__BMI__");
777 Builder.defineMacro(
"__BMI2__");
780 Builder.defineMacro(
"__POPCNT__");
783 Builder.defineMacro(
"__RTM__");
786 Builder.defineMacro(
"__PRFCHW__");
789 Builder.defineMacro(
"__RDSEED__");
792 Builder.defineMacro(
"__ADX__");
795 Builder.defineMacro(
"__TBM__");
798 Builder.defineMacro(
"__LWP__");
801 Builder.defineMacro(
"__MWAITX__");
804 Builder.defineMacro(
"__MOVBE__");
808 Builder.defineMacro(
"__XOP__");
811 Builder.defineMacro(
"__FMA4__");
814 Builder.defineMacro(
"__SSE4A__");
821 Builder.defineMacro(
"__FMA__");
824 Builder.defineMacro(
"__F16C__");
827 Builder.defineMacro(
"__GFNI__");
830 Builder.defineMacro(
"__EVEX512__");
832 Builder.defineMacro(
"__AVX10_1__");
834 Builder.defineMacro(
"__AVX10_1_512__");
836 Builder.defineMacro(
"__AVX512CD__");
837 if (HasAVX512VPOPCNTDQ)
838 Builder.defineMacro(
"__AVX512VPOPCNTDQ__");
840 Builder.defineMacro(
"__AVX512VNNI__");
842 Builder.defineMacro(
"__AVX512BF16__");
844 Builder.defineMacro(
"__AVX512ER__");
846 Builder.defineMacro(
"__AVX512FP16__");
848 Builder.defineMacro(
"__AVX512PF__");
850 Builder.defineMacro(
"__AVX512DQ__");
852 Builder.defineMacro(
"__AVX512BITALG__");
854 Builder.defineMacro(
"__AVX512BW__");
856 Builder.defineMacro(
"__AVX512VL__");
857 Builder.defineMacro(
"__EVEX256__");
860 Builder.defineMacro(
"__AVX512VBMI__");
862 Builder.defineMacro(
"__AVX512VBMI2__");
864 Builder.defineMacro(
"__AVX512IFMA__");
865 if (HasAVX512VP2INTERSECT)
866 Builder.defineMacro(
"__AVX512VP2INTERSECT__");
868 Builder.defineMacro(
"__SHA__");
870 Builder.defineMacro(
"__SHA512__");
873 Builder.defineMacro(
"__FXSR__");
875 Builder.defineMacro(
"__XSAVE__");
877 Builder.defineMacro(
"__XSAVEOPT__");
879 Builder.defineMacro(
"__XSAVEC__");
881 Builder.defineMacro(
"__XSAVES__");
883 Builder.defineMacro(
"__PKU__");
885 Builder.defineMacro(
"__CLFLUSHOPT__");
887 Builder.defineMacro(
"__CLWB__");
889 Builder.defineMacro(
"__WBNOINVD__");
891 Builder.defineMacro(
"__SHSTK__");
893 Builder.defineMacro(
"__SGX__");
895 Builder.defineMacro(
"__SM3__");
897 Builder.defineMacro(
"__SM4__");
899 Builder.defineMacro(
"__PREFETCHI__");
901 Builder.defineMacro(
"__PREFETCHWT1__");
903 Builder.defineMacro(
"__CLZERO__");
905 Builder.defineMacro(
"__KL__");
907 Builder.defineMacro(
"__WIDEKL__");
909 Builder.defineMacro(
"__RDPID__");
911 Builder.defineMacro(
"__RDPRU__");
913 Builder.defineMacro(
"__CLDEMOTE__");
915 Builder.defineMacro(
"__WAITPKG__");
917 Builder.defineMacro(
"__MOVDIRI__");
919 Builder.defineMacro(
"__MOVDIR64B__");
921 Builder.defineMacro(
"__PCONFIG__");
923 Builder.defineMacro(
"__PTWRITE__");
925 Builder.defineMacro(
"__INVPCID__");
927 Builder.defineMacro(
"__ENQCMD__");
929 Builder.defineMacro(
"__HRESET__");
931 Builder.defineMacro(
"__AMX_TILE__");
933 Builder.defineMacro(
"__AMX_INT8__");
935 Builder.defineMacro(
"__AMX_BF16__");
937 Builder.defineMacro(
"__AMX_FP16__");
939 Builder.defineMacro(
"__AMX_COMPLEX__");
941 Builder.defineMacro(
"__CMPCCXADD__");
943 Builder.defineMacro(
"__RAOINT__");
945 Builder.defineMacro(
"__AVXIFMA__");
947 Builder.defineMacro(
"__AVXNECONVERT__");
949 Builder.defineMacro(
"__AVXVNNI__");
951 Builder.defineMacro(
"__AVXVNNIINT16__");
953 Builder.defineMacro(
"__AVXVNNIINT8__");
955 Builder.defineMacro(
"__SERIALIZE__");
957 Builder.defineMacro(
"__TSXLDTRK__");
959 Builder.defineMacro(
"__UINTR__");
961 Builder.defineMacro(
"__USERMSR__");
963 Builder.defineMacro(
"__CRC32__");
965 Builder.defineMacro(
"__EGPR__");
967 Builder.defineMacro(
"__PUSH2POP2__");
969 Builder.defineMacro(
"__PPX__");
971 Builder.defineMacro(
"__NDD__");
973 Builder.defineMacro(
"__CCMP__");
975 Builder.defineMacro(
"__NF__");
977 Builder.defineMacro(
"__CF__");
979 if (HasEGPR && HasPush2Pop2 && HasPPX && HasNDD)
980 Builder.defineMacro(
"__APX_F__");
985 Builder.defineMacro(
"__AVX512F__");
988 Builder.defineMacro(
"__AVX2__");
991 Builder.defineMacro(
"__AVX__");
994 Builder.defineMacro(
"__SSE4_2__");
997 Builder.defineMacro(
"__SSE4_1__");
1000 Builder.defineMacro(
"__SSSE3__");
1003 Builder.defineMacro(
"__SSE3__");
1006 Builder.defineMacro(
"__SSE2__");
1007 Builder.defineMacro(
"__SSE2_MATH__");
1010 Builder.defineMacro(
"__SSE__");
1011 Builder.defineMacro(
"__SSE_MATH__");
1017 if (Opts.MicrosoftExt &&
getTriple().getArch() == llvm::Triple::x86) {
1027 Builder.defineMacro(
"_M_IX86_FP", Twine(2));
1030 Builder.defineMacro(
"_M_IX86_FP", Twine(1));
1033 Builder.defineMacro(
"_M_IX86_FP", Twine(0));
1039 switch (MMX3DNowLevel) {
1040 case AMD3DNowAthlon:
1041 Builder.defineMacro(
"__3dNOW_A__");
1044 Builder.defineMacro(
"__3dNOW__");
1047 Builder.defineMacro(
"__MMX__");
1053 if (
CPU >= CK_i486 ||
CPU == CK_None) {
1054 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1055 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1056 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1059 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
1060 if (HasCX16 &&
getTriple().getArch() == llvm::Triple::x86_64)
1061 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
1064 Builder.defineMacro(
"__SIZEOF_FLOAT128__",
"16");
1068 return llvm::StringSwitch<bool>(Name)
1069 .Case(
"3dnow",
true)
1070 .Case(
"3dnowa",
true)
1073 .Case(
"amx-bf16",
true)
1074 .Case(
"amx-complex",
true)
1075 .Case(
"amx-fp16",
true)
1076 .Case(
"amx-int8",
true)
1077 .Case(
"amx-tile",
true)
1079 .Case(
"avx10.1-256",
true)
1080 .Case(
"avx10.1-512",
true)
1082 .Case(
"avx512f",
true)
1083 .Case(
"avx512cd",
true)
1084 .Case(
"avx512vpopcntdq",
true)
1085 .Case(
"avx512vnni",
true)
1086 .Case(
"avx512bf16",
true)
1087 .Case(
"avx512er",
true)
1088 .Case(
"avx512fp16",
true)
1089 .Case(
"avx512pf",
true)
1090 .Case(
"avx512dq",
true)
1091 .Case(
"avx512bitalg",
true)
1092 .Case(
"avx512bw",
true)
1093 .Case(
"avx512vl",
true)
1094 .Case(
"avx512vbmi",
true)
1095 .Case(
"avx512vbmi2",
true)
1096 .Case(
"avx512ifma",
true)
1097 .Case(
"avx512vp2intersect",
true)
1098 .Case(
"avxifma",
true)
1099 .Case(
"avxneconvert",
true)
1100 .Case(
"avxvnni",
true)
1101 .Case(
"avxvnniint16",
true)
1102 .Case(
"avxvnniint8",
true)
1105 .Case(
"cldemote",
true)
1106 .Case(
"clflushopt",
true)
1108 .Case(
"clzero",
true)
1109 .Case(
"cmpccxadd",
true)
1110 .Case(
"crc32",
true)
1112 .Case(
"enqcmd",
true)
1113 .Case(
"evex512",
true)
1117 .Case(
"fsgsbase",
true)
1119 .Case(
"general-regs-only",
true)
1121 .Case(
"hreset",
true)
1122 .Case(
"invpcid",
true)
1124 .Case(
"widekl",
true)
1126 .Case(
"lzcnt",
true)
1128 .Case(
"movbe",
true)
1129 .Case(
"movdiri",
true)
1130 .Case(
"movdir64b",
true)
1131 .Case(
"mwaitx",
true)
1132 .Case(
"pclmul",
true)
1133 .Case(
"pconfig",
true)
1135 .Case(
"popcnt",
true)
1136 .Case(
"prefetchi",
true)
1137 .Case(
"prefetchwt1",
true)
1138 .Case(
"prfchw",
true)
1139 .Case(
"ptwrite",
true)
1140 .Case(
"raoint",
true)
1141 .Case(
"rdpid",
true)
1142 .Case(
"rdpru",
true)
1143 .Case(
"rdrnd",
true)
1144 .Case(
"rdseed",
true)
1147 .Case(
"serialize",
true)
1150 .Case(
"sha512",
true)
1151 .Case(
"shstk",
true)
1157 .Case(
"ssse3",
true)
1159 .Case(
"sse4.1",
true)
1160 .Case(
"sse4.2",
true)
1161 .Case(
"sse4a",
true)
1163 .Case(
"tsxldtrk",
true)
1164 .Case(
"uintr",
true)
1165 .Case(
"usermsr",
true)
1167 .Case(
"vpclmulqdq",
true)
1168 .Case(
"wbnoinvd",
true)
1169 .Case(
"waitpkg",
true)
1172 .Case(
"xsave",
true)
1173 .Case(
"xsavec",
true)
1174 .Case(
"xsaves",
true)
1175 .Case(
"xsaveopt",
true)
1177 .Case(
"push2pop2",
true)
1187 return llvm::StringSwitch<bool>(Feature)
1188 .Case(
"adx", HasADX)
1189 .Case(
"aes", HasAES)
1190 .Case(
"amx-bf16", HasAMXBF16)
1191 .Case(
"amx-complex", HasAMXCOMPLEX)
1192 .Case(
"amx-fp16", HasAMXFP16)
1193 .Case(
"amx-int8", HasAMXINT8)
1194 .Case(
"amx-tile", HasAMXTILE)
1195 .Case(
"avx", SSELevel >= AVX)
1196 .Case(
"avx10.1-256", HasAVX10_1)
1197 .Case(
"avx10.1-512", HasAVX10_1_512)
1198 .Case(
"avx2", SSELevel >= AVX2)
1199 .Case(
"avx512f", SSELevel >= AVX512F)
1200 .Case(
"avx512cd", HasAVX512CD)
1201 .Case(
"avx512vpopcntdq", HasAVX512VPOPCNTDQ)
1202 .Case(
"avx512vnni", HasAVX512VNNI)
1203 .Case(
"avx512bf16", HasAVX512BF16)
1204 .Case(
"avx512er", HasAVX512ER)
1205 .Case(
"avx512fp16", HasAVX512FP16)
1206 .Case(
"avx512pf", HasAVX512PF)
1207 .Case(
"avx512dq", HasAVX512DQ)
1208 .Case(
"avx512bitalg", HasAVX512BITALG)
1209 .Case(
"avx512bw", HasAVX512BW)
1210 .Case(
"avx512vl", HasAVX512VL)
1211 .Case(
"avx512vbmi", HasAVX512VBMI)
1212 .Case(
"avx512vbmi2", HasAVX512VBMI2)
1213 .Case(
"avx512ifma", HasAVX512IFMA)
1214 .Case(
"avx512vp2intersect", HasAVX512VP2INTERSECT)
1215 .Case(
"avxifma", HasAVXIFMA)
1216 .Case(
"avxneconvert", HasAVXNECONVERT)
1217 .Case(
"avxvnni", HasAVXVNNI)
1218 .Case(
"avxvnniint16", HasAVXVNNIINT16)
1219 .Case(
"avxvnniint8", HasAVXVNNIINT8)
1220 .Case(
"bmi", HasBMI)
1221 .Case(
"bmi2", HasBMI2)
1222 .Case(
"cldemote", HasCLDEMOTE)
1223 .Case(
"clflushopt", HasCLFLUSHOPT)
1224 .Case(
"clwb", HasCLWB)
1225 .Case(
"clzero", HasCLZERO)
1226 .Case(
"cmpccxadd", HasCMPCCXADD)
1227 .Case(
"crc32", HasCRC32)
1228 .Case(
"cx8", HasCX8)
1229 .Case(
"cx16", HasCX16)
1230 .Case(
"enqcmd", HasENQCMD)
1231 .Case(
"evex512", HasEVEX512)
1232 .Case(
"f16c", HasF16C)
1233 .Case(
"fma", HasFMA)
1234 .Case(
"fma4", XOPLevel >= FMA4)
1235 .Case(
"fsgsbase", HasFSGSBASE)
1236 .Case(
"fxsr", HasFXSR)
1237 .Case(
"gfni", HasGFNI)
1238 .Case(
"hreset", HasHRESET)
1239 .Case(
"invpcid", HasINVPCID)
1241 .Case(
"widekl", HasWIDEKL)
1242 .Case(
"lwp", HasLWP)
1243 .Case(
"lzcnt", HasLZCNT)
1244 .Case(
"mm3dnow", MMX3DNowLevel >= AMD3DNow)
1245 .Case(
"mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
1246 .Case(
"mmx", MMX3DNowLevel >= MMX)
1247 .Case(
"movbe", HasMOVBE)
1248 .Case(
"movdiri", HasMOVDIRI)
1249 .Case(
"movdir64b", HasMOVDIR64B)
1250 .Case(
"mwaitx", HasMWAITX)
1251 .Case(
"pclmul", HasPCLMUL)
1252 .Case(
"pconfig", HasPCONFIG)
1253 .Case(
"pku", HasPKU)
1254 .Case(
"popcnt", HasPOPCNT)
1255 .Case(
"prefetchi", HasPREFETCHI)
1256 .Case(
"prefetchwt1", HasPREFETCHWT1)
1257 .Case(
"prfchw", HasPRFCHW)
1258 .Case(
"ptwrite", HasPTWRITE)
1259 .Case(
"raoint", HasRAOINT)
1260 .Case(
"rdpid", HasRDPID)
1261 .Case(
"rdpru", HasRDPRU)
1262 .Case(
"rdrnd", HasRDRND)
1263 .Case(
"rdseed", HasRDSEED)
1264 .Case(
"retpoline-external-thunk", HasRetpolineExternalThunk)
1265 .Case(
"rtm", HasRTM)
1266 .Case(
"sahf", HasLAHFSAHF)
1267 .Case(
"serialize", HasSERIALIZE)
1268 .Case(
"sgx", HasSGX)
1269 .Case(
"sha", HasSHA)
1270 .Case(
"sha512", HasSHA512)
1271 .Case(
"shstk", HasSHSTK)
1272 .Case(
"sm3", HasSM3)
1273 .Case(
"sm4", HasSM4)
1274 .Case(
"sse", SSELevel >= SSE1)
1275 .Case(
"sse2", SSELevel >= SSE2)
1276 .Case(
"sse3", SSELevel >= SSE3)
1277 .Case(
"ssse3", SSELevel >= SSSE3)
1278 .Case(
"sse4.1", SSELevel >= SSE41)
1279 .Case(
"sse4.2", SSELevel >= SSE42)
1280 .Case(
"sse4a", XOPLevel >= SSE4A)
1281 .Case(
"tbm", HasTBM)
1282 .Case(
"tsxldtrk", HasTSXLDTRK)
1283 .Case(
"uintr", HasUINTR)
1284 .Case(
"usermsr", HasUSERMSR)
1285 .Case(
"vaes", HasVAES)
1286 .Case(
"vpclmulqdq", HasVPCLMULQDQ)
1287 .Case(
"wbnoinvd", HasWBNOINVD)
1288 .Case(
"waitpkg", HasWAITPKG)
1290 .Case(
"x86_32",
getTriple().getArch() == llvm::Triple::x86)
1291 .Case(
"x86_64",
getTriple().getArch() == llvm::Triple::x86_64)
1292 .Case(
"x87", HasX87)
1293 .Case(
"xop", XOPLevel >= XOP)
1294 .Case(
"xsave", HasXSAVE)
1295 .Case(
"xsavec", HasXSAVEC)
1296 .Case(
"xsaves", HasXSAVES)
1297 .Case(
"xsaveopt", HasXSAVEOPT)
1299 .Case(
"egpr", HasEGPR)
1300 .Case(
"push2pop2", HasPush2Pop2)
1301 .Case(
"ppx", HasPPX)
1302 .Case(
"ndd", HasNDD)
1303 .Case(
"ccmp", HasCCMP)
1315 return llvm::StringSwitch<bool>(FeatureStr)
1316#define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY) .Case(STR, true)
1317#define X86_MICROARCH_LEVEL(ENUM, STR, PRIORITY) .Case(STR, true)
1318#include "llvm/TargetParser/X86TargetParser.def"
1323 return llvm::StringSwitch<llvm::X86::ProcessorFeatures>(Name)
1324#define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY) \
1325 .Case(STR, llvm::X86::FEATURE_##ENUM)
1327#include "llvm/TargetParser/X86TargetParser.def"
1336 using namespace llvm::X86;
1337 CPUKind Kind = parseArchX86(Name);
1338 if (Kind != CK_None) {
1339 ProcessorFeatures KeyFeature = getKeyFeature(Kind);
1340 return (getFeaturePriority(KeyFeature) << 1) + 1;
1345 return getFeaturePriority(
getFeature(Name)) << 1;
1349 return llvm::X86::validateCPUSpecificCPUDispatch(Name);
1353 return llvm::X86::getCPUDispatchMangling(Name);
1359 llvm::X86::getFeaturesForCPU(Name, TargetCPUFeatures,
true);
1360 for (
auto &F : TargetCPUFeatures)
1361 Features.push_back(F);
1369 return llvm::StringSwitch<bool>(FeatureStr)
1370#define X86_VENDOR(ENUM, STRING) .Case(STRING, true)
1371#define X86_CPU_TYPE_ALIAS(ENUM, ALIAS) .Case(ALIAS, true)
1372#define X86_CPU_TYPE(ENUM, STR) .Case(STR, true)
1373#define X86_CPU_SUBTYPE_ALIAS(ENUM, ALIAS) .Case(ALIAS, true)
1374#define X86_CPU_SUBTYPE(ENUM, STR) .Case(STR, true)
1375#include "llvm/TargetParser/X86TargetParser.def"
1380 auto RV = llvm::StringSwitch<unsigned>(Name)
1536 using namespace llvm::X86;
1576 case CK_GoldmontPlus:
1581 case CK_SandyBridge:
1585 case CK_SkylakeClient:
1586 case CK_SkylakeServer:
1587 case CK_Cascadelake:
1592 case CK_SapphireRapids:
1593 case CK_IcelakeClient:
1595 case CK_IcelakeServer:
1602 case CK_Pantherlake:
1603 case CK_Sierraforest:
1605 case CK_Graniterapids:
1606 case CK_GraniterapidsD:
1607 case CK_Emeraldrapids:
1608 case CK_Clearwaterforest:
1644 return std::nullopt;
1646 llvm_unreachable(
"Unknown CPU kind");
1650 StringRef Constraint,
1651 unsigned Size)
const {
1653 Constraint = Constraint.ltrim(
"=+&");
1659 StringRef Constraint,
1660 unsigned Size)
const {
1665 StringRef Constraint,
1666 unsigned Size)
const {
1667 switch (Constraint[0]) {
1680 switch (Constraint[1]) {
1692 return Size <= 512U;
1695 return Size <= 256U;
1697 return Size <= 128U;
1703 if (SSELevel < SSE2)
1714 return Size <= 512U;
1717 return Size <= 256U;
1718 return Size <= 128U;
1726 switch (*Constraint) {
1729 std::string Converted =
"{" + std::string(Constraint, Len) +
"}";
1730 Constraint += Len - 1;
1733 return std::string(1, *Constraint);
1735 return std::string(
"{ax}");
1737 return std::string(
"{bx}");
1739 return std::string(
"{cx}");
1741 return std::string(
"{dx}");
1743 return std::string(
"{si}");
1745 return std::string(
"{di}");
1747 return std::string(
"p");
1749 return std::string(
"{st}");
1751 return std::string(
"{st(1)}");
1753 assert(Constraint[1] ==
's');
1754 return '^' + std::string(Constraint++, 2);
1756 switch (Constraint[1]) {
1771 return std::string(
"^") + std::string(Constraint++, 2);
1775 return std::string(1, *Constraint);
1780 bool Only64Bit =
getTriple().getArch() != llvm::Triple::x86;
1781 llvm::X86::fillValidCPUArchList(Values, Only64Bit);
1785 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
unsigned multiVersionSortPriority(StringRef Name) 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
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...
void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName, bool Tuning)
static constexpr Builtin::Info BuiltinInfoX86[]
const TargetInfo::AddlRegName AddlRegNames[]
static const char *const GCCRegNames[]
void DefineStd(MacroBuilder &Builder, StringRef MacroName, const LangOptions &Opts)
DefineStd - 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