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-transpose") {
400 HasAMXTRANSPOSE =
true;
401 }
else if (
Feature ==
"+amx-avx512") {
403 }
else if (
Feature ==
"+amx-tf32") {
405 }
else if (
Feature ==
"+cmpccxadd") {
407 }
else if (
Feature ==
"+raoint") {
409 }
else if (
Feature ==
"+avxifma") {
411 }
else if (
Feature ==
"+avxneconvert") {
412 HasAVXNECONVERT=
true;
413 }
else if (
Feature ==
"+avxvnni") {
415 }
else if (
Feature ==
"+avxvnniint16") {
416 HasAVXVNNIINT16 =
true;
417 }
else if (
Feature ==
"+avxvnniint8") {
418 HasAVXVNNIINT8 =
true;
419 }
else if (
Feature ==
"+serialize") {
421 }
else if (
Feature ==
"+tsxldtrk") {
423 }
else if (
Feature ==
"+uintr") {
425 }
else if (
Feature ==
"+usermsr") {
427 }
else if (
Feature ==
"+crc32") {
429 }
else if (
Feature ==
"+x87") {
431 }
else if (
Feature ==
"+fullbf16") {
433 }
else if (
Feature ==
"+egpr") {
435 }
else if (
Feature ==
"+inline-asm-use-gpr32") {
436 HasInlineAsmUseGPR32 =
true;
437 }
else if (
Feature ==
"+push2pop2") {
439 }
else if (
Feature ==
"+ppx") {
441 }
else if (
Feature ==
"+ndd") {
443 }
else if (
Feature ==
"+ccmp") {
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:
629 case CK_Sierraforest:
631 case CK_Graniterapids:
632 case CK_GraniterapidsD:
633 case CK_Emeraldrapids:
634 case CK_Clearwaterforest:
635 case CK_Diamondrapids:
649 Builder.defineMacro(
"__tune_lakemont__");
652 Builder.defineMacro(
"__k6_2__");
653 Builder.defineMacro(
"__tune_k6_2__");
656 if (
CPU != CK_K6_2) {
660 Builder.defineMacro(
"__k6_3__");
661 Builder.defineMacro(
"__tune_k6_3__");
670 if (SSELevel != NoSSE) {
671 Builder.defineMacro(
"__athlon_sse__");
672 Builder.defineMacro(
"__tune_athlon_sse__");
726 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
731 Builder.defineMacro(
"__NO_MATH_INLINES");
734 Builder.defineMacro(
"__AES__");
737 Builder.defineMacro(
"__VAES__");
740 Builder.defineMacro(
"__PCLMUL__");
743 Builder.defineMacro(
"__VPCLMULQDQ__");
747 if (HasLAHFSAHF ||
getTriple().getArch() == llvm::Triple::x86)
748 Builder.defineMacro(
"__LAHF_SAHF__");
751 Builder.defineMacro(
"__LZCNT__");
754 Builder.defineMacro(
"__RDRND__");
757 Builder.defineMacro(
"__FSGSBASE__");
760 Builder.defineMacro(
"__BMI__");
763 Builder.defineMacro(
"__BMI2__");
766 Builder.defineMacro(
"__POPCNT__");
769 Builder.defineMacro(
"__RTM__");
772 Builder.defineMacro(
"__PRFCHW__");
775 Builder.defineMacro(
"__RDSEED__");
778 Builder.defineMacro(
"__ADX__");
781 Builder.defineMacro(
"__TBM__");
784 Builder.defineMacro(
"__LWP__");
787 Builder.defineMacro(
"__MWAITX__");
790 Builder.defineMacro(
"__MOVBE__");
794 Builder.defineMacro(
"__XOP__");
797 Builder.defineMacro(
"__FMA4__");
800 Builder.defineMacro(
"__SSE4A__");
807 Builder.defineMacro(
"__FMA__");
810 Builder.defineMacro(
"__F16C__");
813 Builder.defineMacro(
"__GFNI__");
816 Builder.defineMacro(
"__AVX10_1__");
817 Builder.defineMacro(
"__AVX10_1_512__");
820 Builder.defineMacro(
"__AVX10_2__");
821 Builder.defineMacro(
"__AVX10_2_512__");
824 Builder.defineMacro(
"__AVX512CD__");
825 if (HasAVX512VPOPCNTDQ)
826 Builder.defineMacro(
"__AVX512VPOPCNTDQ__");
828 Builder.defineMacro(
"__AVX512VNNI__");
830 Builder.defineMacro(
"__AVX512BF16__");
832 Builder.defineMacro(
"__AVX512FP16__");
834 Builder.defineMacro(
"__AVX512DQ__");
836 Builder.defineMacro(
"__AVX512BITALG__");
838 Builder.defineMacro(
"__AVX512BW__");
840 Builder.defineMacro(
"__AVX512VL__");
843 Builder.defineMacro(
"__AVX512VBMI__");
845 Builder.defineMacro(
"__AVX512VBMI2__");
847 Builder.defineMacro(
"__AVX512IFMA__");
848 if (HasAVX512VP2INTERSECT)
849 Builder.defineMacro(
"__AVX512VP2INTERSECT__");
851 Builder.defineMacro(
"__SHA__");
853 Builder.defineMacro(
"__SHA512__");
856 Builder.defineMacro(
"__FXSR__");
858 Builder.defineMacro(
"__XSAVE__");
860 Builder.defineMacro(
"__XSAVEOPT__");
862 Builder.defineMacro(
"__XSAVEC__");
864 Builder.defineMacro(
"__XSAVES__");
866 Builder.defineMacro(
"__PKU__");
868 Builder.defineMacro(
"__CLFLUSHOPT__");
870 Builder.defineMacro(
"__CLWB__");
872 Builder.defineMacro(
"__WBNOINVD__");
874 Builder.defineMacro(
"__SHSTK__");
876 Builder.defineMacro(
"__SGX__");
878 Builder.defineMacro(
"__SM3__");
880 Builder.defineMacro(
"__SM4__");
882 Builder.defineMacro(
"__PREFETCHI__");
884 Builder.defineMacro(
"__CLZERO__");
886 Builder.defineMacro(
"__KL__");
888 Builder.defineMacro(
"__WIDEKL__");
890 Builder.defineMacro(
"__RDPID__");
892 Builder.defineMacro(
"__RDPRU__");
894 Builder.defineMacro(
"__CLDEMOTE__");
896 Builder.defineMacro(
"__WAITPKG__");
898 Builder.defineMacro(
"__MOVDIRI__");
900 Builder.defineMacro(
"__MOVDIR64B__");
902 Builder.defineMacro(
"__MOVRS__");
904 Builder.defineMacro(
"__PCONFIG__");
906 Builder.defineMacro(
"__PTWRITE__");
908 Builder.defineMacro(
"__INVPCID__");
910 Builder.defineMacro(
"__ENQCMD__");
912 Builder.defineMacro(
"__HRESET__");
914 Builder.defineMacro(
"__AMX_TILE__");
916 Builder.defineMacro(
"__AMX_INT8__");
918 Builder.defineMacro(
"__AMX_BF16__");
920 Builder.defineMacro(
"__AMX_FP16__");
922 Builder.defineMacro(
"__AMX_COMPLEX__");
924 Builder.defineMacro(
"__AMX_FP8__");
926 Builder.defineMacro(
"__AMX_MOVRS__");
928 Builder.defineMacro(
"__AMX_TRANSPOSE__");
930 Builder.defineMacro(
"__AMX_AVX512__");
932 Builder.defineMacro(
"__AMX_TF32__");
934 Builder.defineMacro(
"__CMPCCXADD__");
936 Builder.defineMacro(
"__RAOINT__");
938 Builder.defineMacro(
"__AVXIFMA__");
940 Builder.defineMacro(
"__AVXNECONVERT__");
942 Builder.defineMacro(
"__AVXVNNI__");
944 Builder.defineMacro(
"__AVXVNNIINT16__");
946 Builder.defineMacro(
"__AVXVNNIINT8__");
948 Builder.defineMacro(
"__SERIALIZE__");
950 Builder.defineMacro(
"__TSXLDTRK__");
952 Builder.defineMacro(
"__UINTR__");
954 Builder.defineMacro(
"__USERMSR__");
956 Builder.defineMacro(
"__CRC32__");
958 Builder.defineMacro(
"__EGPR__");
960 Builder.defineMacro(
"__PUSH2POP2__");
962 Builder.defineMacro(
"__PPX__");
964 Builder.defineMacro(
"__NDD__");
966 Builder.defineMacro(
"__CCMP__");
968 Builder.defineMacro(
"__NF__");
970 Builder.defineMacro(
"__CF__");
972 Builder.defineMacro(
"__ZU__");
973 if (HasEGPR && HasPush2Pop2 && HasPPX && HasNDD && HasCCMP && HasNF && HasZU)
974 Builder.defineMacro(
"__APX_F__");
975 if (HasEGPR && HasInlineAsmUseGPR32)
976 Builder.defineMacro(
"__APX_INLINE_ASM_USE_GPR32__");
981 Builder.defineMacro(
"__AVX512F__");
984 Builder.defineMacro(
"__AVX2__");
987 Builder.defineMacro(
"__AVX__");
990 Builder.defineMacro(
"__SSE4_2__");
993 Builder.defineMacro(
"__SSE4_1__");
996 Builder.defineMacro(
"__SSSE3__");
999 Builder.defineMacro(
"__SSE3__");
1002 Builder.defineMacro(
"__SSE2__");
1003 Builder.defineMacro(
"__SSE2_MATH__");
1006 Builder.defineMacro(
"__SSE__");
1007 Builder.defineMacro(
"__SSE_MATH__");
1013 if (Opts.MicrosoftExt &&
getTriple().getArch() == llvm::Triple::x86) {
1023 Builder.defineMacro(
"_M_IX86_FP", Twine(2));
1026 Builder.defineMacro(
"_M_IX86_FP", Twine(1));
1029 Builder.defineMacro(
"_M_IX86_FP", Twine(0));
1036 Builder.defineMacro(
"__MMX__");
1039 if (
CPU >= CK_i486 ||
CPU == CK_None) {
1040 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1041 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1042 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1045 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
1046 if (HasCX16 &&
getTriple().getArch() == llvm::Triple::x86_64)
1047 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
1050 Builder.defineMacro(
"__SIZEOF_FLOAT128__",
"16");
1052 if (Opts.CFProtectionReturn || Opts.CFProtectionBranch)
1053 Builder.defineMacro(
"__CET__", Twine{(Opts.CFProtectionReturn << 1) |
1054 Opts.CFProtectionBranch});
1058 return llvm::StringSwitch<bool>(Name)
1061 .Case(
"amx-avx512",
true)
1062 .Case(
"amx-bf16",
true)
1063 .Case(
"amx-complex",
true)
1064 .Case(
"amx-fp16",
true)
1065 .Case(
"amx-fp8",
true)
1066 .Case(
"amx-int8",
true)
1067 .Case(
"amx-movrs",
true)
1068 .Case(
"amx-tf32",
true)
1069 .Case(
"amx-tile",
true)
1070 .Case(
"amx-transpose",
true)
1072 .Case(
"avx10.1",
true)
1073 .Case(
"avx10.2",
true)
1075 .Case(
"avx512f",
true)
1076 .Case(
"avx512cd",
true)
1077 .Case(
"avx512vpopcntdq",
true)
1078 .Case(
"avx512vnni",
true)
1079 .Case(
"avx512bf16",
true)
1080 .Case(
"avx512fp16",
true)
1081 .Case(
"avx512dq",
true)
1082 .Case(
"avx512bitalg",
true)
1083 .Case(
"avx512bw",
true)
1084 .Case(
"avx512vl",
true)
1085 .Case(
"avx512vbmi",
true)
1086 .Case(
"avx512vbmi2",
true)
1087 .Case(
"avx512ifma",
true)
1088 .Case(
"avx512vp2intersect",
true)
1089 .Case(
"avxifma",
true)
1090 .Case(
"avxneconvert",
true)
1091 .Case(
"avxvnni",
true)
1092 .Case(
"avxvnniint16",
true)
1093 .Case(
"avxvnniint8",
true)
1096 .Case(
"cldemote",
true)
1097 .Case(
"clflushopt",
true)
1099 .Case(
"clzero",
true)
1100 .Case(
"cmpccxadd",
true)
1101 .Case(
"crc32",
true)
1103 .Case(
"enqcmd",
true)
1107 .Case(
"fsgsbase",
true)
1109 .Case(
"general-regs-only",
true)
1111 .Case(
"hreset",
true)
1112 .Case(
"invpcid",
true)
1114 .Case(
"widekl",
true)
1116 .Case(
"lzcnt",
true)
1118 .Case(
"movbe",
true)
1119 .Case(
"movrs",
true)
1120 .Case(
"movdiri",
true)
1121 .Case(
"movdir64b",
true)
1122 .Case(
"mwaitx",
true)
1123 .Case(
"pclmul",
true)
1124 .Case(
"pconfig",
true)
1126 .Case(
"popcnt",
true)
1127 .Case(
"prefer-256-bit",
true)
1128 .Case(
"prefetchi",
true)
1129 .Case(
"prfchw",
true)
1130 .Case(
"ptwrite",
true)
1131 .Case(
"raoint",
true)
1132 .Case(
"rdpid",
true)
1133 .Case(
"rdpru",
true)
1134 .Case(
"rdrnd",
true)
1135 .Case(
"rdseed",
true)
1138 .Case(
"serialize",
true)
1141 .Case(
"sha512",
true)
1142 .Case(
"shstk",
true)
1148 .Case(
"ssse3",
true)
1150 .Case(
"sse4.1",
true)
1151 .Case(
"sse4.2",
true)
1152 .Case(
"sse4a",
true)
1154 .Case(
"tsxldtrk",
true)
1155 .Case(
"uintr",
true)
1156 .Case(
"usermsr",
true)
1158 .Case(
"vpclmulqdq",
true)
1159 .Case(
"wbnoinvd",
true)
1160 .Case(
"waitpkg",
true)
1163 .Case(
"xsave",
true)
1164 .Case(
"xsavec",
true)
1165 .Case(
"xsaves",
true)
1166 .Case(
"xsaveopt",
true)
1168 .Case(
"push2pop2",
true)
1179 return llvm::StringSwitch<bool>(
Feature)
1180 .Case(
"adx", HasADX)
1181 .Case(
"aes", HasAES)
1182 .Case(
"amx-avx512", HasAMXAVX512)
1183 .Case(
"amx-bf16", HasAMXBF16)
1184 .Case(
"amx-complex", HasAMXCOMPLEX)
1185 .Case(
"amx-fp16", HasAMXFP16)
1186 .Case(
"amx-fp8", HasAMXFP8)
1187 .Case(
"amx-int8", HasAMXINT8)
1188 .Case(
"amx-movrs", HasAMXMOVRS)
1189 .Case(
"amx-tf32", HasAMXTF32)
1190 .Case(
"amx-tile", HasAMXTILE)
1191 .Case(
"amx-transpose", HasAMXTRANSPOSE)
1192 .Case(
"avx", SSELevel >= AVX)
1193 .Case(
"avx10.1", HasAVX10_1)
1194 .Case(
"avx10.2", HasAVX10_2)
1195 .Case(
"avx2", SSELevel >= AVX2)
1196 .Case(
"avx512f", SSELevel >= AVX512F)
1197 .Case(
"avx512cd", HasAVX512CD)
1198 .Case(
"avx512vpopcntdq", HasAVX512VPOPCNTDQ)
1199 .Case(
"avx512vnni", HasAVX512VNNI)
1200 .Case(
"avx512bf16", HasAVX512BF16)
1201 .Case(
"avx512fp16", HasAVX512FP16)
1202 .Case(
"avx512dq", HasAVX512DQ)
1203 .Case(
"avx512bitalg", HasAVX512BITALG)
1204 .Case(
"avx512bw", HasAVX512BW)
1205 .Case(
"avx512vl", HasAVX512VL)
1206 .Case(
"avx512vbmi", HasAVX512VBMI)
1207 .Case(
"avx512vbmi2", HasAVX512VBMI2)
1208 .Case(
"avx512ifma", HasAVX512IFMA)
1209 .Case(
"avx512vp2intersect", HasAVX512VP2INTERSECT)
1210 .Case(
"avxifma", HasAVXIFMA)
1211 .Case(
"avxneconvert", HasAVXNECONVERT)
1212 .Case(
"avxvnni", HasAVXVNNI)
1213 .Case(
"avxvnniint16", HasAVXVNNIINT16)
1214 .Case(
"avxvnniint8", HasAVXVNNIINT8)
1215 .Case(
"bmi", HasBMI)
1216 .Case(
"bmi2", HasBMI2)
1217 .Case(
"cldemote", HasCLDEMOTE)
1218 .Case(
"clflushopt", HasCLFLUSHOPT)
1219 .Case(
"clwb", HasCLWB)
1220 .Case(
"clzero", HasCLZERO)
1221 .Case(
"cmpccxadd", HasCMPCCXADD)
1222 .Case(
"crc32", HasCRC32)
1223 .Case(
"cx8", HasCX8)
1224 .Case(
"cx16", HasCX16)
1225 .Case(
"enqcmd", HasENQCMD)
1226 .Case(
"f16c", HasF16C)
1227 .Case(
"fma", HasFMA)
1228 .Case(
"fma4", XOPLevel >= FMA4)
1229 .Case(
"fsgsbase", HasFSGSBASE)
1230 .Case(
"fxsr", HasFXSR)
1231 .Case(
"gfni", HasGFNI)
1232 .Case(
"hreset", HasHRESET)
1233 .Case(
"invpcid", HasINVPCID)
1235 .Case(
"widekl", HasWIDEKL)
1236 .Case(
"lwp", HasLWP)
1237 .Case(
"lzcnt", HasLZCNT)
1238 .Case(
"mmx", HasMMX)
1239 .Case(
"movbe", HasMOVBE)
1240 .Case(
"movrs", HasMOVRS)
1241 .Case(
"movdiri", HasMOVDIRI)
1242 .Case(
"movdir64b", HasMOVDIR64B)
1243 .Case(
"mwaitx", HasMWAITX)
1244 .Case(
"pclmul", HasPCLMUL)
1245 .Case(
"pconfig", HasPCONFIG)
1246 .Case(
"pku", HasPKU)
1247 .Case(
"popcnt", HasPOPCNT)
1248 .Case(
"prefetchi", HasPREFETCHI)
1249 .Case(
"prfchw", HasPRFCHW)
1250 .Case(
"ptwrite", HasPTWRITE)
1251 .Case(
"raoint", HasRAOINT)
1252 .Case(
"rdpid", HasRDPID)
1253 .Case(
"rdpru", HasRDPRU)
1254 .Case(
"rdrnd", HasRDRND)
1255 .Case(
"rdseed", HasRDSEED)
1256 .Case(
"retpoline-external-thunk", HasRetpolineExternalThunk)
1257 .Case(
"rtm", HasRTM)
1258 .Case(
"sahf", HasLAHFSAHF)
1259 .Case(
"serialize", HasSERIALIZE)
1260 .Case(
"sgx", HasSGX)
1261 .Case(
"sha", HasSHA)
1262 .Case(
"sha512", HasSHA512)
1263 .Case(
"shstk", HasSHSTK)
1264 .Case(
"sm3", HasSM3)
1265 .Case(
"sm4", HasSM4)
1266 .Case(
"sse", SSELevel >= SSE1)
1267 .Case(
"sse2", SSELevel >= SSE2)
1268 .Case(
"sse3", SSELevel >= SSE3)
1269 .Case(
"ssse3", SSELevel >= SSSE3)
1270 .Case(
"sse4.1", SSELevel >= SSE41)
1271 .Case(
"sse4.2", SSELevel >= SSE42)
1272 .Case(
"sse4a", XOPLevel >= SSE4A)
1273 .Case(
"tbm", HasTBM)
1274 .Case(
"tsxldtrk", HasTSXLDTRK)
1275 .Case(
"uintr", HasUINTR)
1276 .Case(
"usermsr", HasUSERMSR)
1277 .Case(
"vaes", HasVAES)
1278 .Case(
"vpclmulqdq", HasVPCLMULQDQ)
1279 .Case(
"wbnoinvd", HasWBNOINVD)
1280 .Case(
"waitpkg", HasWAITPKG)
1282 .Case(
"x86_32",
getTriple().getArch() == llvm::Triple::x86)
1283 .Case(
"x86_64",
getTriple().getArch() == llvm::Triple::x86_64)
1284 .Case(
"x87", HasX87)
1285 .Case(
"xop", XOPLevel >= XOP)
1286 .Case(
"xsave", HasXSAVE)
1287 .Case(
"xsavec", HasXSAVEC)
1288 .Case(
"xsaves", HasXSAVES)
1289 .Case(
"xsaveopt", HasXSAVEOPT)
1291 .Case(
"egpr", HasEGPR)
1292 .Case(
"push2pop2", HasPush2Pop2)
1293 .Case(
"ppx", HasPPX)
1294 .Case(
"ndd", HasNDD)
1295 .Case(
"ccmp", HasCCMP)
1299 .Case(
"branch-hint", HasBranchHint)
1309 return llvm::StringSwitch<bool>(FeatureStr)
1310#define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY) .Case(STR, true)
1311#define X86_MICROARCH_LEVEL(ENUM, STR, PRIORITY) .Case(STR, true)
1312#include "llvm/TargetParser/X86TargetParser.def"
1317 return llvm::StringSwitch<llvm::X86::ProcessorFeatures>(Name)
1318#define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY) \
1319 .Case(STR, llvm::X86::FEATURE_##ENUM)
1321#include "llvm/TargetParser/X86TargetParser.def"
1328 auto getPriority = [](StringRef
Feature) ->
unsigned {
1331 using namespace llvm::X86;
1332 CPUKind Kind = parseArchX86(
Feature);
1333 if (Kind != CK_None) {
1334 ProcessorFeatures KeyFeature = getKeyFeature(Kind);
1335 return (getFeaturePriority(KeyFeature) << 1) + 1;
1342 unsigned Priority = 0;
1343 for (StringRef
Feature : Features)
1345 Priority = std::max(Priority, getPriority(
Feature));
1346 return llvm::APInt(32, Priority);
1350 return llvm::X86::validateCPUSpecificCPUDispatch(Name);
1354 return llvm::X86::getCPUDispatchMangling(Name);
1360 llvm::X86::getFeaturesForCPU(Name, TargetCPUFeatures,
true);
1361 for (
auto &F : TargetCPUFeatures)
1362 Features.push_back(F);
1370 return llvm::StringSwitch<bool>(FeatureStr)
1371#define X86_VENDOR(ENUM, STRING) .Case(STRING, true)
1372#define X86_CPU_TYPE_ALIAS(ENUM, ALIAS) .Case(ALIAS, true)
1373#define X86_CPU_TYPE(ENUM, STR) .Case(STR, true)
1374#define X86_CPU_SUBTYPE_ALIAS(ENUM, ALIAS) .Case(ALIAS, true)
1375#define X86_CPU_SUBTYPE(ENUM, STR) .Case(STR, true)
1376#include "llvm/TargetParser/X86TargetParser.def"
1381 auto RV = llvm::StringSwitch<unsigned>(Name)
1550 using namespace llvm::X86;
1590 case CK_GoldmontPlus:
1595 case CK_SandyBridge:
1599 case CK_SkylakeClient:
1600 case CK_SkylakeServer:
1601 case CK_Cascadelake:
1606 case CK_SapphireRapids:
1607 case CK_IcelakeClient:
1609 case CK_IcelakeServer:
1616 case CK_Pantherlake:
1617 case CK_Wildcatlake:
1618 case CK_Sierraforest:
1620 case CK_Graniterapids:
1621 case CK_GraniterapidsD:
1622 case CK_Emeraldrapids:
1623 case CK_Clearwaterforest:
1624 case CK_Diamondrapids:
1661 return std::nullopt;
1663 llvm_unreachable(
"Unknown CPU kind");
1667 StringRef Constraint,
1668 unsigned Size)
const {
1670 Constraint = Constraint.ltrim(
"=+&");
1676 StringRef Constraint,
1677 unsigned Size)
const {
1682 StringRef Constraint,
1683 unsigned Size)
const {
1684 switch (Constraint[0]) {
1697 switch (Constraint[1]) {
1708 return Size <= 512U;
1711 return Size <= 256U;
1713 return Size <= 128U;
1719 if (SSELevel < SSE2)
1728 return Size <= 512U;
1731 return Size <= 256U;
1732 return Size <= 128U;
1740 switch (*Constraint) {
1743 std::string Converted =
"{" + std::string(Constraint, Len) +
"}";
1744 Constraint += Len - 1;
1747 return std::string(1, *Constraint);
1749 return std::string(
"{ax}");
1751 return std::string(
"{bx}");
1753 return std::string(
"{cx}");
1755 return std::string(
"{dx}");
1757 return std::string(
"{si}");
1759 return std::string(
"{di}");
1761 return std::string(
"p");
1763 return std::string(
"{st}");
1765 return std::string(
"{st(1)}");
1767 assert(Constraint[1] ==
's');
1768 return '^' + std::string(Constraint++, 2);
1770 switch (Constraint[1]) {
1785 return std::string(
"^") + std::string(Constraint++, 2);
1789 switch (Constraint[1]) {
1800 return std::string(
"^") + std::string(Constraint++, 2);
1804 return std::string(1, *Constraint);
1809 bool Only64Bit =
getTriple().getArch() != llvm::Triple::x86;
1810 llvm::X86::fillValidCPUArchList(Values, Only64Bit);
1814 llvm::X86::fillValidTuneCPUList(Values);
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 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
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.
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