blob: 7f033bea9627d4272beff9a49946e6c7bbc9434f [file] [log] [blame]
Bill Wendling2bce78e2010-12-04 23:57:24 +00001//===-- X86Subtarget.cpp - X86 Subtarget Information ----------------------===//
Nate Begemanf26625e2005-07-12 01:41:54 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Nate Begemanf26625e2005-07-12 01:41:54 +00007//
8//===----------------------------------------------------------------------===//
9//
Evan Cheng0d639a22011-07-01 21:01:15 +000010// This file implements the X86 specific subclass of TargetSubtargetInfo.
Nate Begemanf26625e2005-07-12 01:41:54 +000011//
12//===----------------------------------------------------------------------===//
13
14#include "X86Subtarget.h"
Chris Lattnerdc842c02009-07-10 07:20:05 +000015#include "X86InstrInfo.h"
Eric Christopher4629ed72014-08-09 01:07:25 +000016#include "X86TargetMachine.h"
Bill Wendlingaef9c372013-02-15 22:31:27 +000017#include "llvm/IR/Attributes.h"
18#include "llvm/IR/Function.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000019#include "llvm/IR/GlobalValue.h"
Eric Christopher3470bbb2014-05-21 23:51:57 +000020#include "llvm/Support/CommandLine.h"
Evan Cheng9a3ec1b2009-01-03 04:04:46 +000021#include "llvm/Support/Debug.h"
Rafael Espindola65596562011-09-07 16:10:57 +000022#include "llvm/Support/ErrorHandling.h"
Michael J. Spencer447762d2010-11-29 18:16:10 +000023#include "llvm/Support/Host.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000024#include "llvm/Support/raw_ostream.h"
Anton Korobeynikov430e68a12006-12-22 22:29:05 +000025#include "llvm/Target/TargetMachine.h"
Rafael Espindola65596562011-09-07 16:10:57 +000026#include "llvm/Target/TargetOptions.h"
Evan Cheng54b68e32011-07-01 20:45:01 +000027
Chris Lattner3ad60b12009-04-25 18:27:23 +000028#if defined(_MSC_VER)
Bill Wendling6eecd562009-08-03 00:11:34 +000029#include <intrin.h>
Chris Lattner3ad60b12009-04-25 18:27:23 +000030#endif
31
Chandler Carruth84e68b22014-04-22 02:41:26 +000032using namespace llvm;
33
34#define DEBUG_TYPE "subtarget"
35
Chandler Carruthd174b722014-04-22 02:03:14 +000036#define GET_SUBTARGETINFO_TARGET_DESC
37#define GET_SUBTARGETINFO_CTOR
38#include "X86GenSubtargetInfo.inc"
39
Eric Christopher6b0fcfe2014-05-21 23:40:26 +000040// Temporary option to control early if-conversion for x86 while adding machine
41// models.
42static cl::opt<bool>
43X86EarlyIfConv("x86-early-ifcvt", cl::Hidden,
44 cl::desc("Enable early if-conversion on X86"));
45
46
Sanjay Patel2e753412015-08-14 15:11:42 +000047/// Classify a blockaddress reference for the current subtarget according to how
48/// we should reference it in a non-pcrel context.
Rafael Espindolacb2d2662016-05-19 18:34:20 +000049unsigned char X86Subtarget::classifyBlockAddressReference() const {
Rafael Espindolac7e98132016-05-20 12:20:10 +000050 return classifyLocalReference(nullptr);
51}
Chad Rosier24c19d22012-08-01 18:39:17 +000052
Rafael Espindolac7e98132016-05-20 12:20:10 +000053// FIXME: make this a proper option
54static bool CanUseCopyRelocWithPIE = false;
Chad Rosier24c19d22012-08-01 18:39:17 +000055
Rafael Espindolac7e98132016-05-20 12:20:10 +000056static bool shouldAssumeDSOLocal(Reloc::Model RM, const Triple &TT,
57 const Module &M, const GlobalValue *GV) {
58 // DLLImport explicitly marks the GV as external.
59 if (GV && GV->hasDLLImportStorageClass())
60 return false;
61
62 // Every other GV is local on COFF
63 if (TT.isOSBinFormatCOFF())
64 return true;
65
66 if (RM == Reloc::Static)
67 return true;
68
69 if (GV && (GV->hasInternalLinkage() || !GV->hasDefaultVisibility()))
70 return true;
71
72 if (TT.isOSBinFormatELF()) {
73 assert(RM != Reloc::DynamicNoPIC);
74 // Some linkers can use copy relocations with pie executables.
75 if (M.getPIELevel() != PIELevel::Default) {
76 if (CanUseCopyRelocWithPIE)
77 return true;
78
79 // If the symbol is defined, it cannot be preempted.
80 if (GV && !GV->isDeclarationForLinker())
81 return true;
82 return false;
83 }
84
85 // ELF supports preemption of other symbols.
86 return false;
87 }
88
89 assert(TT.isOSBinFormatMachO());
90 if (GV && GV->isStrongDefinitionForLinker())
91 return true;
92
93 return false;
Dan Gohman7a6611792009-11-20 23:18:13 +000094}
95
Sanjay Patel2e753412015-08-14 15:11:42 +000096/// Classify a global variable reference for the current subtarget according to
97/// how we should reference it in a non-pcrel context.
Rafael Espindolaab03eb02016-05-19 22:07:57 +000098unsigned char
99X86Subtarget::classifyGlobalReference(const GlobalValue *GV) const {
Rafael Espindolac7e98132016-05-20 12:20:10 +0000100 return classifyGlobalReference(GV, *GV->getParent());
101}
Chris Lattnerdc842c02009-07-10 07:20:05 +0000102
Rafael Espindolac7e98132016-05-20 12:20:10 +0000103unsigned char
104X86Subtarget::classifyLocalReference(const GlobalValue *GV) const {
105 // 64 bits can use %rip addressing for anything local.
106 if (is64Bit())
Chris Lattnerdc842c02009-07-10 07:20:05 +0000107 return X86II::MO_NO_FLAG;
Chad Rosier24c19d22012-08-01 18:39:17 +0000108
Rafael Espindolac7e98132016-05-20 12:20:10 +0000109 // If this is for a position dependent executable, the static linker can
110 // figure it out.
111 if (TM.getRelocationModel() != Reloc::PIC_)
112 return X86II::MO_NO_FLAG;
Sriraman Tallam3cb77342016-04-22 21:41:58 +0000113
Rafael Espindolac7e98132016-05-20 12:20:10 +0000114 // The COFF dynamic linker just patches the executable sections.
115 if (isTargetCOFF())
116 return X86II::MO_NO_FLAG;
Chad Rosier24c19d22012-08-01 18:39:17 +0000117
Rafael Espindolac7e98132016-05-20 12:20:10 +0000118 if (isTargetDarwin()) {
119 // 32 bit macho has no relocation for a-b if a is undefined, even if
120 // b is in the section that is being relocated.
121 // This means we have to use o load even for GVs that are known to be
122 // local to the dso.
123 if (GV && (GV->isDeclarationForLinker() || GV->hasCommonLinkage()))
Chris Lattnerbd3e5602009-07-10 20:53:38 +0000124 return X86II::MO_DARWIN_NONLAZY_PIC_BASE;
Chad Rosier24c19d22012-08-01 18:39:17 +0000125
Chris Lattnerbd3e5602009-07-10 20:53:38 +0000126 return X86II::MO_PIC_BASE_OFFSET;
127 }
Chad Rosier24c19d22012-08-01 18:39:17 +0000128
Rafael Espindolac7e98132016-05-20 12:20:10 +0000129 return X86II::MO_GOTOFF;
130}
Chad Rosier24c19d22012-08-01 18:39:17 +0000131
Rafael Espindolac7e98132016-05-20 12:20:10 +0000132unsigned char X86Subtarget::classifyGlobalReference(const GlobalValue *GV,
133 const Module &M) const {
134 // Large model never uses stubs.
135 if (TM.getCodeModel() == CodeModel::Large)
Chris Lattnerbd3e5602009-07-10 20:53:38 +0000136 return X86II::MO_NO_FLAG;
Rafael Espindolac7e98132016-05-20 12:20:10 +0000137
138 Reloc::Model RM = TM.getRelocationModel();
139 if (shouldAssumeDSOLocal(RM, TargetTriple, M, GV))
140 return classifyLocalReference(GV);
141
142 if (isTargetCOFF())
143 return X86II::MO_DLLIMPORT;
144
145 if (is64Bit())
146 return X86II::MO_GOTPCREL;
147
148 if (isTargetDarwin()) {
149 if (RM != Reloc::PIC_)
150 return X86II::MO_DARWIN_NONLAZY;
151 return X86II::MO_DARWIN_NONLAZY_PIC_BASE;
Chris Lattnerdc842c02009-07-10 07:20:05 +0000152 }
Chad Rosier24c19d22012-08-01 18:39:17 +0000153
Rafael Espindolac7e98132016-05-20 12:20:10 +0000154 return X86II::MO_GOT;
Chris Lattnerdc842c02009-07-10 07:20:05 +0000155}
156
Rafael Espindola46107b92016-05-19 18:49:29 +0000157unsigned char
158X86Subtarget::classifyGlobalFunctionReference(const GlobalValue *GV) const {
Rafael Espindolac7e98132016-05-20 12:20:10 +0000159 return classifyGlobalFunctionReference(GV, *GV->getParent());
160}
161
162unsigned char
163X86Subtarget::classifyGlobalFunctionReference(const GlobalValue *GV,
164 const Module &M) const {
165 if (shouldAssumeDSOLocal(TM.getRelocationModel(), TargetTriple, M, GV))
166 return X86II::MO_NO_FLAG;
167
168 assert(!isTargetCOFF());
169
170 if (isTargetELF())
Asaf Badouh89406d12016-04-20 08:32:57 +0000171 return X86II::MO_PLT;
Rafael Espindolac7e98132016-05-20 12:20:10 +0000172
173 if (is64Bit()) {
174 auto *F = dyn_cast_or_null<Function>(GV);
175 if (F && F->hasFnAttribute(Attribute::NonLazyBind))
176 // If the function is marked as non-lazy, generate an indirect call
177 // which loads from the GOT directly. This avoids runtime overhead
178 // at the cost of eager binding (and one extra byte of encoding).
179 return X86II::MO_GOTPCREL;
180 return X86II::MO_NO_FLAG;
Asaf Badouh89406d12016-04-20 08:32:57 +0000181 }
182
Rafael Espindolac7e98132016-05-20 12:20:10 +0000183 // PC-relative references to external symbols should go through $stub,
184 // unless we're building with the leopard linker or later, which
185 // automatically synthesizes these stubs.
186 if (!getTargetTriple().isMacOSX() ||
187 getTargetTriple().isMacOSXVersionLT(10, 5))
188 return X86II::MO_DARWIN_STUB;
189
Asaf Badouh89406d12016-04-20 08:32:57 +0000190 return X86II::MO_NO_FLAG;
191}
Anton Korobeynikov6dbdfe22006-11-30 22:42:55 +0000192
Sanjay Patel2e753412015-08-14 15:11:42 +0000193/// This function returns the name of a function which has an interface like
194/// the non-standard bzero function, if such a function exists on the
195/// current subtarget and it is considered preferable over memset with zero
Bill Wendlingbd092622008-09-30 21:22:07 +0000196/// passed as the second argument. Otherwise it returns null.
Bill Wendling17825842008-09-30 22:05:33 +0000197const char *X86Subtarget::getBZeroEntry() const {
Dan Gohman980d7202008-04-01 20:38:36 +0000198 // Darwin 10 has a __bzero entry point for this purpose.
Daniel Dunbarcd01ed52011-04-20 00:14:25 +0000199 if (getTargetTriple().isMacOSX() &&
200 !getTargetTriple().isMacOSXVersionLT(10, 6))
Bill Wendling17825842008-09-30 22:05:33 +0000201 return "__bzero";
Dan Gohman980d7202008-04-01 20:38:36 +0000202
Craig Topper062a2ba2014-04-25 05:30:21 +0000203 return nullptr;
Dan Gohman980d7202008-04-01 20:38:36 +0000204}
205
Evan Cheng0e88c7d2013-01-29 02:32:37 +0000206bool X86Subtarget::hasSinCos() const {
207 return getTargetTriple().isMacOSX() &&
Evan Chengd2ca4e22013-01-30 22:56:35 +0000208 !getTargetTriple().isMacOSXVersionLT(10, 9) &&
209 is64Bit();
Evan Cheng0e88c7d2013-01-29 02:32:37 +0000210}
211
Sanjay Patel2e753412015-08-14 15:11:42 +0000212/// Return true if the subtarget allows calls to immediate address.
Rafael Espindola46107b92016-05-19 18:49:29 +0000213bool X86Subtarget::isLegalToCallImmediateAddr() const {
David Majnemer02f21882014-03-28 21:40:47 +0000214 // FIXME: I386 PE/COFF supports PC relative calls using IMAGE_REL_I386_REL32
215 // but WinCOFFObjectWriter::RecordRelocation cannot emit them. Once it does,
216 // the following check for Win32 should be removed.
217 if (In64BitMode || isTargetWin32())
Evan Cheng96098332009-05-20 04:53:57 +0000218 return false;
Rafael Espindolaab03eb02016-05-19 22:07:57 +0000219 return isTargetELF() || TM.getRelocationModel() == Reloc::Static;
Evan Cheng96098332009-05-20 04:53:57 +0000220}
221
Eric Christopherb68e2532014-09-03 20:36:31 +0000222void X86Subtarget::initSubtargetFeatures(StringRef CPU, StringRef FS) {
Nadav Rotem08ab8772013-02-27 05:56:20 +0000223 std::string CPUName = CPU;
Jim Grosbach48551fb2014-04-12 01:34:29 +0000224 if (CPUName.empty())
225 CPUName = "generic";
Evan Cheng964cb5f2011-07-08 21:14:14 +0000226
Jim Grosbach48551fb2014-04-12 01:34:29 +0000227 // Make sure 64-bit features are available in 64-bit mode. (But make sure
228 // SSE2 can be turned off explicitly.)
229 std::string FullFS = FS;
230 if (In64BitMode) {
231 if (!FullFS.empty())
232 FullFS = "+64bit,+sse2," + FullFS;
233 else
234 FullFS = "+64bit,+sse2";
Evan Cheng11b0a5d2006-09-08 06:48:29 +0000235 }
Evan Chengc5e6d2f2011-07-11 03:57:24 +0000236
Hans Wennborg5000ce82015-12-04 23:00:33 +0000237 // LAHF/SAHF are always supported in non-64-bit mode.
238 if (!In64BitMode) {
239 if (!FullFS.empty())
240 FullFS = "+sahf," + FullFS;
241 else
242 FullFS = "+sahf";
243 }
244
245
Duncan P. N. Exon Smithbb57d732015-07-10 22:33:01 +0000246 // Parse features string and set the CPU.
Jim Grosbach48551fb2014-04-12 01:34:29 +0000247 ParseSubtargetFeatures(CPUName, FullFS);
248
Sanjay Pateldeb8f822015-08-25 16:29:21 +0000249 // All CPUs that implement SSE4.2 or SSE4A support unaligned accesses of
250 // 16-bytes and under that are reasonably fast. These features were
251 // introduced with Intel's Nehalem/Silvermont and AMD's Family10h
252 // micro-architectures respectively.
253 if (hasSSE42() || hasSSE4A())
Sanjay Patel30145672015-09-01 20:51:51 +0000254 IsUAMem16Slow = false;
Sanjay Pateldeb8f822015-08-25 16:29:21 +0000255
Andrew Tricke0c83b12012-08-07 00:25:30 +0000256 InstrItins = getInstrItineraryForCPU(CPUName);
Andrew Trick8523b162012-02-01 23:20:51 +0000257
Evan Chengc5e6d2f2011-07-11 03:57:24 +0000258 // It's important to keep the MCSubtargetInfo feature bits in sync with
259 // target data structure which is shared with MC code emitter, etc.
260 if (In64BitMode)
261 ToggleFeature(X86::Mode64Bit);
Craig Topper3c80d622014-01-06 04:55:54 +0000262 else if (In32BitMode)
263 ToggleFeature(X86::Mode32Bit);
264 else if (In16BitMode)
265 ToggleFeature(X86::Mode16Bit);
266 else
267 llvm_unreachable("Not 16-bit, 32-bit or 64-bit mode!");
Evan Chengc5e6d2f2011-07-11 03:57:24 +0000268
David Greene00411812010-01-05 01:29:13 +0000269 DEBUG(dbgs() << "Subtarget features: SSELevel " << X86SSELevel
Bill Wendling6eecd562009-08-03 00:11:34 +0000270 << ", 3DNowLevel " << X863DNowLevel
271 << ", 64bit " << HasX86_64 << "\n");
Evan Cheng13bcc6c2011-07-07 21:06:52 +0000272 assert((!In64BitMode || HasX86_64) &&
Dan Gohman74037512009-02-03 00:04:43 +0000273 "64-bit code requested on a subtarget that doesn't support it!");
Evan Cheng11b0a5d2006-09-08 06:48:29 +0000274
Marcin Koscielnicki0275fac2016-05-05 11:35:51 +0000275 // Stack alignment is 16 bytes on Darwin, Linux, kFreeBSD and Solaris (both
Roman Divackye8a93fe82011-02-22 17:30:05 +0000276 // 32 and 64 bit) and for all 64-bit targets.
Evan Cheng3a0c5e52011-06-23 17:54:54 +0000277 if (StackAlignOverride)
278 stackAlignment = StackAlignOverride;
Roman Divacky22135672012-11-09 20:10:44 +0000279 else if (isTargetDarwin() || isTargetLinux() || isTargetSolaris() ||
Marcin Koscielnicki0275fac2016-05-05 11:35:51 +0000280 isTargetKFreeBSD() || In64BitMode)
Nate Begemanf26625e2005-07-12 01:41:54 +0000281 stackAlignment = 16;
Dan Gohmandc53f1c2010-05-27 18:43:40 +0000282}
Andrew Trick8523b162012-02-01 23:20:51 +0000283
Bill Wendling61375d82013-02-16 01:36:26 +0000284void X86Subtarget::initializeEnvironment() {
Eric Christopher11e59832015-10-08 20:10:06 +0000285 X86SSELevel = NoSSE;
Bill Wendling61375d82013-02-16 01:36:26 +0000286 X863DNowLevel = NoThreeDNow;
Andrey Turetskiy6a3d5612016-03-23 11:13:54 +0000287 HasX87 = false;
Bill Wendling61375d82013-02-16 01:36:26 +0000288 HasCMov = false;
289 HasX86_64 = false;
290 HasPOPCNT = false;
291 HasSSE4A = false;
292 HasAES = false;
Craig Topper09b65982015-10-16 06:03:09 +0000293 HasFXSR = false;
Amjad Aboud1db6d7a2015-10-12 11:47:46 +0000294 HasXSAVE = false;
295 HasXSAVEOPT = false;
296 HasXSAVEC = false;
297 HasXSAVES = false;
Bill Wendling61375d82013-02-16 01:36:26 +0000298 HasPCLMUL = false;
299 HasFMA = false;
300 HasFMA4 = false;
301 HasXOP = false;
Yunzhong Gaodd36e932013-09-24 18:21:52 +0000302 HasTBM = false;
Bill Wendling61375d82013-02-16 01:36:26 +0000303 HasMOVBE = false;
304 HasRDRAND = false;
305 HasF16C = false;
306 HasFSGSBase = false;
307 HasLZCNT = false;
308 HasBMI = false;
309 HasBMI2 = false;
Michael Zuckerman97b6a6922016-01-17 13:42:12 +0000310 HasVBMI = false;
Elena Demikhovsky29cde352016-01-24 10:41:28 +0000311 HasIFMA = false;
Bill Wendling61375d82013-02-16 01:36:26 +0000312 HasRTM = false;
Michael Liaoe344ec92013-03-26 22:46:02 +0000313 HasHLE = false;
Elena Demikhovsky003e7d72013-07-28 08:28:38 +0000314 HasERI = false;
315 HasCDI = false;
Craig Topper7a8cf012013-08-20 05:23:59 +0000316 HasPFI = false;
Robert Khasanovbfa01312014-07-21 14:54:21 +0000317 HasDQI = false;
318 HasBWI = false;
319 HasVLX = false;
Bill Wendling61375d82013-02-16 01:36:26 +0000320 HasADX = false;
Asaf Badouh5acf66f2015-12-15 13:35:29 +0000321 HasPKU = false;
Ben Langmuir16501752013-09-12 15:51:31 +0000322 HasSHA = false;
Michael Liao5173ee02013-03-26 17:47:11 +0000323 HasPRFCHW = false;
Michael Liaoa486a112013-03-28 23:41:26 +0000324 HasRDSEED = false;
Hans Wennborg5000ce82015-12-04 23:00:33 +0000325 HasLAHFSAHF = false;
Ashutosh Nema348af9c2016-05-18 11:59:12 +0000326 HasMWAITX = false;
Elena Demikhovskyf7e641c2015-06-03 10:30:57 +0000327 HasMPX = false;
Bill Wendling61375d82013-02-16 01:36:26 +0000328 IsBTMemSlow = false;
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000329 IsSHLDSlow = false;
Sanjay Patel30145672015-09-01 20:51:51 +0000330 IsUAMem16Slow = false;
Sanjay Patel501890e2014-11-21 17:40:04 +0000331 IsUAMem32Slow = false;
Sanjay Patelffd039b2015-02-03 17:13:04 +0000332 HasSSEUnalignedMem = false;
Bill Wendling61375d82013-02-16 01:36:26 +0000333 HasCmpxchg16b = false;
334 UseLeaForSP = false;
Yunzhong Gao0de36ec2016-02-12 23:37:57 +0000335 HasFastPartialYMMWrite = false;
Alexey Volkovfd1731d2014-11-21 11:19:34 +0000336 HasSlowDivide32 = false;
337 HasSlowDivide64 = false;
Bill Wendling61375d82013-02-16 01:36:26 +0000338 PadShortFunctions = false;
Preston Gurd663e6f92013-03-27 19:14:02 +0000339 CallRegIndirect = false;
Preston Gurd8b7ab4b2013-04-25 20:29:37 +0000340 LEAUsesAG = false;
Alexey Volkov6226de62014-05-20 08:55:50 +0000341 SlowLEA = false;
Alexey Volkov5260dba2014-06-09 11:40:41 +0000342 SlowIncDec = false;
Bill Wendling61375d82013-02-16 01:36:26 +0000343 stackAlignment = 4;
344 // FIXME: this is a known good value for Yonah. How about others?
345 MaxInlineSizeThreshold = 128;
Eric Christopher824f42f2015-05-12 01:26:05 +0000346 UseSoftFloat = false;
Bill Wendling61375d82013-02-16 01:36:26 +0000347}
348
Eric Christopher1a212032014-06-11 00:25:19 +0000349X86Subtarget &X86Subtarget::initializeSubtargetDependencies(StringRef CPU,
350 StringRef FS) {
351 initializeEnvironment();
Eric Christopherb68e2532014-09-03 20:36:31 +0000352 initSubtargetFeatures(CPU, FS);
Eric Christopher1a212032014-06-11 00:25:19 +0000353 return *this;
354}
355
Daniel Sandersa73f1fd2015-06-10 12:11:26 +0000356X86Subtarget::X86Subtarget(const Triple &TT, const std::string &CPU,
Eric Christopher12f4a782014-10-01 20:38:22 +0000357 const std::string &FS, const X86TargetMachine &TM,
Eric Christophera08f30b2014-06-09 17:08:19 +0000358 unsigned StackAlignOverride)
Daniel Sanders50f17232015-09-15 16:17:27 +0000359 : X86GenSubtargetInfo(TT, CPU, FS), X86ProcFamily(Others),
Rafael Espindolaab03eb02016-05-19 22:07:57 +0000360 PICStyle(PICStyles::None), TM(TM), TargetTriple(TT),
Eric Christopherb8f97682014-05-07 21:05:47 +0000361 StackAlignOverride(StackAlignOverride),
362 In64BitMode(TargetTriple.getArch() == Triple::x86_64),
363 In32BitMode(TargetTriple.getArch() == Triple::x86 &&
364 TargetTriple.getEnvironment() != Triple::CODE16),
365 In16BitMode(TargetTriple.getArch() == Triple::x86 &&
Eric Christophera08f30b2014-06-09 17:08:19 +0000366 TargetTriple.getEnvironment() == Triple::CODE16),
Mehdi Amini157e5a62015-07-09 02:10:08 +0000367 TSInfo(), InstrInfo(initializeSubtargetDependencies(CPU, FS)),
368 TLInfo(TM, *this), FrameLowering(*this, getStackAlignment()) {
Eric Christopher4629ed72014-08-09 01:07:25 +0000369 // Determine the PICStyle based on the target selected.
370 if (TM.getRelocationModel() == Reloc::Static) {
371 // Unless we're in PIC or DynamicNoPIC mode, set the PIC style to None.
372 setPICStyle(PICStyles::None);
373 } else if (is64Bit()) {
374 // PIC in 64 bit mode is always rip-rel.
375 setPICStyle(PICStyles::RIPRel);
376 } else if (isTargetCOFF()) {
377 setPICStyle(PICStyles::None);
378 } else if (isTargetDarwin()) {
379 if (TM.getRelocationModel() == Reloc::PIC_)
380 setPICStyle(PICStyles::StubPIC);
381 else {
382 assert(TM.getRelocationModel() == Reloc::DynamicNoPIC);
383 setPICStyle(PICStyles::StubDynamicNoPIC);
384 }
385 } else if (isTargetELF()) {
386 setPICStyle(PICStyles::GOT);
387 }
388}
Bill Wendlingaef9c372013-02-15 22:31:27 +0000389
Sanjay Patela2f658d2014-07-15 22:39:58 +0000390bool X86Subtarget::enableEarlyIfConversion() const {
Eric Christopher3470bbb2014-05-21 23:51:57 +0000391 return hasCMov() && X86EarlyIfConv;
Eric Christopher6b0fcfe2014-05-21 23:40:26 +0000392}
Sanjay Patela2f658d2014-07-15 22:39:58 +0000393