xref: /freebsd/contrib/llvm-project/clang/lib/Basic/Targets/X86.cpp (revision 1db9f3b21e39176dd5b67cf8ac378633b172463e)
1 //===--- X86.cpp - Implement X86 target feature support -------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements X86 TargetInfo objects.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "X86.h"
14 #include "clang/Basic/Builtins.h"
15 #include "clang/Basic/Diagnostic.h"
16 #include "clang/Basic/TargetBuiltins.h"
17 #include "llvm/ADT/StringExtras.h"
18 #include "llvm/ADT/StringRef.h"
19 #include "llvm/ADT/StringSwitch.h"
20 #include "llvm/TargetParser/X86TargetParser.h"
21 #include <optional>
22 
23 namespace clang {
24 namespace targets {
25 
26 static constexpr Builtin::Info BuiltinInfoX86[] = {
27 #define BUILTIN(ID, TYPE, ATTRS)                                               \
28   {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
29 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE)                               \
30   {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
31 #define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE)         \
32   {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::HEADER, LANGS},
33 #include "clang/Basic/BuiltinsX86.def"
34 
35 #define BUILTIN(ID, TYPE, ATTRS)                                               \
36   {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
37 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE)                               \
38   {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
39 #define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE)         \
40   {#ID, TYPE, ATTRS, FEATURE, HeaderDesc::HEADER, LANGS},
41 #include "clang/Basic/BuiltinsX86_64.def"
42 };
43 
44 static const char *const GCCRegNames[] = {
45     "ax",    "dx",    "cx",    "bx",    "si",      "di",    "bp",    "sp",
46     "st",    "st(1)", "st(2)", "st(3)", "st(4)",   "st(5)", "st(6)", "st(7)",
47     "argp",  "flags", "fpcr",  "fpsr",  "dirflag", "frame", "xmm0",  "xmm1",
48     "xmm2",  "xmm3",  "xmm4",  "xmm5",  "xmm6",    "xmm7",  "mm0",   "mm1",
49     "mm2",   "mm3",   "mm4",   "mm5",   "mm6",     "mm7",   "r8",    "r9",
50     "r10",   "r11",   "r12",   "r13",   "r14",     "r15",   "xmm8",  "xmm9",
51     "xmm10", "xmm11", "xmm12", "xmm13", "xmm14",   "xmm15", "ymm0",  "ymm1",
52     "ymm2",  "ymm3",  "ymm4",  "ymm5",  "ymm6",    "ymm7",  "ymm8",  "ymm9",
53     "ymm10", "ymm11", "ymm12", "ymm13", "ymm14",   "ymm15", "xmm16", "xmm17",
54     "xmm18", "xmm19", "xmm20", "xmm21", "xmm22",   "xmm23", "xmm24", "xmm25",
55     "xmm26", "xmm27", "xmm28", "xmm29", "xmm30",   "xmm31", "ymm16", "ymm17",
56     "ymm18", "ymm19", "ymm20", "ymm21", "ymm22",   "ymm23", "ymm24", "ymm25",
57     "ymm26", "ymm27", "ymm28", "ymm29", "ymm30",   "ymm31", "zmm0",  "zmm1",
58     "zmm2",  "zmm3",  "zmm4",  "zmm5",  "zmm6",    "zmm7",  "zmm8",  "zmm9",
59     "zmm10", "zmm11", "zmm12", "zmm13", "zmm14",   "zmm15", "zmm16", "zmm17",
60     "zmm18", "zmm19", "zmm20", "zmm21", "zmm22",   "zmm23", "zmm24", "zmm25",
61     "zmm26", "zmm27", "zmm28", "zmm29", "zmm30",   "zmm31", "k0",    "k1",
62     "k2",    "k3",    "k4",    "k5",    "k6",      "k7",
63     "cr0",   "cr2",   "cr3",   "cr4",   "cr8",
64     "dr0",   "dr1",   "dr2",   "dr3",   "dr6",     "dr7",
65     "bnd0",  "bnd1",  "bnd2",  "bnd3",
66     "tmm0",  "tmm1",  "tmm2",  "tmm3",  "tmm4",    "tmm5",  "tmm6",  "tmm7",
67 };
68 
69 const TargetInfo::AddlRegName AddlRegNames[] = {
70     {{"al", "ah", "eax", "rax"}, 0},
71     {{"bl", "bh", "ebx", "rbx"}, 3},
72     {{"cl", "ch", "ecx", "rcx"}, 2},
73     {{"dl", "dh", "edx", "rdx"}, 1},
74     {{"esi", "rsi"}, 4},
75     {{"edi", "rdi"}, 5},
76     {{"esp", "rsp"}, 7},
77     {{"ebp", "rbp"}, 6},
78     {{"r8d", "r8w", "r8b"}, 38},
79     {{"r9d", "r9w", "r9b"}, 39},
80     {{"r10d", "r10w", "r10b"}, 40},
81     {{"r11d", "r11w", "r11b"}, 41},
82     {{"r12d", "r12w", "r12b"}, 42},
83     {{"r13d", "r13w", "r13b"}, 43},
84     {{"r14d", "r14w", "r14b"}, 44},
85     {{"r15d", "r15w", "r15b"}, 45},
86 };
87 
88 } // namespace targets
89 } // namespace clang
90 
91 using namespace clang;
92 using namespace clang::targets;
93 
94 bool X86TargetInfo::setFPMath(StringRef Name) {
95   if (Name == "387") {
96     FPMath = FP_387;
97     return true;
98   }
99   if (Name == "sse") {
100     FPMath = FP_SSE;
101     return true;
102   }
103   return false;
104 }
105 
106 bool X86TargetInfo::initFeatureMap(
107     llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
108     const std::vector<std::string> &FeaturesVec) const {
109   // FIXME: This *really* should not be here.
110   // X86_64 always has SSE2.
111   if (getTriple().getArch() == llvm::Triple::x86_64)
112     setFeatureEnabled(Features, "sse2", true);
113 
114   using namespace llvm::X86;
115 
116   SmallVector<StringRef, 16> CPUFeatures;
117   getFeaturesForCPU(CPU, CPUFeatures);
118   for (auto &F : CPUFeatures)
119     setFeatureEnabled(Features, F, true);
120 
121   std::vector<std::string> UpdatedFeaturesVec;
122   std::vector<std::string> UpdatedAVX10FeaturesVec;
123   enum { FE_NOSET = -1, FE_FALSE, FE_TRUE };
124   int HasEVEX512 = FE_NOSET;
125   bool HasAVX512F = Features.lookup("avx512f");
126   bool HasAVX10 = Features.lookup("avx10.1-256");
127   bool HasAVX10_512 = Features.lookup("avx10.1-512");
128   std::string LastAVX10;
129   std::string LastAVX512;
130   for (const auto &Feature : FeaturesVec) {
131     // Expand general-regs-only to -x86, -mmx and -sse
132     if (Feature == "+general-regs-only") {
133       UpdatedFeaturesVec.push_back("-x87");
134       UpdatedFeaturesVec.push_back("-mmx");
135       UpdatedFeaturesVec.push_back("-sse");
136       continue;
137     }
138 
139     if (Feature.substr(1, 6) == "avx10.") {
140       if (Feature[0] == '+') {
141         HasAVX10 = true;
142         if (Feature.substr(Feature.size() - 3, 3) == "512")
143           HasAVX10_512 = true;
144         LastAVX10 = Feature;
145       } else if (HasAVX10 && Feature == "-avx10.1-256") {
146         HasAVX10 = false;
147         HasAVX10_512 = false;
148       } else if (HasAVX10_512 && Feature == "-avx10.1-512") {
149         HasAVX10_512 = false;
150       }
151       // Postpone AVX10 features handling after AVX512 settled.
152       UpdatedAVX10FeaturesVec.push_back(Feature);
153       continue;
154     } else if (!HasAVX512F && Feature.substr(0, 7) == "+avx512") {
155       HasAVX512F = true;
156       LastAVX512 = Feature;
157     } else if (HasAVX512F && Feature == "-avx512f") {
158       HasAVX512F = false;
159     } else if (HasEVEX512 != FE_TRUE && Feature == "+evex512") {
160       HasEVEX512 = FE_TRUE;
161       continue;
162     } else if (HasEVEX512 != FE_FALSE && Feature == "-evex512") {
163       HasEVEX512 = FE_FALSE;
164       continue;
165     }
166 
167     UpdatedFeaturesVec.push_back(Feature);
168   }
169   llvm::append_range(UpdatedFeaturesVec, UpdatedAVX10FeaturesVec);
170   // HasEVEX512 is a three-states flag. We need to turn it into [+-]evex512
171   // according to other features.
172   if (HasAVX512F) {
173     UpdatedFeaturesVec.push_back(HasEVEX512 == FE_FALSE ? "-evex512"
174                                                         : "+evex512");
175     if (HasAVX10 && !HasAVX10_512 && HasEVEX512 != FE_FALSE)
176       Diags.Report(diag::warn_invalid_feature_combination)
177           << LastAVX512 + " " + LastAVX10 + "; will be promoted to avx10.1-512";
178   } else if (HasAVX10) {
179     if (HasEVEX512 != FE_NOSET)
180       Diags.Report(diag::warn_invalid_feature_combination)
181           << LastAVX10 + (HasEVEX512 == FE_TRUE ? " +evex512" : " -evex512");
182     UpdatedFeaturesVec.push_back(HasAVX10_512 ? "+evex512" : "-evex512");
183   }
184 
185   if (!TargetInfo::initFeatureMap(Features, Diags, CPU, UpdatedFeaturesVec))
186     return false;
187 
188   // Can't do this earlier because we need to be able to explicitly enable
189   // or disable these features and the things that they depend upon.
190 
191   // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
192   auto I = Features.find("sse4.2");
193   if (I != Features.end() && I->getValue() &&
194       !llvm::is_contained(UpdatedFeaturesVec, "-popcnt"))
195     Features["popcnt"] = true;
196 
197   // Additionally, if SSE is enabled and mmx is not explicitly disabled,
198   // then enable MMX.
199   I = Features.find("sse");
200   if (I != Features.end() && I->getValue() &&
201       !llvm::is_contained(UpdatedFeaturesVec, "-mmx"))
202     Features["mmx"] = true;
203 
204   // Enable xsave if avx is enabled and xsave is not explicitly disabled.
205   I = Features.find("avx");
206   if (I != Features.end() && I->getValue() &&
207       !llvm::is_contained(UpdatedFeaturesVec, "-xsave"))
208     Features["xsave"] = true;
209 
210   // Enable CRC32 if SSE4.2 is enabled and CRC32 is not explicitly disabled.
211   I = Features.find("sse4.2");
212   if (I != Features.end() && I->getValue() &&
213       !llvm::is_contained(UpdatedFeaturesVec, "-crc32"))
214     Features["crc32"] = true;
215 
216   return true;
217 }
218 
219 void X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
220                                       StringRef Name, bool Enabled) const {
221   if (Name == "sse4") {
222     // We can get here via the __target__ attribute since that's not controlled
223     // via the -msse4/-mno-sse4 command line alias. Handle this the same way
224     // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
225     // disabled.
226     if (Enabled)
227       Name = "sse4.2";
228     else
229       Name = "sse4.1";
230   }
231 
232   Features[Name] = Enabled;
233   llvm::X86::updateImpliedFeatures(Name, Enabled, Features);
234 }
235 
236 /// handleTargetFeatures - Perform initialization based on the user
237 /// configured set of features.
238 bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
239                                          DiagnosticsEngine &Diags) {
240   for (const auto &Feature : Features) {
241     if (Feature[0] != '+')
242       continue;
243 
244     if (Feature == "+aes") {
245       HasAES = true;
246     } else if (Feature == "+vaes") {
247       HasVAES = true;
248     } else if (Feature == "+pclmul") {
249       HasPCLMUL = true;
250     } else if (Feature == "+vpclmulqdq") {
251       HasVPCLMULQDQ = true;
252     } else if (Feature == "+lzcnt") {
253       HasLZCNT = true;
254     } else if (Feature == "+rdrnd") {
255       HasRDRND = true;
256     } else if (Feature == "+fsgsbase") {
257       HasFSGSBASE = true;
258     } else if (Feature == "+bmi") {
259       HasBMI = true;
260     } else if (Feature == "+bmi2") {
261       HasBMI2 = true;
262     } else if (Feature == "+popcnt") {
263       HasPOPCNT = true;
264     } else if (Feature == "+rtm") {
265       HasRTM = true;
266     } else if (Feature == "+prfchw") {
267       HasPRFCHW = true;
268     } else if (Feature == "+rdseed") {
269       HasRDSEED = true;
270     } else if (Feature == "+adx") {
271       HasADX = true;
272     } else if (Feature == "+tbm") {
273       HasTBM = true;
274     } else if (Feature == "+lwp") {
275       HasLWP = true;
276     } else if (Feature == "+fma") {
277       HasFMA = true;
278     } else if (Feature == "+f16c") {
279       HasF16C = true;
280     } else if (Feature == "+gfni") {
281       HasGFNI = true;
282     } else if (Feature == "+evex512") {
283       HasEVEX512 = true;
284     } else if (Feature == "+avx10.1-256") {
285       HasAVX10_1 = true;
286     } else if (Feature == "+avx10.1-512") {
287       HasAVX10_1_512 = true;
288     } else if (Feature == "+avx512cd") {
289       HasAVX512CD = true;
290     } else if (Feature == "+avx512vpopcntdq") {
291       HasAVX512VPOPCNTDQ = true;
292     } else if (Feature == "+avx512vnni") {
293       HasAVX512VNNI = true;
294     } else if (Feature == "+avx512bf16") {
295       HasAVX512BF16 = true;
296     } else if (Feature == "+avx512er") {
297       HasAVX512ER = true;
298       Diags.Report(diag::warn_knl_knm_isa_support_removed);
299     } else if (Feature == "+avx512fp16") {
300       HasAVX512FP16 = true;
301       HasLegalHalfType = true;
302     } else if (Feature == "+avx512pf") {
303       HasAVX512PF = true;
304       Diags.Report(diag::warn_knl_knm_isa_support_removed);
305     } else if (Feature == "+avx512dq") {
306       HasAVX512DQ = true;
307     } else if (Feature == "+avx512bitalg") {
308       HasAVX512BITALG = true;
309     } else if (Feature == "+avx512bw") {
310       HasAVX512BW = true;
311     } else if (Feature == "+avx512vl") {
312       HasAVX512VL = true;
313     } else if (Feature == "+avx512vbmi") {
314       HasAVX512VBMI = true;
315     } else if (Feature == "+avx512vbmi2") {
316       HasAVX512VBMI2 = true;
317     } else if (Feature == "+avx512ifma") {
318       HasAVX512IFMA = true;
319     } else if (Feature == "+avx512vp2intersect") {
320       HasAVX512VP2INTERSECT = true;
321     } else if (Feature == "+sha") {
322       HasSHA = true;
323     } else if (Feature == "+sha512") {
324       HasSHA512 = true;
325     } else if (Feature == "+shstk") {
326       HasSHSTK = true;
327     } else if (Feature == "+sm3") {
328       HasSM3 = true;
329     } else if (Feature == "+sm4") {
330       HasSM4 = true;
331     } else if (Feature == "+movbe") {
332       HasMOVBE = true;
333     } else if (Feature == "+sgx") {
334       HasSGX = true;
335     } else if (Feature == "+cx8") {
336       HasCX8 = true;
337     } else if (Feature == "+cx16") {
338       HasCX16 = true;
339     } else if (Feature == "+fxsr") {
340       HasFXSR = true;
341     } else if (Feature == "+xsave") {
342       HasXSAVE = true;
343     } else if (Feature == "+xsaveopt") {
344       HasXSAVEOPT = true;
345     } else if (Feature == "+xsavec") {
346       HasXSAVEC = true;
347     } else if (Feature == "+xsaves") {
348       HasXSAVES = true;
349     } else if (Feature == "+mwaitx") {
350       HasMWAITX = true;
351     } else if (Feature == "+pku") {
352       HasPKU = true;
353     } else if (Feature == "+clflushopt") {
354       HasCLFLUSHOPT = true;
355     } else if (Feature == "+clwb") {
356       HasCLWB = true;
357     } else if (Feature == "+wbnoinvd") {
358       HasWBNOINVD = true;
359     } else if (Feature == "+prefetchi") {
360       HasPREFETCHI = true;
361     } else if (Feature == "+prefetchwt1") {
362       HasPREFETCHWT1 = true;
363       Diags.Report(diag::warn_knl_knm_isa_support_removed);
364     } else if (Feature == "+clzero") {
365       HasCLZERO = true;
366     } else if (Feature == "+cldemote") {
367       HasCLDEMOTE = true;
368     } else if (Feature == "+rdpid") {
369       HasRDPID = true;
370     } else if (Feature == "+rdpru") {
371       HasRDPRU = true;
372     } else if (Feature == "+kl") {
373       HasKL = true;
374     } else if (Feature == "+widekl") {
375       HasWIDEKL = true;
376     } else if (Feature == "+retpoline-external-thunk") {
377       HasRetpolineExternalThunk = true;
378     } else if (Feature == "+sahf") {
379       HasLAHFSAHF = true;
380     } else if (Feature == "+waitpkg") {
381       HasWAITPKG = true;
382     } else if (Feature == "+movdiri") {
383       HasMOVDIRI = true;
384     } else if (Feature == "+movdir64b") {
385       HasMOVDIR64B = true;
386     } else if (Feature == "+pconfig") {
387       HasPCONFIG = true;
388     } else if (Feature == "+ptwrite") {
389       HasPTWRITE = true;
390     } else if (Feature == "+invpcid") {
391       HasINVPCID = true;
392     } else if (Feature == "+enqcmd") {
393       HasENQCMD = true;
394     } else if (Feature == "+hreset") {
395       HasHRESET = true;
396     } else if (Feature == "+amx-bf16") {
397       HasAMXBF16 = true;
398     } else if (Feature == "+amx-fp16") {
399       HasAMXFP16 = true;
400     } else if (Feature == "+amx-int8") {
401       HasAMXINT8 = true;
402     } else if (Feature == "+amx-tile") {
403       HasAMXTILE = true;
404     } else if (Feature == "+amx-complex") {
405       HasAMXCOMPLEX = true;
406     } else if (Feature == "+cmpccxadd") {
407       HasCMPCCXADD = true;
408     } else if (Feature == "+raoint") {
409       HasRAOINT = true;
410     } else if (Feature == "+avxifma") {
411       HasAVXIFMA = true;
412     } else if (Feature == "+avxneconvert") {
413       HasAVXNECONVERT= true;
414     } else if (Feature == "+avxvnni") {
415       HasAVXVNNI = true;
416     } else if (Feature == "+avxvnniint16") {
417       HasAVXVNNIINT16 = true;
418     } else if (Feature == "+avxvnniint8") {
419       HasAVXVNNIINT8 = true;
420     } else if (Feature == "+serialize") {
421       HasSERIALIZE = true;
422     } else if (Feature == "+tsxldtrk") {
423       HasTSXLDTRK = true;
424     } else if (Feature == "+uintr") {
425       HasUINTR = true;
426     } else if (Feature == "+usermsr") {
427       HasUSERMSR = true;
428     } else if (Feature == "+crc32") {
429       HasCRC32 = true;
430     } else if (Feature == "+x87") {
431       HasX87 = true;
432     } else if (Feature == "+fullbf16") {
433       HasFullBFloat16 = true;
434     } else if (Feature == "+egpr") {
435       HasEGPR = true;
436     } else if (Feature == "+push2pop2") {
437       HasPush2Pop2 = true;
438     } else if (Feature == "+ppx") {
439       HasPPX = true;
440     } else if (Feature == "+ndd") {
441       HasNDD = true;
442     } else if (Feature == "+ccmp") {
443       HasCCMP = true;
444     } else if (Feature == "+cf") {
445       HasCF = true;
446     }
447 
448     X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
449                            .Case("+avx512f", AVX512F)
450                            .Case("+avx2", AVX2)
451                            .Case("+avx", AVX)
452                            .Case("+sse4.2", SSE42)
453                            .Case("+sse4.1", SSE41)
454                            .Case("+ssse3", SSSE3)
455                            .Case("+sse3", SSE3)
456                            .Case("+sse2", SSE2)
457                            .Case("+sse", SSE1)
458                            .Default(NoSSE);
459     SSELevel = std::max(SSELevel, Level);
460 
461     HasFloat16 = SSELevel >= SSE2;
462 
463     // X86 target has bfloat16 emulation support in the backend, where
464     // bfloat16 is treated as a 32-bit float, arithmetic operations are
465     // performed in 32-bit, and the result is converted back to bfloat16.
466     // Truncation and extension between bfloat16 and 32-bit float are supported
467     // by the compiler-rt library. However, native bfloat16 support is currently
468     // not available in the X86 target. Hence, HasFullBFloat16 will be false
469     // until native bfloat16 support is available. HasFullBFloat16 is used to
470     // determine whether to automatically use excess floating point precision
471     // for bfloat16 arithmetic operations in the front-end.
472     HasBFloat16 = SSELevel >= SSE2;
473 
474     MMX3DNowEnum ThreeDNowLevel = llvm::StringSwitch<MMX3DNowEnum>(Feature)
475                                       .Case("+3dnowa", AMD3DNowAthlon)
476                                       .Case("+3dnow", AMD3DNow)
477                                       .Case("+mmx", MMX)
478                                       .Default(NoMMX3DNow);
479     MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
480 
481     XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
482                          .Case("+xop", XOP)
483                          .Case("+fma4", FMA4)
484                          .Case("+sse4a", SSE4A)
485                          .Default(NoXOP);
486     XOPLevel = std::max(XOPLevel, XLevel);
487   }
488 
489   // LLVM doesn't have a separate switch for fpmath, so only accept it if it
490   // matches the selected sse level.
491   if ((FPMath == FP_SSE && SSELevel < SSE1) ||
492       (FPMath == FP_387 && SSELevel >= SSE1)) {
493     Diags.Report(diag::err_target_unsupported_fpmath)
494         << (FPMath == FP_SSE ? "sse" : "387");
495     return false;
496   }
497 
498   // FIXME: We should allow long double type on 32-bits to match with GCC.
499   // This requires backend to be able to lower f80 without x87 first.
500   if (!HasX87 && LongDoubleFormat == &llvm::APFloat::x87DoubleExtended())
501     HasLongDouble = false;
502 
503   return true;
504 }
505 
506 /// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
507 /// definitions for this particular subtarget.
508 void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
509                                      MacroBuilder &Builder) const {
510   // Inline assembly supports X86 flag outputs.
511   Builder.defineMacro("__GCC_ASM_FLAG_OUTPUTS__");
512 
513   std::string CodeModel = getTargetOpts().CodeModel;
514   if (CodeModel == "default")
515     CodeModel = "small";
516   Builder.defineMacro("__code_model_" + CodeModel + "__");
517 
518   // Target identification.
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__");
527     }
528   } else {
529     DefineStd(Builder, "i386", Opts);
530   }
531 
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)))");
536 
537   // Subtarget options.
538   // FIXME: We are hard-coding the tune parameters based on the CPU, but they
539   // truly should be based on -mtune options.
540   using namespace llvm::X86;
541   switch (CPU) {
542   case CK_None:
543     break;
544   case CK_i386:
545     // The rest are coming from the i386 define above.
546     Builder.defineMacro("__tune_i386__");
547     break;
548   case CK_i486:
549   case CK_WinChipC6:
550   case CK_WinChip2:
551   case CK_C3:
552     defineCPUMacros(Builder, "i486");
553     break;
554   case CK_PentiumMMX:
555     Builder.defineMacro("__pentium_mmx__");
556     Builder.defineMacro("__tune_pentium_mmx__");
557     [[fallthrough]];
558   case CK_i586:
559   case CK_Pentium:
560     defineCPUMacros(Builder, "i586");
561     defineCPUMacros(Builder, "pentium");
562     break;
563   case CK_Pentium3:
564   case CK_PentiumM:
565     Builder.defineMacro("__tune_pentium3__");
566     [[fallthrough]];
567   case CK_Pentium2:
568   case CK_C3_2:
569     Builder.defineMacro("__tune_pentium2__");
570     [[fallthrough]];
571   case CK_PentiumPro:
572   case CK_i686:
573     defineCPUMacros(Builder, "i686");
574     defineCPUMacros(Builder, "pentiumpro");
575     break;
576   case CK_Pentium4:
577     defineCPUMacros(Builder, "pentium4");
578     break;
579   case CK_Yonah:
580   case CK_Prescott:
581   case CK_Nocona:
582     defineCPUMacros(Builder, "nocona");
583     break;
584   case CK_Core2:
585   case CK_Penryn:
586     defineCPUMacros(Builder, "core2");
587     break;
588   case CK_Bonnell:
589     defineCPUMacros(Builder, "atom");
590     break;
591   case CK_Silvermont:
592     defineCPUMacros(Builder, "slm");
593     break;
594   case CK_Goldmont:
595     defineCPUMacros(Builder, "goldmont");
596     break;
597   case CK_GoldmontPlus:
598     defineCPUMacros(Builder, "goldmont_plus");
599     break;
600   case CK_Tremont:
601     defineCPUMacros(Builder, "tremont");
602     break;
603   // Gracemont and later atom-cores use P-core cpu macros.
604   case CK_Gracemont:
605   case CK_Nehalem:
606   case CK_Westmere:
607   case CK_SandyBridge:
608   case CK_IvyBridge:
609   case CK_Haswell:
610   case CK_Broadwell:
611   case CK_SkylakeClient:
612   case CK_SkylakeServer:
613   case CK_Cascadelake:
614   case CK_Cooperlake:
615   case CK_Cannonlake:
616   case CK_IcelakeClient:
617   case CK_Rocketlake:
618   case CK_IcelakeServer:
619   case CK_Tigerlake:
620   case CK_SapphireRapids:
621   case CK_Alderlake:
622   case CK_Raptorlake:
623   case CK_Meteorlake:
624   case CK_Arrowlake:
625   case CK_ArrowlakeS:
626   case CK_Lunarlake:
627   case CK_Pantherlake:
628   case CK_Sierraforest:
629   case CK_Grandridge:
630   case CK_Graniterapids:
631   case CK_GraniterapidsD:
632   case CK_Emeraldrapids:
633   case CK_Clearwaterforest:
634     // FIXME: Historically, we defined this legacy name, it would be nice to
635     // remove it at some point. We've never exposed fine-grained names for
636     // recent primary x86 CPUs, and we should keep it that way.
637     defineCPUMacros(Builder, "corei7");
638     break;
639   case CK_KNL:
640     defineCPUMacros(Builder, "knl");
641     break;
642   case CK_KNM:
643     break;
644   case CK_Lakemont:
645     defineCPUMacros(Builder, "i586", /*Tuning*/false);
646     defineCPUMacros(Builder, "pentium", /*Tuning*/false);
647     Builder.defineMacro("__tune_lakemont__");
648     break;
649   case CK_K6_2:
650     Builder.defineMacro("__k6_2__");
651     Builder.defineMacro("__tune_k6_2__");
652     [[fallthrough]];
653   case CK_K6_3:
654     if (CPU != CK_K6_2) { // In case of fallthrough
655       // FIXME: GCC may be enabling these in cases where some other k6
656       // architecture is specified but -m3dnow is explicitly provided. The
657       // exact semantics need to be determined and emulated here.
658       Builder.defineMacro("__k6_3__");
659       Builder.defineMacro("__tune_k6_3__");
660     }
661     [[fallthrough]];
662   case CK_K6:
663     defineCPUMacros(Builder, "k6");
664     break;
665   case CK_Athlon:
666   case CK_AthlonXP:
667     defineCPUMacros(Builder, "athlon");
668     if (SSELevel != NoSSE) {
669       Builder.defineMacro("__athlon_sse__");
670       Builder.defineMacro("__tune_athlon_sse__");
671     }
672     break;
673   case CK_K8:
674   case CK_K8SSE3:
675   case CK_x86_64:
676     defineCPUMacros(Builder, "k8");
677     break;
678   case CK_x86_64_v2:
679   case CK_x86_64_v3:
680   case CK_x86_64_v4:
681     break;
682   case CK_AMDFAM10:
683     defineCPUMacros(Builder, "amdfam10");
684     break;
685   case CK_BTVER1:
686     defineCPUMacros(Builder, "btver1");
687     break;
688   case CK_BTVER2:
689     defineCPUMacros(Builder, "btver2");
690     break;
691   case CK_BDVER1:
692     defineCPUMacros(Builder, "bdver1");
693     break;
694   case CK_BDVER2:
695     defineCPUMacros(Builder, "bdver2");
696     break;
697   case CK_BDVER3:
698     defineCPUMacros(Builder, "bdver3");
699     break;
700   case CK_BDVER4:
701     defineCPUMacros(Builder, "bdver4");
702     break;
703   case CK_ZNVER1:
704     defineCPUMacros(Builder, "znver1");
705     break;
706   case CK_ZNVER2:
707     defineCPUMacros(Builder, "znver2");
708     break;
709   case CK_ZNVER3:
710     defineCPUMacros(Builder, "znver3");
711     break;
712   case CK_ZNVER4:
713     defineCPUMacros(Builder, "znver4");
714     break;
715   case CK_Geode:
716     defineCPUMacros(Builder, "geode");
717     break;
718   }
719 
720   // Target properties.
721   Builder.defineMacro("__REGISTER_PREFIX__", "");
722 
723   // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
724   // functions in glibc header files that use FP Stack inline asm which the
725   // backend can't deal with (PR879).
726   Builder.defineMacro("__NO_MATH_INLINES");
727 
728   if (HasAES)
729     Builder.defineMacro("__AES__");
730 
731   if (HasVAES)
732     Builder.defineMacro("__VAES__");
733 
734   if (HasPCLMUL)
735     Builder.defineMacro("__PCLMUL__");
736 
737   if (HasVPCLMULQDQ)
738     Builder.defineMacro("__VPCLMULQDQ__");
739 
740   // Note, in 32-bit mode, GCC does not define the macro if -mno-sahf. In LLVM,
741   // the feature flag only applies to 64-bit mode.
742   if (HasLAHFSAHF || getTriple().getArch() == llvm::Triple::x86)
743     Builder.defineMacro("__LAHF_SAHF__");
744 
745   if (HasLZCNT)
746     Builder.defineMacro("__LZCNT__");
747 
748   if (HasRDRND)
749     Builder.defineMacro("__RDRND__");
750 
751   if (HasFSGSBASE)
752     Builder.defineMacro("__FSGSBASE__");
753 
754   if (HasBMI)
755     Builder.defineMacro("__BMI__");
756 
757   if (HasBMI2)
758     Builder.defineMacro("__BMI2__");
759 
760   if (HasPOPCNT)
761     Builder.defineMacro("__POPCNT__");
762 
763   if (HasRTM)
764     Builder.defineMacro("__RTM__");
765 
766   if (HasPRFCHW)
767     Builder.defineMacro("__PRFCHW__");
768 
769   if (HasRDSEED)
770     Builder.defineMacro("__RDSEED__");
771 
772   if (HasADX)
773     Builder.defineMacro("__ADX__");
774 
775   if (HasTBM)
776     Builder.defineMacro("__TBM__");
777 
778   if (HasLWP)
779     Builder.defineMacro("__LWP__");
780 
781   if (HasMWAITX)
782     Builder.defineMacro("__MWAITX__");
783 
784   if (HasMOVBE)
785     Builder.defineMacro("__MOVBE__");
786 
787   switch (XOPLevel) {
788   case XOP:
789     Builder.defineMacro("__XOP__");
790     [[fallthrough]];
791   case FMA4:
792     Builder.defineMacro("__FMA4__");
793     [[fallthrough]];
794   case SSE4A:
795     Builder.defineMacro("__SSE4A__");
796     [[fallthrough]];
797   case NoXOP:
798     break;
799   }
800 
801   if (HasFMA)
802     Builder.defineMacro("__FMA__");
803 
804   if (HasF16C)
805     Builder.defineMacro("__F16C__");
806 
807   if (HasGFNI)
808     Builder.defineMacro("__GFNI__");
809 
810   if (HasEVEX512)
811     Builder.defineMacro("__EVEX512__");
812   if (HasAVX10_1)
813     Builder.defineMacro("__AVX10_1__");
814   if (HasAVX10_1_512)
815     Builder.defineMacro("__AVX10_1_512__");
816   if (HasAVX512CD)
817     Builder.defineMacro("__AVX512CD__");
818   if (HasAVX512VPOPCNTDQ)
819     Builder.defineMacro("__AVX512VPOPCNTDQ__");
820   if (HasAVX512VNNI)
821     Builder.defineMacro("__AVX512VNNI__");
822   if (HasAVX512BF16)
823     Builder.defineMacro("__AVX512BF16__");
824   if (HasAVX512ER)
825     Builder.defineMacro("__AVX512ER__");
826   if (HasAVX512FP16)
827     Builder.defineMacro("__AVX512FP16__");
828   if (HasAVX512PF)
829     Builder.defineMacro("__AVX512PF__");
830   if (HasAVX512DQ)
831     Builder.defineMacro("__AVX512DQ__");
832   if (HasAVX512BITALG)
833     Builder.defineMacro("__AVX512BITALG__");
834   if (HasAVX512BW)
835     Builder.defineMacro("__AVX512BW__");
836   if (HasAVX512VL) {
837     Builder.defineMacro("__AVX512VL__");
838     Builder.defineMacro("__EVEX256__");
839   }
840   if (HasAVX512VBMI)
841     Builder.defineMacro("__AVX512VBMI__");
842   if (HasAVX512VBMI2)
843     Builder.defineMacro("__AVX512VBMI2__");
844   if (HasAVX512IFMA)
845     Builder.defineMacro("__AVX512IFMA__");
846   if (HasAVX512VP2INTERSECT)
847     Builder.defineMacro("__AVX512VP2INTERSECT__");
848   if (HasSHA)
849     Builder.defineMacro("__SHA__");
850   if (HasSHA512)
851     Builder.defineMacro("__SHA512__");
852 
853   if (HasFXSR)
854     Builder.defineMacro("__FXSR__");
855   if (HasXSAVE)
856     Builder.defineMacro("__XSAVE__");
857   if (HasXSAVEOPT)
858     Builder.defineMacro("__XSAVEOPT__");
859   if (HasXSAVEC)
860     Builder.defineMacro("__XSAVEC__");
861   if (HasXSAVES)
862     Builder.defineMacro("__XSAVES__");
863   if (HasPKU)
864     Builder.defineMacro("__PKU__");
865   if (HasCLFLUSHOPT)
866     Builder.defineMacro("__CLFLUSHOPT__");
867   if (HasCLWB)
868     Builder.defineMacro("__CLWB__");
869   if (HasWBNOINVD)
870     Builder.defineMacro("__WBNOINVD__");
871   if (HasSHSTK)
872     Builder.defineMacro("__SHSTK__");
873   if (HasSGX)
874     Builder.defineMacro("__SGX__");
875   if (HasSM3)
876     Builder.defineMacro("__SM3__");
877   if (HasSM4)
878     Builder.defineMacro("__SM4__");
879   if (HasPREFETCHI)
880     Builder.defineMacro("__PREFETCHI__");
881   if (HasPREFETCHWT1)
882     Builder.defineMacro("__PREFETCHWT1__");
883   if (HasCLZERO)
884     Builder.defineMacro("__CLZERO__");
885   if (HasKL)
886     Builder.defineMacro("__KL__");
887   if (HasWIDEKL)
888     Builder.defineMacro("__WIDEKL__");
889   if (HasRDPID)
890     Builder.defineMacro("__RDPID__");
891   if (HasRDPRU)
892     Builder.defineMacro("__RDPRU__");
893   if (HasCLDEMOTE)
894     Builder.defineMacro("__CLDEMOTE__");
895   if (HasWAITPKG)
896     Builder.defineMacro("__WAITPKG__");
897   if (HasMOVDIRI)
898     Builder.defineMacro("__MOVDIRI__");
899   if (HasMOVDIR64B)
900     Builder.defineMacro("__MOVDIR64B__");
901   if (HasPCONFIG)
902     Builder.defineMacro("__PCONFIG__");
903   if (HasPTWRITE)
904     Builder.defineMacro("__PTWRITE__");
905   if (HasINVPCID)
906     Builder.defineMacro("__INVPCID__");
907   if (HasENQCMD)
908     Builder.defineMacro("__ENQCMD__");
909   if (HasHRESET)
910     Builder.defineMacro("__HRESET__");
911   if (HasAMXTILE)
912     Builder.defineMacro("__AMX_TILE__");
913   if (HasAMXINT8)
914     Builder.defineMacro("__AMX_INT8__");
915   if (HasAMXBF16)
916     Builder.defineMacro("__AMX_BF16__");
917   if (HasAMXFP16)
918     Builder.defineMacro("__AMX_FP16__");
919   if (HasAMXCOMPLEX)
920     Builder.defineMacro("__AMX_COMPLEX__");
921   if (HasCMPCCXADD)
922     Builder.defineMacro("__CMPCCXADD__");
923   if (HasRAOINT)
924     Builder.defineMacro("__RAOINT__");
925   if (HasAVXIFMA)
926     Builder.defineMacro("__AVXIFMA__");
927   if (HasAVXNECONVERT)
928     Builder.defineMacro("__AVXNECONVERT__");
929   if (HasAVXVNNI)
930     Builder.defineMacro("__AVXVNNI__");
931   if (HasAVXVNNIINT16)
932     Builder.defineMacro("__AVXVNNIINT16__");
933   if (HasAVXVNNIINT8)
934     Builder.defineMacro("__AVXVNNIINT8__");
935   if (HasSERIALIZE)
936     Builder.defineMacro("__SERIALIZE__");
937   if (HasTSXLDTRK)
938     Builder.defineMacro("__TSXLDTRK__");
939   if (HasUINTR)
940     Builder.defineMacro("__UINTR__");
941   if (HasUSERMSR)
942     Builder.defineMacro("__USERMSR__");
943   if (HasCRC32)
944     Builder.defineMacro("__CRC32__");
945   if (HasEGPR)
946     Builder.defineMacro("__EGPR__");
947   if (HasPush2Pop2)
948     Builder.defineMacro("__PUSH2POP2__");
949   if (HasPPX)
950     Builder.defineMacro("__PPX__");
951   if (HasNDD)
952     Builder.defineMacro("__NDD__");
953   if (HasCCMP)
954     Builder.defineMacro("__CCMP__");
955   if (HasCF)
956     Builder.defineMacro("__CF__");
957 
958   // Each case falls through to the previous one here.
959   switch (SSELevel) {
960   case AVX512F:
961     Builder.defineMacro("__AVX512F__");
962     [[fallthrough]];
963   case AVX2:
964     Builder.defineMacro("__AVX2__");
965     [[fallthrough]];
966   case AVX:
967     Builder.defineMacro("__AVX__");
968     [[fallthrough]];
969   case SSE42:
970     Builder.defineMacro("__SSE4_2__");
971     [[fallthrough]];
972   case SSE41:
973     Builder.defineMacro("__SSE4_1__");
974     [[fallthrough]];
975   case SSSE3:
976     Builder.defineMacro("__SSSE3__");
977     [[fallthrough]];
978   case SSE3:
979     Builder.defineMacro("__SSE3__");
980     [[fallthrough]];
981   case SSE2:
982     Builder.defineMacro("__SSE2__");
983     Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
984     [[fallthrough]];
985   case SSE1:
986     Builder.defineMacro("__SSE__");
987     Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
988     [[fallthrough]];
989   case NoSSE:
990     break;
991   }
992 
993   if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
994     switch (SSELevel) {
995     case AVX512F:
996     case AVX2:
997     case AVX:
998     case SSE42:
999     case SSE41:
1000     case SSSE3:
1001     case SSE3:
1002     case SSE2:
1003       Builder.defineMacro("_M_IX86_FP", Twine(2));
1004       break;
1005     case SSE1:
1006       Builder.defineMacro("_M_IX86_FP", Twine(1));
1007       break;
1008     default:
1009       Builder.defineMacro("_M_IX86_FP", Twine(0));
1010       break;
1011     }
1012   }
1013 
1014   // Each case falls through to the previous one here.
1015   switch (MMX3DNowLevel) {
1016   case AMD3DNowAthlon:
1017     Builder.defineMacro("__3dNOW_A__");
1018     [[fallthrough]];
1019   case AMD3DNow:
1020     Builder.defineMacro("__3dNOW__");
1021     [[fallthrough]];
1022   case MMX:
1023     Builder.defineMacro("__MMX__");
1024     [[fallthrough]];
1025   case NoMMX3DNow:
1026     break;
1027   }
1028 
1029   if (CPU >= CK_i486 || CPU == CK_None) {
1030     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1031     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1032     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1033   }
1034   if (HasCX8)
1035     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
1036   if (HasCX16 && getTriple().getArch() == llvm::Triple::x86_64)
1037     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
1038 
1039   if (HasFloat128)
1040     Builder.defineMacro("__SIZEOF_FLOAT128__", "16");
1041 }
1042 
1043 bool X86TargetInfo::isValidFeatureName(StringRef Name) const {
1044   return llvm::StringSwitch<bool>(Name)
1045       .Case("3dnow", true)
1046       .Case("3dnowa", true)
1047       .Case("adx", true)
1048       .Case("aes", true)
1049       .Case("amx-bf16", true)
1050       .Case("amx-complex", true)
1051       .Case("amx-fp16", true)
1052       .Case("amx-int8", true)
1053       .Case("amx-tile", true)
1054       .Case("avx", true)
1055       .Case("avx10.1-256", true)
1056       .Case("avx10.1-512", true)
1057       .Case("avx2", true)
1058       .Case("avx512f", true)
1059       .Case("avx512cd", true)
1060       .Case("avx512vpopcntdq", true)
1061       .Case("avx512vnni", true)
1062       .Case("avx512bf16", true)
1063       .Case("avx512er", true)
1064       .Case("avx512fp16", true)
1065       .Case("avx512pf", true)
1066       .Case("avx512dq", true)
1067       .Case("avx512bitalg", true)
1068       .Case("avx512bw", true)
1069       .Case("avx512vl", true)
1070       .Case("avx512vbmi", true)
1071       .Case("avx512vbmi2", true)
1072       .Case("avx512ifma", true)
1073       .Case("avx512vp2intersect", true)
1074       .Case("avxifma", true)
1075       .Case("avxneconvert", true)
1076       .Case("avxvnni", true)
1077       .Case("avxvnniint16", true)
1078       .Case("avxvnniint8", true)
1079       .Case("bmi", true)
1080       .Case("bmi2", true)
1081       .Case("cldemote", true)
1082       .Case("clflushopt", true)
1083       .Case("clwb", true)
1084       .Case("clzero", true)
1085       .Case("cmpccxadd", true)
1086       .Case("crc32", true)
1087       .Case("cx16", true)
1088       .Case("enqcmd", true)
1089       .Case("evex512", true)
1090       .Case("f16c", true)
1091       .Case("fma", true)
1092       .Case("fma4", true)
1093       .Case("fsgsbase", true)
1094       .Case("fxsr", true)
1095       .Case("general-regs-only", true)
1096       .Case("gfni", true)
1097       .Case("hreset", true)
1098       .Case("invpcid", true)
1099       .Case("kl", true)
1100       .Case("widekl", true)
1101       .Case("lwp", true)
1102       .Case("lzcnt", true)
1103       .Case("mmx", true)
1104       .Case("movbe", true)
1105       .Case("movdiri", true)
1106       .Case("movdir64b", true)
1107       .Case("mwaitx", true)
1108       .Case("pclmul", true)
1109       .Case("pconfig", true)
1110       .Case("pku", true)
1111       .Case("popcnt", true)
1112       .Case("prefetchi", true)
1113       .Case("prefetchwt1", true)
1114       .Case("prfchw", true)
1115       .Case("ptwrite", true)
1116       .Case("raoint", true)
1117       .Case("rdpid", true)
1118       .Case("rdpru", true)
1119       .Case("rdrnd", true)
1120       .Case("rdseed", true)
1121       .Case("rtm", true)
1122       .Case("sahf", true)
1123       .Case("serialize", true)
1124       .Case("sgx", true)
1125       .Case("sha", true)
1126       .Case("sha512", true)
1127       .Case("shstk", true)
1128       .Case("sm3", true)
1129       .Case("sm4", true)
1130       .Case("sse", true)
1131       .Case("sse2", true)
1132       .Case("sse3", true)
1133       .Case("ssse3", true)
1134       .Case("sse4", true)
1135       .Case("sse4.1", true)
1136       .Case("sse4.2", true)
1137       .Case("sse4a", true)
1138       .Case("tbm", true)
1139       .Case("tsxldtrk", true)
1140       .Case("uintr", true)
1141       .Case("usermsr", true)
1142       .Case("vaes", true)
1143       .Case("vpclmulqdq", true)
1144       .Case("wbnoinvd", true)
1145       .Case("waitpkg", true)
1146       .Case("x87", true)
1147       .Case("xop", true)
1148       .Case("xsave", true)
1149       .Case("xsavec", true)
1150       .Case("xsaves", true)
1151       .Case("xsaveopt", true)
1152       .Case("egpr", true)
1153       .Case("push2pop2", true)
1154       .Case("ppx", true)
1155       .Case("ndd", true)
1156       .Case("ccmp", true)
1157       .Case("cf", true)
1158       .Default(false);
1159 }
1160 
1161 bool X86TargetInfo::hasFeature(StringRef Feature) const {
1162   return llvm::StringSwitch<bool>(Feature)
1163       .Case("adx", HasADX)
1164       .Case("aes", HasAES)
1165       .Case("amx-bf16", HasAMXBF16)
1166       .Case("amx-complex", HasAMXCOMPLEX)
1167       .Case("amx-fp16", HasAMXFP16)
1168       .Case("amx-int8", HasAMXINT8)
1169       .Case("amx-tile", HasAMXTILE)
1170       .Case("avx", SSELevel >= AVX)
1171       .Case("avx10.1-256", HasAVX10_1)
1172       .Case("avx10.1-512", HasAVX10_1_512)
1173       .Case("avx2", SSELevel >= AVX2)
1174       .Case("avx512f", SSELevel >= AVX512F)
1175       .Case("avx512cd", HasAVX512CD)
1176       .Case("avx512vpopcntdq", HasAVX512VPOPCNTDQ)
1177       .Case("avx512vnni", HasAVX512VNNI)
1178       .Case("avx512bf16", HasAVX512BF16)
1179       .Case("avx512er", HasAVX512ER)
1180       .Case("avx512fp16", HasAVX512FP16)
1181       .Case("avx512pf", HasAVX512PF)
1182       .Case("avx512dq", HasAVX512DQ)
1183       .Case("avx512bitalg", HasAVX512BITALG)
1184       .Case("avx512bw", HasAVX512BW)
1185       .Case("avx512vl", HasAVX512VL)
1186       .Case("avx512vbmi", HasAVX512VBMI)
1187       .Case("avx512vbmi2", HasAVX512VBMI2)
1188       .Case("avx512ifma", HasAVX512IFMA)
1189       .Case("avx512vp2intersect", HasAVX512VP2INTERSECT)
1190       .Case("avxifma", HasAVXIFMA)
1191       .Case("avxneconvert", HasAVXNECONVERT)
1192       .Case("avxvnni", HasAVXVNNI)
1193       .Case("avxvnniint16", HasAVXVNNIINT16)
1194       .Case("avxvnniint8", HasAVXVNNIINT8)
1195       .Case("bmi", HasBMI)
1196       .Case("bmi2", HasBMI2)
1197       .Case("cldemote", HasCLDEMOTE)
1198       .Case("clflushopt", HasCLFLUSHOPT)
1199       .Case("clwb", HasCLWB)
1200       .Case("clzero", HasCLZERO)
1201       .Case("cmpccxadd", HasCMPCCXADD)
1202       .Case("crc32", HasCRC32)
1203       .Case("cx8", HasCX8)
1204       .Case("cx16", HasCX16)
1205       .Case("enqcmd", HasENQCMD)
1206       .Case("evex512", HasEVEX512)
1207       .Case("f16c", HasF16C)
1208       .Case("fma", HasFMA)
1209       .Case("fma4", XOPLevel >= FMA4)
1210       .Case("fsgsbase", HasFSGSBASE)
1211       .Case("fxsr", HasFXSR)
1212       .Case("gfni", HasGFNI)
1213       .Case("hreset", HasHRESET)
1214       .Case("invpcid", HasINVPCID)
1215       .Case("kl", HasKL)
1216       .Case("widekl", HasWIDEKL)
1217       .Case("lwp", HasLWP)
1218       .Case("lzcnt", HasLZCNT)
1219       .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
1220       .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
1221       .Case("mmx", MMX3DNowLevel >= MMX)
1222       .Case("movbe", HasMOVBE)
1223       .Case("movdiri", HasMOVDIRI)
1224       .Case("movdir64b", HasMOVDIR64B)
1225       .Case("mwaitx", HasMWAITX)
1226       .Case("pclmul", HasPCLMUL)
1227       .Case("pconfig", HasPCONFIG)
1228       .Case("pku", HasPKU)
1229       .Case("popcnt", HasPOPCNT)
1230       .Case("prefetchi", HasPREFETCHI)
1231       .Case("prefetchwt1", HasPREFETCHWT1)
1232       .Case("prfchw", HasPRFCHW)
1233       .Case("ptwrite", HasPTWRITE)
1234       .Case("raoint", HasRAOINT)
1235       .Case("rdpid", HasRDPID)
1236       .Case("rdpru", HasRDPRU)
1237       .Case("rdrnd", HasRDRND)
1238       .Case("rdseed", HasRDSEED)
1239       .Case("retpoline-external-thunk", HasRetpolineExternalThunk)
1240       .Case("rtm", HasRTM)
1241       .Case("sahf", HasLAHFSAHF)
1242       .Case("serialize", HasSERIALIZE)
1243       .Case("sgx", HasSGX)
1244       .Case("sha", HasSHA)
1245       .Case("sha512", HasSHA512)
1246       .Case("shstk", HasSHSTK)
1247       .Case("sm3", HasSM3)
1248       .Case("sm4", HasSM4)
1249       .Case("sse", SSELevel >= SSE1)
1250       .Case("sse2", SSELevel >= SSE2)
1251       .Case("sse3", SSELevel >= SSE3)
1252       .Case("ssse3", SSELevel >= SSSE3)
1253       .Case("sse4.1", SSELevel >= SSE41)
1254       .Case("sse4.2", SSELevel >= SSE42)
1255       .Case("sse4a", XOPLevel >= SSE4A)
1256       .Case("tbm", HasTBM)
1257       .Case("tsxldtrk", HasTSXLDTRK)
1258       .Case("uintr", HasUINTR)
1259       .Case("usermsr", HasUSERMSR)
1260       .Case("vaes", HasVAES)
1261       .Case("vpclmulqdq", HasVPCLMULQDQ)
1262       .Case("wbnoinvd", HasWBNOINVD)
1263       .Case("waitpkg", HasWAITPKG)
1264       .Case("x86", true)
1265       .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
1266       .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
1267       .Case("x87", HasX87)
1268       .Case("xop", XOPLevel >= XOP)
1269       .Case("xsave", HasXSAVE)
1270       .Case("xsavec", HasXSAVEC)
1271       .Case("xsaves", HasXSAVES)
1272       .Case("xsaveopt", HasXSAVEOPT)
1273       .Case("fullbf16", HasFullBFloat16)
1274       .Case("egpr", HasEGPR)
1275       .Case("push2pop2", HasPush2Pop2)
1276       .Case("ppx", HasPPX)
1277       .Case("ndd", HasNDD)
1278       .Case("ccmp", HasCCMP)
1279       .Case("cf", HasCF)
1280       .Default(false);
1281 }
1282 
1283 // We can't use a generic validation scheme for the features accepted here
1284 // versus subtarget features accepted in the target attribute because the
1285 // bitfield structure that's initialized in the runtime only supports the
1286 // below currently rather than the full range of subtarget features. (See
1287 // X86TargetInfo::hasFeature for a somewhat comprehensive list).
1288 bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
1289   return llvm::StringSwitch<bool>(FeatureStr)
1290 #define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY) .Case(STR, true)
1291 #define X86_MICROARCH_LEVEL(ENUM, STR, PRIORITY) .Case(STR, true)
1292 #include "llvm/TargetParser/X86TargetParser.def"
1293       .Default(false);
1294 }
1295 
1296 static llvm::X86::ProcessorFeatures getFeature(StringRef Name) {
1297   return llvm::StringSwitch<llvm::X86::ProcessorFeatures>(Name)
1298 #define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY)                                \
1299   .Case(STR, llvm::X86::FEATURE_##ENUM)
1300 
1301 #include "llvm/TargetParser/X86TargetParser.def"
1302       ;
1303   // Note, this function should only be used after ensuring the value is
1304   // correct, so it asserts if the value is out of range.
1305 }
1306 
1307 unsigned X86TargetInfo::multiVersionSortPriority(StringRef Name) const {
1308   // Valid CPUs have a 'key feature' that compares just better than its key
1309   // feature.
1310   using namespace llvm::X86;
1311   CPUKind Kind = parseArchX86(Name);
1312   if (Kind != CK_None) {
1313     ProcessorFeatures KeyFeature = getKeyFeature(Kind);
1314     return (getFeaturePriority(KeyFeature) << 1) + 1;
1315   }
1316 
1317   // Now we know we have a feature, so get its priority and shift it a few so
1318   // that we have sufficient room for the CPUs (above).
1319   return getFeaturePriority(getFeature(Name)) << 1;
1320 }
1321 
1322 bool X86TargetInfo::validateCPUSpecificCPUDispatch(StringRef Name) const {
1323   return llvm::X86::validateCPUSpecificCPUDispatch(Name);
1324 }
1325 
1326 char X86TargetInfo::CPUSpecificManglingCharacter(StringRef Name) const {
1327   return llvm::X86::getCPUDispatchMangling(Name);
1328 }
1329 
1330 void X86TargetInfo::getCPUSpecificCPUDispatchFeatures(
1331     StringRef Name, llvm::SmallVectorImpl<StringRef> &Features) const {
1332   SmallVector<StringRef, 32> TargetCPUFeatures;
1333   llvm::X86::getFeaturesForCPU(Name, TargetCPUFeatures, true);
1334   for (auto &F : TargetCPUFeatures)
1335     Features.push_back(F);
1336 }
1337 
1338 // We can't use a generic validation scheme for the cpus accepted here
1339 // versus subtarget cpus accepted in the target attribute because the
1340 // variables intitialized by the runtime only support the below currently
1341 // rather than the full range of cpus.
1342 bool X86TargetInfo::validateCpuIs(StringRef FeatureStr) const {
1343   return llvm::StringSwitch<bool>(FeatureStr)
1344 #define X86_VENDOR(ENUM, STRING) .Case(STRING, true)
1345 #define X86_CPU_TYPE_ALIAS(ENUM, ALIAS) .Case(ALIAS, true)
1346 #define X86_CPU_TYPE(ENUM, STR) .Case(STR, true)
1347 #define X86_CPU_SUBTYPE_ALIAS(ENUM, ALIAS) .Case(ALIAS, true)
1348 #define X86_CPU_SUBTYPE(ENUM, STR) .Case(STR, true)
1349 #include "llvm/TargetParser/X86TargetParser.def"
1350       .Default(false);
1351 }
1352 
1353 static unsigned matchAsmCCConstraint(const char *Name) {
1354   auto RV = llvm::StringSwitch<unsigned>(Name)
1355                 .Case("@cca", 4)
1356                 .Case("@ccae", 5)
1357                 .Case("@ccb", 4)
1358                 .Case("@ccbe", 5)
1359                 .Case("@ccc", 4)
1360                 .Case("@cce", 4)
1361                 .Case("@ccz", 4)
1362                 .Case("@ccg", 4)
1363                 .Case("@ccge", 5)
1364                 .Case("@ccl", 4)
1365                 .Case("@ccle", 5)
1366                 .Case("@ccna", 5)
1367                 .Case("@ccnae", 6)
1368                 .Case("@ccnb", 5)
1369                 .Case("@ccnbe", 6)
1370                 .Case("@ccnc", 5)
1371                 .Case("@ccne", 5)
1372                 .Case("@ccnz", 5)
1373                 .Case("@ccng", 5)
1374                 .Case("@ccnge", 6)
1375                 .Case("@ccnl", 5)
1376                 .Case("@ccnle", 6)
1377                 .Case("@ccno", 5)
1378                 .Case("@ccnp", 5)
1379                 .Case("@ccns", 5)
1380                 .Case("@cco", 4)
1381                 .Case("@ccp", 4)
1382                 .Case("@ccs", 4)
1383                 .Default(0);
1384   return RV;
1385 }
1386 
1387 bool X86TargetInfo::validateAsmConstraint(
1388     const char *&Name, TargetInfo::ConstraintInfo &Info) const {
1389   switch (*Name) {
1390   default:
1391     return false;
1392   // Constant constraints.
1393   case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
1394             // instructions.
1395   case 'Z': // 32-bit unsigned integer constant for use with zero-extending
1396             // x86_64 instructions.
1397   case 's':
1398     Info.setRequiresImmediate();
1399     return true;
1400   case 'I':
1401     Info.setRequiresImmediate(0, 31);
1402     return true;
1403   case 'J':
1404     Info.setRequiresImmediate(0, 63);
1405     return true;
1406   case 'K':
1407     Info.setRequiresImmediate(-128, 127);
1408     return true;
1409   case 'L':
1410     Info.setRequiresImmediate({int(0xff), int(0xffff), int(0xffffffff)});
1411     return true;
1412   case 'M':
1413     Info.setRequiresImmediate(0, 3);
1414     return true;
1415   case 'N':
1416     Info.setRequiresImmediate(0, 255);
1417     return true;
1418   case 'O':
1419     Info.setRequiresImmediate(0, 127);
1420     return true;
1421   // Register constraints.
1422   case 'Y': // 'Y' is the first character for several 2-character constraints.
1423     // Shift the pointer to the second character of the constraint.
1424     Name++;
1425     switch (*Name) {
1426     default:
1427       return false;
1428     case 'z': // First SSE register.
1429     case '2':
1430     case 't': // Any SSE register, when SSE2 is enabled.
1431     case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
1432     case 'm': // Any MMX register, when inter-unit moves enabled.
1433     case 'k': // AVX512 arch mask registers: k1-k7.
1434       Info.setAllowsRegister();
1435       return true;
1436     }
1437   case 'f': // Any x87 floating point stack register.
1438     // Constraint 'f' cannot be used for output operands.
1439     if (Info.ConstraintStr[0] == '=')
1440       return false;
1441     Info.setAllowsRegister();
1442     return true;
1443   case 'a': // eax.
1444   case 'b': // ebx.
1445   case 'c': // ecx.
1446   case 'd': // edx.
1447   case 'S': // esi.
1448   case 'D': // edi.
1449   case 'A': // edx:eax.
1450   case 't': // Top of floating point stack.
1451   case 'u': // Second from top of floating point stack.
1452   case 'q': // Any register accessible as [r]l: a, b, c, and d.
1453   case 'y': // Any MMX register.
1454   case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
1455   case 'x': // Any SSE register.
1456   case 'k': // Any AVX512 mask register (same as Yk, additionally allows k0
1457             // for intermideate k reg operations).
1458   case 'Q': // Any register accessible as [r]h: a, b, c, and d.
1459   case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1460   case 'l': // "Index" registers: any general register that can be used as an
1461             // index in a base+index memory access.
1462     Info.setAllowsRegister();
1463     return true;
1464   // Floating point constant constraints.
1465   case 'C': // SSE floating point constant.
1466   case 'G': // x87 floating point constant.
1467     return true;
1468   case '@':
1469     // CC condition changes.
1470     if (auto Len = matchAsmCCConstraint(Name)) {
1471       Name += Len - 1;
1472       Info.setAllowsRegister();
1473       return true;
1474     }
1475     return false;
1476   }
1477 }
1478 
1479 // Below is based on the following information:
1480 // +------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
1481 // |           Processor Name           | Cache Line Size (Bytes) |                                                                            Source                                                                            |
1482 // +------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
1483 // | i386                               |                      64 | https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf                                          |
1484 // | i486                               |                      16 | "four doublewords" (doubleword = 32 bits, 4 bits * 32 bits = 16 bytes) https://en.wikichip.org/w/images/d/d3/i486_MICROPROCESSOR_HARDWARE_REFERENCE_MANUAL_%281990%29.pdf and http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.126.4216&rep=rep1&type=pdf (page 29) |
1485 // | i586/Pentium MMX                   |                      32 | https://www.7-cpu.com/cpu/P-MMX.html                                                                                                                         |
1486 // | i686/Pentium                       |                      32 | https://www.7-cpu.com/cpu/P6.html                                                                                                                            |
1487 // | Netburst/Pentium4                  |                      64 | https://www.7-cpu.com/cpu/P4-180.html                                                                                                                        |
1488 // | Atom                               |                      64 | https://www.7-cpu.com/cpu/Atom.html                                                                                                                          |
1489 // | Westmere                           |                      64 | https://en.wikichip.org/wiki/intel/microarchitectures/sandy_bridge_(client) "Cache Architecture"                                                             |
1490 // | Sandy Bridge                       |                      64 | https://en.wikipedia.org/wiki/Sandy_Bridge and https://www.7-cpu.com/cpu/SandyBridge.html                                                                    |
1491 // | Ivy Bridge                         |                      64 | https://blog.stuffedcow.net/2013/01/ivb-cache-replacement/ and https://www.7-cpu.com/cpu/IvyBridge.html                                                      |
1492 // | Haswell                            |                      64 | https://www.7-cpu.com/cpu/Haswell.html                                                                                                                       |
1493 // | Broadwell                          |                      64 | https://www.7-cpu.com/cpu/Broadwell.html                                                                                                                     |
1494 // | Skylake (including skylake-avx512) |                      64 | https://www.nas.nasa.gov/hecc/support/kb/skylake-processors_550.html "Cache Hierarchy"                                                                       |
1495 // | Cascade Lake                       |                      64 | https://www.nas.nasa.gov/hecc/support/kb/cascade-lake-processors_579.html "Cache Hierarchy"                                                                  |
1496 // | Skylake                            |                      64 | https://en.wikichip.org/wiki/intel/microarchitectures/kaby_lake "Memory Hierarchy"                                                                           |
1497 // | Ice Lake                           |                      64 | https://www.7-cpu.com/cpu/Ice_Lake.html                                                                                                                      |
1498 // | Knights Landing                    |                      64 | https://software.intel.com/en-us/articles/intel-xeon-phi-processor-7200-family-memory-management-optimizations "The Intel® Xeon Phi™ Processor Architecture" |
1499 // | Knights Mill                       |                      64 | https://software.intel.com/sites/default/files/managed/9e/bc/64-ia-32-architectures-optimization-manual.pdf?countrylabel=Colombia "2.5.5.2 L1 DCache "       |
1500 // +------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
1501 std::optional<unsigned> X86TargetInfo::getCPUCacheLineSize() const {
1502   using namespace llvm::X86;
1503   switch (CPU) {
1504     // i386
1505     case CK_i386:
1506     // i486
1507     case CK_i486:
1508     case CK_WinChipC6:
1509     case CK_WinChip2:
1510     case CK_C3:
1511     // Lakemont
1512     case CK_Lakemont:
1513       return 16;
1514 
1515     // i586
1516     case CK_i586:
1517     case CK_Pentium:
1518     case CK_PentiumMMX:
1519     // i686
1520     case CK_PentiumPro:
1521     case CK_i686:
1522     case CK_Pentium2:
1523     case CK_Pentium3:
1524     case CK_PentiumM:
1525     case CK_C3_2:
1526     // K6
1527     case CK_K6:
1528     case CK_K6_2:
1529     case CK_K6_3:
1530     // Geode
1531     case CK_Geode:
1532       return 32;
1533 
1534     // Netburst
1535     case CK_Pentium4:
1536     case CK_Prescott:
1537     case CK_Nocona:
1538     // Atom
1539     case CK_Bonnell:
1540     case CK_Silvermont:
1541     case CK_Goldmont:
1542     case CK_GoldmontPlus:
1543     case CK_Tremont:
1544     case CK_Gracemont:
1545 
1546     case CK_Westmere:
1547     case CK_SandyBridge:
1548     case CK_IvyBridge:
1549     case CK_Haswell:
1550     case CK_Broadwell:
1551     case CK_SkylakeClient:
1552     case CK_SkylakeServer:
1553     case CK_Cascadelake:
1554     case CK_Nehalem:
1555     case CK_Cooperlake:
1556     case CK_Cannonlake:
1557     case CK_Tigerlake:
1558     case CK_SapphireRapids:
1559     case CK_IcelakeClient:
1560     case CK_Rocketlake:
1561     case CK_IcelakeServer:
1562     case CK_Alderlake:
1563     case CK_Raptorlake:
1564     case CK_Meteorlake:
1565     case CK_Arrowlake:
1566     case CK_ArrowlakeS:
1567     case CK_Lunarlake:
1568     case CK_Pantherlake:
1569     case CK_Sierraforest:
1570     case CK_Grandridge:
1571     case CK_Graniterapids:
1572     case CK_GraniterapidsD:
1573     case CK_Emeraldrapids:
1574     case CK_Clearwaterforest:
1575     case CK_KNL:
1576     case CK_KNM:
1577     // K7
1578     case CK_Athlon:
1579     case CK_AthlonXP:
1580     // K8
1581     case CK_K8:
1582     case CK_K8SSE3:
1583     case CK_AMDFAM10:
1584     // Bobcat
1585     case CK_BTVER1:
1586     case CK_BTVER2:
1587     // Bulldozer
1588     case CK_BDVER1:
1589     case CK_BDVER2:
1590     case CK_BDVER3:
1591     case CK_BDVER4:
1592     // Zen
1593     case CK_ZNVER1:
1594     case CK_ZNVER2:
1595     case CK_ZNVER3:
1596     case CK_ZNVER4:
1597     // Deprecated
1598     case CK_x86_64:
1599     case CK_x86_64_v2:
1600     case CK_x86_64_v3:
1601     case CK_x86_64_v4:
1602     case CK_Yonah:
1603     case CK_Penryn:
1604     case CK_Core2:
1605       return 64;
1606 
1607     // The following currently have unknown cache line sizes (but they are probably all 64):
1608     // Core
1609     case CK_None:
1610       return std::nullopt;
1611   }
1612   llvm_unreachable("Unknown CPU kind");
1613 }
1614 
1615 bool X86TargetInfo::validateOutputSize(const llvm::StringMap<bool> &FeatureMap,
1616                                        StringRef Constraint,
1617                                        unsigned Size) const {
1618   // Strip off constraint modifiers.
1619   Constraint = Constraint.ltrim("=+&");
1620 
1621   return validateOperandSize(FeatureMap, Constraint, Size);
1622 }
1623 
1624 bool X86TargetInfo::validateInputSize(const llvm::StringMap<bool> &FeatureMap,
1625                                       StringRef Constraint,
1626                                       unsigned Size) const {
1627   return validateOperandSize(FeatureMap, Constraint, Size);
1628 }
1629 
1630 bool X86TargetInfo::validateOperandSize(const llvm::StringMap<bool> &FeatureMap,
1631                                         StringRef Constraint,
1632                                         unsigned Size) const {
1633   switch (Constraint[0]) {
1634   default:
1635     break;
1636   case 'k':
1637   // Registers k0-k7 (AVX512) size limit is 64 bit.
1638   case 'y':
1639     return Size <= 64;
1640   case 'f':
1641   case 't':
1642   case 'u':
1643     return Size <= 128;
1644   case 'Y':
1645     // 'Y' is the first character for several 2-character constraints.
1646     switch (Constraint[1]) {
1647     default:
1648       return false;
1649     case 'm':
1650       // 'Ym' is synonymous with 'y'.
1651     case 'k':
1652       return Size <= 64;
1653     case 'z':
1654       // XMM0/YMM/ZMM0
1655       if (hasFeatureEnabled(FeatureMap, "avx512f") &&
1656           hasFeatureEnabled(FeatureMap, "evex512"))
1657         // ZMM0 can be used if target supports AVX512F and EVEX512 is set.
1658         return Size <= 512U;
1659       else if (hasFeatureEnabled(FeatureMap, "avx"))
1660         // YMM0 can be used if target supports AVX.
1661         return Size <= 256U;
1662       else if (hasFeatureEnabled(FeatureMap, "sse"))
1663         return Size <= 128U;
1664       return false;
1665     case 'i':
1666     case 't':
1667     case '2':
1668       // 'Yi','Yt','Y2' are synonymous with 'x' when SSE2 is enabled.
1669       if (SSELevel < SSE2)
1670         return false;
1671       break;
1672     }
1673     break;
1674   case 'v':
1675   case 'x':
1676     if (hasFeatureEnabled(FeatureMap, "avx512f") &&
1677         hasFeatureEnabled(FeatureMap, "evex512"))
1678       // 512-bit zmm registers can be used if target supports AVX512F and
1679       // EVEX512 is set.
1680       return Size <= 512U;
1681     else if (hasFeatureEnabled(FeatureMap, "avx"))
1682       // 256-bit ymm registers can be used if target supports AVX.
1683       return Size <= 256U;
1684     return Size <= 128U;
1685 
1686   }
1687 
1688   return true;
1689 }
1690 
1691 std::string X86TargetInfo::convertConstraint(const char *&Constraint) const {
1692   switch (*Constraint) {
1693   case '@':
1694     if (auto Len = matchAsmCCConstraint(Constraint)) {
1695       std::string Converted = "{" + std::string(Constraint, Len) + "}";
1696       Constraint += Len - 1;
1697       return Converted;
1698     }
1699     return std::string(1, *Constraint);
1700   case 'a':
1701     return std::string("{ax}");
1702   case 'b':
1703     return std::string("{bx}");
1704   case 'c':
1705     return std::string("{cx}");
1706   case 'd':
1707     return std::string("{dx}");
1708   case 'S':
1709     return std::string("{si}");
1710   case 'D':
1711     return std::string("{di}");
1712   case 'p': // Keep 'p' constraint (address).
1713     return std::string("p");
1714   case 't': // top of floating point stack.
1715     return std::string("{st}");
1716   case 'u':                        // second from top of floating point stack.
1717     return std::string("{st(1)}"); // second from top of floating point stack.
1718   case 'Y':
1719     switch (Constraint[1]) {
1720     default:
1721       // Break from inner switch and fall through (copy single char),
1722       // continue parsing after copying the current constraint into
1723       // the return string.
1724       break;
1725     case 'k':
1726     case 'm':
1727     case 'i':
1728     case 't':
1729     case 'z':
1730     case '2':
1731       // "^" hints llvm that this is a 2 letter constraint.
1732       // "Constraint++" is used to promote the string iterator
1733       // to the next constraint.
1734       return std::string("^") + std::string(Constraint++, 2);
1735     }
1736     [[fallthrough]];
1737   default:
1738     return std::string(1, *Constraint);
1739   }
1740 }
1741 
1742 void X86TargetInfo::fillValidCPUList(SmallVectorImpl<StringRef> &Values) const {
1743   bool Only64Bit = getTriple().getArch() != llvm::Triple::x86;
1744   llvm::X86::fillValidCPUArchList(Values, Only64Bit);
1745 }
1746 
1747 void X86TargetInfo::fillValidTuneCPUList(SmallVectorImpl<StringRef> &Values) const {
1748   llvm::X86::fillValidTuneCPUList(Values);
1749 }
1750 
1751 ArrayRef<const char *> X86TargetInfo::getGCCRegNames() const {
1752   return llvm::ArrayRef(GCCRegNames);
1753 }
1754 
1755 ArrayRef<TargetInfo::AddlRegName> X86TargetInfo::getGCCAddlRegNames() const {
1756   return llvm::ArrayRef(AddlRegNames);
1757 }
1758 
1759 ArrayRef<Builtin::Info> X86_32TargetInfo::getTargetBuiltins() const {
1760   return llvm::ArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
1761                                             Builtin::FirstTSBuiltin + 1);
1762 }
1763 
1764 ArrayRef<Builtin::Info> X86_64TargetInfo::getTargetBuiltins() const {
1765   return llvm::ArrayRef(BuiltinInfoX86,
1766                         X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
1767 }
1768