13#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_X86_H
14#define LLVM_CLANG_LIB_BASIC_TARGETS_X86_H
20#include "llvm/ADT/STLExtras.h"
21#include "llvm/IR/DerivedTypes.h"
22#include "llvm/Support/Compiler.h"
23#include "llvm/TargetParser/Triple.h"
24#include "llvm/TargetParser/X86TargetParser.h"
53 enum XOPEnum { NoXOP, SSE4A, FMA4, XOP } XOPLevel = NoXOP;
54 enum AddrSpace { ptr32_sptr = 270, ptr32_uptr = 271, ptr64 = 272 };
58 bool HasPCLMUL =
false;
59 bool HasVPCLMULQDQ =
false;
61 bool HasLZCNT =
false;
62 bool HasRDRND =
false;
63 bool HasFSGSBASE =
false;
66 bool HasPOPCNT =
false;
68 bool HasPRFCHW =
false;
69 bool HasRDSEED =
false;
75 bool HasAVX10_1 =
false;
76 bool HasAVX10_2 =
false;
77 bool HasAVX10_V2_AUX =
false;
78 bool HasAVX512CD =
false;
79 bool HasAVX512VPOPCNTDQ =
false;
80 bool HasAVX512VNNI =
false;
81 bool HasAVX512FP16 =
false;
82 bool HasAVX512BF16 =
false;
83 bool HasAVX512DQ =
false;
84 bool HasAVX512BITALG =
false;
85 bool HasAVX512BMM =
false;
86 bool HasAVX512BW =
false;
87 bool HasAVX512VL =
false;
88 bool HasAVX512VBMI =
false;
89 bool HasAVX512VBMI2 =
false;
90 bool HasAVXIFMA =
false;
91 bool HasAVX512IFMA =
false;
92 bool HasAVX512VP2INTERSECT =
false;
94 bool HasSHA512 =
false;
95 bool HasSHSTK =
false;
100 bool HasCX16 =
false;
101 bool HasFXSR =
false;
102 bool HasXSAVE =
false;
103 bool HasXSAVEOPT =
false;
104 bool HasXSAVEC =
false;
105 bool HasXSAVES =
false;
106 bool HasMWAITX =
false;
107 bool HasCLZERO =
false;
108 bool HasCLDEMOTE =
false;
109 bool HasPCONFIG =
false;
111 bool HasCLFLUSHOPT =
false;
112 bool HasCLWB =
false;
113 bool HasMOVBE =
false;
114 bool HasMOVRS =
false;
115 bool HasPREFETCHI =
false;
116 bool HasRDPID =
false;
117 bool HasRDPRU =
false;
118 bool HasRetpolineExternalThunk =
false;
119 bool HasLAHFSAHF =
false;
120 bool HasWBNOINVD =
false;
121 bool HasWAITPKG =
false;
122 bool HasMOVDIRI =
false;
123 bool HasMOVDIR64B =
false;
124 bool HasPTWRITE =
false;
125 bool HasINVPCID =
false;
126 bool HasENQCMD =
false;
127 bool HasAVXVNNIINT16 =
false;
128 bool HasAMXFP16 =
false;
129 bool HasCMPCCXADD =
false;
130 bool HasRAOINT =
false;
131 bool HasAVXVNNIINT8 =
false;
132 bool HasAVXNECONVERT =
false;
134 bool HasWIDEKL =
false;
135 bool HasHRESET =
false;
136 bool HasAVXVNNI =
false;
137 bool HasAMXTILE =
false;
138 bool HasAMXINT8 =
false;
139 bool HasAMXBF16 =
false;
140 bool HasAMXCOMPLEX =
false;
141 bool HasAMXFP8 =
false;
142 bool HasAMXMOVRS =
false;
143 bool HasAMXAVX512 =
false;
144 bool HasSERIALIZE =
false;
145 bool HasTSXLDTRK =
false;
146 bool HasUSERMSR =
false;
147 bool HasUINTR =
false;
148 bool HasCRC32 =
false;
150 bool HasEGPR =
false;
151 bool HasPush2Pop2 =
false;
154 bool HasCCMP =
false;
158 bool HasJMPABS =
false;
159 bool HasInlineAsmUseGPR32 =
false;
160 bool HasBranchHint =
false;
163 llvm::X86::CPUKind
CPU = llvm::X86::CK_None;
205 return RegName ==
"esp" || RegName ==
"rsp";
212 bool validateCpuSupports(StringRef FeatureStr)
const override;
214 bool validateCpuIs(StringRef FeatureStr)
const override;
216 bool validateCPUSpecificCPUDispatch(StringRef Name)
const override;
218 char CPUSpecificManglingCharacter(StringRef Name)
const override;
220 void getCPUSpecificCPUDispatchFeatures(
224 std::optional<unsigned> getCPUCacheLineSize()
const override;
226 bool validateAsmConstraint(
const char *&Name,
230 bool &HasSizeMismatch)
const override {
233 if (RegName ==
"esp" || RegName ==
"ebp") {
235 HasSizeMismatch = RegSize != 32;
238 if (RegName.ends_with(
"di")) {
240 if (RegName ==
"edi") {
241 HasSizeMismatch = RegSize != 32;
242 }
else if (RegName ==
"di") {
243 HasSizeMismatch = RegSize != 16;
253 return !llvm::is_contained(
254 {
"argp",
"flags",
"fpcr",
"fpsr",
"dirflag",
"frame"}, RegName);
257 bool validateOutputSize(
const llvm::StringMap<bool> &FeatureMap,
258 StringRef Constraint,
unsigned Size)
const override;
260 bool validateInputSize(
const llvm::StringMap<bool> &FeatureMap,
261 StringRef Constraint,
unsigned Size)
const override;
265 if (
CPU == llvm::X86::CK_None ||
CPU >= llvm::X86::CK_PentiumPro)
272 if (
CPU == llvm::X86::CK_None ||
CPU >= llvm::X86::CK_PentiumPro)
277 virtual bool validateOperandSize(
const llvm::StringMap<bool> &FeatureMap,
278 StringRef Constraint,
unsigned Size)
const;
280 std::string convertConstraint(
const char *&Constraint)
const override;
282 return "~{dirflag},~{fpsr},~{flags}";
287 StringRef::iterator I, E;
288 for (I = Constraint.begin(), E = Constraint.end(); I != E; ++I) {
289 if (isalpha(*I) || *I ==
'@')
313 if ((++I != E) && ((*I ==
'0') || (*I ==
'z')))
325 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
326 bool Enabled)
const final;
331 const std::vector<std::string> &FeaturesVec)
const override;
333 bool isValidFeatureName(StringRef Name)
const override;
337 bool handleTargetFeatures(std::vector<std::string> &Features,
341 if (
getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
343 if (
getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
345 if (
getTriple().getArch() == llvm::Triple::x86 && !HasMMX)
355 bool Only64Bit =
getTriple().getArch() != llvm::Triple::x86;
356 return llvm::X86::parseArchX86(Name, Only64Bit) != llvm::X86::CK_None;
360 if (Name ==
"generic")
366 return llvm::X86::parseTuneCPU(Name) != llvm::X86::CK_None;
373 bool Only64Bit =
getTriple().getArch() != llvm::Triple::x86;
374 CPU = llvm::X86::parseArchX86(Name, Only64Bit);
375 return CPU != llvm::X86::CK_None;
380 bool setFPMath(StringRef Name)
override;
383 return getTriple().getArch() != llvm::Triple::x86;
421 if (TargetAddrSpace == ptr32_sptr || TargetAddrSpace == ptr32_uptr)
423 if (TargetAddrSpace == ptr64)
434 IsOpenCL = Opts.OpenCL;
438 bool IsOpenCL =
false;
479 StringRef Constraint,
unsigned Size)
const override {
480 switch (Constraint[0]) {
509 return llvm::IntegerType::MAX_INT_BITS;
549 llvm::Triple
T = llvm::Triple(Triple);
579 bool IsMSVC =
getTriple().isWindowsMSVCEnvironment();
580 std::string Layout = IsWinCOFF ?
"e-m:x" :
"e-m:e";
581 Layout +=
"-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-";
582 Layout += IsMSVC ?
"f80:128" :
"f80:32";
583 Layout +=
"-n8:16:32-a:0:32-S32";
607 Builder.defineMacro(
"_M_IX86",
"600");
623 Builder.defineMacro(
"_X86_");
643 Builder.defineMacro(
"_X86_");
644 Builder.defineMacro(
"__CYGWIN__");
645 Builder.defineMacro(
"__CYGWIN32__");
649 Builder.defineMacro(
"_GNU_SOURCE");
663 Builder.defineMacro(
"__INTEL__");
687 Builder.defineMacro(
"__iamcu");
688 Builder.defineMacro(
"__iamcu__");
707 Builder.defineMacro(
"__INTEL__");
708 Builder.defineMacro(
"__rtems__");
791 bool &HasSizeMismatch)
const override {
794 if (RegName ==
"rsp" || RegName ==
"rbp") {
796 HasSizeMismatch = RegSize != 64;
803 StringRef Reg64 = RegName;
804 if (Reg64.back() ==
'd' || Reg64.back() ==
'w' || Reg64.back() ==
'b') {
805 Reg64 = Reg64.substr(0, Reg64.size() - 1);
807 if (
getTargetOpts().FeatureMap.lookup((
"reserve-" + Reg64).str())) {
808 switch (RegName.back()) {
810 HasSizeMismatch = RegSize != 32;
813 HasSizeMismatch = RegSize != 16;
816 HasSizeMismatch = RegSize != 8;
819 HasSizeMismatch = RegSize != 64;
837 return llvm::IntegerType::MAX_INT_BITS;
843 IsOpenCL = Opts.OpenCL;
847 bool IsOpenCL =
false;
861 this->
TheCXXABI.set(TargetCXXABI::Microsoft);
956 Builder.defineMacro(
"_M_X64",
"100");
957 Builder.defineMacro(
"_M_AMD64",
"100");
965 unsigned getMinGlobalAlign(uint64_t TypeSize,
966 bool HasNonWeakDef)
const override;
974 bool UseMSVCCompatGlobalAlign =
true;
1004 Builder.defineMacro(
"__x86_64__");
1005 Builder.defineMacro(
"__CYGWIN__");
1006 Builder.defineMacro(
"__CYGWIN64__");
1010 Builder.defineMacro(
"_GNU_SOURCE");
1048 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.
The type of a lookup table which maps from language-specific address spaces to target-specific ones.
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...
Exposes information about the current target.
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.
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 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.
bool setCPU(StringRef Name) override
Target the specified CPU.
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 validateLocalRegisterVariable(StringRef RegName) const override
Returns whether the register RegName (a canonical GCC register name) can hold a local register variab...
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 constexpr LangASMap 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.
Top level wrappers for InstallAPI frontend operations.
const FunctionProtoType * T
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