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