17#include "llvm/ADT/StringRef.h"
18#include "llvm/ADT/StringSwitch.h"
19#include "llvm/TargetParser/X86TargetParser.h"
34#define GET_BUILTIN_STR_TABLE
35#include "clang/Basic/BuiltinsX86.inc"
36#undef GET_BUILTIN_STR_TABLE
39#define GET_BUILTIN_INFOS
40#include "clang/Basic/BuiltinsX86.inc"
41#undef GET_BUILTIN_INFOS
45#define GET_BUILTIN_PREFIXED_INFOS
46#include "clang/Basic/BuiltinsX86.inc"
47#undef GET_BUILTIN_PREFIXED_INFOS
54#define GET_BUILTIN_STR_TABLE
55#include "clang/Basic/BuiltinsX86_64.inc"
56#undef GET_BUILTIN_STR_TABLE
59#define GET_BUILTIN_INFOS
60#include "clang/Basic/BuiltinsX86_64.inc"
61#undef GET_BUILTIN_INFOS
65#define GET_BUILTIN_PREFIXED_INFOS
66#include "clang/Basic/BuiltinsX86_64.inc"
67#undef GET_BUILTIN_PREFIXED_INFOS
74 "ax",
"dx",
"cx",
"bx",
"si",
"di",
"bp",
"sp",
75 "st",
"st(1)",
"st(2)",
"st(3)",
"st(4)",
"st(5)",
"st(6)",
"st(7)",
76 "argp",
"flags",
"fpcr",
"fpsr",
"dirflag",
"frame",
"xmm0",
"xmm1",
77 "xmm2",
"xmm3",
"xmm4",
"xmm5",
"xmm6",
"xmm7",
"mm0",
"mm1",
78 "mm2",
"mm3",
"mm4",
"mm5",
"mm6",
"mm7",
"r8",
"r9",
79 "r10",
"r11",
"r12",
"r13",
"r14",
"r15",
"xmm8",
"xmm9",
80 "xmm10",
"xmm11",
"xmm12",
"xmm13",
"xmm14",
"xmm15",
"ymm0",
"ymm1",
81 "ymm2",
"ymm3",
"ymm4",
"ymm5",
"ymm6",
"ymm7",
"ymm8",
"ymm9",
82 "ymm10",
"ymm11",
"ymm12",
"ymm13",
"ymm14",
"ymm15",
"xmm16",
"xmm17",
83 "xmm18",
"xmm19",
"xmm20",
"xmm21",
"xmm22",
"xmm23",
"xmm24",
"xmm25",
84 "xmm26",
"xmm27",
"xmm28",
"xmm29",
"xmm30",
"xmm31",
"ymm16",
"ymm17",
85 "ymm18",
"ymm19",
"ymm20",
"ymm21",
"ymm22",
"ymm23",
"ymm24",
"ymm25",
86 "ymm26",
"ymm27",
"ymm28",
"ymm29",
"ymm30",
"ymm31",
"zmm0",
"zmm1",
87 "zmm2",
"zmm3",
"zmm4",
"zmm5",
"zmm6",
"zmm7",
"zmm8",
"zmm9",
88 "zmm10",
"zmm11",
"zmm12",
"zmm13",
"zmm14",
"zmm15",
"zmm16",
"zmm17",
89 "zmm18",
"zmm19",
"zmm20",
"zmm21",
"zmm22",
"zmm23",
"zmm24",
"zmm25",
90 "zmm26",
"zmm27",
"zmm28",
"zmm29",
"zmm30",
"zmm31",
"k0",
"k1",
91 "k2",
"k3",
"k4",
"k5",
"k6",
"k7",
92 "cr0",
"cr2",
"cr3",
"cr4",
"cr8",
93 "dr0",
"dr1",
"dr2",
"dr3",
"dr6",
"dr7",
94 "bnd0",
"bnd1",
"bnd2",
"bnd3",
95 "tmm0",
"tmm1",
"tmm2",
"tmm3",
"tmm4",
"tmm5",
"tmm6",
"tmm7",
96 "r16",
"r17",
"r18",
"r19",
"r20",
"r21",
"r22",
"r23",
97 "r24",
"r25",
"r26",
"r27",
"r28",
"r29",
"r30",
"r31",
101 {{
"al",
"ah",
"eax",
"rax"}, 0},
102 {{
"bl",
"bh",
"ebx",
"rbx"}, 3},
103 {{
"cl",
"ch",
"ecx",
"rcx"}, 2},
104 {{
"dl",
"dh",
"edx",
"rdx"}, 1},
109 {{
"r8d",
"r8w",
"r8b"}, 38},
110 {{
"r9d",
"r9w",
"r9b"}, 39},
111 {{
"r10d",
"r10w",
"r10b"}, 40},
112 {{
"r11d",
"r11w",
"r11b"}, 41},
113 {{
"r12d",
"r12w",
"r12b"}, 42},
114 {{
"r13d",
"r13w",
"r13b"}, 43},
115 {{
"r14d",
"r14w",
"r14b"}, 44},
116 {{
"r15d",
"r15w",
"r15b"}, 45},
117 {{
"r16d",
"r16w",
"r16b"}, 165},
118 {{
"r17d",
"r17w",
"r17b"}, 166},
119 {{
"r18d",
"r18w",
"r18b"}, 167},
120 {{
"r19d",
"r19w",
"r19b"}, 168},
121 {{
"r20d",
"r20w",
"r20b"}, 169},
122 {{
"r21d",
"r21w",
"r21b"}, 170},
123 {{
"r22d",
"r22w",
"r22b"}, 171},
124 {{
"r23d",
"r23w",
"r23b"}, 172},
125 {{
"r24d",
"r24w",
"r24b"}, 173},
126 {{
"r25d",
"r25w",
"r25b"}, 174},
127 {{
"r26d",
"r26w",
"r26b"}, 175},
128 {{
"r27d",
"r27w",
"r27b"}, 176},
129 {{
"r28d",
"r28w",
"r28b"}, 177},
130 {{
"r29d",
"r29w",
"r29b"}, 178},
131 {{
"r30d",
"r30w",
"r30b"}, 179},
132 {{
"r31d",
"r31w",
"r31b"}, 180},
137using namespace clang;
154 const std::vector<std::string> &FeaturesVec)
const {
157 if (
getTriple().getArch() == llvm::Triple::x86_64)
160 using namespace llvm::X86;
163 getFeaturesForCPU(
CPU, CPUFeatures);
164 for (
auto &F : CPUFeatures)
167 std::vector<std::string> UpdatedFeaturesVec;
168 for (
const auto &
Feature : FeaturesVec) {
170 if (
Feature ==
"+general-regs-only") {
171 UpdatedFeaturesVec.push_back(
"-x87");
172 UpdatedFeaturesVec.push_back(
"-mmx");
173 UpdatedFeaturesVec.push_back(
"-sse");
177 UpdatedFeaturesVec.push_back(
Feature);
187 auto I = Features.find(
"sse4.2");
188 if (I != Features.end() && I->getValue() &&
189 !llvm::is_contained(UpdatedFeaturesVec,
"-popcnt"))
190 Features[
"popcnt"] =
true;
194 I = Features.find(
"sse");
195 if (I != Features.end() && I->getValue() &&
196 !llvm::is_contained(UpdatedFeaturesVec,
"-mmx"))
197 Features[
"mmx"] =
true;
200 I = Features.find(
"avx");
201 if (I != Features.end() && I->getValue() &&
202 !llvm::is_contained(UpdatedFeaturesVec,
"-xsave"))
203 Features[
"xsave"] =
true;
206 I = Features.find(
"sse4.2");
207 if (I != Features.end() && I->getValue() &&
208 !llvm::is_contained(UpdatedFeaturesVec,
"-crc32"))
209 Features[
"crc32"] =
true;
215 StringRef Name,
bool Enabled)
const {
216 if (Name ==
"sse4") {
227 Features[Name] = Enabled;
228 llvm::X86::updateImpliedFeatures(Name, Enabled, Features);
235 for (
const auto &
Feature : Features) {
241 }
else if (
Feature ==
"+aes") {
243 }
else if (
Feature ==
"+vaes") {
245 }
else if (
Feature ==
"+pclmul") {
247 }
else if (
Feature ==
"+vpclmulqdq") {
248 HasVPCLMULQDQ =
true;
249 }
else if (
Feature ==
"+lzcnt") {
251 }
else if (
Feature ==
"+rdrnd") {
253 }
else if (
Feature ==
"+fsgsbase") {
255 }
else if (
Feature ==
"+bmi") {
257 }
else if (
Feature ==
"+bmi2") {
259 }
else if (
Feature ==
"+popcnt") {
261 }
else if (
Feature ==
"+rtm") {
263 }
else if (
Feature ==
"+prfchw") {
265 }
else if (
Feature ==
"+rdseed") {
267 }
else if (
Feature ==
"+adx") {
269 }
else if (
Feature ==
"+tbm") {
271 }
else if (
Feature ==
"+lwp") {
273 }
else if (
Feature ==
"+fma") {
275 }
else if (
Feature ==
"+f16c") {
277 }
else if (
Feature ==
"+gfni") {
279 }
else if (
Feature ==
"+avx10.1") {
281 }
else if (
Feature ==
"+avx10.2") {
284 }
else if (
Feature ==
"+avx512cd") {
286 }
else if (
Feature ==
"+avx512vpopcntdq") {
287 HasAVX512VPOPCNTDQ =
true;
288 }
else if (
Feature ==
"+avx512vnni") {
289 HasAVX512VNNI =
true;
290 }
else if (
Feature ==
"+avx512bf16") {
291 HasAVX512BF16 =
true;
292 }
else if (
Feature ==
"+avx512fp16") {
293 HasAVX512FP16 =
true;
295 }
else if (
Feature ==
"+avx512dq") {
297 }
else if (
Feature ==
"+avx512bitalg") {
298 HasAVX512BITALG =
true;
299 }
else if (
Feature ==
"+avx512bw") {
301 }
else if (
Feature ==
"+avx512vl") {
303 }
else if (
Feature ==
"+avx512vbmi") {
304 HasAVX512VBMI =
true;
305 }
else if (
Feature ==
"+avx512vbmi2") {
306 HasAVX512VBMI2 =
true;
307 }
else if (
Feature ==
"+avx512ifma") {
308 HasAVX512IFMA =
true;
309 }
else if (
Feature ==
"+avx512vp2intersect") {
310 HasAVX512VP2INTERSECT =
true;
311 }
else if (
Feature ==
"+sha") {
313 }
else if (
Feature ==
"+sha512") {
315 }
else if (
Feature ==
"+shstk") {
317 }
else if (
Feature ==
"+sm3") {
319 }
else if (
Feature ==
"+sm4") {
321 }
else if (
Feature ==
"+movbe") {
323 }
else if (
Feature ==
"+movrs") {
325 }
else if (
Feature ==
"+sgx") {
327 }
else if (
Feature ==
"+cx8") {
329 }
else if (
Feature ==
"+cx16") {
331 }
else if (
Feature ==
"+fxsr") {
333 }
else if (
Feature ==
"+xsave") {
335 }
else if (
Feature ==
"+xsaveopt") {
337 }
else if (
Feature ==
"+xsavec") {
339 }
else if (
Feature ==
"+xsaves") {
341 }
else if (
Feature ==
"+mwaitx") {
343 }
else if (
Feature ==
"+pku") {
345 }
else if (
Feature ==
"+clflushopt") {
346 HasCLFLUSHOPT =
true;
347 }
else if (
Feature ==
"+clwb") {
349 }
else if (
Feature ==
"+wbnoinvd") {
351 }
else if (
Feature ==
"+prefetchi") {
353 }
else if (
Feature ==
"+clzero") {
355 }
else if (
Feature ==
"+cldemote") {
357 }
else if (
Feature ==
"+rdpid") {
359 }
else if (
Feature ==
"+rdpru") {
363 }
else if (
Feature ==
"+widekl") {
365 }
else if (
Feature ==
"+retpoline-external-thunk") {
366 HasRetpolineExternalThunk =
true;
367 }
else if (
Feature ==
"+sahf") {
369 }
else if (
Feature ==
"+waitpkg") {
371 }
else if (
Feature ==
"+movdiri") {
373 }
else if (
Feature ==
"+movdir64b") {
375 }
else if (
Feature ==
"+pconfig") {
377 }
else if (
Feature ==
"+ptwrite") {
379 }
else if (
Feature ==
"+invpcid") {
381 }
else if (
Feature ==
"+enqcmd") {
383 }
else if (
Feature ==
"+hreset") {
385 }
else if (
Feature ==
"+amx-bf16") {
387 }
else if (
Feature ==
"+amx-fp16") {
389 }
else if (
Feature ==
"+amx-int8") {
391 }
else if (
Feature ==
"+amx-tile") {
393 }
else if (
Feature ==
"+amx-complex") {
394 HasAMXCOMPLEX =
true;
395 }
else if (
Feature ==
"+amx-fp8") {
397 }
else if (
Feature ==
"+amx-movrs") {
399 }
else if (
Feature ==
"+amx-avx512") {
401 }
else if (
Feature ==
"+amx-tf32") {
403 }
else if (
Feature ==
"+cmpccxadd") {
405 }
else if (
Feature ==
"+raoint") {
407 }
else if (
Feature ==
"+avxifma") {
409 }
else if (
Feature ==
"+avxneconvert") {
410 HasAVXNECONVERT=
true;
411 }
else if (
Feature ==
"+avxvnni") {
413 }
else if (
Feature ==
"+avxvnniint16") {
414 HasAVXVNNIINT16 =
true;
415 }
else if (
Feature ==
"+avxvnniint8") {
416 HasAVXVNNIINT8 =
true;
417 }
else if (
Feature ==
"+serialize") {
419 }
else if (
Feature ==
"+tsxldtrk") {
421 }
else if (
Feature ==
"+uintr") {
423 }
else if (
Feature ==
"+usermsr") {
425 }
else if (
Feature ==
"+crc32") {
427 }
else if (
Feature ==
"+x87") {
429 }
else if (
Feature ==
"+fullbf16") {
431 }
else if (
Feature ==
"+egpr") {
433 }
else if (
Feature ==
"+inline-asm-use-gpr32") {
434 HasInlineAsmUseGPR32 =
true;
435 }
else if (
Feature ==
"+push2pop2") {
437 }
else if (
Feature ==
"+ppx") {
439 }
else if (
Feature ==
"+ndd") {
441 }
else if (
Feature ==
"+ccmp") {
449 }
else if (
Feature ==
"+jmpabs") {
451 }
else if (
Feature ==
"+branch-hint") {
452 HasBranchHint =
true;
455 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(
Feature)
456 .Case(
"+avx512f", AVX512F)
459 .Case(
"+sse4.2", SSE42)
460 .Case(
"+sse4.1", SSE41)
461 .Case(
"+ssse3", SSSE3)
466 SSELevel = std::max(SSELevel, Level);
481 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(
Feature)
484 .Case(
"+sse4a", SSE4A)
486 XOPLevel = std::max(XOPLevel, XLevel);
493 Diags.
Report(diag::err_target_unsupported_fpmath)
511 Builder.defineMacro(
"__GCC_ASM_FLAG_OUTPUTS__");
514 if (CodeModel ==
"default")
516 Builder.defineMacro(
"__code_model_" + CodeModel +
"__");
519 if (
getTriple().getArch() == llvm::Triple::x86_64) {
520 Builder.defineMacro(
"__amd64__");
521 Builder.defineMacro(
"__amd64");
522 Builder.defineMacro(
"__x86_64");
523 Builder.defineMacro(
"__x86_64__");
524 if (
getTriple().getArchName() ==
"x86_64h") {
525 Builder.defineMacro(
"__x86_64h");
526 Builder.defineMacro(
"__x86_64h__");
532 Builder.defineMacro(
"__SEG_GS");
533 Builder.defineMacro(
"__SEG_FS");
534 Builder.defineMacro(
"__seg_gs",
"__attribute__((address_space(256)))");
535 Builder.defineMacro(
"__seg_fs",
"__attribute__((address_space(257)))");
540 using namespace llvm::X86;
546 Builder.defineMacro(
"__tune_i386__");
555 Builder.defineMacro(
"__pentium_mmx__");
556 Builder.defineMacro(
"__tune_pentium_mmx__");
565 Builder.defineMacro(
"__tune_pentium3__");
569 Builder.defineMacro(
"__tune_pentium2__");
597 case CK_GoldmontPlus:
611 case CK_SkylakeClient:
612 case CK_SkylakeServer:
616 case CK_IcelakeClient:
618 case CK_IcelakeServer:
620 case CK_SapphireRapids:
630 case CK_Sierraforest:
632 case CK_Graniterapids:
633 case CK_GraniterapidsD:
634 case CK_Emeraldrapids:
635 case CK_Clearwaterforest:
636 case CK_Diamondrapids:
650 Builder.defineMacro(
"__tune_lakemont__");
653 Builder.defineMacro(
"__k6_2__");
654 Builder.defineMacro(
"__tune_k6_2__");
657 if (
CPU != CK_K6_2) {
661 Builder.defineMacro(
"__k6_3__");
662 Builder.defineMacro(
"__tune_k6_3__");
671 if (SSELevel != NoSSE) {
672 Builder.defineMacro(
"__athlon_sse__");
673 Builder.defineMacro(
"__tune_athlon_sse__");
739 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
744 Builder.defineMacro(
"__NO_MATH_INLINES");
747 Builder.defineMacro(
"__AES__");
750 Builder.defineMacro(
"__VAES__");
753 Builder.defineMacro(
"__PCLMUL__");
756 Builder.defineMacro(
"__VPCLMULQDQ__");
760 if (HasLAHFSAHF ||
getTriple().getArch() == llvm::Triple::x86)
761 Builder.defineMacro(
"__LAHF_SAHF__");
764 Builder.defineMacro(
"__LZCNT__");
767 Builder.defineMacro(
"__RDRND__");
770 Builder.defineMacro(
"__FSGSBASE__");
773 Builder.defineMacro(
"__BMI__");
776 Builder.defineMacro(
"__BMI2__");
779 Builder.defineMacro(
"__POPCNT__");
782 Builder.defineMacro(
"__RTM__");
785 Builder.defineMacro(
"__PRFCHW__");
788 Builder.defineMacro(
"__RDSEED__");
791 Builder.defineMacro(
"__ADX__");
794 Builder.defineMacro(
"__TBM__");
797 Builder.defineMacro(
"__LWP__");
800 Builder.defineMacro(
"__MWAITX__");
803 Builder.defineMacro(
"__MOVBE__");
807 Builder.defineMacro(
"__XOP__");
810 Builder.defineMacro(
"__FMA4__");
813 Builder.defineMacro(
"__SSE4A__");
820 Builder.defineMacro(
"__FMA__");
823 Builder.defineMacro(
"__F16C__");
826 Builder.defineMacro(
"__GFNI__");
829 Builder.defineMacro(
"__AVX10_1__");
830 Builder.defineMacro(
"__AVX10_1_512__");
833 Builder.defineMacro(
"__AVX10_2__");
834 Builder.defineMacro(
"__AVX10_2_512__");
837 Builder.defineMacro(
"__AVX512CD__");
838 if (HasAVX512VPOPCNTDQ)
839 Builder.defineMacro(
"__AVX512VPOPCNTDQ__");
841 Builder.defineMacro(
"__AVX512VNNI__");
843 Builder.defineMacro(
"__AVX512BF16__");
845 Builder.defineMacro(
"__AVX512FP16__");
847 Builder.defineMacro(
"__AVX512DQ__");
849 Builder.defineMacro(
"__AVX512BITALG__");
851 Builder.defineMacro(
"__AVX512BW__");
853 Builder.defineMacro(
"__AVX512VL__");
856 Builder.defineMacro(
"__AVX512VBMI__");
858 Builder.defineMacro(
"__AVX512VBMI2__");
860 Builder.defineMacro(
"__AVX512IFMA__");
861 if (HasAVX512VP2INTERSECT)
862 Builder.defineMacro(
"__AVX512VP2INTERSECT__");
864 Builder.defineMacro(
"__SHA__");
866 Builder.defineMacro(
"__SHA512__");
869 Builder.defineMacro(
"__FXSR__");
871 Builder.defineMacro(
"__XSAVE__");
873 Builder.defineMacro(
"__XSAVEOPT__");
875 Builder.defineMacro(
"__XSAVEC__");
877 Builder.defineMacro(
"__XSAVES__");
879 Builder.defineMacro(
"__PKU__");
881 Builder.defineMacro(
"__CLFLUSHOPT__");
883 Builder.defineMacro(
"__CLWB__");
885 Builder.defineMacro(
"__WBNOINVD__");
887 Builder.defineMacro(
"__SHSTK__");
889 Builder.defineMacro(
"__SGX__");
891 Builder.defineMacro(
"__SM3__");
893 Builder.defineMacro(
"__SM4__");
895 Builder.defineMacro(
"__PREFETCHI__");
897 Builder.defineMacro(
"__CLZERO__");
899 Builder.defineMacro(
"__KL__");
901 Builder.defineMacro(
"__WIDEKL__");
903 Builder.defineMacro(
"__RDPID__");
905 Builder.defineMacro(
"__RDPRU__");
907 Builder.defineMacro(
"__CLDEMOTE__");
909 Builder.defineMacro(
"__WAITPKG__");
911 Builder.defineMacro(
"__MOVDIRI__");
913 Builder.defineMacro(
"__MOVDIR64B__");
915 Builder.defineMacro(
"__MOVRS__");
917 Builder.defineMacro(
"__PCONFIG__");
919 Builder.defineMacro(
"__PTWRITE__");
921 Builder.defineMacro(
"__INVPCID__");
923 Builder.defineMacro(
"__ENQCMD__");
925 Builder.defineMacro(
"__HRESET__");
927 Builder.defineMacro(
"__AMX_TILE__");
929 Builder.defineMacro(
"__AMX_INT8__");
931 Builder.defineMacro(
"__AMX_BF16__");
933 Builder.defineMacro(
"__AMX_FP16__");
935 Builder.defineMacro(
"__AMX_COMPLEX__");
937 Builder.defineMacro(
"__AMX_FP8__");
939 Builder.defineMacro(
"__AMX_MOVRS__");
941 Builder.defineMacro(
"__AMX_AVX512__");
943 Builder.defineMacro(
"__AMX_TF32__");
945 Builder.defineMacro(
"__CMPCCXADD__");
947 Builder.defineMacro(
"__RAOINT__");
949 Builder.defineMacro(
"__AVXIFMA__");
951 Builder.defineMacro(
"__AVXNECONVERT__");
953 Builder.defineMacro(
"__AVXVNNI__");
955 Builder.defineMacro(
"__AVXVNNIINT16__");
957 Builder.defineMacro(
"__AVXVNNIINT8__");
959 Builder.defineMacro(
"__SERIALIZE__");
961 Builder.defineMacro(
"__TSXLDTRK__");
963 Builder.defineMacro(
"__UINTR__");
965 Builder.defineMacro(
"__USERMSR__");
967 Builder.defineMacro(
"__CRC32__");
969 Builder.defineMacro(
"__EGPR__");
971 Builder.defineMacro(
"__PUSH2POP2__");
973 Builder.defineMacro(
"__PPX__");
975 Builder.defineMacro(
"__NDD__");
977 Builder.defineMacro(
"__CCMP__");
979 Builder.defineMacro(
"__NF__");
981 Builder.defineMacro(
"__CF__");
983 Builder.defineMacro(
"__ZU__");
985 Builder.defineMacro(
"__JMPABS__");
986 if (HasEGPR && HasPush2Pop2 && HasPPX && HasNDD && HasCCMP && HasNF &&
988 Builder.defineMacro(
"__APX_F__");
989 if (HasEGPR && HasInlineAsmUseGPR32)
990 Builder.defineMacro(
"__APX_INLINE_ASM_USE_GPR32__");
995 Builder.defineMacro(
"__AVX512F__");
998 Builder.defineMacro(
"__AVX2__");
1001 Builder.defineMacro(
"__AVX__");
1004 Builder.defineMacro(
"__SSE4_2__");
1007 Builder.defineMacro(
"__SSE4_1__");
1010 Builder.defineMacro(
"__SSSE3__");
1013 Builder.defineMacro(
"__SSE3__");
1016 Builder.defineMacro(
"__SSE2__");
1017 Builder.defineMacro(
"__SSE2_MATH__");
1020 Builder.defineMacro(
"__SSE__");
1021 Builder.defineMacro(
"__SSE_MATH__");
1027 if (Opts.MicrosoftExt &&
getTriple().getArch() == llvm::Triple::x86) {
1037 Builder.defineMacro(
"_M_IX86_FP", Twine(2));
1040 Builder.defineMacro(
"_M_IX86_FP", Twine(1));
1043 Builder.defineMacro(
"_M_IX86_FP", Twine(0));
1050 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");
1066 if (Opts.CFProtectionReturn || Opts.CFProtectionBranch)
1067 Builder.defineMacro(
"__CET__", Twine{(Opts.CFProtectionReturn << 1) |
1068 Opts.CFProtectionBranch});
1072 return llvm::StringSwitch<bool>(Name)
1075 .Case(
"amx-avx512",
true)
1076 .Case(
"amx-bf16",
true)
1077 .Case(
"amx-complex",
true)
1078 .Case(
"amx-fp16",
true)
1079 .Case(
"amx-fp8",
true)
1080 .Case(
"amx-int8",
true)
1081 .Case(
"amx-movrs",
true)
1082 .Case(
"amx-tf32",
true)
1083 .Case(
"amx-tile",
true)
1085 .Case(
"avx10.1",
true)
1086 .Case(
"avx10.2",
true)
1088 .Case(
"avx512f",
true)
1089 .Case(
"avx512cd",
true)
1090 .Case(
"avx512vpopcntdq",
true)
1091 .Case(
"avx512vnni",
true)
1092 .Case(
"avx512bf16",
true)
1093 .Case(
"avx512fp16",
true)
1094 .Case(
"avx512dq",
true)
1095 .Case(
"avx512bitalg",
true)
1096 .Case(
"avx512bw",
true)
1097 .Case(
"avx512vl",
true)
1098 .Case(
"avx512vbmi",
true)
1099 .Case(
"avx512vbmi2",
true)
1100 .Case(
"avx512ifma",
true)
1101 .Case(
"avx512vp2intersect",
true)
1102 .Case(
"avxifma",
true)
1103 .Case(
"avxneconvert",
true)
1104 .Case(
"avxvnni",
true)
1105 .Case(
"avxvnniint16",
true)
1106 .Case(
"avxvnniint8",
true)
1109 .Case(
"cldemote",
true)
1110 .Case(
"clflushopt",
true)
1112 .Case(
"clzero",
true)
1113 .Case(
"cmpccxadd",
true)
1114 .Case(
"crc32",
true)
1116 .Case(
"enqcmd",
true)
1120 .Case(
"fsgsbase",
true)
1122 .Case(
"general-regs-only",
true)
1124 .Case(
"hreset",
true)
1125 .Case(
"invpcid",
true)
1127 .Case(
"widekl",
true)
1129 .Case(
"lzcnt",
true)
1131 .Case(
"movbe",
true)
1132 .Case(
"movrs",
true)
1133 .Case(
"movdiri",
true)
1134 .Case(
"movdir64b",
true)
1135 .Case(
"mwaitx",
true)
1136 .Case(
"pclmul",
true)
1137 .Case(
"pconfig",
true)
1139 .Case(
"popcnt",
true)
1140 .Case(
"prefer-256-bit",
true)
1141 .Case(
"prefetchi",
true)
1142 .Case(
"prfchw",
true)
1143 .Case(
"ptwrite",
true)
1144 .Case(
"raoint",
true)
1145 .Case(
"rdpid",
true)
1146 .Case(
"rdpru",
true)
1147 .Case(
"rdrnd",
true)
1148 .Case(
"rdseed",
true)
1151 .Case(
"serialize",
true)
1154 .Case(
"sha512",
true)
1155 .Case(
"shstk",
true)
1161 .Case(
"ssse3",
true)
1163 .Case(
"sse4.1",
true)
1164 .Case(
"sse4.2",
true)
1165 .Case(
"sse4a",
true)
1167 .Case(
"tsxldtrk",
true)
1168 .Case(
"uintr",
true)
1169 .Case(
"usermsr",
true)
1171 .Case(
"vpclmulqdq",
true)
1172 .Case(
"wbnoinvd",
true)
1173 .Case(
"waitpkg",
true)
1176 .Case(
"xsave",
true)
1177 .Case(
"xsavec",
true)
1178 .Case(
"xsaves",
true)
1179 .Case(
"xsaveopt",
true)
1181 .Case(
"push2pop2",
true)
1188 .Case(
"jmpabs",
true)
1193 return llvm::StringSwitch<bool>(
Feature)
1194 .Case(
"adx", HasADX)
1195 .Case(
"aes", HasAES)
1196 .Case(
"amx-avx512", HasAMXAVX512)
1197 .Case(
"amx-bf16", HasAMXBF16)
1198 .Case(
"amx-complex", HasAMXCOMPLEX)
1199 .Case(
"amx-fp16", HasAMXFP16)
1200 .Case(
"amx-fp8", HasAMXFP8)
1201 .Case(
"amx-int8", HasAMXINT8)
1202 .Case(
"amx-movrs", HasAMXMOVRS)
1203 .Case(
"amx-tf32", HasAMXTF32)
1204 .Case(
"amx-tile", HasAMXTILE)
1205 .Case(
"avx", SSELevel >= AVX)
1206 .Case(
"avx10.1", HasAVX10_1)
1207 .Case(
"avx10.2", HasAVX10_2)
1208 .Case(
"avx2", SSELevel >= AVX2)
1209 .Case(
"avx512f", SSELevel >= AVX512F)
1210 .Case(
"avx512cd", HasAVX512CD)
1211 .Case(
"avx512vpopcntdq", HasAVX512VPOPCNTDQ)
1212 .Case(
"avx512vnni", HasAVX512VNNI)
1213 .Case(
"avx512bf16", HasAVX512BF16)
1214 .Case(
"avx512fp16", HasAVX512FP16)
1215 .Case(
"avx512dq", HasAVX512DQ)
1216 .Case(
"avx512bitalg", HasAVX512BITALG)
1217 .Case(
"avx512bw", HasAVX512BW)
1218 .Case(
"avx512vl", HasAVX512VL)
1219 .Case(
"avx512vbmi", HasAVX512VBMI)
1220 .Case(
"avx512vbmi2", HasAVX512VBMI2)
1221 .Case(
"avx512ifma", HasAVX512IFMA)
1222 .Case(
"avx512vp2intersect", HasAVX512VP2INTERSECT)
1223 .Case(
"avxifma", HasAVXIFMA)
1224 .Case(
"avxneconvert", HasAVXNECONVERT)
1225 .Case(
"avxvnni", HasAVXVNNI)
1226 .Case(
"avxvnniint16", HasAVXVNNIINT16)
1227 .Case(
"avxvnniint8", HasAVXVNNIINT8)
1228 .Case(
"bmi", HasBMI)
1229 .Case(
"bmi2", HasBMI2)
1230 .Case(
"cldemote", HasCLDEMOTE)
1231 .Case(
"clflushopt", HasCLFLUSHOPT)
1232 .Case(
"clwb", HasCLWB)
1233 .Case(
"clzero", HasCLZERO)
1234 .Case(
"cmpccxadd", HasCMPCCXADD)
1235 .Case(
"crc32", HasCRC32)
1236 .Case(
"cx8", HasCX8)
1237 .Case(
"cx16", HasCX16)
1238 .Case(
"enqcmd", HasENQCMD)
1239 .Case(
"f16c", HasF16C)
1240 .Case(
"fma", HasFMA)
1241 .Case(
"fma4", XOPLevel >= FMA4)
1242 .Case(
"fsgsbase", HasFSGSBASE)
1243 .Case(
"fxsr", HasFXSR)
1244 .Case(
"gfni", HasGFNI)
1245 .Case(
"hreset", HasHRESET)
1246 .Case(
"invpcid", HasINVPCID)
1248 .Case(
"widekl", HasWIDEKL)
1249 .Case(
"lwp", HasLWP)
1250 .Case(
"lzcnt", HasLZCNT)
1251 .Case(
"mmx", HasMMX)
1252 .Case(
"movbe", HasMOVBE)
1253 .Case(
"movrs", HasMOVRS)
1254 .Case(
"movdiri", HasMOVDIRI)
1255 .Case(
"movdir64b", HasMOVDIR64B)
1256 .Case(
"mwaitx", HasMWAITX)
1257 .Case(
"pclmul", HasPCLMUL)
1258 .Case(
"pconfig", HasPCONFIG)
1259 .Case(
"pku", HasPKU)
1260 .Case(
"popcnt", HasPOPCNT)
1261 .Case(
"prefetchi", HasPREFETCHI)
1262 .Case(
"prfchw", HasPRFCHW)
1263 .Case(
"ptwrite", HasPTWRITE)
1264 .Case(
"raoint", HasRAOINT)
1265 .Case(
"rdpid", HasRDPID)
1266 .Case(
"rdpru", HasRDPRU)
1267 .Case(
"rdrnd", HasRDRND)
1268 .Case(
"rdseed", HasRDSEED)
1269 .Case(
"retpoline-external-thunk", HasRetpolineExternalThunk)
1270 .Case(
"rtm", HasRTM)
1271 .Case(
"sahf", HasLAHFSAHF)
1272 .Case(
"serialize", HasSERIALIZE)
1273 .Case(
"sgx", HasSGX)
1274 .Case(
"sha", HasSHA)
1275 .Case(
"sha512", HasSHA512)
1276 .Case(
"shstk", HasSHSTK)
1277 .Case(
"sm3", HasSM3)
1278 .Case(
"sm4", HasSM4)
1279 .Case(
"sse", SSELevel >= SSE1)
1280 .Case(
"sse2", SSELevel >= SSE2)
1281 .Case(
"sse3", SSELevel >= SSE3)
1282 .Case(
"ssse3", SSELevel >= SSSE3)
1283 .Case(
"sse4.1", SSELevel >= SSE41)
1284 .Case(
"sse4.2", SSELevel >= SSE42)
1285 .Case(
"sse4a", XOPLevel >= SSE4A)
1286 .Case(
"tbm", HasTBM)
1287 .Case(
"tsxldtrk", HasTSXLDTRK)
1288 .Case(
"uintr", HasUINTR)
1289 .Case(
"usermsr", HasUSERMSR)
1290 .Case(
"vaes", HasVAES)
1291 .Case(
"vpclmulqdq", HasVPCLMULQDQ)
1292 .Case(
"wbnoinvd", HasWBNOINVD)
1293 .Case(
"waitpkg", HasWAITPKG)
1295 .Case(
"x86_32",
getTriple().getArch() == llvm::Triple::x86)
1296 .Case(
"x86_64",
getTriple().getArch() == llvm::Triple::x86_64)
1297 .Case(
"x87", HasX87)
1298 .Case(
"xop", XOPLevel >= XOP)
1299 .Case(
"xsave", HasXSAVE)
1300 .Case(
"xsavec", HasXSAVEC)
1301 .Case(
"xsaves", HasXSAVES)
1302 .Case(
"xsaveopt", HasXSAVEOPT)
1304 .Case(
"egpr", HasEGPR)
1305 .Case(
"push2pop2", HasPush2Pop2)
1306 .Case(
"ppx", HasPPX)
1307 .Case(
"ndd", HasNDD)
1308 .Case(
"ccmp", HasCCMP)
1312 .Case(
"jmpabs", HasJMPABS)
1313 .Case(
"branch-hint", HasBranchHint)
1323 return llvm::StringSwitch<bool>(FeatureStr)
1324#define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY, ABI_VALUE) .Case(STR, true)
1325#define X86_MICROARCH_LEVEL(ENUM, STR, PRIORITY, ABI_VALUE) .Case(STR, true)
1326#include "llvm/TargetParser/X86TargetParser.def"
1331 return llvm::StringSwitch<llvm::X86::ProcessorFeatures>(Name)
1332#define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY, ABI_VALUE) \
1333 .Case(STR, llvm::X86::FEATURE_##ENUM)
1335#include "llvm/TargetParser/X86TargetParser.def"
1342 auto getPriority = [](StringRef
Feature) ->
unsigned {
1345 using namespace llvm::X86;
1346 CPUKind Kind = parseArchX86(
Feature);
1347 if (Kind != CK_None) {
1348 ProcessorFeatures KeyFeature = getKeyFeature(Kind);
1349 return (getFeaturePriority(KeyFeature) << 1) + 1;
1356 unsigned Priority = 0;
1357 for (StringRef
Feature : Features)
1359 Priority = std::max(Priority, getPriority(
Feature));
1360 return llvm::APInt(32, Priority);
1364 return llvm::X86::validateCPUSpecificCPUDispatch(Name);
1368 return llvm::X86::getCPUDispatchMangling(Name);
1374 llvm::X86::getFeaturesForCPU(Name, TargetCPUFeatures,
true);
1375 for (
auto &F : TargetCPUFeatures)
1376 Features.push_back(F);
1384 return llvm::StringSwitch<bool>(FeatureStr)
1385#define X86_VENDOR(ENUM, STRING) .Case(STRING, true)
1386#define X86_CPU_TYPE_ALIAS(ENUM, ALIAS) .Case(ALIAS, true)
1387#define X86_CPU_TYPE(ENUM, STR) .Case(STR, true)
1388#define X86_CPU_SUBTYPE_ALIAS(ENUM, ALIAS) .Case(ALIAS, true)
1389#define X86_CPU_SUBTYPE(ENUM, STR) .Case(STR, true)
1390#include "llvm/TargetParser/X86TargetParser.def"
1395 auto RV = llvm::StringSwitch<unsigned>(Name)
1564 using namespace llvm::X86;
1604 case CK_GoldmontPlus:
1609 case CK_SandyBridge:
1613 case CK_SkylakeClient:
1614 case CK_SkylakeServer:
1615 case CK_Cascadelake:
1620 case CK_SapphireRapids:
1621 case CK_IcelakeClient:
1623 case CK_IcelakeServer:
1630 case CK_Pantherlake:
1631 case CK_Wildcatlake:
1633 case CK_Sierraforest:
1635 case CK_Graniterapids:
1636 case CK_GraniterapidsD:
1637 case CK_Emeraldrapids:
1638 case CK_Clearwaterforest:
1639 case CK_Diamondrapids:
1681 return std::nullopt;
1683 llvm_unreachable(
"Unknown CPU kind");
1687 StringRef Constraint,
1688 unsigned Size)
const {
1690 Constraint = Constraint.ltrim(
"=+&");
1696 StringRef Constraint,
1697 unsigned Size)
const {
1702 StringRef Constraint,
1703 unsigned Size)
const {
1704 switch (Constraint[0]) {
1717 switch (Constraint[1]) {
1728 return Size <= 512U;
1731 return Size <= 256U;
1733 return Size <= 128U;
1739 if (SSELevel < SSE2)
1748 return Size <= 512U;
1751 return Size <= 256U;
1752 return Size <= 128U;
1760 switch (*Constraint) {
1763 std::string Converted =
"{" + std::string(Constraint, Len) +
"}";
1764 Constraint += Len - 1;
1767 return std::string(1, *Constraint);
1769 return std::string(
"{ax}");
1771 return std::string(
"{bx}");
1773 return std::string(
"{cx}");
1775 return std::string(
"{dx}");
1777 return std::string(
"{si}");
1779 return std::string(
"{di}");
1781 return std::string(
"p");
1783 return std::string(
"{st}");
1785 return std::string(
"{st(1)}");
1787 assert(Constraint[1] ==
's');
1788 return '^' + std::string(Constraint++, 2);
1790 switch (Constraint[1]) {
1805 return std::string(
"^") + std::string(Constraint++, 2);
1809 switch (Constraint[1]) {
1820 return std::string(
"^") + std::string(Constraint++, 2);
1824 return std::string(1, *Constraint);
1829 bool Only64Bit =
getTriple().getArch() != llvm::Triple::x86;
1830 llvm::X86::fillValidCPUArchList(Values, Only64Bit);
1834 llvm::X86::fillValidTuneCPUList(Values);
1866 bool HasNonWeakDef)
const {
Defines the Diagnostic-related interfaces.
static unsigned matchAsmCCConstraint(const char *Name)
static constexpr Builtin::Info PrefixedBuiltinInfos[]
static llvm::X86::ProcessorFeatures getFeature(StringRef Name)
static constexpr Builtin::Info BuiltinInfos[]
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 unsigned getMinGlobalAlign(uint64_t Size, bool HasNonWeakDef) const
getMinGlobalAlign - Return the minimum alignment of a global variable, unless its alignment is explic...
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 ...
unsigned getMinGlobalAlign(uint64_t TypeSize, bool HasNonWeakDef) const override
getMinGlobalAlign - Return the minimum alignment of a global variable, unless its alignment is explic...
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
llvm::APInt getFMVPriority(ArrayRef< StringRef > Features) 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
llvm::SmallVector< Builtin::InfosShard > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
llvm::SmallVector< Builtin::InfosShard > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
static constexpr Builtin::Info BuiltinInfos[]
static constexpr Builtin::Info PrefixedBuiltinInfos[]
static constexpr Builtin::Info BuiltinInfos[]
static constexpr Builtin::Info PrefixedBuiltinInfos[]
static constexpr int NumX86Builtins
LLVM_LIBRARY_VISIBILITY void defineCPUMacros(clang::MacroBuilder &Builder, llvm::StringRef CPUName, bool Tuning=true)
static constexpr int NumBuiltins
const TargetInfo::AddlRegName AddlRegNames[]
static const char *const GCCRegNames[]
static constexpr int NumX86_64Builtins
LLVM_LIBRARY_VISIBILITY void DefineStd(clang::MacroBuilder &Builder, llvm::StringRef MacroName, const clang::LangOptions &Opts)
Define a macro name and standard variants.
The JSON file list parser is used to communicate input to InstallAPI.
unsigned Microsoft64BitMinGlobalAlign(uint64_t TypeSize)
The info used to represent each builtin.
std::string ConstraintStr
void setOutputOperandBounds(unsigned Min, unsigned Max)
void setRequiresImmediate(int Min, int Max)
const llvm::fltSemantics * LongDoubleFormat