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