1 //===--- X86.cpp - Implement X86 target feature support -------------------===//
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
7 //===----------------------------------------------------------------------===//
9 // This file implements X86 TargetInfo objects.
11 //===----------------------------------------------------------------------===//
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/Support/X86TargetParser.h"
25 const Builtin::Info BuiltinInfoX86
[] = {
26 #define BUILTIN(ID, TYPE, ATTRS) \
27 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
28 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
29 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE},
30 #define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
31 {#ID, TYPE, ATTRS, HEADER, LANGS, FEATURE},
32 #include "clang/Basic/BuiltinsX86.def"
34 #define BUILTIN(ID, TYPE, ATTRS) \
35 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
36 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
37 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE},
38 #define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
39 {#ID, TYPE, ATTRS, HEADER, LANGS, FEATURE},
40 #include "clang/Basic/BuiltinsX86_64.def"
43 static const char *const GCCRegNames
[] = {
44 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
45 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
46 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame", "xmm0", "xmm1",
47 "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", "mm0", "mm1",
48 "mm2", "mm3", "mm4", "mm5", "mm6", "mm7", "r8", "r9",
49 "r10", "r11", "r12", "r13", "r14", "r15", "xmm8", "xmm9",
50 "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15", "ymm0", "ymm1",
51 "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7", "ymm8", "ymm9",
52 "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15", "xmm16", "xmm17",
53 "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23", "xmm24", "xmm25",
54 "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31", "ymm16", "ymm17",
55 "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23", "ymm24", "ymm25",
56 "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31", "zmm0", "zmm1",
57 "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7", "zmm8", "zmm9",
58 "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15", "zmm16", "zmm17",
59 "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23", "zmm24", "zmm25",
60 "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31", "k0", "k1",
61 "k2", "k3", "k4", "k5", "k6", "k7",
62 "cr0", "cr2", "cr3", "cr4", "cr8",
63 "dr0", "dr1", "dr2", "dr3", "dr6", "dr7",
64 "bnd0", "bnd1", "bnd2", "bnd3",
65 "tmm0", "tmm1", "tmm2", "tmm3", "tmm4", "tmm5", "tmm6", "tmm7",
68 const TargetInfo::AddlRegName AddlRegNames
[] = {
69 {{"al", "ah", "eax", "rax"}, 0},
70 {{"bl", "bh", "ebx", "rbx"}, 3},
71 {{"cl", "ch", "ecx", "rcx"}, 2},
72 {{"dl", "dh", "edx", "rdx"}, 1},
77 {{"r8d", "r8w", "r8b"}, 38},
78 {{"r9d", "r9w", "r9b"}, 39},
79 {{"r10d", "r10w", "r10b"}, 40},
80 {{"r11d", "r11w", "r11b"}, 41},
81 {{"r12d", "r12w", "r12b"}, 42},
82 {{"r13d", "r13w", "r13b"}, 43},
83 {{"r14d", "r14w", "r14b"}, 44},
84 {{"r15d", "r15w", "r15b"}, 45},
87 } // namespace targets
90 using namespace clang
;
91 using namespace clang::targets
;
93 bool X86TargetInfo::setFPMath(StringRef Name
) {
105 bool X86TargetInfo::initFeatureMap(
106 llvm::StringMap
<bool> &Features
, DiagnosticsEngine
&Diags
, StringRef CPU
,
107 const std::vector
<std::string
> &FeaturesVec
) const {
108 // FIXME: This *really* should not be here.
109 // X86_64 always has SSE2.
110 if (getTriple().getArch() == llvm::Triple::x86_64
)
111 setFeatureEnabled(Features
, "sse2", true);
113 using namespace llvm::X86
;
115 SmallVector
<StringRef
, 16> CPUFeatures
;
116 getFeaturesForCPU(CPU
, CPUFeatures
);
117 for (auto &F
: CPUFeatures
)
118 setFeatureEnabled(Features
, F
, true);
120 std::vector
<std::string
> UpdatedFeaturesVec
;
121 for (const auto &Feature
: FeaturesVec
) {
122 // Expand general-regs-only to -x86, -mmx and -sse
123 if (Feature
== "+general-regs-only") {
124 UpdatedFeaturesVec
.push_back("-x87");
125 UpdatedFeaturesVec
.push_back("-mmx");
126 UpdatedFeaturesVec
.push_back("-sse");
130 UpdatedFeaturesVec
.push_back(Feature
);
133 if (!TargetInfo::initFeatureMap(Features
, Diags
, CPU
, UpdatedFeaturesVec
))
136 // Can't do this earlier because we need to be able to explicitly enable
137 // or disable these features and the things that they depend upon.
139 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
140 auto I
= Features
.find("sse4.2");
141 if (I
!= Features
.end() && I
->getValue() &&
142 !llvm::is_contained(UpdatedFeaturesVec
, "-popcnt"))
143 Features
["popcnt"] = true;
145 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
147 I
= Features
.find("sse");
148 if (I
!= Features
.end() && I
->getValue() &&
149 !llvm::is_contained(UpdatedFeaturesVec
, "-mmx"))
150 Features
["mmx"] = true;
152 // Enable xsave if avx is enabled and xsave is not explicitly disabled.
153 I
= Features
.find("avx");
154 if (I
!= Features
.end() && I
->getValue() &&
155 !llvm::is_contained(UpdatedFeaturesVec
, "-xsave"))
156 Features
["xsave"] = true;
158 // Enable CRC32 if SSE4.2 is enabled and CRC32 is not explicitly disabled.
159 I
= Features
.find("sse4.2");
160 if (I
!= Features
.end() && I
->getValue() &&
161 !llvm::is_contained(UpdatedFeaturesVec
, "-crc32"))
162 Features
["crc32"] = true;
167 void X86TargetInfo::setFeatureEnabled(llvm::StringMap
<bool> &Features
,
168 StringRef Name
, bool Enabled
) const {
169 if (Name
== "sse4") {
170 // We can get here via the __target__ attribute since that's not controlled
171 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
172 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
180 Features
[Name
] = Enabled
;
181 llvm::X86::updateImpliedFeatures(Name
, Enabled
, Features
);
184 /// handleTargetFeatures - Perform initialization based on the user
185 /// configured set of features.
186 bool X86TargetInfo::handleTargetFeatures(std::vector
<std::string
> &Features
,
187 DiagnosticsEngine
&Diags
) {
188 for (const auto &Feature
: Features
) {
189 if (Feature
[0] != '+')
192 if (Feature
== "+aes") {
194 } else if (Feature
== "+vaes") {
196 } else if (Feature
== "+pclmul") {
198 } else if (Feature
== "+vpclmulqdq") {
199 HasVPCLMULQDQ
= true;
200 } else if (Feature
== "+lzcnt") {
202 } else if (Feature
== "+rdrnd") {
204 } else if (Feature
== "+fsgsbase") {
206 } else if (Feature
== "+bmi") {
208 } else if (Feature
== "+bmi2") {
210 } else if (Feature
== "+popcnt") {
212 } else if (Feature
== "+rtm") {
214 } else if (Feature
== "+prfchw") {
216 } else if (Feature
== "+rdseed") {
218 } else if (Feature
== "+adx") {
220 } else if (Feature
== "+tbm") {
222 } else if (Feature
== "+lwp") {
224 } else if (Feature
== "+fma") {
226 } else if (Feature
== "+f16c") {
228 } else if (Feature
== "+gfni") {
230 } else if (Feature
== "+avx512cd") {
232 } else if (Feature
== "+avx512vpopcntdq") {
233 HasAVX512VPOPCNTDQ
= true;
234 } else if (Feature
== "+avx512vnni") {
235 HasAVX512VNNI
= true;
236 } else if (Feature
== "+avx512bf16") {
237 HasAVX512BF16
= true;
238 } else if (Feature
== "+avx512er") {
240 } else if (Feature
== "+avx512fp16") {
241 HasAVX512FP16
= true;
242 } else if (Feature
== "+avx512pf") {
244 } else if (Feature
== "+avx512dq") {
246 } else if (Feature
== "+avx512bitalg") {
247 HasAVX512BITALG
= true;
248 } else if (Feature
== "+avx512bw") {
250 } else if (Feature
== "+avx512vl") {
252 } else if (Feature
== "+avx512vbmi") {
253 HasAVX512VBMI
= true;
254 } else if (Feature
== "+avx512vbmi2") {
255 HasAVX512VBMI2
= true;
256 } else if (Feature
== "+avx512ifma") {
257 HasAVX512IFMA
= true;
258 } else if (Feature
== "+avx512vp2intersect") {
259 HasAVX512VP2INTERSECT
= true;
260 } else if (Feature
== "+sha") {
262 } else if (Feature
== "+shstk") {
264 } else if (Feature
== "+movbe") {
266 } else if (Feature
== "+sgx") {
268 } else if (Feature
== "+cx8") {
270 } else if (Feature
== "+cx16") {
272 } else if (Feature
== "+fxsr") {
274 } else if (Feature
== "+xsave") {
276 } else if (Feature
== "+xsaveopt") {
278 } else if (Feature
== "+xsavec") {
280 } else if (Feature
== "+xsaves") {
282 } else if (Feature
== "+mwaitx") {
284 } else if (Feature
== "+pku") {
286 } else if (Feature
== "+clflushopt") {
287 HasCLFLUSHOPT
= true;
288 } else if (Feature
== "+clwb") {
290 } else if (Feature
== "+wbnoinvd") {
292 } else if (Feature
== "+prefetchwt1") {
293 HasPREFETCHWT1
= true;
294 } else if (Feature
== "+clzero") {
296 } else if (Feature
== "+cldemote") {
298 } else if (Feature
== "+rdpid") {
300 } else if (Feature
== "+rdpru") {
302 } else if (Feature
== "+kl") {
304 } else if (Feature
== "+widekl") {
306 } else if (Feature
== "+retpoline-external-thunk") {
307 HasRetpolineExternalThunk
= true;
308 } else if (Feature
== "+sahf") {
310 } else if (Feature
== "+waitpkg") {
312 } else if (Feature
== "+movdiri") {
314 } else if (Feature
== "+movdir64b") {
316 } else if (Feature
== "+pconfig") {
318 } else if (Feature
== "+ptwrite") {
320 } else if (Feature
== "+invpcid") {
322 } else if (Feature
== "+enqcmd") {
324 } else if (Feature
== "+hreset") {
326 } else if (Feature
== "+amx-bf16") {
328 } else if (Feature
== "+amx-int8") {
330 } else if (Feature
== "+amx-tile") {
332 } else if (Feature
== "+avxvnni") {
334 } else if (Feature
== "+serialize") {
336 } else if (Feature
== "+tsxldtrk") {
338 } else if (Feature
== "+uintr") {
340 } else if (Feature
== "+crc32") {
342 } else if (Feature
== "+x87") {
346 X86SSEEnum Level
= llvm::StringSwitch
<X86SSEEnum
>(Feature
)
347 .Case("+avx512f", AVX512F
)
350 .Case("+sse4.2", SSE42
)
351 .Case("+sse4.1", SSE41
)
352 .Case("+ssse3", SSSE3
)
357 SSELevel
= std::max(SSELevel
, Level
);
359 HasFloat16
= SSELevel
>= SSE2
;
361 HasBFloat16
= SSELevel
>= SSE2
;
363 MMX3DNowEnum ThreeDNowLevel
= llvm::StringSwitch
<MMX3DNowEnum
>(Feature
)
364 .Case("+3dnowa", AMD3DNowAthlon
)
365 .Case("+3dnow", AMD3DNow
)
367 .Default(NoMMX3DNow
);
368 MMX3DNowLevel
= std::max(MMX3DNowLevel
, ThreeDNowLevel
);
370 XOPEnum XLevel
= llvm::StringSwitch
<XOPEnum
>(Feature
)
373 .Case("+sse4a", SSE4A
)
375 XOPLevel
= std::max(XOPLevel
, XLevel
);
378 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
379 // matches the selected sse level.
380 if ((FPMath
== FP_SSE
&& SSELevel
< SSE1
) ||
381 (FPMath
== FP_387
&& SSELevel
>= SSE1
)) {
382 Diags
.Report(diag::err_target_unsupported_fpmath
)
383 << (FPMath
== FP_SSE
? "sse" : "387");
388 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
390 // FIXME: We should allow long double type on 32-bits to match with GCC.
391 // This requires backend to be able to lower f80 without x87 first.
392 if (!HasX87
&& LongDoubleFormat
== &llvm::APFloat::x87DoubleExtended())
393 HasLongDouble
= false;
398 /// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
399 /// definitions for this particular subtarget.
400 void X86TargetInfo::getTargetDefines(const LangOptions
&Opts
,
401 MacroBuilder
&Builder
) const {
402 // Inline assembly supports X86 flag outputs.
403 Builder
.defineMacro("__GCC_ASM_FLAG_OUTPUTS__");
405 std::string CodeModel
= getTargetOpts().CodeModel
;
406 if (CodeModel
== "default")
408 Builder
.defineMacro("__code_model_" + CodeModel
+ "__");
410 // Target identification.
411 if (getTriple().getArch() == llvm::Triple::x86_64
) {
412 Builder
.defineMacro("__amd64__");
413 Builder
.defineMacro("__amd64");
414 Builder
.defineMacro("__x86_64");
415 Builder
.defineMacro("__x86_64__");
416 if (getTriple().getArchName() == "x86_64h") {
417 Builder
.defineMacro("__x86_64h");
418 Builder
.defineMacro("__x86_64h__");
421 DefineStd(Builder
, "i386", Opts
);
424 Builder
.defineMacro("__SEG_GS");
425 Builder
.defineMacro("__SEG_FS");
426 Builder
.defineMacro("__seg_gs", "__attribute__((address_space(256)))");
427 Builder
.defineMacro("__seg_fs", "__attribute__((address_space(257)))");
429 // Subtarget options.
430 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
431 // truly should be based on -mtune options.
432 using namespace llvm::X86
;
437 // The rest are coming from the i386 define above.
438 Builder
.defineMacro("__tune_i386__");
444 defineCPUMacros(Builder
, "i486");
447 Builder
.defineMacro("__pentium_mmx__");
448 Builder
.defineMacro("__tune_pentium_mmx__");
452 defineCPUMacros(Builder
, "i586");
453 defineCPUMacros(Builder
, "pentium");
457 Builder
.defineMacro("__tune_pentium3__");
461 Builder
.defineMacro("__tune_pentium2__");
465 defineCPUMacros(Builder
, "i686");
466 defineCPUMacros(Builder
, "pentiumpro");
469 defineCPUMacros(Builder
, "pentium4");
474 defineCPUMacros(Builder
, "nocona");
478 defineCPUMacros(Builder
, "core2");
481 defineCPUMacros(Builder
, "atom");
484 defineCPUMacros(Builder
, "slm");
487 defineCPUMacros(Builder
, "goldmont");
489 case CK_GoldmontPlus
:
490 defineCPUMacros(Builder
, "goldmont_plus");
493 defineCPUMacros(Builder
, "tremont");
501 case CK_SkylakeClient
:
502 case CK_SkylakeServer
:
506 case CK_IcelakeClient
:
508 case CK_IcelakeServer
:
510 case CK_SapphireRapids
:
512 // FIXME: Historically, we defined this legacy name, it would be nice to
513 // remove it at some point. We've never exposed fine-grained names for
514 // recent primary x86 CPUs, and we should keep it that way.
515 defineCPUMacros(Builder
, "corei7");
518 defineCPUMacros(Builder
, "knl");
523 defineCPUMacros(Builder
, "i586", /*Tuning*/false);
524 defineCPUMacros(Builder
, "pentium", /*Tuning*/false);
525 Builder
.defineMacro("__tune_lakemont__");
528 Builder
.defineMacro("__k6_2__");
529 Builder
.defineMacro("__tune_k6_2__");
532 if (CPU
!= CK_K6_2
) { // In case of fallthrough
533 // FIXME: GCC may be enabling these in cases where some other k6
534 // architecture is specified but -m3dnow is explicitly provided. The
535 // exact semantics need to be determined and emulated here.
536 Builder
.defineMacro("__k6_3__");
537 Builder
.defineMacro("__tune_k6_3__");
541 defineCPUMacros(Builder
, "k6");
545 defineCPUMacros(Builder
, "athlon");
546 if (SSELevel
!= NoSSE
) {
547 Builder
.defineMacro("__athlon_sse__");
548 Builder
.defineMacro("__tune_athlon_sse__");
554 defineCPUMacros(Builder
, "k8");
561 defineCPUMacros(Builder
, "amdfam10");
564 defineCPUMacros(Builder
, "btver1");
567 defineCPUMacros(Builder
, "btver2");
570 defineCPUMacros(Builder
, "bdver1");
573 defineCPUMacros(Builder
, "bdver2");
576 defineCPUMacros(Builder
, "bdver3");
579 defineCPUMacros(Builder
, "bdver4");
582 defineCPUMacros(Builder
, "znver1");
585 defineCPUMacros(Builder
, "znver2");
588 defineCPUMacros(Builder
, "znver3");
591 defineCPUMacros(Builder
, "geode");
595 // Target properties.
596 Builder
.defineMacro("__REGISTER_PREFIX__", "");
598 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
599 // functions in glibc header files that use FP Stack inline asm which the
600 // backend can't deal with (PR879).
601 Builder
.defineMacro("__NO_MATH_INLINES");
604 Builder
.defineMacro("__AES__");
607 Builder
.defineMacro("__VAES__");
610 Builder
.defineMacro("__PCLMUL__");
613 Builder
.defineMacro("__VPCLMULQDQ__");
615 // Note, in 32-bit mode, GCC does not define the macro if -mno-sahf. In LLVM,
616 // the feature flag only applies to 64-bit mode.
617 if (HasLAHFSAHF
|| getTriple().getArch() == llvm::Triple::x86
)
618 Builder
.defineMacro("__LAHF_SAHF__");
621 Builder
.defineMacro("__LZCNT__");
624 Builder
.defineMacro("__RDRND__");
627 Builder
.defineMacro("__FSGSBASE__");
630 Builder
.defineMacro("__BMI__");
633 Builder
.defineMacro("__BMI2__");
636 Builder
.defineMacro("__POPCNT__");
639 Builder
.defineMacro("__RTM__");
642 Builder
.defineMacro("__PRFCHW__");
645 Builder
.defineMacro("__RDSEED__");
648 Builder
.defineMacro("__ADX__");
651 Builder
.defineMacro("__TBM__");
654 Builder
.defineMacro("__LWP__");
657 Builder
.defineMacro("__MWAITX__");
660 Builder
.defineMacro("__MOVBE__");
664 Builder
.defineMacro("__XOP__");
667 Builder
.defineMacro("__FMA4__");
670 Builder
.defineMacro("__SSE4A__");
677 Builder
.defineMacro("__FMA__");
680 Builder
.defineMacro("__F16C__");
683 Builder
.defineMacro("__GFNI__");
686 Builder
.defineMacro("__AVX512CD__");
687 if (HasAVX512VPOPCNTDQ
)
688 Builder
.defineMacro("__AVX512VPOPCNTDQ__");
690 Builder
.defineMacro("__AVX512VNNI__");
692 Builder
.defineMacro("__AVX512BF16__");
694 Builder
.defineMacro("__AVX512ER__");
696 Builder
.defineMacro("__AVX512FP16__");
698 Builder
.defineMacro("__AVX512PF__");
700 Builder
.defineMacro("__AVX512DQ__");
702 Builder
.defineMacro("__AVX512BITALG__");
704 Builder
.defineMacro("__AVX512BW__");
706 Builder
.defineMacro("__AVX512VL__");
708 Builder
.defineMacro("__AVX512VBMI__");
710 Builder
.defineMacro("__AVX512VBMI2__");
712 Builder
.defineMacro("__AVX512IFMA__");
713 if (HasAVX512VP2INTERSECT
)
714 Builder
.defineMacro("__AVX512VP2INTERSECT__");
716 Builder
.defineMacro("__SHA__");
719 Builder
.defineMacro("__FXSR__");
721 Builder
.defineMacro("__XSAVE__");
723 Builder
.defineMacro("__XSAVEOPT__");
725 Builder
.defineMacro("__XSAVEC__");
727 Builder
.defineMacro("__XSAVES__");
729 Builder
.defineMacro("__PKU__");
731 Builder
.defineMacro("__CLFLUSHOPT__");
733 Builder
.defineMacro("__CLWB__");
735 Builder
.defineMacro("__WBNOINVD__");
737 Builder
.defineMacro("__SHSTK__");
739 Builder
.defineMacro("__SGX__");
741 Builder
.defineMacro("__PREFETCHWT1__");
743 Builder
.defineMacro("__CLZERO__");
745 Builder
.defineMacro("__KL__");
747 Builder
.defineMacro("__WIDEKL__");
749 Builder
.defineMacro("__RDPID__");
751 Builder
.defineMacro("__RDPRU__");
753 Builder
.defineMacro("__CLDEMOTE__");
755 Builder
.defineMacro("__WAITPKG__");
757 Builder
.defineMacro("__MOVDIRI__");
759 Builder
.defineMacro("__MOVDIR64B__");
761 Builder
.defineMacro("__PCONFIG__");
763 Builder
.defineMacro("__PTWRITE__");
765 Builder
.defineMacro("__INVPCID__");
767 Builder
.defineMacro("__ENQCMD__");
769 Builder
.defineMacro("__HRESET__");
771 Builder
.defineMacro("__AMXTILE__");
773 Builder
.defineMacro("__AMXINT8__");
775 Builder
.defineMacro("__AMXBF16__");
777 Builder
.defineMacro("__AVXVNNI__");
779 Builder
.defineMacro("__SERIALIZE__");
781 Builder
.defineMacro("__TSXLDTRK__");
783 Builder
.defineMacro("__UINTR__");
785 Builder
.defineMacro("__CRC32__");
787 // Each case falls through to the previous one here.
790 Builder
.defineMacro("__AVX512F__");
793 Builder
.defineMacro("__AVX2__");
796 Builder
.defineMacro("__AVX__");
799 Builder
.defineMacro("__SSE4_2__");
802 Builder
.defineMacro("__SSE4_1__");
805 Builder
.defineMacro("__SSSE3__");
808 Builder
.defineMacro("__SSE3__");
811 Builder
.defineMacro("__SSE2__");
812 Builder
.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
815 Builder
.defineMacro("__SSE__");
816 Builder
.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
822 if (Opts
.MicrosoftExt
&& getTriple().getArch() == llvm::Triple::x86
) {
832 Builder
.defineMacro("_M_IX86_FP", Twine(2));
835 Builder
.defineMacro("_M_IX86_FP", Twine(1));
838 Builder
.defineMacro("_M_IX86_FP", Twine(0));
843 // Each case falls through to the previous one here.
844 switch (MMX3DNowLevel
) {
846 Builder
.defineMacro("__3dNOW_A__");
849 Builder
.defineMacro("__3dNOW__");
852 Builder
.defineMacro("__MMX__");
858 if (CPU
>= CK_i486
|| CPU
== CK_None
) {
859 Builder
.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
860 Builder
.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
861 Builder
.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
864 Builder
.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
865 if (HasCX16
&& getTriple().getArch() == llvm::Triple::x86_64
)
866 Builder
.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
869 Builder
.defineMacro("__SIZEOF_FLOAT128__", "16");
872 bool X86TargetInfo::isValidFeatureName(StringRef Name
) const {
873 return llvm::StringSwitch
<bool>(Name
)
875 .Case("3dnowa", true)
878 .Case("amx-bf16", true)
879 .Case("amx-int8", true)
880 .Case("amx-tile", true)
883 .Case("avx512f", true)
884 .Case("avx512cd", true)
885 .Case("avx512vpopcntdq", true)
886 .Case("avx512vnni", true)
887 .Case("avx512bf16", true)
888 .Case("avx512er", true)
889 .Case("avx512fp16", true)
890 .Case("avx512pf", true)
891 .Case("avx512dq", true)
892 .Case("avx512bitalg", true)
893 .Case("avx512bw", true)
894 .Case("avx512vl", true)
895 .Case("avx512vbmi", true)
896 .Case("avx512vbmi2", true)
897 .Case("avx512ifma", true)
898 .Case("avx512vp2intersect", true)
899 .Case("avxvnni", true)
902 .Case("cldemote", true)
903 .Case("clflushopt", true)
905 .Case("clzero", true)
908 .Case("enqcmd", true)
912 .Case("fsgsbase", true)
914 .Case("general-regs-only", true)
916 .Case("hreset", true)
917 .Case("invpcid", true)
919 .Case("widekl", true)
924 .Case("movdiri", true)
925 .Case("movdir64b", true)
926 .Case("mwaitx", true)
927 .Case("pclmul", true)
928 .Case("pconfig", true)
930 .Case("popcnt", true)
931 .Case("prefetchwt1", true)
932 .Case("prfchw", true)
933 .Case("ptwrite", true)
937 .Case("rdseed", true)
940 .Case("serialize", true)
949 .Case("sse4.1", true)
950 .Case("sse4.2", true)
953 .Case("tsxldtrk", true)
956 .Case("vpclmulqdq", true)
957 .Case("wbnoinvd", true)
958 .Case("waitpkg", true)
962 .Case("xsavec", true)
963 .Case("xsaves", true)
964 .Case("xsaveopt", true)
968 bool X86TargetInfo::hasFeature(StringRef Feature
) const {
969 return llvm::StringSwitch
<bool>(Feature
)
972 .Case("amx-bf16", HasAMXBF16
)
973 .Case("amx-int8", HasAMXINT8
)
974 .Case("amx-tile", HasAMXTILE
)
975 .Case("avxvnni", HasAVXVNNI
)
976 .Case("avx", SSELevel
>= AVX
)
977 .Case("avx2", SSELevel
>= AVX2
)
978 .Case("avx512f", SSELevel
>= AVX512F
)
979 .Case("avx512cd", HasAVX512CD
)
980 .Case("avx512vpopcntdq", HasAVX512VPOPCNTDQ
)
981 .Case("avx512vnni", HasAVX512VNNI
)
982 .Case("avx512bf16", HasAVX512BF16
)
983 .Case("avx512er", HasAVX512ER
)
984 .Case("avx512fp16", HasAVX512FP16
)
985 .Case("avx512pf", HasAVX512PF
)
986 .Case("avx512dq", HasAVX512DQ
)
987 .Case("avx512bitalg", HasAVX512BITALG
)
988 .Case("avx512bw", HasAVX512BW
)
989 .Case("avx512vl", HasAVX512VL
)
990 .Case("avx512vbmi", HasAVX512VBMI
)
991 .Case("avx512vbmi2", HasAVX512VBMI2
)
992 .Case("avx512ifma", HasAVX512IFMA
)
993 .Case("avx512vp2intersect", HasAVX512VP2INTERSECT
)
995 .Case("bmi2", HasBMI2
)
996 .Case("cldemote", HasCLDEMOTE
)
997 .Case("clflushopt", HasCLFLUSHOPT
)
998 .Case("clwb", HasCLWB
)
999 .Case("clzero", HasCLZERO
)
1000 .Case("crc32", HasCRC32
)
1001 .Case("cx8", HasCX8
)
1002 .Case("cx16", HasCX16
)
1003 .Case("enqcmd", HasENQCMD
)
1004 .Case("f16c", HasF16C
)
1005 .Case("fma", HasFMA
)
1006 .Case("fma4", XOPLevel
>= FMA4
)
1007 .Case("fsgsbase", HasFSGSBASE
)
1008 .Case("fxsr", HasFXSR
)
1009 .Case("gfni", HasGFNI
)
1010 .Case("hreset", HasHRESET
)
1011 .Case("invpcid", HasINVPCID
)
1013 .Case("widekl", HasWIDEKL
)
1014 .Case("lwp", HasLWP
)
1015 .Case("lzcnt", HasLZCNT
)
1016 .Case("mm3dnow", MMX3DNowLevel
>= AMD3DNow
)
1017 .Case("mm3dnowa", MMX3DNowLevel
>= AMD3DNowAthlon
)
1018 .Case("mmx", MMX3DNowLevel
>= MMX
)
1019 .Case("movbe", HasMOVBE
)
1020 .Case("movdiri", HasMOVDIRI
)
1021 .Case("movdir64b", HasMOVDIR64B
)
1022 .Case("mwaitx", HasMWAITX
)
1023 .Case("pclmul", HasPCLMUL
)
1024 .Case("pconfig", HasPCONFIG
)
1025 .Case("pku", HasPKU
)
1026 .Case("popcnt", HasPOPCNT
)
1027 .Case("prefetchwt1", HasPREFETCHWT1
)
1028 .Case("prfchw", HasPRFCHW
)
1029 .Case("ptwrite", HasPTWRITE
)
1030 .Case("rdpid", HasRDPID
)
1031 .Case("rdpru", HasRDPRU
)
1032 .Case("rdrnd", HasRDRND
)
1033 .Case("rdseed", HasRDSEED
)
1034 .Case("retpoline-external-thunk", HasRetpolineExternalThunk
)
1035 .Case("rtm", HasRTM
)
1036 .Case("sahf", HasLAHFSAHF
)
1037 .Case("serialize", HasSERIALIZE
)
1038 .Case("sgx", HasSGX
)
1039 .Case("sha", HasSHA
)
1040 .Case("shstk", HasSHSTK
)
1041 .Case("sse", SSELevel
>= SSE1
)
1042 .Case("sse2", SSELevel
>= SSE2
)
1043 .Case("sse3", SSELevel
>= SSE3
)
1044 .Case("ssse3", SSELevel
>= SSSE3
)
1045 .Case("sse4.1", SSELevel
>= SSE41
)
1046 .Case("sse4.2", SSELevel
>= SSE42
)
1047 .Case("sse4a", XOPLevel
>= SSE4A
)
1048 .Case("tbm", HasTBM
)
1049 .Case("tsxldtrk", HasTSXLDTRK
)
1050 .Case("uintr", HasUINTR
)
1051 .Case("vaes", HasVAES
)
1052 .Case("vpclmulqdq", HasVPCLMULQDQ
)
1053 .Case("wbnoinvd", HasWBNOINVD
)
1054 .Case("waitpkg", HasWAITPKG
)
1056 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86
)
1057 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64
)
1058 .Case("x87", HasX87
)
1059 .Case("xop", XOPLevel
>= XOP
)
1060 .Case("xsave", HasXSAVE
)
1061 .Case("xsavec", HasXSAVEC
)
1062 .Case("xsaves", HasXSAVES
)
1063 .Case("xsaveopt", HasXSAVEOPT
)
1067 // We can't use a generic validation scheme for the features accepted here
1068 // versus subtarget features accepted in the target attribute because the
1069 // bitfield structure that's initialized in the runtime only supports the
1070 // below currently rather than the full range of subtarget features. (See
1071 // X86TargetInfo::hasFeature for a somewhat comprehensive list).
1072 bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr
) const {
1073 return llvm::StringSwitch
<bool>(FeatureStr
)
1074 #define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY) .Case(STR, true)
1075 #include "llvm/Support/X86TargetParser.def"
1079 static llvm::X86::ProcessorFeatures
getFeature(StringRef Name
) {
1080 return llvm::StringSwitch
<llvm::X86::ProcessorFeatures
>(Name
)
1081 #define X86_FEATURE_COMPAT(ENUM, STR, PRIORITY) \
1082 .Case(STR, llvm::X86::FEATURE_##ENUM)
1084 #include "llvm/Support/X86TargetParser.def"
1086 // Note, this function should only be used after ensuring the value is
1087 // correct, so it asserts if the value is out of range.
1090 unsigned X86TargetInfo::multiVersionSortPriority(StringRef Name
) const {
1091 // Valid CPUs have a 'key feature' that compares just better than its key
1093 using namespace llvm::X86
;
1094 CPUKind Kind
= parseArchX86(Name
);
1095 if (Kind
!= CK_None
) {
1096 ProcessorFeatures KeyFeature
= getKeyFeature(Kind
);
1097 return (getFeaturePriority(KeyFeature
) << 1) + 1;
1100 // Now we know we have a feature, so get its priority and shift it a few so
1101 // that we have sufficient room for the CPUs (above).
1102 return getFeaturePriority(getFeature(Name
)) << 1;
1105 bool X86TargetInfo::validateCPUSpecificCPUDispatch(StringRef Name
) const {
1106 return llvm::StringSwitch
<bool>(Name
)
1107 #define CPU_SPECIFIC(NAME, TUNE_NAME, MANGLING, FEATURES) .Case(NAME, true)
1108 #define CPU_SPECIFIC_ALIAS(NEW_NAME, TUNE_NAME, NAME) .Case(NEW_NAME, true)
1109 #include "llvm/Support/X86TargetParser.def"
1113 static StringRef
CPUSpecificCPUDispatchNameDealias(StringRef Name
) {
1114 return llvm::StringSwitch
<StringRef
>(Name
)
1115 #define CPU_SPECIFIC_ALIAS(NEW_NAME, TUNE_NAME, NAME) .Case(NEW_NAME, NAME)
1116 #include "llvm/Support/X86TargetParser.def"
1120 char X86TargetInfo::CPUSpecificManglingCharacter(StringRef Name
) const {
1121 return llvm::StringSwitch
<char>(CPUSpecificCPUDispatchNameDealias(Name
))
1122 #define CPU_SPECIFIC(NAME, TUNE_NAME, MANGLING, FEATURES) .Case(NAME, MANGLING)
1123 #include "llvm/Support/X86TargetParser.def"
1127 void X86TargetInfo::getCPUSpecificCPUDispatchFeatures(
1128 StringRef Name
, llvm::SmallVectorImpl
<StringRef
> &Features
) const {
1129 StringRef WholeList
=
1130 llvm::StringSwitch
<StringRef
>(CPUSpecificCPUDispatchNameDealias(Name
))
1131 #define CPU_SPECIFIC(NAME, TUNE_NAME, MANGLING, FEATURES) .Case(NAME, FEATURES)
1132 #include "llvm/Support/X86TargetParser.def"
1134 WholeList
.split(Features
, ',', /*MaxSplit=*/-1, /*KeepEmpty=*/false);
1137 StringRef
X86TargetInfo::getCPUSpecificTuneName(StringRef Name
) const {
1138 return llvm::StringSwitch
<StringRef
>(Name
)
1139 #define CPU_SPECIFIC(NAME, TUNE_NAME, MANGLING, FEATURES) .Case(NAME, TUNE_NAME)
1140 #define CPU_SPECIFIC_ALIAS(NEW_NAME, TUNE_NAME, NAME) .Case(NEW_NAME, TUNE_NAME)
1141 #include "llvm/Support/X86TargetParser.def"
1145 // We can't use a generic validation scheme for the cpus accepted here
1146 // versus subtarget cpus accepted in the target attribute because the
1147 // variables intitialized by the runtime only support the below currently
1148 // rather than the full range of cpus.
1149 bool X86TargetInfo::validateCpuIs(StringRef FeatureStr
) const {
1150 return llvm::StringSwitch
<bool>(FeatureStr
)
1151 #define X86_VENDOR(ENUM, STRING) .Case(STRING, true)
1152 #define X86_CPU_TYPE_ALIAS(ENUM, ALIAS) .Case(ALIAS, true)
1153 #define X86_CPU_TYPE(ENUM, STR) .Case(STR, true)
1154 #define X86_CPU_SUBTYPE(ENUM, STR) .Case(STR, true)
1155 #include "llvm/Support/X86TargetParser.def"
1159 static unsigned matchAsmCCConstraint(const char *&Name
) {
1160 auto RV
= llvm::StringSwitch
<unsigned>(Name
)
1193 bool X86TargetInfo::validateAsmConstraint(
1194 const char *&Name
, TargetInfo::ConstraintInfo
&Info
) const {
1198 // Constant constraints.
1199 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
1201 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
1202 // x86_64 instructions.
1204 Info
.setRequiresImmediate();
1207 Info
.setRequiresImmediate(0, 31);
1210 Info
.setRequiresImmediate(0, 63);
1213 Info
.setRequiresImmediate(-128, 127);
1216 Info
.setRequiresImmediate({int(0xff), int(0xffff), int(0xffffffff)});
1219 Info
.setRequiresImmediate(0, 3);
1222 Info
.setRequiresImmediate(0, 255);
1225 Info
.setRequiresImmediate(0, 127);
1227 // Register constraints.
1228 case 'Y': // 'Y' is the first character for several 2-character constraints.
1229 // Shift the pointer to the second character of the constraint.
1234 case 'z': // First SSE register.
1236 case 't': // Any SSE register, when SSE2 is enabled.
1237 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
1238 case 'm': // Any MMX register, when inter-unit moves enabled.
1239 case 'k': // AVX512 arch mask registers: k1-k7.
1240 Info
.setAllowsRegister();
1243 case 'f': // Any x87 floating point stack register.
1244 // Constraint 'f' cannot be used for output operands.
1245 if (Info
.ConstraintStr
[0] == '=')
1247 Info
.setAllowsRegister();
1255 case 'A': // edx:eax.
1256 case 't': // Top of floating point stack.
1257 case 'u': // Second from top of floating point stack.
1258 case 'q': // Any register accessible as [r]l: a, b, c, and d.
1259 case 'y': // Any MMX register.
1260 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
1261 case 'x': // Any SSE register.
1262 case 'k': // Any AVX512 mask register (same as Yk, additionally allows k0
1263 // for intermideate k reg operations).
1264 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
1265 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
1266 case 'l': // "Index" registers: any general register that can be used as an
1267 // index in a base+index memory access.
1268 Info
.setAllowsRegister();
1270 // Floating point constant constraints.
1271 case 'C': // SSE floating point constant.
1272 case 'G': // x87 floating point constant.
1275 // CC condition changes.
1276 if (auto Len
= matchAsmCCConstraint(Name
)) {
1278 Info
.setAllowsRegister();
1285 // Below is based on the following information:
1286 // +------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
1287 // | Processor Name | Cache Line Size (Bytes) | Source |
1288 // +------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
1289 // | i386 | 64 | https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf |
1290 // | 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) |
1291 // | i586/Pentium MMX | 32 | https://www.7-cpu.com/cpu/P-MMX.html |
1292 // | i686/Pentium | 32 | https://www.7-cpu.com/cpu/P6.html |
1293 // | Netburst/Pentium4 | 64 | https://www.7-cpu.com/cpu/P4-180.html |
1294 // | Atom | 64 | https://www.7-cpu.com/cpu/Atom.html |
1295 // | Westmere | 64 | https://en.wikichip.org/wiki/intel/microarchitectures/sandy_bridge_(client) "Cache Architecture" |
1296 // | Sandy Bridge | 64 | https://en.wikipedia.org/wiki/Sandy_Bridge and https://www.7-cpu.com/cpu/SandyBridge.html |
1297 // | Ivy Bridge | 64 | https://blog.stuffedcow.net/2013/01/ivb-cache-replacement/ and https://www.7-cpu.com/cpu/IvyBridge.html |
1298 // | Haswell | 64 | https://www.7-cpu.com/cpu/Haswell.html |
1299 // | Boadwell | 64 | https://www.7-cpu.com/cpu/Broadwell.html |
1300 // | Skylake (including skylake-avx512) | 64 | https://www.nas.nasa.gov/hecc/support/kb/skylake-processors_550.html "Cache Hierarchy" |
1301 // | Cascade Lake | 64 | https://www.nas.nasa.gov/hecc/support/kb/cascade-lake-processors_579.html "Cache Hierarchy" |
1302 // | Skylake | 64 | https://en.wikichip.org/wiki/intel/microarchitectures/kaby_lake "Memory Hierarchy" |
1303 // | Ice Lake | 64 | https://www.7-cpu.com/cpu/Ice_Lake.html |
1304 // | 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" |
1305 // | 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 " |
1306 // +------------------------------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
1307 Optional
<unsigned> X86TargetInfo::getCPUCacheLineSize() const {
1308 using namespace llvm::X86
;
1348 case CK_GoldmontPlus
:
1352 case CK_SandyBridge
:
1356 case CK_SkylakeClient
:
1357 case CK_SkylakeServer
:
1358 case CK_Cascadelake
:
1363 case CK_SapphireRapids
:
1364 case CK_IcelakeClient
:
1366 case CK_IcelakeServer
:
1399 // The following currently have unknown cache line sizes (but they are probably all 64):
1404 llvm_unreachable("Unknown CPU kind");
1407 bool X86TargetInfo::validateOutputSize(const llvm::StringMap
<bool> &FeatureMap
,
1408 StringRef Constraint
,
1409 unsigned Size
) const {
1410 // Strip off constraint modifiers.
1411 while (Constraint
[0] == '=' || Constraint
[0] == '+' || Constraint
[0] == '&')
1412 Constraint
= Constraint
.substr(1);
1414 return validateOperandSize(FeatureMap
, Constraint
, Size
);
1417 bool X86TargetInfo::validateInputSize(const llvm::StringMap
<bool> &FeatureMap
,
1418 StringRef Constraint
,
1419 unsigned Size
) const {
1420 return validateOperandSize(FeatureMap
, Constraint
, Size
);
1423 bool X86TargetInfo::validateOperandSize(const llvm::StringMap
<bool> &FeatureMap
,
1424 StringRef Constraint
,
1425 unsigned Size
) const {
1426 switch (Constraint
[0]) {
1430 // Registers k0-k7 (AVX512) size limit is 64 bit.
1438 // 'Y' is the first character for several 2-character constraints.
1439 switch (Constraint
[1]) {
1443 // 'Ym' is synonymous with 'y'.
1448 if (hasFeatureEnabled(FeatureMap
, "avx512f"))
1449 // ZMM0 can be used if target supports AVX512F.
1450 return Size
<= 512U;
1451 else if (hasFeatureEnabled(FeatureMap
, "avx"))
1452 // YMM0 can be used if target supports AVX.
1453 return Size
<= 256U;
1454 else if (hasFeatureEnabled(FeatureMap
, "sse"))
1455 return Size
<= 128U;
1460 // 'Yi','Yt','Y2' are synonymous with 'x' when SSE2 is enabled.
1461 if (SSELevel
< SSE2
)
1468 if (hasFeatureEnabled(FeatureMap
, "avx512f"))
1469 // 512-bit zmm registers can be used if target supports AVX512F.
1470 return Size
<= 512U;
1471 else if (hasFeatureEnabled(FeatureMap
, "avx"))
1472 // 256-bit ymm registers can be used if target supports AVX.
1473 return Size
<= 256U;
1474 return Size
<= 128U;
1481 std::string
X86TargetInfo::convertConstraint(const char *&Constraint
) const {
1482 switch (*Constraint
) {
1484 if (auto Len
= matchAsmCCConstraint(Constraint
)) {
1485 std::string Converted
= "{" + std::string(Constraint
, Len
) + "}";
1486 Constraint
+= Len
- 1;
1489 return std::string(1, *Constraint
);
1491 return std::string("{ax}");
1493 return std::string("{bx}");
1495 return std::string("{cx}");
1497 return std::string("{dx}");
1499 return std::string("{si}");
1501 return std::string("{di}");
1502 case 'p': // Keep 'p' constraint (address).
1503 return std::string("p");
1504 case 't': // top of floating point stack.
1505 return std::string("{st}");
1506 case 'u': // second from top of floating point stack.
1507 return std::string("{st(1)}"); // second from top of floating point stack.
1509 switch (Constraint
[1]) {
1511 // Break from inner switch and fall through (copy single char),
1512 // continue parsing after copying the current constraint into
1513 // the return string.
1521 // "^" hints llvm that this is a 2 letter constraint.
1522 // "Constraint++" is used to promote the string iterator
1523 // to the next constraint.
1524 return std::string("^") + std::string(Constraint
++, 2);
1528 return std::string(1, *Constraint
);
1532 void X86TargetInfo::fillValidCPUList(SmallVectorImpl
<StringRef
> &Values
) const {
1533 bool Only64Bit
= getTriple().getArch() != llvm::Triple::x86
;
1534 llvm::X86::fillValidCPUArchList(Values
, Only64Bit
);
1537 void X86TargetInfo::fillValidTuneCPUList(SmallVectorImpl
<StringRef
> &Values
) const {
1538 llvm::X86::fillValidTuneCPUList(Values
);
1541 ArrayRef
<const char *> X86TargetInfo::getGCCRegNames() const {
1542 return llvm::makeArrayRef(GCCRegNames
);
1545 ArrayRef
<TargetInfo::AddlRegName
> X86TargetInfo::getGCCAddlRegNames() const {
1546 return llvm::makeArrayRef(AddlRegNames
);
1549 ArrayRef
<Builtin::Info
> X86_32TargetInfo::getTargetBuiltins() const {
1550 return llvm::makeArrayRef(BuiltinInfoX86
, clang::X86::LastX86CommonBuiltin
-
1551 Builtin::FirstTSBuiltin
+ 1);
1554 ArrayRef
<Builtin::Info
> X86_64TargetInfo::getTargetBuiltins() const {
1555 return llvm::makeArrayRef(BuiltinInfoX86
,
1556 X86::LastTSBuiltin
- Builtin::FirstTSBuiltin
);