13#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_X86_H
14#define LLVM_CLANG_LIB_BASIC_TARGETS_X86_H
20#include "llvm/Support/Compiler.h"
21#include "llvm/TargetParser/Triple.h"
22#include "llvm/TargetParser/X86TargetParser.h"
77 enum XOPEnum { NoXOP, SSE4A, FMA4, XOP } XOPLevel = NoXOP;
78 enum AddrSpace { ptr32_sptr = 270, ptr32_uptr = 271, ptr64 = 272 };
82 bool HasPCLMUL =
false;
83 bool HasVPCLMULQDQ =
false;
85 bool HasLZCNT =
false;
86 bool HasRDRND =
false;
87 bool HasFSGSBASE =
false;
90 bool HasPOPCNT =
false;
92 bool HasPRFCHW =
false;
93 bool HasRDSEED =
false;
99 bool HasAVX10_1 =
false;
100 bool HasAVX10_2 =
false;
101 bool HasAVX512CD =
false;
102 bool HasAVX512VPOPCNTDQ =
false;
103 bool HasAVX512VNNI =
false;
104 bool HasAVX512FP16 =
false;
105 bool HasAVX512BF16 =
false;
106 bool HasAVX512DQ =
false;
107 bool HasAVX512BITALG =
false;
108 bool HasAVX512BW =
false;
109 bool HasAVX512VL =
false;
110 bool HasAVX512VBMI =
false;
111 bool HasAVX512VBMI2 =
false;
112 bool HasAVXIFMA =
false;
113 bool HasAVX512IFMA =
false;
114 bool HasAVX512VP2INTERSECT =
false;
116 bool HasSHA512 =
false;
117 bool HasSHSTK =
false;
122 bool HasCX16 =
false;
123 bool HasFXSR =
false;
124 bool HasXSAVE =
false;
125 bool HasXSAVEOPT =
false;
126 bool HasXSAVEC =
false;
127 bool HasXSAVES =
false;
128 bool HasMWAITX =
false;
129 bool HasCLZERO =
false;
130 bool HasCLDEMOTE =
false;
131 bool HasPCONFIG =
false;
133 bool HasCLFLUSHOPT =
false;
134 bool HasCLWB =
false;
135 bool HasMOVBE =
false;
136 bool HasMOVRS =
false;
137 bool HasPREFETCHI =
false;
138 bool HasRDPID =
false;
139 bool HasRDPRU =
false;
140 bool HasRetpolineExternalThunk =
false;
141 bool HasLAHFSAHF =
false;
142 bool HasWBNOINVD =
false;
143 bool HasWAITPKG =
false;
144 bool HasMOVDIRI =
false;
145 bool HasMOVDIR64B =
false;
146 bool HasPTWRITE =
false;
147 bool HasINVPCID =
false;
148 bool HasENQCMD =
false;
149 bool HasAVXVNNIINT16 =
false;
150 bool HasAMXFP16 =
false;
151 bool HasCMPCCXADD =
false;
152 bool HasRAOINT =
false;
153 bool HasAVXVNNIINT8 =
false;
154 bool HasAVXNECONVERT =
false;
156 bool HasWIDEKL =
false;
157 bool HasHRESET =
false;
158 bool HasAVXVNNI =
false;
159 bool HasAMXTILE =
false;
160 bool HasAMXINT8 =
false;
161 bool HasAMXBF16 =
false;
162 bool HasAMXCOMPLEX =
false;
163 bool HasAMXFP8 =
false;
164 bool HasAMXMOVRS =
false;
165 bool HasAMXAVX512 =
false;
166 bool HasAMXTF32 =
false;
167 bool HasSERIALIZE =
false;
168 bool HasTSXLDTRK =
false;
169 bool HasUSERMSR =
false;
170 bool HasUINTR =
false;
171 bool HasCRC32 =
false;
173 bool HasEGPR =
false;
174 bool HasPush2Pop2 =
false;
177 bool HasCCMP =
false;
181 bool HasJMPABS =
false;
182 bool HasInlineAsmUseGPR32 =
false;
183 bool HasBranchHint =
false;
186 llvm::X86::CPUKind
CPU = llvm::X86::CK_None;
228 return RegName ==
"esp" || RegName ==
"rsp";
235 bool validateCpuSupports(StringRef FeatureStr)
const override;
237 bool validateCpuIs(StringRef FeatureStr)
const override;
239 bool validateCPUSpecificCPUDispatch(StringRef Name)
const override;
241 char CPUSpecificManglingCharacter(StringRef Name)
const override;
243 void getCPUSpecificCPUDispatchFeatures(
247 std::optional<unsigned> getCPUCacheLineSize()
const override;
249 bool validateAsmConstraint(
const char *&Name,
253 bool &HasSizeMismatch)
const override {
256 if (RegName ==
"esp" || RegName ==
"ebp") {
258 HasSizeMismatch = RegSize != 32;
261 if (RegName.ends_with(
"di")) {
263 if (RegName ==
"edi") {
264 HasSizeMismatch = RegSize != 32;
265 }
else if (RegName ==
"di") {
266 HasSizeMismatch = RegSize != 16;
275 bool validateOutputSize(
const llvm::StringMap<bool> &FeatureMap,
276 StringRef Constraint,
unsigned Size)
const override;
278 bool validateInputSize(
const llvm::StringMap<bool> &FeatureMap,
279 StringRef Constraint,
unsigned Size)
const override;
283 if (
CPU == llvm::X86::CK_None ||
CPU >= llvm::X86::CK_PentiumPro)
290 if (
CPU == llvm::X86::CK_None ||
CPU >= llvm::X86::CK_PentiumPro)
295 virtual bool validateOperandSize(
const llvm::StringMap<bool> &FeatureMap,
296 StringRef Constraint,
unsigned Size)
const;
298 std::string convertConstraint(
const char *&Constraint)
const override;
300 return "~{dirflag},~{fpsr},~{flags}";
305 StringRef::iterator I, E;
306 for (I = Constraint.begin(), E = Constraint.end(); I != E; ++I) {
307 if (isalpha(*I) || *I ==
'@')
331 if ((++I != E) && ((*I ==
'0') || (*I ==
'z')))
347 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
348 bool Enabled)
const final;
353 const std::vector<std::string> &FeaturesVec)
const override;
355 bool isValidFeatureName(StringRef Name)
const override;
359 bool handleTargetFeatures(std::vector<std::string> &Features,
363 if (
getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
365 if (
getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
367 if (
getTriple().getArch() == llvm::Triple::x86 && !HasMMX)
377 bool Only64Bit =
getTriple().getArch() != llvm::Triple::x86;
378 return llvm::X86::parseArchX86(Name, Only64Bit) != llvm::X86::CK_None;
382 if (Name ==
"generic")
388 return llvm::X86::parseTuneCPU(Name) != llvm::X86::CK_None;
394 bool setCPU(
const std::string &Name)
override {
395 bool Only64Bit =
getTriple().getArch() != llvm::Triple::x86;
396 CPU = llvm::X86::parseArchX86(Name, Only64Bit);
397 return CPU != llvm::X86::CK_None;
402 bool setFPMath(StringRef Name)
override;
405 return getTriple().getArch() != llvm::Triple::x86;
443 if (TargetAddrSpace == ptr32_sptr || TargetAddrSpace == ptr32_uptr)
445 if (TargetAddrSpace == ptr64)
456 IsOpenCL = Opts.OpenCL;
460 bool IsOpenCL =
false;
501 StringRef Constraint,
unsigned Size)
const override {
502 switch (Constraint[0]) {
531 return llvm::IntegerType::MAX_INT_BITS;
571 llvm::Triple T = llvm::Triple(Triple);
601 bool IsMSVC =
getTriple().isWindowsMSVCEnvironment();
602 std::string Layout = IsWinCOFF ?
"e-m:x" :
"e-m:e";
603 Layout +=
"-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-";
604 Layout += IsMSVC ?
"f80:128" :
"f80:32";
605 Layout +=
"-n8:16:32-a:0:32-S32";
629 Builder.defineMacro(
"_M_IX86",
"600");
645 Builder.defineMacro(
"_X86_");
665 Builder.defineMacro(
"_X86_");
666 Builder.defineMacro(
"__CYGWIN__");
667 Builder.defineMacro(
"__CYGWIN32__");
671 Builder.defineMacro(
"_GNU_SOURCE");
685 Builder.defineMacro(
"__INTEL__");
709 Builder.defineMacro(
"__iamcu");
710 Builder.defineMacro(
"__iamcu__");
729 Builder.defineMacro(
"__INTEL__");
730 Builder.defineMacro(
"__rtems__");
813 bool &HasSizeMismatch)
const override {
816 if (RegName ==
"rsp" || RegName ==
"rbp") {
818 HasSizeMismatch = RegSize != 64;
825 StringRef Reg64 = RegName;
826 if (Reg64.back() ==
'd' || Reg64.back() ==
'w' || Reg64.back() ==
'b') {
827 Reg64 = Reg64.substr(0, Reg64.size() - 1);
829 if (
getTargetOpts().FeatureMap.lookup((
"reserve-" + Reg64).str())) {
830 switch (RegName.back()) {
832 HasSizeMismatch = RegSize != 32;
835 HasSizeMismatch = RegSize != 16;
838 HasSizeMismatch = RegSize != 8;
841 HasSizeMismatch = RegSize != 64;
859 return llvm::IntegerType::MAX_INT_BITS;
865 IsOpenCL = Opts.OpenCL;
869 bool IsOpenCL =
false;
883 this->
TheCXXABI.set(TargetCXXABI::Microsoft);
976 Builder.defineMacro(
"_M_X64",
"100");
977 Builder.defineMacro(
"_M_AMD64",
"100");
1013 Builder.defineMacro(
"__x86_64__");
1014 Builder.defineMacro(
"__CYGWIN__");
1015 Builder.defineMacro(
"__CYGWIN64__");
1019 Builder.defineMacro(
"_GNU_SOURCE");
1057 llvm::Triple T = llvm::Triple(Triple);
Provides LLVM's BitmaskEnum facility to enumeration types declared in namespace clang.
static llvm::APInt getFMVPriority(const TargetInfo &TI, const CodeGenFunction::FMVResolverOption &RO)
static unsigned getCharWidth(tok::TokenKind kind, const TargetInfo &Target)
static bool hasFeature(StringRef Feature, const LangOptions &LangOpts, const TargetInfo &Target)
Determine whether a translation unit built using the current language options has the given feature.
static StringRef getTriple(const Command &Job)
Defines the clang::TargetOptions class.
Concrete class used by the front-end to report problems and issues.
FPEvalMethodKind
Possible float expression evaluation method choices.
@ FEM_Extended
Use extended type for fp arithmetic.
@ FEM_Source
Use the declared type for fp arithmetic.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
TargetOptions & getTargetOpts() const
Retrieve the target options.
TargetInfo(const llvm::Triple &T)
virtual bool checkCFProtectionReturnSupported(DiagnosticsEngine &Diags) const
Check if the target supports CFProtection return.
const LangASMap * AddrSpaceMap
const char * UserLabelPrefix
BuiltinVaListKind
The different kinds of __builtin_va_list types defined by the target implementation.
@ CharPtrBuiltinVaList
typedef char* __builtin_va_list;
@ X86_64ABIBuiltinVaList
__builtin_va_list as defined by the x86-64 ABI: http://refspecs.linuxbase.org/elf/x86_64-abi-0....
bool UseMicrosoftManglingForC
virtual void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const =0
===-— Other target property query methods -----------------------—===//
unsigned HasUnalignedAccess
virtual void adjust(DiagnosticsEngine &Diags, LangOptions &Opts, const TargetInfo *Aux)
Set forced language options.
unsigned char MaxAtomicPromoteWidth
unsigned RealTypeUsesObjCFPRetMask
void resetDataLayout(StringRef DL)
Set the data layout to the given string.
virtual void supportAllOpenCLOpts(bool V=true)
unsigned ComplexLongDoubleUsesFP2Ret
unsigned getTargetAddressSpace(LangAS AS) const
unsigned HasAlignMac68kSupport
virtual bool checkCFProtectionBranchSupported(DiagnosticsEngine &Diags) const
Check if the target supports CFProtection branch.
unsigned char MaxAtomicInlineWidth
unsigned HasBuiltinMSVaList
Options for controlling the target.
AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
AppleMachOI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
AppleMachOTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
BuiltinVaListKind getBuiltinVaListKind() const override
Returns the kind of __builtin_va_list type that should be used with this target.
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Determines whether a given calling convention is valid for the target.
CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
bool handleTargetFeatures(std::vector< std::string > &Features, DiagnosticsEngine &Diags) override
Perform initialization based on the user configured set of features (e.g., +sse4).
DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
bool handleTargetFeatures(std::vector< std::string > &Features, DiagnosticsEngine &Diags) override
Perform initialization based on the user configured set of features (e.g., +sse4).
HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
bool allowsLargerPreferedTypeAlignment() const override
Whether target allows to overalign ABI-specified preferred alignment.
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Determines whether a given calling convention is valid for the target.
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
MicrosoftX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
TargetInfo::CallingConvKind getCallingConvKind(bool ClangABICompat4) const override
MicrosoftX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
OHOSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
OHOSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
OHOSX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
UEFITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
UEFIX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
BuiltinVaListKind getBuiltinVaListKind() const override
Returns the kind of __builtin_va_list type that should be used with this target.
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Determines whether a given calling convention is valid for the target.
TargetInfo::CallingConvKind getCallingConvKind(bool ClangABICompat4) const override
WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
BuiltinVaListKind getBuiltinVaListKind() const override
Returns the kind of __builtin_va_list type that should be used with this target.
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Determines whether a given calling convention is valid for the target.
bool isSPRegName(StringRef RegName) const override
bool isValidTuneCPUName(StringRef Name) const override
Determine whether this TargetInfo supports the given CPU name for tuning.
bool supportsCpuSupports() const override
bool isValidCPUName(StringRef Name) const override
Determine whether this TargetInfo supports the given CPU name.
bool setCPU(const std::string &Name) override
Target the specified CPU.
X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
bool supportsExtendIntArgs() const override
Whether the option -fextend-arguments={32,64} is supported on the target.
CallingConv getDefaultCallingConv() const override
Gets the default calling convention for the given target.
bool useFP16ConversionIntrinsics() const override
Check whether conversions to and from __fp16 should go through an integer bitcast with i16.
bool hasSjLjLowering() const override
Controls if __builtin_longjmp / __builtin_setjmp can be lowered to llvm.eh.sjlj.longjmp / llvm....
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Determines whether a given calling convention is valid for the target.
bool supportsCpuIs() const override
bool supportsCpuInit() const override
bool checkCFProtectionBranchSupported(DiagnosticsEngine &Diags) const override
Check if the target supports CFProtection branch.
StringRef getConstraintRegister(StringRef Constraint, StringRef Expression) const override
Extracts a register from the passed constraint (if it is a single-register constraint) and the asm la...
std::string_view getClobbers() const override
Returns a string of target-specific clobbers, in LLVM format.
bool supportSourceEvalMethod() const override
bool checkCFProtectionReturnSupported(DiagnosticsEngine &Diags) const override
Check if the target supports CFProtection return.
LangOptions::FPEvalMethodKind getFPEvalMethod() const override
Return the value for the C99 FLT_EVAL_METHOD macro.
uint64_t getPointerWidthV(LangAS AS) const override
void setSupportedOpenCLOpts() override
Set supported OpenCL extensions and optional core features.
bool supportsTargetAttributeTune() const override
Determine whether this TargetInfo supports tune in target attribute.
const char * getLongDoubleMangling() const override
Return the mangled code of long double.
virtual bool validateOperandSize(const llvm::StringMap< bool > &FeatureMap, StringRef Constraint, unsigned Size) const
bool checkArithmeticFenceSupported() const override
Controls if __arithmetic_fence is supported in the targeted backend.
void adjust(DiagnosticsEngine &Diags, LangOptions &Opts, const TargetInfo *Aux) override
Set forced language options.
bool validateGlobalRegisterVariable(StringRef RegName, unsigned RegSize, bool &HasSizeMismatch) const override
Validate register name used for global register variables.
StringRef getABI() const override
Get the ABI currently in use.
ArrayRef< TargetInfo::GCCRegAlias > getGCCRegAliases() const override
uint64_t getPointerAlignV(LangAS AddrSpace) const override
X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
size_t getMaxBitIntWidth() const override
void setMaxAtomicWidth() override
Set the maximum inline or promote width lock-free atomic operation for the given target.
int getEHDataRegisterNumber(unsigned RegNo) const override
Return the register number that __builtin_eh_return_regno would return with the specified argument.
bool hasBitIntType() const override
Determine whether the _BitInt type is supported on this target.
bool validateOperandSize(const llvm::StringMap< bool > &FeatureMap, StringRef Constraint, unsigned Size) const override
BuiltinVaListKind getBuiltinVaListKind() const override
Returns the kind of __builtin_va_list type that should be used with this target.
bool validateGlobalRegisterVariable(StringRef RegName, unsigned RegSize, bool &HasSizeMismatch) const override
Validate register name used for global register variables.
bool hasInt128Type() const override
Determine whether the __int128 type is supported on this target.
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Determines whether a given calling convention is valid for the target.
CallingConv getDefaultCallingConv() const override
Gets the default calling convention for the given target.
bool hasBitIntType() const override
Determine whether the _BitInt type is supported on this target.
int getEHDataRegisterNumber(unsigned RegNo) const override
Return the register number that __builtin_eh_return_regno would return with the specified argument.
void setMaxAtomicWidth() override
Set the maximum inline or promote width lock-free atomic operation for the given target.
size_t getMaxBitIntWidth() const override
BuiltinVaListKind getBuiltinVaListKind() const override
Returns the kind of __builtin_va_list type that should be used with this target.
X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
unsigned getUnwindWordWidth() const override
void adjust(DiagnosticsEngine &Diags, LangOptions &Opts, const TargetInfo *Aux) override
Set forced language options.
unsigned getRegisterWidth() const override
Return the "preferred" register width on this target.
Defines the clang::TargetInfo interface.
static const unsigned X86AddrSpaceMap[]
LLVM_LIBRARY_VISIBILITY void addCygMingDefines(const clang::LangOptions &Opts, clang::MacroBuilder &Builder)
LLVM_LIBRARY_VISIBILITY void DefineStd(clang::MacroBuilder &Builder, llvm::StringRef MacroName, const clang::LangOptions &Opts)
Define a macro name and standard variants.
The JSON file list parser is used to communicate input to InstallAPI.
LangAS
Defines the address space values used by the address space qualifier of QualType.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
unsigned short SuitableAlign
unsigned char PointerWidth
const llvm::fltSemantics * LongDoubleFormat
unsigned char LargeArrayAlign
unsigned char LongLongAlign
unsigned char LargeArrayMinWidth
unsigned char PointerAlign
unsigned char BFloat16Width
unsigned char LongDoubleAlign
unsigned char LongDoubleWidth
unsigned char BFloat16Align
unsigned char DoubleAlign
unsigned UseSignedCharForObjCBool
Whether Objective-C's built-in boolean type should be signed char.
const llvm::fltSemantics * BFloat16Format
unsigned char DefaultAlignForAttributeAligned