,
"dx",
"cx",
"bx",
"si",
"di",
"bp",
"sp",
46 "st",
"st(1)",
"st(2)",
"st(3)",
"st(4)",
"st(5)",
"st(6)",
"st(7)",
47 "argp",
"flags",
"fpcr",
"fpsr",
"dirflag",
"frame",
"xmm0",
"xmm1",
48 "xmm2",
"xmm3",
"xmm4",
"xmm5",
"xmm6",
"xmm7",
"mm0",
"mm1",
49 "mm2",
"mm3",
"mm4",
"mm5",
"mm6",
"mm7",
"r8",
"r9",
50 "r10",
"r11",
"r12",
"r13",
"r14",
"r15",
"xmm8",
"xmm9",
51 "xmm10",
"xmm11",
"xmm12",
"xmm13",
"xmm14",
"xmm15",
"ymm0",
"ymm1",
52 "ymm2",
"ymm3",
"ymm4",
"ymm5",
"ymm6",
"ymm7",
"ymm8",
"ymm9",
53 "ymm10",
"ymm11",
"ymm12",
"ymm13",
"ymm14",
"ymm15",
"xmm16",
"xmm17",
54 "xmm18",
"xmm19",
"xmm20",
"xmm21",
"xmm22",
"xmm23",
"xmm24",
"xmm25",
55 "xmm26",
"xmm27",
"xmm28",
"xmm29",
"xmm30",
"xmm31",
"ymm16",
"ymm17",
56 "ymm18",
"ymm19",
"ymm20",
"ymm21",
"ymm22",
"ymm23",
"ymm24",
"ymm25",
57 "ymm26",
"ymm27",
"ymm28",
"ymm29",
"ymm30",
"ymm31",
"zmm0",
"zmm1",
58 "zmm2",
"zmm3",
"zmm4",
"zmm5",
"zmm6",
"zmm7",
"zmm8",
"zmm9",
59 "zmm10",
"zmm11",
"zmm12",
"zmm13",
"zmm14",
"zmm15",
"zmm16",
"zmm17",
60 "zmm18",
"zmm19",
"zmm20",
"zmm21",
"zmm22",
"zmm23",
"zmm24",
"zmm25",
61 "zmm26",
"zmm27",
"zmm28",
"zmm29",
"zmm30",
"zmm31",
"k0",
"k1",
62 "k2",
"k3",
"k4",
"k5",
"k6",
"k7",
63 "cr0",
"cr2",
"cr3",
"cr4",
"cr8",
64 "dr0",
"dr1",
"dr2",
"dr3",
"dr6",
"dr7",
65 "bnd0",
"bnd1",
"bnd2",
"bnd3",
66 "tmm0",
"tmm1",
"tmm2",
"tmm3",
"tmm4",
"tmm5",
"tmm6",
"tmm7",
67 "r16",
"r17",
"r18",
"r19",
"r20",
"r21",
"r22",
"r23",
68 "r24",
"r25",
"r26",
"r27",
"r28",
"r29",
"r30",
"r31",
72{{
"al",
"ah",
"eax",
"rax"}, 0},
73{{
"bl",
"bh",
"ebx",
"rbx"}, 3},
74{{
"cl",
"ch",
"ecx",
"rcx"}, 2},
75{{
"dl",
"dh",
"edx",
"rdx"}, 1},
76{{
"esi",
"rsi"}, 4},
77{{
"edi",
"rdi"}, 5},
78{{
"esp",
"rsp"}, 7},
79{{
"ebp",
"rbp"}, 6},
80{{
"r8d",
"r8w",
"r8b"}, 38},
81{{
"r9d",
"r9w",
"r9b"}, 39},
82{{
"r10d",
"r10w",
"r10b"}, 40},
83{{
"r11d",
"r11w",
"r11b"}, 41},
84{{
"r12d",
"r12w",
"r12b"}, 42},
85{{
"r13d",
"r13w",
"r13b"}, 43},
86{{
"r14d",
"r14w",
"r14b"}, 44},
87{{
"r15d",
"r15w",
"r15b"}, 45},
88{{
"r16d",
"r16w",
"r16b"}, 165},
89{{
"r17d",
"r17w",
"r17b"}, 166},
90{{
"r18d",
"r18w",
"r18b"}, 167},
91{{
"r19d",
"r19w",
"r19b"}, 168},
92{{
"r20d",
"r20w",
"r20b"}, 169},
93{{
"r21d",
"r21w",
"r21b"}, 170},
94{{
"r22d",
"r22w",
"r22b"}, 171},
95{{
"r23d",
"r23w",
"r23b"}, 172},
96{{
"r24d",
"r24w",
"r24b"}, 173},
97{{
"r25d",
"r25w",
"r25b"}, 174},
98{{
"r26d",
"r26w",
"r26b"}, 175},
99{{
"r27d",
"r27w",
"r27b"}, 176},
100{{
"r28d",
"r28w",
"r28b"}, 177},
101{{
"r29d",
"r29w",
"r29b"}, 178},
102{{
"r30d",
"r30w",
"r30b"}, 179},
103{{
"r31d",
"r31w",
"r31b"}, 180},
108using namespace clang;
112 if(Name ==
"387") {
116 if(Name ==
"sse") {
125 conststd::vector<std::string> &FeaturesVec)
const{
128 if(
getTriple().getArch() == llvm::Triple::x86_64)
131 using namespacellvm::X86;
134getFeaturesForCPU(
CPU, CPUFeatures);
135 for(
auto&F : CPUFeatures)
138std::vector<std::string> UpdatedFeaturesVec;
139std::vector<std::string> UpdatedAVX10FeaturesVec;
140 enum{ FE_NOSET = -1, FE_FALSE, FE_TRUE };
141 intHasEVEX512 = FE_NOSET;
142 boolHasAVX512F = Features.lookup(
"avx512f");
143 boolHasAVX10 = Features.lookup(
"avx10.1-256");
144 boolHasAVX10_512 = Features.lookup(
"avx10.1-512");
145std::string LastAVX10;
146std::string LastAVX512;
147 for(
const auto&Feature : FeaturesVec) {
149 if(Feature ==
"+general-regs-only") {
150UpdatedFeaturesVec.push_back(
"-x87");
151UpdatedFeaturesVec.push_back(
"-mmx");
152UpdatedFeaturesVec.push_back(
"-sse");
156 if(Feature.substr(1, 6) ==
"avx10.") {
157 if(Feature[0] ==
'+') {
159 if(StringRef(Feature).ends_with(
"512"))
160HasAVX10_512 =
true;
162}
else if(HasAVX10 && Feature ==
"-avx10.1-256") {
164HasAVX10_512 =
false;
165}
else if(HasAVX10_512 && Feature ==
"-avx10.1-512") {
166HasAVX10_512 =
false;
169UpdatedAVX10FeaturesVec.push_back(Feature);
171}
else if(!HasAVX512F && StringRef(Feature).starts_with(
"+avx512")) {
173LastAVX512 = Feature;
174}
else if(HasAVX512F && Feature ==
"-avx512f") {
176}
else if(HasEVEX512 != FE_TRUE && Feature ==
"+evex512") {
177HasEVEX512 = FE_TRUE;
179}
else if(HasEVEX512 != FE_FALSE && Feature ==
"-evex512") {
180HasEVEX512 = FE_FALSE;
184UpdatedFeaturesVec.push_back(Feature);
186llvm::append_range(UpdatedFeaturesVec, UpdatedAVX10FeaturesVec);
189 if(!HasAVX10_512 && HasAVX512F) {
190UpdatedFeaturesVec.push_back(HasEVEX512 == FE_FALSE ?
"-evex512" 192 if(HasAVX10 && HasEVEX512 != FE_FALSE)
193Diags.
Report(diag::warn_invalid_feature_combination)
194<< LastAVX512 +
" "+ LastAVX10 +
"; will be promoted to avx10.1-512";
195}
else if(HasAVX10) {
196 if(!HasAVX512F && HasEVEX512 != FE_NOSET)
197Diags.
Report(diag::warn_invalid_feature_combination)
198<< LastAVX10 + (HasEVEX512 == FE_TRUE ?
" +evex512":
" -evex512");
199UpdatedFeaturesVec.push_back(HasAVX10_512 ?
"+evex512":
"-evex512");
209 autoI = Features.find(
"sse4.2");
210 if(I != Features.end() && I->getValue() &&
211!llvm::is_contained(UpdatedFeaturesVec,
"-popcnt"))
212Features[
"popcnt"] =
true;
216I = Features.find(
"sse");
217 if(I != Features.end() && I->getValue() &&
218!llvm::is_contained(UpdatedFeaturesVec,
"-mmx"))
219Features[
"mmx"] =
true;
222I = Features.find(
"avx");
223 if(I != Features.end() && I->getValue() &&
224!llvm::is_contained(UpdatedFeaturesVec,
"-xsave"))
225Features[
"xsave"] =
true;
228I = Features.find(
"sse4.2");
229 if(I != Features.end() && I->getValue() &&
230!llvm::is_contained(UpdatedFeaturesVec,
"-crc32"))
231Features[
"crc32"] =
true;
237StringRef Name,
boolEnabled)
const{
238 if(Name ==
"sse4") {
249Features[Name] = Enabled;
250llvm::X86::updateImpliedFeatures(Name, Enabled, Features);
257 for(
const auto&Feature : Features) {
258 if(Feature[0] !=
'+')
261 if(Feature ==
"+mmx") {
263}
else if(Feature ==
"+aes") {
265}
else if(Feature ==
"+vaes") {
267}
else if(Feature ==
"+pclmul") {
269}
else if(Feature ==
"+vpclmulqdq") {
270HasVPCLMULQDQ =
true;
271}
else if(Feature ==
"+lzcnt") {
273}
else if(Feature ==
"+rdrnd") {
275}
else if(Feature ==
"+fsgsbase") {
277}
else if(Feature ==
"+bmi") {
279}
else if(Feature ==
"+bmi2") {
281}
else if(Feature ==
"+popcnt") {
283}
else if(Feature ==
"+rtm") {
285}
else if(Feature ==
"+prfchw") {
287}
else if(Feature ==
"+rdseed") {
289}
else if(Feature ==
"+adx") {
291}
else if(Feature ==
"+tbm") {
293}
else if(Feature ==
"+lwp") {
295}
else if(Feature ==
"+fma") {
297}
else if(Feature ==
"+f16c") {
299}
else if(Feature ==
"+gfni") {
301}
else if(Feature ==
"+evex512") {
303}
else if(Feature ==
"+avx10.1-256") {
305}
else if(Feature ==
"+avx10.1-512") {
306HasAVX10_1_512 =
true;
307}
else if(Feature ==
"+avx10.2-256") {
310}
else if(Feature ==
"+avx10.2-512") {
311HasAVX10_2_512 =
true;
312}
else if(Feature ==
"+avx512cd") {
314}
else if(Feature ==
"+avx512vpopcntdq") {
315HasAVX512VPOPCNTDQ =
true;
316}
else if(Feature ==
"+avx512vnni") {
317HasAVX512VNNI =
true;
318}
else if(Feature ==
"+avx512bf16") {
319HasAVX512BF16 =
true;
320}
else if(Feature ==
"+avx512fp16") {
321HasAVX512FP16 =
true;
323}
else if(Feature ==
"+avx512dq") {
325}
else if(Feature ==
"+avx512bitalg") {
326HasAVX512BITALG =
true;
327}
else if(Feature ==
"+avx512bw") {
329}
else if(Feature ==
"+avx512vl") {
331}
else if(Feature ==
"+avx512vbmi") {
332HasAVX512VBMI =
true;
333}
else if(Feature ==
"+avx512vbmi2") {
334HasAVX512VBMI2 =
true;
335}
else if(Feature ==
"+avx512ifma") {
336HasAVX512IFMA =
true;
337}
else if(Feature ==
"+avx512vp2intersect") {
338HasAVX512VP2INTERSECT =
true;
339}
else if(Feature ==
"+sha") {
341}
else if(Feature ==
"+sha512") {
343}
else if(Feature ==
"+shstk") {
345}
else if(Feature ==
"+sm3") {
347}
else if(Feature ==
"+sm4") {
349}
else if(Feature ==
"+movbe") {
351}
else if(Feature ==
"+movrs") {
353}
else if(Feature ==
"+sgx") {
355}
else if(Feature ==
"+cx8") {
357}
else if(Feature ==
"+cx16") {
359}
else if(Feature ==
"+fxsr") {
361}
else if(Feature ==
"+xsave") {
363}
else if(Feature ==
"+xsaveopt") {
365}
else if(Feature ==
"+xsavec") {
367}
else if(Feature ==
"+xsaves") {
369}
else if(Feature ==
"+mwaitx") {
371}
else if(Feature ==
"+pku") {
373}
else if(Feature ==
"+clflushopt") {
374HasCLFLUSHOPT =
true;
375}
else if(Feature ==
"+clwb") {
377}
else if(Feature ==
"+wbnoinvd") {
379}
else if(Feature ==
"+prefetchi") {
380HasPREFETCHI =
true;
381}
else if(Feature ==
"+clzero") {
383}
else if(Feature ==
"+cldemote") {
385}
else if(Feature ==
"+rdpid") {
387}
else if(Feature ==
"+rdpru") {
389}
else if(Feature ==
"+kl") {
391}
else if(Feature ==
"+widekl") {
393}
else if(Feature ==
"+retpoline-external-thunk") {
394HasRetpolineExternalThunk =
true;
395}
else if(Feature ==
"+sahf") {
397}
else if(Feature ==
"+waitpkg") {
399}
else if(Feature ==
"+movdiri") {
401}
else if(Feature ==
"+movdir64b") {
402HasMOVDIR64B =
true;
403}
else if(Feature ==
"+pconfig") {
405}
else if(Feature ==
"+ptwrite") {
407}
else if(Feature ==
"+invpcid") {
409}
else if(Feature ==
"+enqcmd") {
411}
else if(Feature ==
"+hreset") {
413}
else if(Feature ==
"+amx-bf16") {
415}
else if(Feature ==
"+amx-fp16") {
417}
else if(Feature ==
"+amx-int8") {
419}
else if(Feature ==
"+amx-tile") {
421}
else if(Feature ==
"+amx-complex") {
422HasAMXCOMPLEX =
true;
423}
else if(Feature ==
"+amx-fp8") {
425}
else if(Feature ==
"+amx-movrs") {
427}
else if(Feature ==
"+amx-transpose") {
428HasAMXTRANSPOSE =
true;
429}
else if(Feature ==
"+amx-avx512") {
430HasAMXAVX512 =
true;
431}
else if(Feature ==
"+amx-tf32") {
433}
else if(Feature ==
"+cmpccxadd") {
434HasCMPCCXADD =
true;
435}
else if(Feature ==
"+raoint") {
437}
else if(Feature ==
"+avxifma") {
439}
else if(Feature ==
"+avxneconvert") {
440HasAVXNECONVERT=
true;
441}
else if(Feature ==
"+avxvnni") {
443}
else if(Feature ==
"+avxvnniint16") {
444HasAVXVNNIINT16 =
true;
445}
else if(Feature ==
"+avxvnniint8") {
446HasAVXVNNIINT8 =
true;
447}
else if(Feature ==
"+serialize") {
448HasSERIALIZE =
true;
449}
else if(Feature ==
"+tsxldtrk") {
451}
else if(Feature ==
"+uintr") {
453}
else if(Feature ==
"+usermsr") {
455}
else if(Feature ==
"+crc32") {
457}
else if(Feature ==
"+x87") {
459}
else if(Feature ==
"+fullbf16") {
461}
else if(Feature ==
"+egpr") {
463}
else if(Feature ==
"+inline-asm-use-gpr32") {
464HasInlineAsmUseGPR32 =
true;
465}
else if(Feature ==
"+push2pop2") {
466HasPush2Pop2 =
true;
467}
else if(Feature ==
"+ppx") {
469}
else if(Feature ==
"+ndd") {
471}
else if(Feature ==
"+ccmp") {
473}
else if(Feature ==
"+nf") {
475}
else if(Feature ==
"+cf") {
477}
else if(Feature ==
"+zu") {
479}
else if(Feature ==
"+branch-hint") {
480HasBranchHint =
true;
483X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
484.Case(
"+avx512f", AVX512F)
485.Case(
"+avx2", AVX2)
487.Case(
"+sse4.2", SSE42)
488.Case(
"+sse4.1", SSE41)
489.Case(
"+ssse3", SSSE3)
490.Case(
"+sse3", SSE3)
491.Case(
"+sse2", SSE2)
492.Case(
"+sse", SSE1)
494SSELevel = std::max(SSELevel, Level);
509XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
511.Case(
"+fma4", FMA4)
512.Case(
"+sse4a", SSE4A)
514XOPLevel = std::max(XOPLevel, XLevel);
521Diags.
Report(diag::err_target_unsupported_fpmath)
539Builder.defineMacro(
"__GCC_ASM_FLAG_OUTPUTS__");
542 if(CodeModel ==
"default")
543CodeModel =
"small";
544Builder.defineMacro(
"__code_model_"+ CodeModel +
"__");
547 if(
getTriple().getArch() == llvm::Triple::x86_64) {
548Builder.defineMacro(
"__amd64__");
549Builder.defineMacro(
"__amd64");
550Builder.defineMacro(
"__x86_64");
551Builder.defineMacro(
"__x86_64__");
552 if(
getTriple().getArchName() ==
"x86_64h") {
553Builder.defineMacro(
"__x86_64h");
554Builder.defineMacro(
"__x86_64h__");
560Builder.defineMacro(
"__SEG_GS");
561Builder.defineMacro(
"__SEG_FS");
562Builder.defineMacro(
"__seg_gs",
"__attribute__((address_space(256)))");
563Builder.defineMacro(
"__seg_fs",
"__attribute__((address_space(257)))");
568 using namespacellvm::X86;
574Builder.defineMacro(
"__tune_i386__");
583Builder.defineMacro(
"__pentium_mmx__");
584Builder.defineMacro(
"__tune_pentium_mmx__");
593Builder.defineMacro(
"__tune_pentium3__");
597Builder.defineMacro(
"__tune_pentium2__");
625 caseCK_GoldmontPlus:
639 caseCK_SkylakeClient:
640 caseCK_SkylakeServer:
644 caseCK_IcelakeClient:
646 caseCK_IcelakeServer:
648 caseCK_SapphireRapids:
656 caseCK_Sierraforest:
658 caseCK_Graniterapids:
659 caseCK_GraniterapidsD:
660 caseCK_Emeraldrapids:
661 caseCK_Clearwaterforest:
662 caseCK_Diamondrapids:
676Builder.defineMacro(
"__tune_lakemont__");
679Builder.defineMacro(
"__k6_2__");
680Builder.defineMacro(
"__tune_k6_2__");
683 if(
CPU!= CK_K6_2) {
687Builder.defineMacro(
"__k6_3__");
688Builder.defineMacro(
"__tune_k6_3__");
697 if(SSELevel != NoSSE) {
698Builder.defineMacro(
"__athlon_sse__");
699Builder.defineMacro(
"__tune_athlon_sse__");
753Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
758Builder.defineMacro(
"__NO_MATH_INLINES");
761Builder.defineMacro(
"__AES__");
764Builder.defineMacro(
"__VAES__");
767Builder.defineMacro(
"__PCLMUL__");
770Builder.defineMacro(
"__VPCLMULQDQ__");
774 if(HasLAHFSAHF ||
getTriple().getArch() == llvm::Triple::x86)
775Builder.defineMacro(
"__LAHF_SAHF__");
778Builder.defineMacro(
"__LZCNT__");
781Builder.defineMacro(
"__RDRND__");
784Builder.defineMacro(
"__FSGSBASE__");
787Builder.defineMacro(
"__BMI__");
790Builder.defineMacro(
"__BMI2__");
793Builder.defineMacro(
"__POPCNT__");
796Builder.defineMacro(
"__RTM__");
799Builder.defineMacro(
"__PRFCHW__");
802Builder.defineMacro(
"__RDSEED__");
805Builder.defineMacro(
"__ADX__");
808Builder.defineMacro(
"__TBM__");
811Builder.defineMacro(
"__LWP__");
814Builder.defineMacro(
"__MWAITX__");
817Builder.defineMacro(
"__MOVBE__");
821Builder.defineMacro(
"__XOP__");
824Builder.defineMacro(
"__FMA4__");
827Builder.defineMacro(
"__SSE4A__");
834Builder.defineMacro(
"__FMA__");
837Builder.defineMacro(
"__F16C__");
840Builder.defineMacro(
"__GFNI__");
843Builder.defineMacro(
"__EVEX512__");
845Builder.defineMacro(
"__AVX10_1__");
847Builder.defineMacro(
"__AVX10_1_512__");
849Builder.defineMacro(
"__AVX10_2__");
851Builder.defineMacro(
"__AVX10_2_512__");
853Builder.defineMacro(
"__AVX512CD__");
854 if(HasAVX512VPOPCNTDQ)
855Builder.defineMacro(
"__AVX512VPOPCNTDQ__");
857Builder.defineMacro(
"__AVX512VNNI__");
859Builder.defineMacro(
"__AVX512BF16__");
861Builder.defineMacro(
"__AVX512FP16__");
863Builder.defineMacro(
"__AVX512DQ__");
865Builder.defineMacro(
"__AVX512BITALG__");
867Builder.defineMacro(
"__AVX512BW__");
869Builder.defineMacro(
"__AVX512VL__");
870Builder.defineMacro(
"__EVEX256__");
873Builder.defineMacro(
"__AVX512VBMI__");
875Builder.defineMacro(
"__AVX512VBMI2__");
877Builder.defineMacro(
"__AVX512IFMA__");
878 if(HasAVX512VP2INTERSECT)
879Builder.defineMacro(
"__AVX512VP2INTERSECT__");
881Builder.defineMacro(
"__SHA__");
883Builder.defineMacro(
"__SHA512__");
886Builder.defineMacro(
"__FXSR__");
888Builder.defineMacro(
"__XSAVE__");
890Builder.defineMacro(
"__XSAVEOPT__");
892Builder.defineMacro(
"__XSAVEC__");
894Builder.defineMacro(
"__XSAVES__");
896Builder.defineMacro(
"__PKU__");
898Builder.defineMacro(
"__CLFLUSHOPT__");
900Builder.defineMacro(
"__CLWB__");
902Builder.defineMacro(
"__WBNOINVD__");
904Builder.defineMacro(
"__SHSTK__");
906Builder.defineMacro(
"__SGX__");
908Builder.defineMacro(
"__SM3__");
910Builder.defineMacro(
"__SM4__");
912Builder.defineMacro(
"__PREFETCHI__");
914Builder.defineMacro(
"__CLZERO__");
916Builder.defineMacro(
"__KL__");
918Builder.defineMacro(
"__WIDEKL__");
920Builder.defineMacro(
"__RDPID__");
922Builder.defineMacro(
"__RDPRU__");
924Builder.defineMacro(
"__CLDEMOTE__");
926Builder.defineMacro(
"__WAITPKG__");
928Builder.defineMacro(
"__MOVDIRI__");
930Builder.defineMacro(
"__MOVDIR64B__");
932Builder.defineMacro(
"__MOVRS__");
934Builder.defineMacro(
"__PCONFIG__");
936Builder.defineMacro(
"__PTWRITE__");
938Builder.defineMacro(
"__INVPCID__");
940Builder.defineMacro(
"__ENQCMD__");
942Builder.defineMacro(
"__HRESET__");
944Builder.defineMacro(
"__AMX_TILE__");
946Builder.defineMacro(
"__AMX_INT8__");
948Builder.defineMacro(
"__AMX_BF16__");
950Builder.defineMacro(
"__AMX_FP16__");
952Builder.defineMacro(
"__AMX_COMPLEX__");
954Builder.defineMacro(
"__AMX_FP8__");
956Builder.defineMacro(
"__AMX_MOVRS__");
958Builder.defineMacro(
"__AMX_TRANSPOSE__");
960Builder.defineMacro(
"__AMX_AVX512__");
962Builder.defineMacro(
"__AMX_TF32__");
964Builder.defineMacro(
"__CMPCCXADD__");
966Builder.defineMacro(
"__RAOINT__");
968Builder.defineMacro(
"__AVXIFMA__");
970Builder.defineMacro(
"__AVXNECONVERT__");
972Builder.defineMacro(
"__AVXVNNI__");
974Builder.defineMacro(
"__AVXVNNIINT16__");
976Builder.defineMacro(
"__AVXVNNIINT8__");
978Builder.defineMacro(
"__SERIALIZE__");
980Builder.defineMacro(
"__TSXLDTRK__");
982Builder.defineMacro(
"__UINTR__");
984Builder.defineMacro(
"__USERMSR__");
986Builder.defineMacro(
"__CRC32__");
988Builder.defineMacro(
"__EGPR__");
990Builder.defineMacro(
"__PUSH2POP2__");
992Builder.defineMacro(
"__PPX__");
994Builder.defineMacro(
"__NDD__");
996Builder.defineMacro(
"__CCMP__");
998Builder.defineMacro(
"__NF__");
1000Builder.defineMacro(
"__CF__");
1002Builder.defineMacro(
"__ZU__");
1003 if(HasEGPR && HasPush2Pop2 && HasPPX && HasNDD && HasCCMP && HasNF &&
1005Builder.defineMacro(
"__APX_F__");
1006 if(HasEGPR && HasInlineAsmUseGPR32)
1007Builder.defineMacro(
"__APX_INLINE_ASM_USE_GPR32__");
1012Builder.defineMacro(
"__AVX512F__");
1015Builder.defineMacro(
"__AVX2__");
1018Builder.defineMacro(
"__AVX__");
1021Builder.defineMacro(
"__SSE4_2__");
1024Builder.defineMacro(
"__SSE4_1__");
1027Builder.defineMacro(
"__SSSE3__");
1030Builder.defineMacro(
"__SSE3__");
1033Builder.defineMacro(
"__SSE2__");
1034Builder.defineMacro(
"__SSE2_MATH__");
1037Builder.defineMacro(
"__SSE__");
1038Builder.defineMacro(
"__SSE_MATH__");
1044 if(Opts.MicrosoftExt &&
getTriple().getArch() == llvm::Triple::x86) {
1054Builder.defineMacro(
"_M_IX86_FP", Twine(2));
1057Builder.defineMacro(
"_M_IX86_FP", Twine(1));
1060Builder.defineMacro(
"_M_IX86_FP", Twine(0));
1067Builder.defineMacro(
"__MMX__");
1070 if(
CPU>= CK_i486 ||
CPU== CK_None) {
1071Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1072Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1073Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1076Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
1077 if(HasCX16 &&
getTriple().getArch() == llvm::Triple::x86_64)
1078Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
1081Builder.defineMacro(
"__SIZEOF_FLOAT128__",
"16");
1085 returnllvm::StringSwitch<bool>(Name)
1086.Case(
"adx",
true)
1087.Case(
"aes",
true)
1088.Case(
"amx-avx512",
true)
1089.Case(
"amx-bf16",
true)
1090.Case(
"amx-complex",
true)
1091.Case(
"amx-fp16",
true)
1092.Case(
"amx-fp8",
true)
1093.Case(
"amx-int8",
true)
1094.Case(
"amx-movrs",
true)
1095.Case(
"amx-tf32",
true)
1096.Case(
"amx-tile",
true)
1097.Case(
"amx-transpose",
true)
1098.Case(
"avx",
true)
1099.Case(
"avx10.1-256",
true)
1100.Case(
"avx10.1-512",
true)
1101.Case(
"avx10.2-256",
true)
1102.Case(
"avx10.2-512",
true)
1103.Case(
"avx2",
true)
1104.Case(
"avx512f",
true)
1105.Case(
"avx512cd",
true)
1106.Case(
"avx512vpopcntdq",
true)
1107.Case(
"avx512vnni",
true)
1108.Case(
"avx512bf16",
true)
1109.Case(
"avx512fp16",
true)
1110.Case(
"avx512dq",
true)
1111.Case(
"avx512bitalg",
true)
1112.Case(
"avx512bw",
true)
1113.Case(
"avx512vl",
true)
1114.Case(
"avx512vbmi",
true)
1115.Case(
"avx512vbmi2",
true)
1116.Case(
"avx512ifma",
true)
1117.Case(
"avx512vp2intersect",
true)
1118.Case(
"avxifma",
true)
1119.Case(
"avxneconvert",
true)
1120.Case(
"avxvnni",
true)
1121.Case(
"avxvnniint16",
true)
1122.Case(
"avxvnniint8",
true)
1123.Case(
"bmi",
true)
1124.Case(
"bmi2",
true)
1125.Case(
"cldemote",
true)
1126.Case(
"clflushopt",
true)
1127.Case(
"clwb",
true)
1128.Case(
"clzero",
true)
1129.Case(
"cmpccxadd",
true)
1130.Case(
"crc32",
true)
1131.Case(
"cx16",
true)
1132.Case(
"enqcmd",
true)
1133.Case(
"evex512",
true)
1134.Case(
"f16c",
true)
1135.Case(
"fma",
true)
1136.Case(
"fma4",
true)
1137.Case(
"fsgsbase",
true)
1138.Case(
"fxsr",
true)
1139.Case(
"general-regs-only",
true)
1140.Case(
"gfni",
true)
1141.Case(
"hreset",
true)
1142.Case(
"invpcid",
true)
1143.Case(
"kl",
true)
1144.Case(
"widekl",
true)
1145.Case(
"lwp",
true)
1146.Case(
"lzcnt",
true)
1147.Case(
"mmx",
true)
1148.Case(
"movbe",
true)
1149.Case(
"movrs",
true)
1150.Case(
"movdiri",
true)
1151.Case(
"movdir64b",
true)
1152.Case(
"mwaitx",
true)
1153.Case(
"pclmul",
true)
1154.Case(
"pconfig",
true)
1155.Case(
"pku",
true)
1156.Case(
"popcnt",
true)
1157.Case(
"prefer-256-bit",
true)
1158.Case(
"prefetchi",
true)
1159.Case(
"prfchw",
true)
1160.Case(
"ptwrite",
true)
1161.Case(
"raoint",
true)
1162.Case(
"rdpid",
true)
1163.Case(
"rdpru",
true)
1164.Case(
"rdrnd",
true)
1165.Case(
"rdseed",
true)
1166.Case(
"rtm",
true)
1167.Case(
"sahf",
true)
1168.Case(
"serialize",
true)
1169.Case(
"sgx",
true)
1170.Case(
"sha",
true)
1171.Case(
"sha512",
true)
1172.Case(
"shstk",
true)
1173.Case(
"sm3",
true)
1174.Case(
"sm4",
true)
1175.Case(
"sse",
true)
1176.Case(
"sse2",
true)
1177.Case(
"sse3",
true)
1178.Case(
"ssse3",
true)
1179.Case(
"sse4",
true)
1180.Case(
"sse4.1",
true)
1181.Case(
"sse4.2",
true)
1182.Case(
"sse4a",
true)
1183.Case(
"tbm",
true)
1184.Case(
"tsxldtrk",
true)
1185.Case(
"uintr",
true)
1186.Case(
"usermsr",
true)
1187.Case(
"vaes",
true)
1188.Case(
"vpclmulqdq",
true)
1189.Case(
"wbnoinvd",
true)
1190.Case(
"waitpkg",
true)
1191.Case(
"x87",
true)
1192.Case(
"xop",
true)
1193.Case(
"xsave",
true)
1194.Case(
"xsavec",
true)
1195.Case(
"xsaves",
true)
1196.Case(
"xsaveopt",
true)
1197.Case(
"egpr",
true)
1198.Case(
"push2pop2",
true)
1199.Case(
"ppx",
true)
1200.Case(
"ndd",
true)
1201.Case(
"ccmp",
true)
1202.Case(
"nf",
true)
1203.Case(
"cf",
true)
1204.Case(
"zu",
true)
1209 returnllvm::StringSwitch<bool>(Feature)
1210.Case(
"adx", HasADX)
1211.Case(
"aes", HasAES)
1212.Case(
"amx-avx512", HasAMXAVX512)
1213.Case(
"amx-bf16", HasAMXBF16)
1214.Case(
"amx-complex", HasAMXCOMPLEX)
1215.Case(
"amx-fp16", HasAMXFP16)
1216.Case(
"amx-fp8", HasAMXFP8)
1217.Case(
"amx-int8", HasAMXINT8)
1218.Case(
"amx-movrs", HasAMXMOVRS)
1219.Case(
"amx-tf32", HasAMXTF32)
1220.Case(
"amx-tile", HasAMXTILE)
1221.Case(
"amx-transpose", HasAMXTRANSPOSE)
1222.Case(
"avx", SSELevel >= AVX)
1223.Case(
"avx10.1-256", HasAVX10_1)
1224.Case(
"avx10.1-512", HasAVX10_1_512)
1225.Case(
"avx10.2-256", HasAVX10_2)
1226.Case(
"avx10.2-512", HasAVX10_2_512)
1227.Case(
"avx2", SSELevel >= AVX2)
1228.Case(
"avx512f", SSELevel >= AVX512F)
1229.Case(
"avx512cd", HasAVX512CD)
1230.Case(
"avx512vpopcntdq", HasAVX512VPOPCNTDQ)
1231.Case(
"avx512vnni", HasAVX512VNNI)
1232.Case(
"avx512bf16", HasAVX512BF16)
1233.Case(
"avx512fp16", HasAVX512FP16)
1234.Case(
"avx512dq", HasAVX512DQ)
1235.Case(
"avx512bitalg", HasAVX512BITALG)
1236.Case(
"avx512bw", HasAVX512BW)
1237.Case(
"avx512vl", HasAVX512VL)
1238.Case(
"avx512vbmi", HasAVX512VBMI)
1239.Case(
"avx512vbmi2", HasAVX512VBMI2)
1240.Case(
"avx512ifma", HasAVX512IFMA)
1241.Case(
"avx512vp2intersect", HasAVX512VP2INTERSECT)
1242.Case(
"avxifma", HasAVXIFMA)
1243.Case(
"avxneconvert", HasAVXNECONVERT)
1244.Case(
"avxvnni", HasAVXVNNI)
1245.Case(
"avxvnniint16", HasAVXVNNIINT16)
1246.Case(
"avxvnniint8", HasAVXVNNIINT8)
1247.Case(
"bmi", HasBMI)
1248.Case(
"bmi2", HasBMI2)
1249.Case(
"cldemote", HasCLDEMOTE)
1250.Case(
"clflushopt", HasCLFLUSHOPT)
1251.Case(
"clwb", HasCLWB)
1252.Case(
"clzero", HasCLZERO)
1253.Case(
"cmpccxadd", HasCMPCCXADD)
1254.Case(
"crc32", HasCRC32)
1255.Case(
"cx8", HasCX8)
1256.Case(
"cx16", HasCX16)
1257.Case(
"enqcmd", HasENQCMD)
1258.Case(
"evex512", HasEVEX512)
1259.Case(
"f16c", HasF16C)
1260.Case(
"fma", HasFMA)
1261.Case(
"fma4", XOPLevel >= FMA4)
1262.Case(
"fsgsbase", HasFSGSBASE)
1263.Case(
"fxsr", HasFXSR)
1264.Case(
"gfni", HasGFNI)
1265.Case(
"hreset", HasHRESET)
1266.Case(
"invpcid", HasINVPCID)
1267.Case(
"kl", HasKL)
1268.Case(
"widekl", HasWIDEKL)
1269.Case(
"lwp", HasLWP)
1270.Case(
"lzcnt", HasLZCNT)
1271.Case(
"mmx", HasMMX)
1272.Case(
"movbe", HasMOVBE)
1273.Case(
"movrs", HasMOVRS)
1274.Case(
"movdiri", HasMOVDIRI)
1275.Case(
"movdir64b", HasMOVDIR64B)
1276.Case(
"mwaitx", HasMWAITX)
1277.Case(
"pclmul", HasPCLMUL)
1278.Case(
"pconfig", HasPCONFIG)
1279.Case(
"pku", HasPKU)
1280.Case(
"popcnt", HasPOPCNT)
1281.Case(
"prefetchi", HasPREFETCHI)
1282.Case(
"prfchw", HasPRFCHW)
1283.Case(
"ptwrite", HasPTWRITE)
1284.Case(
"raoint", HasRAOINT)
1285.Case(
"rdpid", HasRDPID)
1286.Case(
"rdpru", HasRDPRU)
1287.Case(
"rdrnd", HasRDRND)
1288.Case(
"rdseed", HasRDSEED)
1289.Case(
"retpoline-external-thunk", HasRetpolineExternalThunk)
1290.Case(
"rtm", HasRTM)
1291.Case(
"sahf", HasLAHFSAHF)
1292.Case(
"serialize", HasSERIALIZE)
1293.Case(
"sgx", HasSGX)
1294.Case(
"sha", HasSHA)
1295.Case(
"sha512", HasSHA512)
1296.Case(
"shstk", HasSHSTK)
1297.Case(
"sm3", HasSM3)
1298.Case(
"sm4", HasSM4)
1299.Case(
"sse", SSELevel >= SSE1)
1300.Case(
"sse2", SSELevel >= SSE2)
1301.Case(
"sse3", SSELevel >= SSE3)
1302.Case(
"ssse3", SSELevel >= SSSE3)
1303.Case(
"sse4.1", SSELevel >= SSE41)
1304.Case(
"sse4.2", SSELevel >= SSE42)
1305.Case(
"sse4a", XOPLevel >= SSE4A)
1306.Case(
"tbm", HasTBM)
1307.Case(
"tsxldtrk", HasTSXLDTRK)
1308.Case(
"uintr", HasUINTR)
1309.Case(
"usermsr", HasUSERMSR)
1310.Case(
"vaes", HasVAES)
1311.Case(
"vpclmulqdq", HasVPCLMULQDQ)
1312.Case(
"wbnoinvd", HasWBNOINVD)
1313.Case(
"waitpkg", HasWAITPKG)
1314.Case(
"x86",
true)
1315.Case(
"x86_32",
getTriple().getArch() == llvm::Triple::x86)
1316.Case(
"x86_64",
getTriple().getArch() == llvm::Triple::x86_64)
1317.Case(
"x87", HasX87)
1318.Case(
"xop", XOPLevel >= XOP)
1319.Case(
"xsave", HasXSAVE)
1320.Case(
"xsavec", HasXSAVEC)
1321.Case(
"xsaves", HasXSAVES)
1322.Case(
"xsaveopt", HasXSAVEOPT)
1324.Case(
"egpr", HasEGPR)
1325.Case(
"push2pop2", HasPush2Pop2)
1326.Case(
"ppx", HasPPX)
1327.Case(
"ndd", HasNDD)
1328.Case(
"ccmp", HasCCMP)
1329.Case(
"nf", HasNF)
1330.Case(
"cf", HasCF)
1331.Case(
"zu", HasZU)
1332.Case(
"branch-hint", HasBranchHint)
1342 returnllvm::StringSwitch<bool>(FeatureStr)
1343#define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY) .Case(STR, true) 1344#define X86_MICROARCH_LEVEL(ENUM, STR, PRIORITY) .Case(STR, true) 1345#include "llvm/TargetParser/X86TargetParser.def" 1350 returnllvm::StringSwitch<llvm::X86::ProcessorFeatures>(Name)
1351#define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY) \ 1352 .Case(STR, llvm::X86::FEATURE_##ENUM) 1354#include "llvm/TargetParser/X86TargetParser.def" 1361 autogetPriority = [](StringRef Feature) -> uint64_t {
1364 using namespacellvm::X86;
1365CPUKind Kind = parseArchX86(Feature);
1366 if(Kind != CK_None) {
1367ProcessorFeatures KeyFeature = getKeyFeature(Kind);
1368 return(getFeaturePriority(KeyFeature) << 1) + 1;
1372 returngetFeaturePriority(
getFeature(Feature)) << 1;
1376 for(StringRef Feature : Features)
1377 if(!Feature.empty())
1383 returnllvm::X86::validateCPUSpecificCPUDispatch(Name);
1387 returnllvm::X86::getCPUDispatchMangling(Name);
1393llvm::X86::getFeaturesForCPU(Name, TargetCPUFeatures,
true);
1394 for(
auto&F : TargetCPUFeatures)
1395Features.push_back(F);
1403 returnllvm::StringSwitch<bool>(FeatureStr)
1404#define X86_VENDOR(ENUM, STRING) .Case(STRING, true) 1405#define X86_CPU_TYPE_ALIAS(ENUM, ALIAS) .Case(ALIAS, true) 1406#define X86_CPU_TYPE(ENUM, STR) .Case(STR, true) 1407#define X86_CPU_SUBTYPE_ALIAS(ENUM, ALIAS) .Case(ALIAS, true) 1408#define X86_CPU_SUBTYPE(ENUM, STR) .Case(STR, true) 1409#include "llvm/TargetParser/X86TargetParser.def" 1414 autoRV = llvm::StringSwitch<unsigned>(Name)
1427.Case(
"@ccnae", 6)
1429.Case(
"@ccnbe", 6)
1434.Case(
"@ccnge", 6)
1436.Case(
"@ccnle", 6)
1582 using namespacellvm::X86;
1622 caseCK_GoldmontPlus:
1627 caseCK_SandyBridge:
1631 caseCK_SkylakeClient:
1632 caseCK_SkylakeServer:
1633 caseCK_Cascadelake:
1638 caseCK_SapphireRapids:
1639 caseCK_IcelakeClient:
1641 caseCK_IcelakeServer:
1648 caseCK_Pantherlake:
1649 caseCK_Sierraforest:
1651 caseCK_Graniterapids:
1652 caseCK_GraniterapidsD:
1653 caseCK_Emeraldrapids:
1654 caseCK_Clearwaterforest:
1655 caseCK_Diamondrapids:
1692 returnstd::nullopt;
1694llvm_unreachable(
"Unknown CPU kind");
1698StringRef Constraint,
1699 unsignedSize)
const{
1701Constraint = Constraint.ltrim(
"=+&");
1707StringRef Constraint,
1708 unsignedSize)
const{
1713StringRef Constraint,
1714 unsignedSize)
const{
1715 switch(Constraint[0]) {
1728 switch(Constraint[1]) {
1740 returnSize <= 512U;
1743 returnSize <= 256U;
1745 returnSize <= 128U;
1751 if(SSELevel < SSE2)
1762 returnSize <= 512U;
1765 returnSize <= 256U;
1766 returnSize <= 128U;
1774 switch(*Constraint) {
1777std::string Converted =
"{"+ std::string(Constraint, Len) +
"}";
1778Constraint += Len - 1;
1781 returnstd::string(1, *Constraint);
1783 returnstd::string(
"{ax}");
1785 returnstd::string(
"{bx}");
1787 returnstd::string(
"{cx}");
1789 returnstd::string(
"{dx}");
1791 returnstd::string(
"{si}");
1793 returnstd::string(
"{di}");
1795 returnstd::string(
"p");
1797 returnstd::string(
"{st}");
1799 returnstd::string(
"{st(1)}");
1801assert(Constraint[1] ==
's');
1802 return '^'+ std::string(Constraint++, 2);
1804 switch(Constraint[1]) {
1819 returnstd::string(
"^") + std::string(Constraint++, 2);
1823 switch(Constraint[1]) {
1834 returnstd::string(
"^") + std::string(Constraint++, 2);
1838 returnstd::string(1, *Constraint);
1843 boolOnly64Bit =
getTriple().getArch() != llvm::Triple::x86;
1844llvm::X86::fillValidCPUArchList(Values, Only64Bit);
1848llvm::X86::fillValidTuneCPUList(Values);
Defines the Diagnostic-related interfaces.
static unsigned matchAsmCCConstraint(const char *Name)
static llvm::X86::ProcessorFeatures getFeature(StringRef Name)
Defines enum values for all the target-independent builtin functions.
Enumerates target-specific builtins in their own namespaces within namespace clang.
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
TargetOptions & getTargetOpts() const
Retrieve the target options.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual bool hasFeatureEnabled(const llvm::StringMap< bool > &Features, StringRef Name) const
Check if target has a given feature enabled.
virtual bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeatureVec) const
Initialize the map with the default set of target features for the CPU this should include all legal ...
enum clang::targets::X86TargetInfo::FPMathKind FPMath
bool handleTargetFeatures(std::vector< std::string > &Features, DiagnosticsEngine &Diags) override
handleTargetFeatures - Perform initialization based on the user configured set of features.
std::optional< unsigned > getCPUCacheLineSize() const override
bool validateAsmConstraint(const char *&Name, TargetInfo::ConstraintInfo &info) const override
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
uint64_t getFMVPriority(ArrayRef< StringRef > Features) 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...
LLVM_LIBRARY_VISIBILITY void defineCPUMacros(clang::MacroBuilder &Builder, llvm::StringRef CPUName, bool Tuning=true)
static constexpr Builtin::Info BuiltinInfoX86[]
const TargetInfo::AddlRegName AddlRegNames[]
static const char *const GCCRegNames[]
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.
std::string ConstraintStr
void setRequiresImmediate(int Min, int Max)
const llvm::fltSemantics * LongDoubleFormat
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4