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 ==
"+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 ==
"+avx512cd") {
309 }
else if (Feature ==
"+avx512vpopcntdq") {
310 HasAVX512VPOPCNTDQ =
true;
311 }
else if (Feature ==
"+avx512vnni") {
312 HasAVX512VNNI =
true;
313 }
else if (Feature ==
"+avx512bf16") {
314 HasAVX512BF16 =
true;
315 }
else if (Feature ==
"+avx512fp16") {
316 HasAVX512FP16 =
true;
318 }
else if (Feature ==
"+avx512dq") {
320 }
else if (Feature ==
"+avx512bitalg") {
321 HasAVX512BITALG =
true;
322 }
else if (Feature ==
"+avx512bw") {
324 }
else if (Feature ==
"+avx512vl") {
326 }
else if (Feature ==
"+avx512vbmi") {
327 HasAVX512VBMI =
true;
328 }
else if (Feature ==
"+avx512vbmi2") {
329 HasAVX512VBMI2 =
true;
330 }
else if (Feature ==
"+avx512ifma") {
331 HasAVX512IFMA =
true;
332 }
else if (Feature ==
"+avx512vp2intersect") {
333 HasAVX512VP2INTERSECT =
true;
334 }
else if (Feature ==
"+sha") {
336 }
else if (Feature ==
"+sha512") {
338 }
else if (Feature ==
"+shstk") {
340 }
else if (Feature ==
"+sm3") {
342 }
else if (Feature ==
"+sm4") {
344 }
else if (Feature ==
"+movbe") {
346 }
else if (Feature ==
"+sgx") {
348 }
else if (Feature ==
"+cx8") {
350 }
else if (Feature ==
"+cx16") {
352 }
else if (Feature ==
"+fxsr") {
354 }
else if (Feature ==
"+xsave") {
356 }
else if (Feature ==
"+xsaveopt") {
358 }
else if (Feature ==
"+xsavec") {
360 }
else if (Feature ==
"+xsaves") {
362 }
else if (Feature ==
"+mwaitx") {
364 }
else if (Feature ==
"+pku") {
366 }
else if (Feature ==
"+clflushopt") {
367 HasCLFLUSHOPT =
true;
368 }
else if (Feature ==
"+clwb") {
370 }
else if (Feature ==
"+wbnoinvd") {
372 }
else if (Feature ==
"+prefetchi") {
374 }
else if (Feature ==
"+clzero") {
376 }
else if (Feature ==
"+cldemote") {
378 }
else if (Feature ==
"+rdpid") {
380 }
else if (Feature ==
"+rdpru") {
382 }
else if (Feature ==
"+kl") {
384 }
else if (Feature ==
"+widekl") {
386 }
else if (Feature ==
"+retpoline-external-thunk") {
387 HasRetpolineExternalThunk =
true;
388 }
else if (Feature ==
"+sahf") {
390 }
else if (Feature ==
"+waitpkg") {
392 }
else if (Feature ==
"+movdiri") {
394 }
else if (Feature ==
"+movdir64b") {
396 }
else if (Feature ==
"+pconfig") {
398 }
else if (Feature ==
"+ptwrite") {
400 }
else if (Feature ==
"+invpcid") {
402 }
else if (Feature ==
"+enqcmd") {
404 }
else if (Feature ==
"+hreset") {
406 }
else if (Feature ==
"+amx-bf16") {
408 }
else if (Feature ==
"+amx-fp16") {
410 }
else if (Feature ==
"+amx-int8") {
412 }
else if (Feature ==
"+amx-tile") {
414 }
else if (Feature ==
"+amx-complex") {
415 HasAMXCOMPLEX =
true;
416 }
else if (Feature ==
"+cmpccxadd") {
418 }
else if (Feature ==
"+raoint") {
420 }
else if (Feature ==
"+avxifma") {
422 }
else if (Feature ==
"+avxneconvert") {
423 HasAVXNECONVERT=
true;
424 }
else if (Feature ==
"+avxvnni") {
426 }
else if (Feature ==
"+avxvnniint16") {
427 HasAVXVNNIINT16 =
true;
428 }
else if (Feature ==
"+avxvnniint8") {
429 HasAVXVNNIINT8 =
true;
430 }
else if (Feature ==
"+serialize") {
432 }
else if (Feature ==
"+tsxldtrk") {
434 }
else if (Feature ==
"+uintr") {
436 }
else if (Feature ==
"+usermsr") {
438 }
else if (Feature ==
"+crc32") {
440 }
else if (Feature ==
"+x87") {
442 }
else if (Feature ==
"+fullbf16") {
444 }
else if (Feature ==
"+egpr") {
446 }
else if (Feature ==
"+inline-asm-use-gpr32") {
447 HasInlineAsmUseGPR32 =
true;
448 }
else if (Feature ==
"+push2pop2") {
450 }
else if (Feature ==
"+ppx") {
452 }
else if (Feature ==
"+ndd") {
454 }
else if (Feature ==
"+ccmp") {
456 }
else if (Feature ==
"+nf") {
458 }
else if (Feature ==
"+cf") {
460 }
else if (Feature ==
"+zu") {
462 }
else if (Feature ==
"+branch-hint") {
463 HasBranchHint =
true;
466 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
467 .Case(
"+avx512f", AVX512F)
470 .Case(
"+sse4.2", SSE42)
471 .Case(
"+sse4.1", SSE41)
472 .Case(
"+ssse3", SSSE3)
477 SSELevel = std::max(SSELevel, Level);
492 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
495 .Case(
"+sse4a", SSE4A)
497 XOPLevel = std::max(XOPLevel, XLevel);
504 Diags.
Report(diag::err_target_unsupported_fpmath)
522 Builder.defineMacro(
"__GCC_ASM_FLAG_OUTPUTS__");
525 if (CodeModel ==
"default")
527 Builder.defineMacro(
"__code_model_" + CodeModel +
"__");
530 if (
getTriple().getArch() == llvm::Triple::x86_64) {
531 Builder.defineMacro(
"__amd64__");
532 Builder.defineMacro(
"__amd64");
533 Builder.defineMacro(
"__x86_64");
534 Builder.defineMacro(
"__x86_64__");
535 if (
getTriple().getArchName() ==
"x86_64h") {
536 Builder.defineMacro(
"__x86_64h");
537 Builder.defineMacro(
"__x86_64h__");
543 Builder.defineMacro(
"__SEG_GS");
544 Builder.defineMacro(
"__SEG_FS");
545 Builder.defineMacro(
"__seg_gs",
"__attribute__((address_space(256)))");
546 Builder.defineMacro(
"__seg_fs",
"__attribute__((address_space(257)))");
551 using namespace llvm::X86;
557 Builder.defineMacro(
"__tune_i386__");
566 Builder.defineMacro(
"__pentium_mmx__");
567 Builder.defineMacro(
"__tune_pentium_mmx__");
576 Builder.defineMacro(
"__tune_pentium3__");
580 Builder.defineMacro(
"__tune_pentium2__");
608 case CK_GoldmontPlus:
622 case CK_SkylakeClient:
623 case CK_SkylakeServer:
627 case CK_IcelakeClient:
629 case CK_IcelakeServer:
631 case CK_SapphireRapids:
639 case CK_Sierraforest:
641 case CK_Graniterapids:
642 case CK_GraniterapidsD:
643 case CK_Emeraldrapids:
644 case CK_Clearwaterforest:
658 Builder.defineMacro(
"__tune_lakemont__");
661 Builder.defineMacro(
"__k6_2__");
662 Builder.defineMacro(
"__tune_k6_2__");
665 if (
CPU != CK_K6_2) {
669 Builder.defineMacro(
"__k6_3__");
670 Builder.defineMacro(
"__tune_k6_3__");
679 if (SSELevel != NoSSE) {
680 Builder.defineMacro(
"__athlon_sse__");
681 Builder.defineMacro(
"__tune_athlon_sse__");
732 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
737 Builder.defineMacro(
"__NO_MATH_INLINES");
740 Builder.defineMacro(
"__AES__");
743 Builder.defineMacro(
"__VAES__");
746 Builder.defineMacro(
"__PCLMUL__");
749 Builder.defineMacro(
"__VPCLMULQDQ__");
753 if (HasLAHFSAHF ||
getTriple().getArch() == llvm::Triple::x86)
754 Builder.defineMacro(
"__LAHF_SAHF__");
757 Builder.defineMacro(
"__LZCNT__");
760 Builder.defineMacro(
"__RDRND__");
763 Builder.defineMacro(
"__FSGSBASE__");
766 Builder.defineMacro(
"__BMI__");
769 Builder.defineMacro(
"__BMI2__");
772 Builder.defineMacro(
"__POPCNT__");
775 Builder.defineMacro(
"__RTM__");
778 Builder.defineMacro(
"__PRFCHW__");
781 Builder.defineMacro(
"__RDSEED__");
784 Builder.defineMacro(
"__ADX__");
787 Builder.defineMacro(
"__TBM__");
790 Builder.defineMacro(
"__LWP__");
793 Builder.defineMacro(
"__MWAITX__");
796 Builder.defineMacro(
"__MOVBE__");
800 Builder.defineMacro(
"__XOP__");
803 Builder.defineMacro(
"__FMA4__");
806 Builder.defineMacro(
"__SSE4A__");
813 Builder.defineMacro(
"__FMA__");
816 Builder.defineMacro(
"__F16C__");
819 Builder.defineMacro(
"__GFNI__");
822 Builder.defineMacro(
"__EVEX512__");
824 Builder.defineMacro(
"__AVX10_1__");
826 Builder.defineMacro(
"__AVX10_1_512__");
828 Builder.defineMacro(
"__AVX512CD__");
829 if (HasAVX512VPOPCNTDQ)
830 Builder.defineMacro(
"__AVX512VPOPCNTDQ__");
832 Builder.defineMacro(
"__AVX512VNNI__");
834 Builder.defineMacro(
"__AVX512BF16__");
836 Builder.defineMacro(
"__AVX512FP16__");
838 Builder.defineMacro(
"__AVX512DQ__");
840 Builder.defineMacro(
"__AVX512BITALG__");
842 Builder.defineMacro(
"__AVX512BW__");
844 Builder.defineMacro(
"__AVX512VL__");
845 Builder.defineMacro(
"__EVEX256__");
848 Builder.defineMacro(
"__AVX512VBMI__");
850 Builder.defineMacro(
"__AVX512VBMI2__");
852 Builder.defineMacro(
"__AVX512IFMA__");
853 if (HasAVX512VP2INTERSECT)
854 Builder.defineMacro(
"__AVX512VP2INTERSECT__");
856 Builder.defineMacro(
"__SHA__");
858 Builder.defineMacro(
"__SHA512__");
861 Builder.defineMacro(
"__FXSR__");
863 Builder.defineMacro(
"__XSAVE__");
865 Builder.defineMacro(
"__XSAVEOPT__");
867 Builder.defineMacro(
"__XSAVEC__");
869 Builder.defineMacro(
"__XSAVES__");
871 Builder.defineMacro(
"__PKU__");
873 Builder.defineMacro(
"__CLFLUSHOPT__");
875 Builder.defineMacro(
"__CLWB__");
877 Builder.defineMacro(
"__WBNOINVD__");
879 Builder.defineMacro(
"__SHSTK__");
881 Builder.defineMacro(
"__SGX__");
883 Builder.defineMacro(
"__SM3__");
885 Builder.defineMacro(
"__SM4__");
887 Builder.defineMacro(
"__PREFETCHI__");
889 Builder.defineMacro(
"__CLZERO__");
891 Builder.defineMacro(
"__KL__");
893 Builder.defineMacro(
"__WIDEKL__");
895 Builder.defineMacro(
"__RDPID__");
897 Builder.defineMacro(
"__RDPRU__");
899 Builder.defineMacro(
"__CLDEMOTE__");
901 Builder.defineMacro(
"__WAITPKG__");
903 Builder.defineMacro(
"__MOVDIRI__");
905 Builder.defineMacro(
"__MOVDIR64B__");
907 Builder.defineMacro(
"__PCONFIG__");
909 Builder.defineMacro(
"__PTWRITE__");
911 Builder.defineMacro(
"__INVPCID__");
913 Builder.defineMacro(
"__ENQCMD__");
915 Builder.defineMacro(
"__HRESET__");
917 Builder.defineMacro(
"__AMX_TILE__");
919 Builder.defineMacro(
"__AMX_INT8__");
921 Builder.defineMacro(
"__AMX_BF16__");
923 Builder.defineMacro(
"__AMX_FP16__");
925 Builder.defineMacro(
"__AMX_COMPLEX__");
927 Builder.defineMacro(
"__CMPCCXADD__");
929 Builder.defineMacro(
"__RAOINT__");
931 Builder.defineMacro(
"__AVXIFMA__");
933 Builder.defineMacro(
"__AVXNECONVERT__");
935 Builder.defineMacro(
"__AVXVNNI__");
937 Builder.defineMacro(
"__AVXVNNIINT16__");
939 Builder.defineMacro(
"__AVXVNNIINT8__");
941 Builder.defineMacro(
"__SERIALIZE__");
943 Builder.defineMacro(
"__TSXLDTRK__");
945 Builder.defineMacro(
"__UINTR__");
947 Builder.defineMacro(
"__USERMSR__");
949 Builder.defineMacro(
"__CRC32__");
951 Builder.defineMacro(
"__EGPR__");
953 Builder.defineMacro(
"__PUSH2POP2__");
955 Builder.defineMacro(
"__PPX__");
957 Builder.defineMacro(
"__NDD__");
959 Builder.defineMacro(
"__CCMP__");
961 Builder.defineMacro(
"__NF__");
963 Builder.defineMacro(
"__CF__");
965 Builder.defineMacro(
"__ZU__");
966 if (HasEGPR && HasPush2Pop2 && HasPPX && HasNDD && HasCCMP && HasNF &&
968 Builder.defineMacro(
"__APX_F__");
969 if (HasEGPR && HasInlineAsmUseGPR32)
970 Builder.defineMacro(
"__APX_INLINE_ASM_USE_GPR32__");
975 Builder.defineMacro(
"__AVX512F__");
978 Builder.defineMacro(
"__AVX2__");
981 Builder.defineMacro(
"__AVX__");
984 Builder.defineMacro(
"__SSE4_2__");
987 Builder.defineMacro(
"__SSE4_1__");
990 Builder.defineMacro(
"__SSSE3__");
993 Builder.defineMacro(
"__SSE3__");
996 Builder.defineMacro(
"__SSE2__");
997 Builder.defineMacro(
"__SSE2_MATH__");
1000 Builder.defineMacro(
"__SSE__");
1001 Builder.defineMacro(
"__SSE_MATH__");
1007 if (Opts.MicrosoftExt &&
getTriple().getArch() == llvm::Triple::x86) {
1017 Builder.defineMacro(
"_M_IX86_FP", Twine(2));
1020 Builder.defineMacro(
"_M_IX86_FP", Twine(1));
1023 Builder.defineMacro(
"_M_IX86_FP", Twine(0));
1030 Builder.defineMacro(
"__MMX__");
1033 if (
CPU >= CK_i486 ||
CPU == CK_None) {
1034 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1035 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1036 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1039 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
1040 if (HasCX16 &&
getTriple().getArch() == llvm::Triple::x86_64)
1041 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
1044 Builder.defineMacro(
"__SIZEOF_FLOAT128__",
"16");
1048 return llvm::StringSwitch<bool>(Name)
1051 .Case(
"amx-bf16",
true)
1052 .Case(
"amx-complex",
true)
1053 .Case(
"amx-fp16",
true)
1054 .Case(
"amx-int8",
true)
1055 .Case(
"amx-tile",
true)
1057 .Case(
"avx10.1-256",
true)
1058 .Case(
"avx10.1-512",
true)
1060 .Case(
"avx512f",
true)
1061 .Case(
"avx512cd",
true)
1062 .Case(
"avx512vpopcntdq",
true)
1063 .Case(
"avx512vnni",
true)
1064 .Case(
"avx512bf16",
true)
1065 .Case(
"avx512fp16",
true)
1066 .Case(
"avx512dq",
true)
1067 .Case(
"avx512bitalg",
true)
1068 .Case(
"avx512bw",
true)
1069 .Case(
"avx512vl",
true)
1070 .Case(
"avx512vbmi",
true)
1071 .Case(
"avx512vbmi2",
true)
1072 .Case(
"avx512ifma",
true)
1073 .Case(
"avx512vp2intersect",
true)
1074 .Case(
"avxifma",
true)
1075 .Case(
"avxneconvert",
true)
1076 .Case(
"avxvnni",
true)
1077 .Case(
"avxvnniint16",
true)
1078 .Case(
"avxvnniint8",
true)
1081 .Case(
"cldemote",
true)
1082 .Case(
"clflushopt",
true)
1084 .Case(
"clzero",
true)
1085 .Case(
"cmpccxadd",
true)
1086 .Case(
"crc32",
true)
1088 .Case(
"enqcmd",
true)
1089 .Case(
"evex512",
true)
1093 .Case(
"fsgsbase",
true)
1095 .Case(
"general-regs-only",
true)
1097 .Case(
"hreset",
true)
1098 .Case(
"invpcid",
true)
1100 .Case(
"widekl",
true)
1102 .Case(
"lzcnt",
true)
1104 .Case(
"movbe",
true)
1105 .Case(
"movdiri",
true)
1106 .Case(
"movdir64b",
true)
1107 .Case(
"mwaitx",
true)
1108 .Case(
"pclmul",
true)
1109 .Case(
"pconfig",
true)
1111 .Case(
"popcnt",
true)
1112 .Case(
"prefetchi",
true)
1113 .Case(
"prfchw",
true)
1114 .Case(
"ptwrite",
true)
1115 .Case(
"raoint",
true)
1116 .Case(
"rdpid",
true)
1117 .Case(
"rdpru",
true)
1118 .Case(
"rdrnd",
true)
1119 .Case(
"rdseed",
true)
1122 .Case(
"serialize",
true)
1125 .Case(
"sha512",
true)
1126 .Case(
"shstk",
true)
1132 .Case(
"ssse3",
true)
1134 .Case(
"sse4.1",
true)
1135 .Case(
"sse4.2",
true)
1136 .Case(
"sse4a",
true)
1138 .Case(
"tsxldtrk",
true)
1139 .Case(
"uintr",
true)
1140 .Case(
"usermsr",
true)
1142 .Case(
"vpclmulqdq",
true)
1143 .Case(
"wbnoinvd",
true)
1144 .Case(
"waitpkg",
true)
1147 .Case(
"xsave",
true)
1148 .Case(
"xsavec",
true)
1149 .Case(
"xsaves",
true)
1150 .Case(
"xsaveopt",
true)
1152 .Case(
"push2pop2",
true)
1163 return llvm::StringSwitch<bool>(Feature)
1164 .Case(
"adx", HasADX)
1165 .Case(
"aes", HasAES)
1166 .Case(
"amx-bf16", HasAMXBF16)
1167 .Case(
"amx-complex", HasAMXCOMPLEX)
1168 .Case(
"amx-fp16", HasAMXFP16)
1169 .Case(
"amx-int8", HasAMXINT8)
1170 .Case(
"amx-tile", HasAMXTILE)
1171 .Case(
"avx", SSELevel >= AVX)
1172 .Case(
"avx10.1-256", HasAVX10_1)
1173 .Case(
"avx10.1-512", HasAVX10_1_512)
1174 .Case(
"avx2", SSELevel >= AVX2)
1175 .Case(
"avx512f", SSELevel >= AVX512F)
1176 .Case(
"avx512cd", HasAVX512CD)
1177 .Case(
"avx512vpopcntdq", HasAVX512VPOPCNTDQ)
1178 .Case(
"avx512vnni", HasAVX512VNNI)
1179 .Case(
"avx512bf16", HasAVX512BF16)
1180 .Case(
"avx512fp16", HasAVX512FP16)
1181 .Case(
"avx512dq", HasAVX512DQ)
1182 .Case(
"avx512bitalg", HasAVX512BITALG)
1183 .Case(
"avx512bw", HasAVX512BW)
1184 .Case(
"avx512vl", HasAVX512VL)
1185 .Case(
"avx512vbmi", HasAVX512VBMI)
1186 .Case(
"avx512vbmi2", HasAVX512VBMI2)
1187 .Case(
"avx512ifma", HasAVX512IFMA)
1188 .Case(
"avx512vp2intersect", HasAVX512VP2INTERSECT)
1189 .Case(
"avxifma", HasAVXIFMA)
1190 .Case(
"avxneconvert", HasAVXNECONVERT)
1191 .Case(
"avxvnni", HasAVXVNNI)
1192 .Case(
"avxvnniint16", HasAVXVNNIINT16)
1193 .Case(
"avxvnniint8", HasAVXVNNIINT8)
1194 .Case(
"bmi", HasBMI)
1195 .Case(
"bmi2", HasBMI2)
1196 .Case(
"cldemote", HasCLDEMOTE)
1197 .Case(
"clflushopt", HasCLFLUSHOPT)
1198 .Case(
"clwb", HasCLWB)
1199 .Case(
"clzero", HasCLZERO)
1200 .Case(
"cmpccxadd", HasCMPCCXADD)
1201 .Case(
"crc32", HasCRC32)
1202 .Case(
"cx8", HasCX8)
1203 .Case(
"cx16", HasCX16)
1204 .Case(
"enqcmd", HasENQCMD)
1205 .Case(
"evex512", HasEVEX512)
1206 .Case(
"f16c", HasF16C)
1207 .Case(
"fma", HasFMA)
1208 .Case(
"fma4", XOPLevel >= FMA4)
1209 .Case(
"fsgsbase", HasFSGSBASE)
1210 .Case(
"fxsr", HasFXSR)
1211 .Case(
"gfni", HasGFNI)
1212 .Case(
"hreset", HasHRESET)
1213 .Case(
"invpcid", HasINVPCID)
1215 .Case(
"widekl", HasWIDEKL)
1216 .Case(
"lwp", HasLWP)
1217 .Case(
"lzcnt", HasLZCNT)
1218 .Case(
"mmx", HasMMX)
1219 .Case(
"movbe", HasMOVBE)
1220 .Case(
"movdiri", HasMOVDIRI)
1221 .Case(
"movdir64b", HasMOVDIR64B)
1222 .Case(
"mwaitx", HasMWAITX)
1223 .Case(
"pclmul", HasPCLMUL)
1224 .Case(
"pconfig", HasPCONFIG)
1225 .Case(
"pku", HasPKU)
1226 .Case(
"popcnt", HasPOPCNT)
1227 .Case(
"prefetchi", HasPREFETCHI)
1228 .Case(
"prfchw", HasPRFCHW)
1229 .Case(
"ptwrite", HasPTWRITE)
1230 .Case(
"raoint", HasRAOINT)
1231 .Case(
"rdpid", HasRDPID)
1232 .Case(
"rdpru", HasRDPRU)
1233 .Case(
"rdrnd", HasRDRND)
1234 .Case(
"rdseed", HasRDSEED)
1235 .Case(
"retpoline-external-thunk", HasRetpolineExternalThunk)
1236 .Case(
"rtm", HasRTM)
1237 .Case(
"sahf", HasLAHFSAHF)
1238 .Case(
"serialize", HasSERIALIZE)
1239 .Case(
"sgx", HasSGX)
1240 .Case(
"sha", HasSHA)
1241 .Case(
"sha512", HasSHA512)
1242 .Case(
"shstk", HasSHSTK)
1243 .Case(
"sm3", HasSM3)
1244 .Case(
"sm4", HasSM4)
1245 .Case(
"sse", SSELevel >= SSE1)
1246 .Case(
"sse2", SSELevel >= SSE2)
1247 .Case(
"sse3", SSELevel >= SSE3)
1248 .Case(
"ssse3", SSELevel >= SSSE3)
1249 .Case(
"sse4.1", SSELevel >= SSE41)
1250 .Case(
"sse4.2", SSELevel >= SSE42)
1251 .Case(
"sse4a", XOPLevel >= SSE4A)
1252 .Case(
"tbm", HasTBM)
1253 .Case(
"tsxldtrk", HasTSXLDTRK)
1254 .Case(
"uintr", HasUINTR)
1255 .Case(
"usermsr", HasUSERMSR)
1256 .Case(
"vaes", HasVAES)
1257 .Case(
"vpclmulqdq", HasVPCLMULQDQ)
1258 .Case(
"wbnoinvd", HasWBNOINVD)
1259 .Case(
"waitpkg", HasWAITPKG)
1261 .Case(
"x86_32",
getTriple().getArch() == llvm::Triple::x86)
1262 .Case(
"x86_64",
getTriple().getArch() == llvm::Triple::x86_64)
1263 .Case(
"x87", HasX87)
1264 .Case(
"xop", XOPLevel >= XOP)
1265 .Case(
"xsave", HasXSAVE)
1266 .Case(
"xsavec", HasXSAVEC)
1267 .Case(
"xsaves", HasXSAVES)
1268 .Case(
"xsaveopt", HasXSAVEOPT)
1270 .Case(
"egpr", HasEGPR)
1271 .Case(
"push2pop2", HasPush2Pop2)
1272 .Case(
"ppx", HasPPX)
1273 .Case(
"ndd", HasNDD)
1274 .Case(
"ccmp", HasCCMP)
1278 .Case(
"branch-hint", HasBranchHint)
1288 return llvm::StringSwitch<bool>(FeatureStr)
1289#define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY) .Case(STR, true)
1290#define X86_MICROARCH_LEVEL(ENUM, STR, PRIORITY) .Case(STR, true)
1291#include "llvm/TargetParser/X86TargetParser.def"
1296 return llvm::StringSwitch<llvm::X86::ProcessorFeatures>(Name)
1297#define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY) \
1298 .Case(STR, llvm::X86::FEATURE_##ENUM)
1300#include "llvm/TargetParser/X86TargetParser.def"
1309 using namespace llvm::X86;
1310 CPUKind Kind = parseArchX86(Name);
1311 if (Kind != CK_None) {
1312 ProcessorFeatures KeyFeature = getKeyFeature(Kind);
1313 return (getFeaturePriority(KeyFeature) << 1) + 1;
1318 return getFeaturePriority(
getFeature(Name)) << 1;
1322 return llvm::X86::validateCPUSpecificCPUDispatch(Name);
1326 return llvm::X86::getCPUDispatchMangling(Name);
1332 llvm::X86::getFeaturesForCPU(Name, TargetCPUFeatures,
true);
1333 for (
auto &F : TargetCPUFeatures)
1334 Features.push_back(F);
1342 return llvm::StringSwitch<bool>(FeatureStr)
1343#define X86_VENDOR(ENUM, STRING) .Case(STRING, true)
1344#define X86_CPU_TYPE_ALIAS(ENUM, ALIAS) .Case(ALIAS, true)
1345#define X86_CPU_TYPE(ENUM, STR) .Case(STR, true)
1346#define X86_CPU_SUBTYPE_ALIAS(ENUM, ALIAS) .Case(ALIAS, true)
1347#define X86_CPU_SUBTYPE(ENUM, STR) .Case(STR, true)
1348#include "llvm/TargetParser/X86TargetParser.def"
1353 auto RV = llvm::StringSwitch<unsigned>(Name)
1521 using namespace llvm::X86;
1561 case CK_GoldmontPlus:
1566 case CK_SandyBridge:
1570 case CK_SkylakeClient:
1571 case CK_SkylakeServer:
1572 case CK_Cascadelake:
1577 case CK_SapphireRapids:
1578 case CK_IcelakeClient:
1580 case CK_IcelakeServer:
1587 case CK_Pantherlake:
1588 case CK_Sierraforest:
1590 case CK_Graniterapids:
1591 case CK_GraniterapidsD:
1592 case CK_Emeraldrapids:
1593 case CK_Clearwaterforest:
1629 return std::nullopt;
1631 llvm_unreachable(
"Unknown CPU kind");
1635 StringRef Constraint,
1636 unsigned Size)
const {
1638 Constraint = Constraint.ltrim(
"=+&");
1644 StringRef Constraint,
1645 unsigned Size)
const {
1650 StringRef Constraint,
1651 unsigned Size)
const {
1652 switch (Constraint[0]) {
1665 switch (Constraint[1]) {
1677 return Size <= 512U;
1680 return Size <= 256U;
1682 return Size <= 128U;
1688 if (SSELevel < SSE2)
1699 return Size <= 512U;
1702 return Size <= 256U;
1703 return Size <= 128U;
1711 switch (*Constraint) {
1714 std::string Converted =
"{" + std::string(Constraint, Len) +
"}";
1715 Constraint += Len - 1;
1718 return std::string(1, *Constraint);
1720 return std::string(
"{ax}");
1722 return std::string(
"{bx}");
1724 return std::string(
"{cx}");
1726 return std::string(
"{dx}");
1728 return std::string(
"{si}");
1730 return std::string(
"{di}");
1732 return std::string(
"p");
1734 return std::string(
"{st}");
1736 return std::string(
"{st(1)}");
1738 assert(Constraint[1] ==
's');
1739 return '^' + std::string(Constraint++, 2);
1741 switch (Constraint[1]) {
1756 return std::string(
"^") + std::string(Constraint++, 2);
1760 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