xref: /aosp_15_r20/external/llvm/lib/Target/X86/X86Subtarget.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-- X86Subtarget.cpp - X86 Subtarget Information ----------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file implements the X86 specific subclass of TargetSubtargetInfo.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker 
14*9880d681SAndroid Build Coastguard Worker #include "X86Subtarget.h"
15*9880d681SAndroid Build Coastguard Worker #include "X86InstrInfo.h"
16*9880d681SAndroid Build Coastguard Worker #include "X86TargetMachine.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Attributes.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Function.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/GlobalValue.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/CommandLine.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Debug.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Host.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetMachine.h"
26*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetOptions.h"
27*9880d681SAndroid Build Coastguard Worker 
28*9880d681SAndroid Build Coastguard Worker #if defined(_MSC_VER)
29*9880d681SAndroid Build Coastguard Worker #include <intrin.h>
30*9880d681SAndroid Build Coastguard Worker #endif
31*9880d681SAndroid Build Coastguard Worker 
32*9880d681SAndroid Build Coastguard Worker using namespace llvm;
33*9880d681SAndroid Build Coastguard Worker 
34*9880d681SAndroid Build Coastguard Worker #define DEBUG_TYPE "subtarget"
35*9880d681SAndroid Build Coastguard Worker 
36*9880d681SAndroid Build Coastguard Worker #define GET_SUBTARGETINFO_TARGET_DESC
37*9880d681SAndroid Build Coastguard Worker #define GET_SUBTARGETINFO_CTOR
38*9880d681SAndroid Build Coastguard Worker #include "X86GenSubtargetInfo.inc"
39*9880d681SAndroid Build Coastguard Worker 
40*9880d681SAndroid Build Coastguard Worker // Temporary option to control early if-conversion for x86 while adding machine
41*9880d681SAndroid Build Coastguard Worker // models.
42*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
43*9880d681SAndroid Build Coastguard Worker X86EarlyIfConv("x86-early-ifcvt", cl::Hidden,
44*9880d681SAndroid Build Coastguard Worker                cl::desc("Enable early if-conversion on X86"));
45*9880d681SAndroid Build Coastguard Worker 
46*9880d681SAndroid Build Coastguard Worker 
47*9880d681SAndroid Build Coastguard Worker /// Classify a blockaddress reference for the current subtarget according to how
48*9880d681SAndroid Build Coastguard Worker /// we should reference it in a non-pcrel context.
classifyBlockAddressReference() const49*9880d681SAndroid Build Coastguard Worker unsigned char X86Subtarget::classifyBlockAddressReference() const {
50*9880d681SAndroid Build Coastguard Worker   return classifyLocalReference(nullptr);
51*9880d681SAndroid Build Coastguard Worker }
52*9880d681SAndroid Build Coastguard Worker 
53*9880d681SAndroid Build Coastguard Worker /// Classify a global variable reference for the current subtarget according to
54*9880d681SAndroid Build Coastguard Worker /// how we should reference it in a non-pcrel context.
55*9880d681SAndroid Build Coastguard Worker unsigned char
classifyGlobalReference(const GlobalValue * GV) const56*9880d681SAndroid Build Coastguard Worker X86Subtarget::classifyGlobalReference(const GlobalValue *GV) const {
57*9880d681SAndroid Build Coastguard Worker   return classifyGlobalReference(GV, *GV->getParent());
58*9880d681SAndroid Build Coastguard Worker }
59*9880d681SAndroid Build Coastguard Worker 
60*9880d681SAndroid Build Coastguard Worker unsigned char
classifyLocalReference(const GlobalValue * GV) const61*9880d681SAndroid Build Coastguard Worker X86Subtarget::classifyLocalReference(const GlobalValue *GV) const {
62*9880d681SAndroid Build Coastguard Worker   // 64 bits can use %rip addressing for anything local.
63*9880d681SAndroid Build Coastguard Worker   if (is64Bit())
64*9880d681SAndroid Build Coastguard Worker     return X86II::MO_NO_FLAG;
65*9880d681SAndroid Build Coastguard Worker 
66*9880d681SAndroid Build Coastguard Worker   // If this is for a position dependent executable, the static linker can
67*9880d681SAndroid Build Coastguard Worker   // figure it out.
68*9880d681SAndroid Build Coastguard Worker   if (!isPositionIndependent())
69*9880d681SAndroid Build Coastguard Worker     return X86II::MO_NO_FLAG;
70*9880d681SAndroid Build Coastguard Worker 
71*9880d681SAndroid Build Coastguard Worker   // The COFF dynamic linker just patches the executable sections.
72*9880d681SAndroid Build Coastguard Worker   if (isTargetCOFF())
73*9880d681SAndroid Build Coastguard Worker     return X86II::MO_NO_FLAG;
74*9880d681SAndroid Build Coastguard Worker 
75*9880d681SAndroid Build Coastguard Worker   if (isTargetDarwin()) {
76*9880d681SAndroid Build Coastguard Worker     // 32 bit macho has no relocation for a-b if a is undefined, even if
77*9880d681SAndroid Build Coastguard Worker     // b is in the section that is being relocated.
78*9880d681SAndroid Build Coastguard Worker     // This means we have to use o load even for GVs that are known to be
79*9880d681SAndroid Build Coastguard Worker     // local to the dso.
80*9880d681SAndroid Build Coastguard Worker     if (GV && (GV->isDeclarationForLinker() || GV->hasCommonLinkage()))
81*9880d681SAndroid Build Coastguard Worker       return X86II::MO_DARWIN_NONLAZY_PIC_BASE;
82*9880d681SAndroid Build Coastguard Worker 
83*9880d681SAndroid Build Coastguard Worker     return X86II::MO_PIC_BASE_OFFSET;
84*9880d681SAndroid Build Coastguard Worker   }
85*9880d681SAndroid Build Coastguard Worker 
86*9880d681SAndroid Build Coastguard Worker   return X86II::MO_GOTOFF;
87*9880d681SAndroid Build Coastguard Worker }
88*9880d681SAndroid Build Coastguard Worker 
classifyGlobalReference(const GlobalValue * GV,const Module & M) const89*9880d681SAndroid Build Coastguard Worker unsigned char X86Subtarget::classifyGlobalReference(const GlobalValue *GV,
90*9880d681SAndroid Build Coastguard Worker                                                     const Module &M) const {
91*9880d681SAndroid Build Coastguard Worker   // Large model never uses stubs.
92*9880d681SAndroid Build Coastguard Worker   if (TM.getCodeModel() == CodeModel::Large)
93*9880d681SAndroid Build Coastguard Worker     return X86II::MO_NO_FLAG;
94*9880d681SAndroid Build Coastguard Worker 
95*9880d681SAndroid Build Coastguard Worker   if (TM.shouldAssumeDSOLocal(M, GV))
96*9880d681SAndroid Build Coastguard Worker     return classifyLocalReference(GV);
97*9880d681SAndroid Build Coastguard Worker 
98*9880d681SAndroid Build Coastguard Worker   if (isTargetCOFF())
99*9880d681SAndroid Build Coastguard Worker     return X86II::MO_DLLIMPORT;
100*9880d681SAndroid Build Coastguard Worker 
101*9880d681SAndroid Build Coastguard Worker   if (is64Bit())
102*9880d681SAndroid Build Coastguard Worker     return X86II::MO_GOTPCREL;
103*9880d681SAndroid Build Coastguard Worker 
104*9880d681SAndroid Build Coastguard Worker   if (isTargetDarwin()) {
105*9880d681SAndroid Build Coastguard Worker     if (!isPositionIndependent())
106*9880d681SAndroid Build Coastguard Worker       return X86II::MO_DARWIN_NONLAZY;
107*9880d681SAndroid Build Coastguard Worker     return X86II::MO_DARWIN_NONLAZY_PIC_BASE;
108*9880d681SAndroid Build Coastguard Worker   }
109*9880d681SAndroid Build Coastguard Worker 
110*9880d681SAndroid Build Coastguard Worker   return X86II::MO_GOT;
111*9880d681SAndroid Build Coastguard Worker }
112*9880d681SAndroid Build Coastguard Worker 
113*9880d681SAndroid Build Coastguard Worker unsigned char
classifyGlobalFunctionReference(const GlobalValue * GV) const114*9880d681SAndroid Build Coastguard Worker X86Subtarget::classifyGlobalFunctionReference(const GlobalValue *GV) const {
115*9880d681SAndroid Build Coastguard Worker   return classifyGlobalFunctionReference(GV, *GV->getParent());
116*9880d681SAndroid Build Coastguard Worker }
117*9880d681SAndroid Build Coastguard Worker 
118*9880d681SAndroid Build Coastguard Worker unsigned char
classifyGlobalFunctionReference(const GlobalValue * GV,const Module & M) const119*9880d681SAndroid Build Coastguard Worker X86Subtarget::classifyGlobalFunctionReference(const GlobalValue *GV,
120*9880d681SAndroid Build Coastguard Worker                                               const Module &M) const {
121*9880d681SAndroid Build Coastguard Worker   if (TM.shouldAssumeDSOLocal(M, GV))
122*9880d681SAndroid Build Coastguard Worker     return X86II::MO_NO_FLAG;
123*9880d681SAndroid Build Coastguard Worker 
124*9880d681SAndroid Build Coastguard Worker   assert(!isTargetCOFF());
125*9880d681SAndroid Build Coastguard Worker 
126*9880d681SAndroid Build Coastguard Worker   if (isTargetELF())
127*9880d681SAndroid Build Coastguard Worker     return X86II::MO_PLT;
128*9880d681SAndroid Build Coastguard Worker 
129*9880d681SAndroid Build Coastguard Worker   if (is64Bit()) {
130*9880d681SAndroid Build Coastguard Worker     auto *F = dyn_cast_or_null<Function>(GV);
131*9880d681SAndroid Build Coastguard Worker     if (F && F->hasFnAttribute(Attribute::NonLazyBind))
132*9880d681SAndroid Build Coastguard Worker       // If the function is marked as non-lazy, generate an indirect call
133*9880d681SAndroid Build Coastguard Worker       // which loads from the GOT directly. This avoids runtime overhead
134*9880d681SAndroid Build Coastguard Worker       // at the cost of eager binding (and one extra byte of encoding).
135*9880d681SAndroid Build Coastguard Worker       return X86II::MO_GOTPCREL;
136*9880d681SAndroid Build Coastguard Worker     return X86II::MO_NO_FLAG;
137*9880d681SAndroid Build Coastguard Worker   }
138*9880d681SAndroid Build Coastguard Worker 
139*9880d681SAndroid Build Coastguard Worker   return X86II::MO_NO_FLAG;
140*9880d681SAndroid Build Coastguard Worker }
141*9880d681SAndroid Build Coastguard Worker 
142*9880d681SAndroid Build Coastguard Worker /// This function returns the name of a function which has an interface like
143*9880d681SAndroid Build Coastguard Worker /// the non-standard bzero function, if such a function exists on the
144*9880d681SAndroid Build Coastguard Worker /// current subtarget and it is considered preferable over memset with zero
145*9880d681SAndroid Build Coastguard Worker /// passed as the second argument. Otherwise it returns null.
getBZeroEntry() const146*9880d681SAndroid Build Coastguard Worker const char *X86Subtarget::getBZeroEntry() const {
147*9880d681SAndroid Build Coastguard Worker   // Darwin 10 has a __bzero entry point for this purpose.
148*9880d681SAndroid Build Coastguard Worker   if (getTargetTriple().isMacOSX() &&
149*9880d681SAndroid Build Coastguard Worker       !getTargetTriple().isMacOSXVersionLT(10, 6))
150*9880d681SAndroid Build Coastguard Worker     return "__bzero";
151*9880d681SAndroid Build Coastguard Worker 
152*9880d681SAndroid Build Coastguard Worker   return nullptr;
153*9880d681SAndroid Build Coastguard Worker }
154*9880d681SAndroid Build Coastguard Worker 
hasSinCos() const155*9880d681SAndroid Build Coastguard Worker bool X86Subtarget::hasSinCos() const {
156*9880d681SAndroid Build Coastguard Worker   return getTargetTriple().isMacOSX() &&
157*9880d681SAndroid Build Coastguard Worker     !getTargetTriple().isMacOSXVersionLT(10, 9) &&
158*9880d681SAndroid Build Coastguard Worker     is64Bit();
159*9880d681SAndroid Build Coastguard Worker }
160*9880d681SAndroid Build Coastguard Worker 
161*9880d681SAndroid Build Coastguard Worker /// Return true if the subtarget allows calls to immediate address.
isLegalToCallImmediateAddr() const162*9880d681SAndroid Build Coastguard Worker bool X86Subtarget::isLegalToCallImmediateAddr() const {
163*9880d681SAndroid Build Coastguard Worker   // FIXME: I386 PE/COFF supports PC relative calls using IMAGE_REL_I386_REL32
164*9880d681SAndroid Build Coastguard Worker   // but WinCOFFObjectWriter::RecordRelocation cannot emit them.  Once it does,
165*9880d681SAndroid Build Coastguard Worker   // the following check for Win32 should be removed.
166*9880d681SAndroid Build Coastguard Worker   if (In64BitMode || isTargetWin32())
167*9880d681SAndroid Build Coastguard Worker     return false;
168*9880d681SAndroid Build Coastguard Worker   return isTargetELF() || TM.getRelocationModel() == Reloc::Static;
169*9880d681SAndroid Build Coastguard Worker }
170*9880d681SAndroid Build Coastguard Worker 
initSubtargetFeatures(StringRef CPU,StringRef FS)171*9880d681SAndroid Build Coastguard Worker void X86Subtarget::initSubtargetFeatures(StringRef CPU, StringRef FS) {
172*9880d681SAndroid Build Coastguard Worker   std::string CPUName = CPU;
173*9880d681SAndroid Build Coastguard Worker   if (CPUName.empty())
174*9880d681SAndroid Build Coastguard Worker     CPUName = "generic";
175*9880d681SAndroid Build Coastguard Worker 
176*9880d681SAndroid Build Coastguard Worker   // Make sure 64-bit features are available in 64-bit mode. (But make sure
177*9880d681SAndroid Build Coastguard Worker   // SSE2 can be turned off explicitly.)
178*9880d681SAndroid Build Coastguard Worker   std::string FullFS = FS;
179*9880d681SAndroid Build Coastguard Worker   if (In64BitMode) {
180*9880d681SAndroid Build Coastguard Worker     if (!FullFS.empty())
181*9880d681SAndroid Build Coastguard Worker       FullFS = "+64bit,+sse2," + FullFS;
182*9880d681SAndroid Build Coastguard Worker     else
183*9880d681SAndroid Build Coastguard Worker       FullFS = "+64bit,+sse2";
184*9880d681SAndroid Build Coastguard Worker   }
185*9880d681SAndroid Build Coastguard Worker 
186*9880d681SAndroid Build Coastguard Worker   // LAHF/SAHF are always supported in non-64-bit mode.
187*9880d681SAndroid Build Coastguard Worker   if (!In64BitMode) {
188*9880d681SAndroid Build Coastguard Worker     if (!FullFS.empty())
189*9880d681SAndroid Build Coastguard Worker       FullFS = "+sahf," + FullFS;
190*9880d681SAndroid Build Coastguard Worker     else
191*9880d681SAndroid Build Coastguard Worker       FullFS = "+sahf";
192*9880d681SAndroid Build Coastguard Worker   }
193*9880d681SAndroid Build Coastguard Worker 
194*9880d681SAndroid Build Coastguard Worker 
195*9880d681SAndroid Build Coastguard Worker   // Parse features string and set the CPU.
196*9880d681SAndroid Build Coastguard Worker   ParseSubtargetFeatures(CPUName, FullFS);
197*9880d681SAndroid Build Coastguard Worker 
198*9880d681SAndroid Build Coastguard Worker   // All CPUs that implement SSE4.2 or SSE4A support unaligned accesses of
199*9880d681SAndroid Build Coastguard Worker   // 16-bytes and under that are reasonably fast. These features were
200*9880d681SAndroid Build Coastguard Worker   // introduced with Intel's Nehalem/Silvermont and AMD's Family10h
201*9880d681SAndroid Build Coastguard Worker   // micro-architectures respectively.
202*9880d681SAndroid Build Coastguard Worker   if (hasSSE42() || hasSSE4A())
203*9880d681SAndroid Build Coastguard Worker     IsUAMem16Slow = false;
204*9880d681SAndroid Build Coastguard Worker 
205*9880d681SAndroid Build Coastguard Worker   InstrItins = getInstrItineraryForCPU(CPUName);
206*9880d681SAndroid Build Coastguard Worker 
207*9880d681SAndroid Build Coastguard Worker   // It's important to keep the MCSubtargetInfo feature bits in sync with
208*9880d681SAndroid Build Coastguard Worker   // target data structure which is shared with MC code emitter, etc.
209*9880d681SAndroid Build Coastguard Worker   if (In64BitMode)
210*9880d681SAndroid Build Coastguard Worker     ToggleFeature(X86::Mode64Bit);
211*9880d681SAndroid Build Coastguard Worker   else if (In32BitMode)
212*9880d681SAndroid Build Coastguard Worker     ToggleFeature(X86::Mode32Bit);
213*9880d681SAndroid Build Coastguard Worker   else if (In16BitMode)
214*9880d681SAndroid Build Coastguard Worker     ToggleFeature(X86::Mode16Bit);
215*9880d681SAndroid Build Coastguard Worker   else
216*9880d681SAndroid Build Coastguard Worker     llvm_unreachable("Not 16-bit, 32-bit or 64-bit mode!");
217*9880d681SAndroid Build Coastguard Worker 
218*9880d681SAndroid Build Coastguard Worker   DEBUG(dbgs() << "Subtarget features: SSELevel " << X86SSELevel
219*9880d681SAndroid Build Coastguard Worker                << ", 3DNowLevel " << X863DNowLevel
220*9880d681SAndroid Build Coastguard Worker                << ", 64bit " << HasX86_64 << "\n");
221*9880d681SAndroid Build Coastguard Worker   assert((!In64BitMode || HasX86_64) &&
222*9880d681SAndroid Build Coastguard Worker          "64-bit code requested on a subtarget that doesn't support it!");
223*9880d681SAndroid Build Coastguard Worker 
224*9880d681SAndroid Build Coastguard Worker   // Stack alignment is 16 bytes on Darwin, Linux, kFreeBSD and Solaris (both
225*9880d681SAndroid Build Coastguard Worker   // 32 and 64 bit) and for all 64-bit targets.
226*9880d681SAndroid Build Coastguard Worker   if (StackAlignOverride)
227*9880d681SAndroid Build Coastguard Worker     stackAlignment = StackAlignOverride;
228*9880d681SAndroid Build Coastguard Worker   else if (isTargetDarwin() || isTargetLinux() || isTargetSolaris() ||
229*9880d681SAndroid Build Coastguard Worker            isTargetKFreeBSD() || In64BitMode)
230*9880d681SAndroid Build Coastguard Worker     stackAlignment = 16;
231*9880d681SAndroid Build Coastguard Worker }
232*9880d681SAndroid Build Coastguard Worker 
initializeEnvironment()233*9880d681SAndroid Build Coastguard Worker void X86Subtarget::initializeEnvironment() {
234*9880d681SAndroid Build Coastguard Worker   X86SSELevel = NoSSE;
235*9880d681SAndroid Build Coastguard Worker   X863DNowLevel = NoThreeDNow;
236*9880d681SAndroid Build Coastguard Worker   HasX87 = false;
237*9880d681SAndroid Build Coastguard Worker   HasCMov = false;
238*9880d681SAndroid Build Coastguard Worker   HasX86_64 = false;
239*9880d681SAndroid Build Coastguard Worker   HasPOPCNT = false;
240*9880d681SAndroid Build Coastguard Worker   HasSSE4A = false;
241*9880d681SAndroid Build Coastguard Worker   HasAES = false;
242*9880d681SAndroid Build Coastguard Worker   HasFXSR = false;
243*9880d681SAndroid Build Coastguard Worker   HasXSAVE = false;
244*9880d681SAndroid Build Coastguard Worker   HasXSAVEOPT = false;
245*9880d681SAndroid Build Coastguard Worker   HasXSAVEC = false;
246*9880d681SAndroid Build Coastguard Worker   HasXSAVES = false;
247*9880d681SAndroid Build Coastguard Worker   HasPCLMUL = false;
248*9880d681SAndroid Build Coastguard Worker   HasFMA = false;
249*9880d681SAndroid Build Coastguard Worker   HasFMA4 = false;
250*9880d681SAndroid Build Coastguard Worker   HasXOP = false;
251*9880d681SAndroid Build Coastguard Worker   HasTBM = false;
252*9880d681SAndroid Build Coastguard Worker   HasMOVBE = false;
253*9880d681SAndroid Build Coastguard Worker   HasRDRAND = false;
254*9880d681SAndroid Build Coastguard Worker   HasF16C = false;
255*9880d681SAndroid Build Coastguard Worker   HasFSGSBase = false;
256*9880d681SAndroid Build Coastguard Worker   HasLZCNT = false;
257*9880d681SAndroid Build Coastguard Worker   HasBMI = false;
258*9880d681SAndroid Build Coastguard Worker   HasBMI2 = false;
259*9880d681SAndroid Build Coastguard Worker   HasVBMI = false;
260*9880d681SAndroid Build Coastguard Worker   HasIFMA = false;
261*9880d681SAndroid Build Coastguard Worker   HasRTM = false;
262*9880d681SAndroid Build Coastguard Worker   HasHLE = false;
263*9880d681SAndroid Build Coastguard Worker   HasERI = false;
264*9880d681SAndroid Build Coastguard Worker   HasCDI = false;
265*9880d681SAndroid Build Coastguard Worker   HasPFI = false;
266*9880d681SAndroid Build Coastguard Worker   HasDQI = false;
267*9880d681SAndroid Build Coastguard Worker   HasBWI = false;
268*9880d681SAndroid Build Coastguard Worker   HasVLX = false;
269*9880d681SAndroid Build Coastguard Worker   HasADX = false;
270*9880d681SAndroid Build Coastguard Worker   HasPKU = false;
271*9880d681SAndroid Build Coastguard Worker   HasSHA = false;
272*9880d681SAndroid Build Coastguard Worker   HasPRFCHW = false;
273*9880d681SAndroid Build Coastguard Worker   HasRDSEED = false;
274*9880d681SAndroid Build Coastguard Worker   HasLAHFSAHF = false;
275*9880d681SAndroid Build Coastguard Worker   HasMWAITX = false;
276*9880d681SAndroid Build Coastguard Worker   HasMPX = false;
277*9880d681SAndroid Build Coastguard Worker   IsBTMemSlow = false;
278*9880d681SAndroid Build Coastguard Worker   IsSHLDSlow = false;
279*9880d681SAndroid Build Coastguard Worker   IsUAMem16Slow = false;
280*9880d681SAndroid Build Coastguard Worker   IsUAMem32Slow = false;
281*9880d681SAndroid Build Coastguard Worker   HasSSEUnalignedMem = false;
282*9880d681SAndroid Build Coastguard Worker   HasCmpxchg16b = false;
283*9880d681SAndroid Build Coastguard Worker   UseLeaForSP = false;
284*9880d681SAndroid Build Coastguard Worker   HasFastPartialYMMWrite = false;
285*9880d681SAndroid Build Coastguard Worker   HasSlowDivide32 = false;
286*9880d681SAndroid Build Coastguard Worker   HasSlowDivide64 = false;
287*9880d681SAndroid Build Coastguard Worker   PadShortFunctions = false;
288*9880d681SAndroid Build Coastguard Worker   CallRegIndirect = false;
289*9880d681SAndroid Build Coastguard Worker   LEAUsesAG = false;
290*9880d681SAndroid Build Coastguard Worker   SlowLEA = false;
291*9880d681SAndroid Build Coastguard Worker   SlowIncDec = false;
292*9880d681SAndroid Build Coastguard Worker   stackAlignment = 4;
293*9880d681SAndroid Build Coastguard Worker   // FIXME: this is a known good value for Yonah. How about others?
294*9880d681SAndroid Build Coastguard Worker   MaxInlineSizeThreshold = 128;
295*9880d681SAndroid Build Coastguard Worker   UseSoftFloat = false;
296*9880d681SAndroid Build Coastguard Worker }
297*9880d681SAndroid Build Coastguard Worker 
initializeSubtargetDependencies(StringRef CPU,StringRef FS)298*9880d681SAndroid Build Coastguard Worker X86Subtarget &X86Subtarget::initializeSubtargetDependencies(StringRef CPU,
299*9880d681SAndroid Build Coastguard Worker                                                             StringRef FS) {
300*9880d681SAndroid Build Coastguard Worker   initializeEnvironment();
301*9880d681SAndroid Build Coastguard Worker   initSubtargetFeatures(CPU, FS);
302*9880d681SAndroid Build Coastguard Worker   return *this;
303*9880d681SAndroid Build Coastguard Worker }
304*9880d681SAndroid Build Coastguard Worker 
X86Subtarget(const Triple & TT,StringRef CPU,StringRef FS,const X86TargetMachine & TM,unsigned StackAlignOverride)305*9880d681SAndroid Build Coastguard Worker X86Subtarget::X86Subtarget(const Triple &TT, StringRef CPU, StringRef FS,
306*9880d681SAndroid Build Coastguard Worker                            const X86TargetMachine &TM,
307*9880d681SAndroid Build Coastguard Worker                            unsigned StackAlignOverride)
308*9880d681SAndroid Build Coastguard Worker     : X86GenSubtargetInfo(TT, CPU, FS), X86ProcFamily(Others),
309*9880d681SAndroid Build Coastguard Worker       PICStyle(PICStyles::None), TM(TM), TargetTriple(TT),
310*9880d681SAndroid Build Coastguard Worker       StackAlignOverride(StackAlignOverride),
311*9880d681SAndroid Build Coastguard Worker       In64BitMode(TargetTriple.getArch() == Triple::x86_64),
312*9880d681SAndroid Build Coastguard Worker       In32BitMode(TargetTriple.getArch() == Triple::x86 &&
313*9880d681SAndroid Build Coastguard Worker                   TargetTriple.getEnvironment() != Triple::CODE16),
314*9880d681SAndroid Build Coastguard Worker       In16BitMode(TargetTriple.getArch() == Triple::x86 &&
315*9880d681SAndroid Build Coastguard Worker                   TargetTriple.getEnvironment() == Triple::CODE16),
316*9880d681SAndroid Build Coastguard Worker       TSInfo(), InstrInfo(initializeSubtargetDependencies(CPU, FS)),
317*9880d681SAndroid Build Coastguard Worker       TLInfo(TM, *this), FrameLowering(*this, getStackAlignment()) {
318*9880d681SAndroid Build Coastguard Worker   // Determine the PICStyle based on the target selected.
319*9880d681SAndroid Build Coastguard Worker   if (!isPositionIndependent())
320*9880d681SAndroid Build Coastguard Worker     setPICStyle(PICStyles::None);
321*9880d681SAndroid Build Coastguard Worker   else if (is64Bit())
322*9880d681SAndroid Build Coastguard Worker     setPICStyle(PICStyles::RIPRel);
323*9880d681SAndroid Build Coastguard Worker   else if (isTargetCOFF())
324*9880d681SAndroid Build Coastguard Worker     setPICStyle(PICStyles::None);
325*9880d681SAndroid Build Coastguard Worker   else if (isTargetDarwin())
326*9880d681SAndroid Build Coastguard Worker     setPICStyle(PICStyles::StubPIC);
327*9880d681SAndroid Build Coastguard Worker   else if (isTargetELF())
328*9880d681SAndroid Build Coastguard Worker     setPICStyle(PICStyles::GOT);
329*9880d681SAndroid Build Coastguard Worker }
330*9880d681SAndroid Build Coastguard Worker 
enableEarlyIfConversion() const331*9880d681SAndroid Build Coastguard Worker bool X86Subtarget::enableEarlyIfConversion() const {
332*9880d681SAndroid Build Coastguard Worker   return hasCMov() && X86EarlyIfConv;
333*9880d681SAndroid Build Coastguard Worker }
334*9880d681SAndroid Build Coastguard Worker 
335