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
23namespace clang {
24namespace targets {
25
26static 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
44static 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
69const 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
91using namespace clang;
92using namespace clang::targets;
93
94bool 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
106bool 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
219void 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.
238bool 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.
508void 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
1043bool 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
1161bool 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).
1288bool 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
1296static 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
1307unsigned 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
1322bool X86TargetInfo::validateCPUSpecificCPUDispatch(StringRef Name) const {
1323  return llvm::X86::validateCPUSpecificCPUDispatch(Name);
1324}
1325
1326char X86TargetInfo::CPUSpecificManglingCharacter(StringRef Name) const {
1327  return llvm::X86::getCPUDispatchMangling(Name);
1328}
1329
1330void 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.
1342bool 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
1353static 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
1387bool 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  case 'W':
1422    switch (*++Name) {
1423    default:
1424      return false;
1425    case 's':
1426      Info.setAllowsRegister();
1427      return true;
1428    }
1429  // Register constraints.
1430  case 'Y': // 'Y' is the first character for several 2-character constraints.
1431    // Shift the pointer to the second character of the constraint.
1432    Name++;
1433    switch (*Name) {
1434    default:
1435      return false;
1436    case 'z': // First SSE register.
1437    case '2':
1438    case 't': // Any SSE register, when SSE2 is enabled.
1439    case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
1440    case 'm': // Any MMX register, when inter-unit moves enabled.
1441    case 'k': // AVX512 arch mask registers: k1-k7.
1442      Info.setAllowsRegister();
1443      return true;
1444    }
1445  case 'f': // Any x87 floating point stack register.
1446    // Constraint 'f' cannot be used for output operands.
1447    if (Info.ConstraintStr[0] == '=')
1448      return false;
1449    Info.setAllowsRegister();
1450    return true;
1451  case 'a': // eax.
1452  case 'b': // ebx.
1453  case 'c': // ecx.
1454  case 'd': // edx.
1455  case 'S': // esi.
1456  case 'D': // edi.
1457  case 'A': // edx:eax.
1458  case 't': // Top of floating point stack.
1459  case 'u': // Second from top of floating point stack.
1460  case 'q': // Any register accessible as [r]l: a, b, c, and d.
1461  case 'y': // Any MMX register.
1462  case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
1463  case 'x': // Any SSE register.
1464  case 'k': // Any AVX512 mask register (same as Yk, additionally allows k0
1465            // for intermideate k reg operations).
1466  case 'Q': // Any register accessible as [r]h: a, b, c, and d.
1467  case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1468  case 'l': // "Index" registers: any general register that can be used as an
1469            // index in a base+index memory access.
1470    Info.setAllowsRegister();
1471    return true;
1472  // Floating point constant constraints.
1473  case 'C': // SSE floating point constant.
1474  case 'G': // x87 floating point constant.
1475    return true;
1476  case '@':
1477    // CC condition changes.
1478    if (auto Len = matchAsmCCConstraint(Name)) {
1479      Name += Len - 1;
1480      Info.setAllowsRegister();
1481      return true;
1482    }
1483    return false;
1484  }
1485}
1486
1487// Below is based on the following information:
1488// +------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
1489// |           Processor Name           | Cache Line Size (Bytes) |                                                                            Source                                                                            |
1490// +------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
1491// | i386                               |                      64 | https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf                                          |
1492// | 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) |
1493// | i586/Pentium MMX                   |                      32 | https://www.7-cpu.com/cpu/P-MMX.html                                                                                                                         |
1494// | i686/Pentium                       |                      32 | https://www.7-cpu.com/cpu/P6.html                                                                                                                            |
1495// | Netburst/Pentium4                  |                      64 | https://www.7-cpu.com/cpu/P4-180.html                                                                                                                        |
1496// | Atom                               |                      64 | https://www.7-cpu.com/cpu/Atom.html                                                                                                                          |
1497// | Westmere                           |                      64 | https://en.wikichip.org/wiki/intel/microarchitectures/sandy_bridge_(client) "Cache Architecture"                                                             |
1498// | Sandy Bridge                       |                      64 | https://en.wikipedia.org/wiki/Sandy_Bridge and https://www.7-cpu.com/cpu/SandyBridge.html                                                                    |
1499// | Ivy Bridge                         |                      64 | https://blog.stuffedcow.net/2013/01/ivb-cache-replacement/ and https://www.7-cpu.com/cpu/IvyBridge.html                                                      |
1500// | Haswell                            |                      64 | https://www.7-cpu.com/cpu/Haswell.html                                                                                                                       |
1501// | Broadwell                          |                      64 | https://www.7-cpu.com/cpu/Broadwell.html                                                                                                                     |
1502// | Skylake (including skylake-avx512) |                      64 | https://www.nas.nasa.gov/hecc/support/kb/skylake-processors_550.html "Cache Hierarchy"                                                                       |
1503// | Cascade Lake                       |                      64 | https://www.nas.nasa.gov/hecc/support/kb/cascade-lake-processors_579.html "Cache Hierarchy"                                                                  |
1504// | Skylake                            |                      64 | https://en.wikichip.org/wiki/intel/microarchitectures/kaby_lake "Memory Hierarchy"                                                                           |
1505// | Ice Lake                           |                      64 | https://www.7-cpu.com/cpu/Ice_Lake.html                                                                                                                      |
1506// | 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" |
1507// | 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 "       |
1508// +------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
1509std::optional<unsigned> X86TargetInfo::getCPUCacheLineSize() const {
1510  using namespace llvm::X86;
1511  switch (CPU) {
1512    // i386
1513    case CK_i386:
1514    // i486
1515    case CK_i486:
1516    case CK_WinChipC6:
1517    case CK_WinChip2:
1518    case CK_C3:
1519    // Lakemont
1520    case CK_Lakemont:
1521      return 16;
1522
1523    // i586
1524    case CK_i586:
1525    case CK_Pentium:
1526    case CK_PentiumMMX:
1527    // i686
1528    case CK_PentiumPro:
1529    case CK_i686:
1530    case CK_Pentium2:
1531    case CK_Pentium3:
1532    case CK_PentiumM:
1533    case CK_C3_2:
1534    // K6
1535    case CK_K6:
1536    case CK_K6_2:
1537    case CK_K6_3:
1538    // Geode
1539    case CK_Geode:
1540      return 32;
1541
1542    // Netburst
1543    case CK_Pentium4:
1544    case CK_Prescott:
1545    case CK_Nocona:
1546    // Atom
1547    case CK_Bonnell:
1548    case CK_Silvermont:
1549    case CK_Goldmont:
1550    case CK_GoldmontPlus:
1551    case CK_Tremont:
1552    case CK_Gracemont:
1553
1554    case CK_Westmere:
1555    case CK_SandyBridge:
1556    case CK_IvyBridge:
1557    case CK_Haswell:
1558    case CK_Broadwell:
1559    case CK_SkylakeClient:
1560    case CK_SkylakeServer:
1561    case CK_Cascadelake:
1562    case CK_Nehalem:
1563    case CK_Cooperlake:
1564    case CK_Cannonlake:
1565    case CK_Tigerlake:
1566    case CK_SapphireRapids:
1567    case CK_IcelakeClient:
1568    case CK_Rocketlake:
1569    case CK_IcelakeServer:
1570    case CK_Alderlake:
1571    case CK_Raptorlake:
1572    case CK_Meteorlake:
1573    case CK_Arrowlake:
1574    case CK_ArrowlakeS:
1575    case CK_Lunarlake:
1576    case CK_Pantherlake:
1577    case CK_Sierraforest:
1578    case CK_Grandridge:
1579    case CK_Graniterapids:
1580    case CK_GraniterapidsD:
1581    case CK_Emeraldrapids:
1582    case CK_Clearwaterforest:
1583    case CK_KNL:
1584    case CK_KNM:
1585    // K7
1586    case CK_Athlon:
1587    case CK_AthlonXP:
1588    // K8
1589    case CK_K8:
1590    case CK_K8SSE3:
1591    case CK_AMDFAM10:
1592    // Bobcat
1593    case CK_BTVER1:
1594    case CK_BTVER2:
1595    // Bulldozer
1596    case CK_BDVER1:
1597    case CK_BDVER2:
1598    case CK_BDVER3:
1599    case CK_BDVER4:
1600    // Zen
1601    case CK_ZNVER1:
1602    case CK_ZNVER2:
1603    case CK_ZNVER3:
1604    case CK_ZNVER4:
1605    // Deprecated
1606    case CK_x86_64:
1607    case CK_x86_64_v2:
1608    case CK_x86_64_v3:
1609    case CK_x86_64_v4:
1610    case CK_Yonah:
1611    case CK_Penryn:
1612    case CK_Core2:
1613      return 64;
1614
1615    // The following currently have unknown cache line sizes (but they are probably all 64):
1616    // Core
1617    case CK_None:
1618      return std::nullopt;
1619  }
1620  llvm_unreachable("Unknown CPU kind");
1621}
1622
1623bool X86TargetInfo::validateOutputSize(const llvm::StringMap<bool> &FeatureMap,
1624                                       StringRef Constraint,
1625                                       unsigned Size) const {
1626  // Strip off constraint modifiers.
1627  Constraint = Constraint.ltrim("=+&");
1628
1629  return validateOperandSize(FeatureMap, Constraint, Size);
1630}
1631
1632bool X86TargetInfo::validateInputSize(const llvm::StringMap<bool> &FeatureMap,
1633                                      StringRef Constraint,
1634                                      unsigned Size) const {
1635  return validateOperandSize(FeatureMap, Constraint, Size);
1636}
1637
1638bool X86TargetInfo::validateOperandSize(const llvm::StringMap<bool> &FeatureMap,
1639                                        StringRef Constraint,
1640                                        unsigned Size) const {
1641  switch (Constraint[0]) {
1642  default:
1643    break;
1644  case 'k':
1645  // Registers k0-k7 (AVX512) size limit is 64 bit.
1646  case 'y':
1647    return Size <= 64;
1648  case 'f':
1649  case 't':
1650  case 'u':
1651    return Size <= 128;
1652  case 'Y':
1653    // 'Y' is the first character for several 2-character constraints.
1654    switch (Constraint[1]) {
1655    default:
1656      return false;
1657    case 'm':
1658      // 'Ym' is synonymous with 'y'.
1659    case 'k':
1660      return Size <= 64;
1661    case 'z':
1662      // XMM0/YMM/ZMM0
1663      if (hasFeatureEnabled(FeatureMap, "avx512f") &&
1664          hasFeatureEnabled(FeatureMap, "evex512"))
1665        // ZMM0 can be used if target supports AVX512F and EVEX512 is set.
1666        return Size <= 512U;
1667      else if (hasFeatureEnabled(FeatureMap, "avx"))
1668        // YMM0 can be used if target supports AVX.
1669        return Size <= 256U;
1670      else if (hasFeatureEnabled(FeatureMap, "sse"))
1671        return Size <= 128U;
1672      return false;
1673    case 'i':
1674    case 't':
1675    case '2':
1676      // 'Yi','Yt','Y2' are synonymous with 'x' when SSE2 is enabled.
1677      if (SSELevel < SSE2)
1678        return false;
1679      break;
1680    }
1681    break;
1682  case 'v':
1683  case 'x':
1684    if (hasFeatureEnabled(FeatureMap, "avx512f") &&
1685        hasFeatureEnabled(FeatureMap, "evex512"))
1686      // 512-bit zmm registers can be used if target supports AVX512F and
1687      // EVEX512 is set.
1688      return Size <= 512U;
1689    else if (hasFeatureEnabled(FeatureMap, "avx"))
1690      // 256-bit ymm registers can be used if target supports AVX.
1691      return Size <= 256U;
1692    return Size <= 128U;
1693
1694  }
1695
1696  return true;
1697}
1698
1699std::string X86TargetInfo::convertConstraint(const char *&Constraint) const {
1700  switch (*Constraint) {
1701  case '@':
1702    if (auto Len = matchAsmCCConstraint(Constraint)) {
1703      std::string Converted = "{" + std::string(Constraint, Len) + "}";
1704      Constraint += Len - 1;
1705      return Converted;
1706    }
1707    return std::string(1, *Constraint);
1708  case 'a':
1709    return std::string("{ax}");
1710  case 'b':
1711    return std::string("{bx}");
1712  case 'c':
1713    return std::string("{cx}");
1714  case 'd':
1715    return std::string("{dx}");
1716  case 'S':
1717    return std::string("{si}");
1718  case 'D':
1719    return std::string("{di}");
1720  case 'p': // Keep 'p' constraint (address).
1721    return std::string("p");
1722  case 't': // top of floating point stack.
1723    return std::string("{st}");
1724  case 'u':                        // second from top of floating point stack.
1725    return std::string("{st(1)}"); // second from top of floating point stack.
1726  case 'W':
1727    assert(Constraint[1] == 's');
1728    return '^' + std::string(Constraint++, 2);
1729  case 'Y':
1730    switch (Constraint[1]) {
1731    default:
1732      // Break from inner switch and fall through (copy single char),
1733      // continue parsing after copying the current constraint into
1734      // the return string.
1735      break;
1736    case 'k':
1737    case 'm':
1738    case 'i':
1739    case 't':
1740    case 'z':
1741    case '2':
1742      // "^" hints llvm that this is a 2 letter constraint.
1743      // "Constraint++" is used to promote the string iterator
1744      // to the next constraint.
1745      return std::string("^") + std::string(Constraint++, 2);
1746    }
1747    [[fallthrough]];
1748  default:
1749    return std::string(1, *Constraint);
1750  }
1751}
1752
1753void X86TargetInfo::fillValidCPUList(SmallVectorImpl<StringRef> &Values) const {
1754  bool Only64Bit = getTriple().getArch() != llvm::Triple::x86;
1755  llvm::X86::fillValidCPUArchList(Values, Only64Bit);
1756}
1757
1758void X86TargetInfo::fillValidTuneCPUList(SmallVectorImpl<StringRef> &Values) const {
1759  llvm::X86::fillValidTuneCPUList(Values);
1760}
1761
1762ArrayRef<const char *> X86TargetInfo::getGCCRegNames() const {
1763  return llvm::ArrayRef(GCCRegNames);
1764}
1765
1766ArrayRef<TargetInfo::AddlRegName> X86TargetInfo::getGCCAddlRegNames() const {
1767  return llvm::ArrayRef(AddlRegNames);
1768}
1769
1770ArrayRef<Builtin::Info> X86_32TargetInfo::getTargetBuiltins() const {
1771  return llvm::ArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
1772                                            Builtin::FirstTSBuiltin + 1);
1773}
1774
1775ArrayRef<Builtin::Info> X86_64TargetInfo::getTargetBuiltins() const {
1776  return llvm::ArrayRef(BuiltinInfoX86,
1777                        X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
1778}
1779