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",
70 {{
"al",
"ah",
"eax",
"rax"}, 0},
71 {{
"bl",
"bh",
"ebx",
"rbx"}, 3},
72 {{
"cl",
"ch",
"ecx",
"rcx"}, 2},
73 {{
"dl",
"dh",
"edx",
"rdx"}, 1},
78 {{
"r8d",
"r8w",
"r8b"}, 38},
79 {{
"r9d",
"r9w",
"r9b"}, 39},
80 {{
"r10d",
"r10w",
"r10b"}, 40},
81 {{
"r11d",
"r11w",
"r11b"}, 41},
82 {{
"r12d",
"r12w",
"r12b"}, 42},
83 {{
"r13d",
"r13w",
"r13b"}, 43},
84 {{
"r14d",
"r14w",
"r14b"}, 44},
85 {{
"r15d",
"r15w",
"r15b"}, 45},
108 const std::vector<std::string> &FeaturesVec)
const {
111 if (
getTriple().getArch() == llvm::Triple::x86_64)
114 using namespace llvm::X86;
117 getFeaturesForCPU(
CPU, CPUFeatures);
118 for (
auto &F : CPUFeatures)
121 std::vector<std::string> UpdatedFeaturesVec;
122 for (
const auto &Feature : FeaturesVec) {
124 if (Feature ==
"+general-regs-only") {
125 UpdatedFeaturesVec.push_back(
"-x87");
126 UpdatedFeaturesVec.push_back(
"-mmx");
127 UpdatedFeaturesVec.push_back(
"-sse");
131 UpdatedFeaturesVec.push_back(Feature);
141 auto I = Features.find(
"sse4.2");
142 if (I != Features.end() && I->getValue() &&
143 !llvm::is_contained(UpdatedFeaturesVec,
"-popcnt"))
144 Features[
"popcnt"] =
true;
148 I = Features.find(
"sse");
149 if (I != Features.end() && I->getValue() &&
150 !llvm::is_contained(UpdatedFeaturesVec,
"-mmx"))
151 Features[
"mmx"] =
true;
154 I = Features.find(
"avx");
155 if (I != Features.end() && I->getValue() &&
156 !llvm::is_contained(UpdatedFeaturesVec,
"-xsave"))
157 Features[
"xsave"] =
true;
160 I = Features.find(
"sse4.2");
161 if (I != Features.end() && I->getValue() &&
162 !llvm::is_contained(UpdatedFeaturesVec,
"-crc32"))
163 Features[
"crc32"] =
true;
169 StringRef Name,
bool Enabled)
const {
170 if (Name ==
"sse4") {
181 Features[Name] = Enabled;
182 llvm::X86::updateImpliedFeatures(Name, Enabled, Features);
189 for (
const auto &Feature : Features) {
190 if (Feature[0] !=
'+')
193 if (Feature ==
"+aes") {
195 }
else if (Feature ==
"+vaes") {
197 }
else if (Feature ==
"+pclmul") {
199 }
else if (Feature ==
"+vpclmulqdq") {
200 HasVPCLMULQDQ =
true;
201 }
else if (Feature ==
"+lzcnt") {
203 }
else if (Feature ==
"+rdrnd") {
205 }
else if (Feature ==
"+fsgsbase") {
207 }
else if (Feature ==
"+bmi") {
209 }
else if (Feature ==
"+bmi2") {
211 }
else if (Feature ==
"+popcnt") {
213 }
else if (Feature ==
"+rtm") {
215 }
else if (Feature ==
"+prfchw") {
217 }
else if (Feature ==
"+rdseed") {
219 }
else if (Feature ==
"+adx") {
221 }
else if (Feature ==
"+tbm") {
223 }
else if (Feature ==
"+lwp") {
225 }
else if (Feature ==
"+fma") {
227 }
else if (Feature ==
"+f16c") {
229 }
else if (Feature ==
"+gfni") {
231 }
else if (Feature ==
"+avx512cd") {
233 }
else if (Feature ==
"+avx512vpopcntdq") {
234 HasAVX512VPOPCNTDQ =
true;
235 }
else if (Feature ==
"+avx512vnni") {
236 HasAVX512VNNI =
true;
237 }
else if (Feature ==
"+avx512bf16") {
238 HasAVX512BF16 =
true;
239 }
else if (Feature ==
"+avx512er") {
241 }
else if (Feature ==
"+avx512fp16") {
242 HasAVX512FP16 =
true;
244 }
else if (Feature ==
"+avx512pf") {
246 }
else if (Feature ==
"+avx512dq") {
248 }
else if (Feature ==
"+avx512bitalg") {
249 HasAVX512BITALG =
true;
250 }
else if (Feature ==
"+avx512bw") {
252 }
else if (Feature ==
"+avx512vl") {
254 }
else if (Feature ==
"+avx512vbmi") {
255 HasAVX512VBMI =
true;
256 }
else if (Feature ==
"+avx512vbmi2") {
257 HasAVX512VBMI2 =
true;
258 }
else if (Feature ==
"+avx512ifma") {
259 HasAVX512IFMA =
true;
260 }
else if (Feature ==
"+avx512vp2intersect") {
261 HasAVX512VP2INTERSECT =
true;
262 }
else if (Feature ==
"+sha") {
264 }
else if (Feature ==
"+shstk") {
266 }
else if (Feature ==
"+movbe") {
268 }
else if (Feature ==
"+sgx") {
270 }
else if (Feature ==
"+cx8") {
272 }
else if (Feature ==
"+cx16") {
274 }
else if (Feature ==
"+fxsr") {
276 }
else if (Feature ==
"+xsave") {
278 }
else if (Feature ==
"+xsaveopt") {
280 }
else if (Feature ==
"+xsavec") {
282 }
else if (Feature ==
"+xsaves") {
284 }
else if (Feature ==
"+mwaitx") {
286 }
else if (Feature ==
"+pku") {
288 }
else if (Feature ==
"+clflushopt") {
289 HasCLFLUSHOPT =
true;
290 }
else if (Feature ==
"+clwb") {
292 }
else if (Feature ==
"+wbnoinvd") {
294 }
else if (Feature ==
"+prefetchi") {
296 }
else if (Feature ==
"+prefetchwt1") {
297 HasPREFETCHWT1 =
true;
298 }
else if (Feature ==
"+clzero") {
300 }
else if (Feature ==
"+cldemote") {
302 }
else if (Feature ==
"+rdpid") {
304 }
else if (Feature ==
"+rdpru") {
306 }
else if (Feature ==
"+kl") {
308 }
else if (Feature ==
"+widekl") {
310 }
else if (Feature ==
"+retpoline-external-thunk") {
311 HasRetpolineExternalThunk =
true;
312 }
else if (Feature ==
"+sahf") {
314 }
else if (Feature ==
"+waitpkg") {
316 }
else if (Feature ==
"+movdiri") {
318 }
else if (Feature ==
"+movdir64b") {
320 }
else if (Feature ==
"+pconfig") {
322 }
else if (Feature ==
"+ptwrite") {
324 }
else if (Feature ==
"+invpcid") {
326 }
else if (Feature ==
"+enqcmd") {
328 }
else if (Feature ==
"+hreset") {
330 }
else if (Feature ==
"+amx-bf16") {
332 }
else if (Feature ==
"+amx-fp16") {
334 }
else if (Feature ==
"+amx-int8") {
336 }
else if (Feature ==
"+amx-tile") {
338 }
else if (Feature ==
"+amx-complex") {
339 HasAMXCOMPLEX =
true;
340 }
else if (Feature ==
"+cmpccxadd") {
342 }
else if (Feature ==
"+raoint") {
344 }
else if (Feature ==
"+avxifma") {
346 }
else if (Feature ==
"+avxneconvert") {
347 HasAVXNECONVERT=
true;
348 }
else if (Feature ==
"+avxvnni") {
350 }
else if (Feature ==
"+avxvnniint8") {
351 HasAVXVNNIINT8 =
true;
352 }
else if (Feature ==
"+serialize") {
354 }
else if (Feature ==
"+tsxldtrk") {
356 }
else if (Feature ==
"+uintr") {
358 }
else if (Feature ==
"+crc32") {
360 }
else if (Feature ==
"+x87") {
362 }
else if (Feature ==
"+fullbf16") {
366 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
367 .Case(
"+avx512f", AVX512F)
370 .Case(
"+sse4.2", SSE42)
371 .Case(
"+sse4.1", SSE41)
372 .Case(
"+ssse3", SSSE3)
377 SSELevel = std::max(SSELevel, Level);
392 MMX3DNowEnum ThreeDNowLevel = llvm::StringSwitch<MMX3DNowEnum>(Feature)
393 .Case(
"+3dnowa", AMD3DNowAthlon)
394 .Case(
"+3dnow", AMD3DNow)
396 .Default(NoMMX3DNow);
397 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
399 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
402 .Case(
"+sse4a", SSE4A)
404 XOPLevel = std::max(XOPLevel, XLevel);
411 Diags.
Report(diag::err_target_unsupported_fpmath)
429 Builder.defineMacro(
"__GCC_ASM_FLAG_OUTPUTS__");
432 if (CodeModel ==
"default")
434 Builder.defineMacro(
"__code_model_" + CodeModel +
"__");
437 if (
getTriple().getArch() == llvm::Triple::x86_64) {
438 Builder.defineMacro(
"__amd64__");
439 Builder.defineMacro(
"__amd64");
440 Builder.defineMacro(
"__x86_64");
441 Builder.defineMacro(
"__x86_64__");
442 if (
getTriple().getArchName() ==
"x86_64h") {
443 Builder.defineMacro(
"__x86_64h");
444 Builder.defineMacro(
"__x86_64h__");
450 Builder.defineMacro(
"__SEG_GS");
451 Builder.defineMacro(
"__SEG_FS");
452 Builder.defineMacro(
"__seg_gs",
"__attribute__((address_space(256)))");
453 Builder.defineMacro(
"__seg_fs",
"__attribute__((address_space(257)))");
458 using namespace llvm::X86;
464 Builder.defineMacro(
"__tune_i386__");
473 Builder.defineMacro(
"__pentium_mmx__");
474 Builder.defineMacro(
"__tune_pentium_mmx__");
483 Builder.defineMacro(
"__tune_pentium3__");
487 Builder.defineMacro(
"__tune_pentium2__");
515 case CK_GoldmontPlus:
527 case CK_SkylakeClient:
528 case CK_SkylakeServer:
532 case CK_IcelakeClient:
534 case CK_IcelakeServer:
536 case CK_SapphireRapids:
540 case CK_Sierraforest:
542 case CK_Graniterapids:
543 case CK_Emeraldrapids:
557 Builder.defineMacro(
"__tune_lakemont__");
560 Builder.defineMacro(
"__k6_2__");
561 Builder.defineMacro(
"__tune_k6_2__");
564 if (
CPU != CK_K6_2) {
568 Builder.defineMacro(
"__k6_3__");
569 Builder.defineMacro(
"__tune_k6_3__");
578 if (SSELevel != NoSSE) {
579 Builder.defineMacro(
"__athlon_sse__");
580 Builder.defineMacro(
"__tune_athlon_sse__");
631 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
636 Builder.defineMacro(
"__NO_MATH_INLINES");
639 Builder.defineMacro(
"__AES__");
642 Builder.defineMacro(
"__VAES__");
645 Builder.defineMacro(
"__PCLMUL__");
648 Builder.defineMacro(
"__VPCLMULQDQ__");
652 if (HasLAHFSAHF ||
getTriple().getArch() == llvm::Triple::x86)
653 Builder.defineMacro(
"__LAHF_SAHF__");
656 Builder.defineMacro(
"__LZCNT__");
659 Builder.defineMacro(
"__RDRND__");
662 Builder.defineMacro(
"__FSGSBASE__");
665 Builder.defineMacro(
"__BMI__");
668 Builder.defineMacro(
"__BMI2__");
671 Builder.defineMacro(
"__POPCNT__");
674 Builder.defineMacro(
"__RTM__");
677 Builder.defineMacro(
"__PRFCHW__");
680 Builder.defineMacro(
"__RDSEED__");
683 Builder.defineMacro(
"__ADX__");
686 Builder.defineMacro(
"__TBM__");
689 Builder.defineMacro(
"__LWP__");
692 Builder.defineMacro(
"__MWAITX__");
695 Builder.defineMacro(
"__MOVBE__");
699 Builder.defineMacro(
"__XOP__");
702 Builder.defineMacro(
"__FMA4__");
705 Builder.defineMacro(
"__SSE4A__");
712 Builder.defineMacro(
"__FMA__");
715 Builder.defineMacro(
"__F16C__");
718 Builder.defineMacro(
"__GFNI__");
721 Builder.defineMacro(
"__AVX512CD__");
722 if (HasAVX512VPOPCNTDQ)
723 Builder.defineMacro(
"__AVX512VPOPCNTDQ__");
725 Builder.defineMacro(
"__AVX512VNNI__");
727 Builder.defineMacro(
"__AVX512BF16__");
729 Builder.defineMacro(
"__AVX512ER__");
731 Builder.defineMacro(
"__AVX512FP16__");
733 Builder.defineMacro(
"__AVX512PF__");
735 Builder.defineMacro(
"__AVX512DQ__");
737 Builder.defineMacro(
"__AVX512BITALG__");
739 Builder.defineMacro(
"__AVX512BW__");
741 Builder.defineMacro(
"__AVX512VL__");
743 Builder.defineMacro(
"__AVX512VBMI__");
745 Builder.defineMacro(
"__AVX512VBMI2__");
747 Builder.defineMacro(
"__AVX512IFMA__");
748 if (HasAVX512VP2INTERSECT)
749 Builder.defineMacro(
"__AVX512VP2INTERSECT__");
751 Builder.defineMacro(
"__SHA__");
754 Builder.defineMacro(
"__FXSR__");
756 Builder.defineMacro(
"__XSAVE__");
758 Builder.defineMacro(
"__XSAVEOPT__");
760 Builder.defineMacro(
"__XSAVEC__");
762 Builder.defineMacro(
"__XSAVES__");
764 Builder.defineMacro(
"__PKU__");
766 Builder.defineMacro(
"__CLFLUSHOPT__");
768 Builder.defineMacro(
"__CLWB__");
770 Builder.defineMacro(
"__WBNOINVD__");
772 Builder.defineMacro(
"__SHSTK__");
774 Builder.defineMacro(
"__SGX__");
776 Builder.defineMacro(
"__PREFETCHI__");
778 Builder.defineMacro(
"__PREFETCHWT1__");
780 Builder.defineMacro(
"__CLZERO__");
782 Builder.defineMacro(
"__KL__");
784 Builder.defineMacro(
"__WIDEKL__");
786 Builder.defineMacro(
"__RDPID__");
788 Builder.defineMacro(
"__RDPRU__");
790 Builder.defineMacro(
"__CLDEMOTE__");
792 Builder.defineMacro(
"__WAITPKG__");
794 Builder.defineMacro(
"__MOVDIRI__");
796 Builder.defineMacro(
"__MOVDIR64B__");
798 Builder.defineMacro(
"__PCONFIG__");
800 Builder.defineMacro(
"__PTWRITE__");
802 Builder.defineMacro(
"__INVPCID__");
804 Builder.defineMacro(
"__ENQCMD__");
806 Builder.defineMacro(
"__HRESET__");
808 Builder.defineMacro(
"__AMX_TILE__");
810 Builder.defineMacro(
"__AMX_INT8__");
812 Builder.defineMacro(
"__AMX_BF16__");
814 Builder.defineMacro(
"__AMX_FP16__");
816 Builder.defineMacro(
"__AMX_COMPLEX__");
818 Builder.defineMacro(
"__CMPCCXADD__");
820 Builder.defineMacro(
"__RAOINT__");
822 Builder.defineMacro(
"__AVXIFMA__");
824 Builder.defineMacro(
"__AVXNECONVERT__");
826 Builder.defineMacro(
"__AVXVNNI__");
828 Builder.defineMacro(
"__AVXVNNIINT8__");
830 Builder.defineMacro(
"__SERIALIZE__");
832 Builder.defineMacro(
"__TSXLDTRK__");
834 Builder.defineMacro(
"__UINTR__");
836 Builder.defineMacro(
"__CRC32__");
841 Builder.defineMacro(
"__AVX512F__");
844 Builder.defineMacro(
"__AVX2__");
847 Builder.defineMacro(
"__AVX__");
850 Builder.defineMacro(
"__SSE4_2__");
853 Builder.defineMacro(
"__SSE4_1__");
856 Builder.defineMacro(
"__SSSE3__");
859 Builder.defineMacro(
"__SSE3__");
862 Builder.defineMacro(
"__SSE2__");
863 Builder.defineMacro(
"__SSE2_MATH__");
866 Builder.defineMacro(
"__SSE__");
867 Builder.defineMacro(
"__SSE_MATH__");
873 if (Opts.MicrosoftExt &&
getTriple().getArch() == llvm::Triple::x86) {
883 Builder.defineMacro(
"_M_IX86_FP", Twine(2));
886 Builder.defineMacro(
"_M_IX86_FP", Twine(1));
889 Builder.defineMacro(
"_M_IX86_FP", Twine(0));
895 switch (MMX3DNowLevel) {
897 Builder.defineMacro(
"__3dNOW_A__");
900 Builder.defineMacro(
"__3dNOW__");
903 Builder.defineMacro(
"__MMX__");
909 if (
CPU >= CK_i486 ||
CPU == CK_None) {
910 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
911 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
912 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
915 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
916 if (HasCX16 &&
getTriple().getArch() == llvm::Triple::x86_64)
917 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
920 Builder.defineMacro(
"__SIZEOF_FLOAT128__",
"16");
924 return llvm::StringSwitch<bool>(Name)
926 .Case(
"3dnowa",
true)
929 .Case(
"amx-bf16",
true)
930 .Case(
"amx-complex",
true)
931 .Case(
"amx-fp16",
true)
932 .Case(
"amx-int8",
true)
933 .Case(
"amx-tile",
true)
936 .Case(
"avx512f",
true)
937 .Case(
"avx512cd",
true)
938 .Case(
"avx512vpopcntdq",
true)
939 .Case(
"avx512vnni",
true)
940 .Case(
"avx512bf16",
true)
941 .Case(
"avx512er",
true)
942 .Case(
"avx512fp16",
true)
943 .Case(
"avx512pf",
true)
944 .Case(
"avx512dq",
true)
945 .Case(
"avx512bitalg",
true)
946 .Case(
"avx512bw",
true)
947 .Case(
"avx512vl",
true)
948 .Case(
"avx512vbmi",
true)
949 .Case(
"avx512vbmi2",
true)
950 .Case(
"avx512ifma",
true)
951 .Case(
"avx512vp2intersect",
true)
952 .Case(
"avxifma",
true)
953 .Case(
"avxneconvert",
true)
954 .Case(
"avxvnni",
true)
955 .Case(
"avxvnniint8",
true)
958 .Case(
"cldemote",
true)
959 .Case(
"clflushopt",
true)
961 .Case(
"clzero",
true)
962 .Case(
"cmpccxadd",
true)
965 .Case(
"enqcmd",
true)
969 .Case(
"fsgsbase",
true)
971 .Case(
"general-regs-only",
true)
973 .Case(
"hreset",
true)
974 .Case(
"invpcid",
true)
976 .Case(
"widekl",
true)
981 .Case(
"movdiri",
true)
982 .Case(
"movdir64b",
true)
983 .Case(
"mwaitx",
true)
984 .Case(
"pclmul",
true)
985 .Case(
"pconfig",
true)
987 .Case(
"popcnt",
true)
988 .Case(
"prefetchi",
true)
989 .Case(
"prefetchwt1",
true)
990 .Case(
"prfchw",
true)
991 .Case(
"ptwrite",
true)
992 .Case(
"raoint",
true)
996 .Case(
"rdseed",
true)
999 .Case(
"serialize",
true)
1002 .Case(
"shstk",
true)
1006 .Case(
"ssse3",
true)
1008 .Case(
"sse4.1",
true)
1009 .Case(
"sse4.2",
true)
1010 .Case(
"sse4a",
true)
1012 .Case(
"tsxldtrk",
true)
1013 .Case(
"uintr",
true)
1015 .Case(
"vpclmulqdq",
true)
1016 .Case(
"wbnoinvd",
true)
1017 .Case(
"waitpkg",
true)
1020 .Case(
"xsave",
true)
1021 .Case(
"xsavec",
true)
1022 .Case(
"xsaves",
true)
1023 .Case(
"xsaveopt",
true)
1028 return llvm::StringSwitch<bool>(Feature)
1029 .Case(
"adx", HasADX)
1030 .Case(
"aes", HasAES)
1031 .Case(
"amx-bf16", HasAMXBF16)
1032 .Case(
"amx-complex", HasAMXCOMPLEX)
1033 .Case(
"amx-fp16", HasAMXFP16)
1034 .Case(
"amx-int8", HasAMXINT8)
1035 .Case(
"amx-tile", HasAMXTILE)
1036 .Case(
"avx", SSELevel >= AVX)
1037 .Case(
"avx2", SSELevel >= AVX2)
1038 .Case(
"avx512f", SSELevel >= AVX512F)
1039 .Case(
"avx512cd", HasAVX512CD)
1040 .Case(
"avx512vpopcntdq", HasAVX512VPOPCNTDQ)
1041 .Case(
"avx512vnni", HasAVX512VNNI)
1042 .Case(
"avx512bf16", HasAVX512BF16)
1043 .Case(
"avx512er", HasAVX512ER)
1044 .Case(
"avx512fp16", HasAVX512FP16)
1045 .Case(
"avx512pf", HasAVX512PF)
1046 .Case(
"avx512dq", HasAVX512DQ)
1047 .Case(
"avx512bitalg", HasAVX512BITALG)
1048 .Case(
"avx512bw", HasAVX512BW)
1049 .Case(
"avx512vl", HasAVX512VL)
1050 .Case(
"avx512vbmi", HasAVX512VBMI)
1051 .Case(
"avx512vbmi2", HasAVX512VBMI2)
1052 .Case(
"avx512ifma", HasAVX512IFMA)
1053 .Case(
"avx512vp2intersect", HasAVX512VP2INTERSECT)
1054 .Case(
"avxifma", HasAVXIFMA)
1055 .Case(
"avxneconvert", HasAVXNECONVERT)
1056 .Case(
"avxvnni", HasAVXVNNI)
1057 .Case(
"avxvnniint8", HasAVXVNNIINT8)
1058 .Case(
"bmi", HasBMI)
1059 .Case(
"bmi2", HasBMI2)
1060 .Case(
"cldemote", HasCLDEMOTE)
1061 .Case(
"clflushopt", HasCLFLUSHOPT)
1062 .Case(
"clwb", HasCLWB)
1063 .Case(
"clzero", HasCLZERO)
1064 .Case(
"cmpccxadd", HasCMPCCXADD)
1065 .Case(
"crc32", HasCRC32)
1066 .Case(
"cx8", HasCX8)
1067 .Case(
"cx16", HasCX16)
1068 .Case(
"enqcmd", HasENQCMD)
1069 .Case(
"f16c", HasF16C)
1070 .Case(
"fma", HasFMA)
1071 .Case(
"fma4", XOPLevel >= FMA4)
1072 .Case(
"fsgsbase", HasFSGSBASE)
1073 .Case(
"fxsr", HasFXSR)
1074 .Case(
"gfni", HasGFNI)
1075 .Case(
"hreset", HasHRESET)
1076 .Case(
"invpcid", HasINVPCID)
1078 .Case(
"widekl", HasWIDEKL)
1079 .Case(
"lwp", HasLWP)
1080 .Case(
"lzcnt", HasLZCNT)
1081 .Case(
"mm3dnow", MMX3DNowLevel >= AMD3DNow)
1082 .Case(
"mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
1083 .Case(
"mmx", MMX3DNowLevel >= MMX)
1084 .Case(
"movbe", HasMOVBE)
1085 .Case(
"movdiri", HasMOVDIRI)
1086 .Case(
"movdir64b", HasMOVDIR64B)
1087 .Case(
"mwaitx", HasMWAITX)
1088 .Case(
"pclmul", HasPCLMUL)
1089 .Case(
"pconfig", HasPCONFIG)
1090 .Case(
"pku", HasPKU)
1091 .Case(
"popcnt", HasPOPCNT)
1092 .Case(
"prefetchi", HasPREFETCHI)
1093 .Case(
"prefetchwt1", HasPREFETCHWT1)
1094 .Case(
"prfchw", HasPRFCHW)
1095 .Case(
"ptwrite", HasPTWRITE)
1096 .Case(
"raoint", HasRAOINT)
1097 .Case(
"rdpid", HasRDPID)
1098 .Case(
"rdpru", HasRDPRU)
1099 .Case(
"rdrnd", HasRDRND)
1100 .Case(
"rdseed", HasRDSEED)
1101 .Case(
"retpoline-external-thunk", HasRetpolineExternalThunk)
1102 .Case(
"rtm", HasRTM)
1103 .Case(
"sahf", HasLAHFSAHF)
1104 .Case(
"serialize", HasSERIALIZE)
1105 .Case(
"sgx", HasSGX)
1106 .Case(
"sha", HasSHA)
1107 .Case(
"shstk", HasSHSTK)
1108 .Case(
"sse", SSELevel >= SSE1)
1109 .Case(
"sse2", SSELevel >= SSE2)
1110 .Case(
"sse3", SSELevel >= SSE3)
1111 .Case(
"ssse3", SSELevel >= SSSE3)
1112 .Case(
"sse4.1", SSELevel >= SSE41)
1113 .Case(
"sse4.2", SSELevel >= SSE42)
1114 .Case(
"sse4a", XOPLevel >= SSE4A)
1115 .Case(
"tbm", HasTBM)
1116 .Case(
"tsxldtrk", HasTSXLDTRK)
1117 .Case(
"uintr", HasUINTR)
1118 .Case(
"vaes", HasVAES)
1119 .Case(
"vpclmulqdq", HasVPCLMULQDQ)
1120 .Case(
"wbnoinvd", HasWBNOINVD)
1121 .Case(
"waitpkg", HasWAITPKG)
1123 .Case(
"x86_32",
getTriple().getArch() == llvm::Triple::x86)
1124 .Case(
"x86_64",
getTriple().getArch() == llvm::Triple::x86_64)
1125 .Case(
"x87", HasX87)
1126 .Case(
"xop", XOPLevel >= XOP)
1127 .Case(
"xsave", HasXSAVE)
1128 .Case(
"xsavec", HasXSAVEC)
1129 .Case(
"xsaves", HasXSAVES)
1130 .Case(
"xsaveopt", HasXSAVEOPT)
1141 return llvm::StringSwitch<bool>(FeatureStr)
1142#define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY) .Case(STR, true)
1143#include "llvm/TargetParser/X86TargetParser.def"
1148 return llvm::StringSwitch<llvm::X86::ProcessorFeatures>(Name)
1149#define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY) \
1150 .Case(STR, llvm::X86::FEATURE_##ENUM)
1152#include "llvm/TargetParser/X86TargetParser.def"
1161 using namespace llvm::X86;
1162 CPUKind Kind = parseArchX86(Name);
1163 if (Kind != CK_None) {
1164 ProcessorFeatures KeyFeature = getKeyFeature(Kind);
1165 return (getFeaturePriority(KeyFeature) << 1) + 1;
1170 return getFeaturePriority(
getFeature(Name)) << 1;
1174 return llvm::StringSwitch<bool>(Name)
1175#define CPU_SPECIFIC(NAME, TUNE_NAME, MANGLING, FEATURES) .Case(NAME, true)
1176#define CPU_SPECIFIC_ALIAS(NEW_NAME, TUNE_NAME, NAME) .Case(NEW_NAME, true)
1177#include "llvm/TargetParser/X86TargetParser.def"
1182 return llvm::StringSwitch<StringRef>(Name)
1183#define CPU_SPECIFIC_ALIAS(NEW_NAME, TUNE_NAME, NAME) .Case(NEW_NAME, NAME)
1184#include "llvm/TargetParser/X86TargetParser.def"
1190#define CPU_SPECIFIC(NAME, TUNE_NAME, MANGLING, FEATURES) .Case(NAME, MANGLING)
1191#include "llvm/TargetParser/X86TargetParser.def"
1197 StringRef WholeList =
1199#define CPU_SPECIFIC(NAME, TUNE_NAME, MANGLING, FEATURES) .Case(NAME, FEATURES)
1200#include "llvm/TargetParser/X86TargetParser.def"
1202 WholeList.split(Features,
',', -1,
false);
1206 return llvm::StringSwitch<StringRef>(Name)
1207#define CPU_SPECIFIC(NAME, TUNE_NAME, MANGLING, FEATURES) .Case(NAME, TUNE_NAME)
1208#define CPU_SPECIFIC_ALIAS(NEW_NAME, TUNE_NAME, NAME) .Case(NEW_NAME, TUNE_NAME)
1209#include "llvm/TargetParser/X86TargetParser.def"
1218 return llvm::StringSwitch<bool>(FeatureStr)
1219#define X86_VENDOR(ENUM, STRING) .Case(STRING, true)
1220#define X86_CPU_TYPE_ALIAS(ENUM, ALIAS) .Case(ALIAS, true)
1221#define X86_CPU_TYPE(ENUM, STR) .Case(STR, true)
1222#define X86_CPU_SUBTYPE_ALIAS(ENUM, ALIAS) .Case(ALIAS, true)
1223#define X86_CPU_SUBTYPE(ENUM, STR) .Case(STR, true)
1224#include "llvm/TargetParser/X86TargetParser.def"
1229 auto RV = llvm::StringSwitch<unsigned>(Name)
1377 using namespace llvm::X86;
1417 case CK_GoldmontPlus:
1421 case CK_SandyBridge:
1425 case CK_SkylakeClient:
1426 case CK_SkylakeServer:
1427 case CK_Cascadelake:
1432 case CK_SapphireRapids:
1433 case CK_IcelakeClient:
1435 case CK_IcelakeServer:
1439 case CK_Sierraforest:
1441 case CK_Graniterapids:
1442 case CK_Emeraldrapids:
1478 return std::nullopt;
1480 llvm_unreachable(
"Unknown CPU kind");
1484 StringRef Constraint,
1485 unsigned Size)
const {
1487 while (Constraint[0] ==
'=' || Constraint[0] ==
'+' || Constraint[0] ==
'&')
1488 Constraint = Constraint.substr(1);
1494 StringRef Constraint,
1495 unsigned Size)
const {
1500 StringRef Constraint,
1501 unsigned Size)
const {
1502 switch (Constraint[0]) {
1515 switch (Constraint[1]) {
1526 return Size <= 512U;
1529 return Size <= 256U;
1531 return Size <= 128U;
1537 if (SSELevel < SSE2)
1546 return Size <= 512U;
1549 return Size <= 256U;
1550 return Size <= 128U;
1558 switch (*Constraint) {
1561 std::string Converted =
"{" + std::string(Constraint, Len) +
"}";
1562 Constraint += Len - 1;
1565 return std::string(1, *Constraint);
1567 return std::string(
"{ax}");
1569 return std::string(
"{bx}");
1571 return std::string(
"{cx}");
1573 return std::string(
"{dx}");
1575 return std::string(
"{si}");
1577 return std::string(
"{di}");
1579 return std::string(
"p");
1581 return std::string(
"{st}");
1583 return std::string(
"{st(1)}");
1585 switch (Constraint[1]) {
1600 return std::string(
"^") + std::string(Constraint++, 2);
1604 return std::string(1, *Constraint);
1609 bool Only64Bit =
getTriple().getArch() != llvm::Triple::x86;
1610 llvm::X86::fillValidCPUArchList(Values, Only64Bit);
1614 llvm::X86::fillValidTuneCPUList(Values);
Defines the Diagnostic-related interfaces.
static unsigned matchAsmCCConstraint(const char *Name)
static StringRef CPUSpecificCPUDispatchNameDealias(StringRef 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.
StringRef getCPUSpecificTuneName(StringRef Name) const override
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.
std::string ConstraintStr
void setRequiresImmediate(int Min, int Max)
const llvm::fltSemantics * LongDoubleFormat