blob: a6ad386b0a948f121907b295c1b1ac221be5d55e [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"
Bill Wendlingaef9c372013-02-15 22:31:27 +000016#include "llvm/IR/Attributes.h"
17#include "llvm/IR/Function.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000018#include "llvm/IR/GlobalValue.h"
Evan Cheng9a3ec1b2009-01-03 04:04:46 +000019#include "llvm/Support/Debug.h"
Rafael Espindola65596562011-09-07 16:10:57 +000020#include "llvm/Support/ErrorHandling.h"
Michael J. Spencer447762d2010-11-29 18:16:10 +000021#include "llvm/Support/Host.h"
Chandler Carruthed0881b2012-12-03 16:50:05 +000022#include "llvm/Support/raw_ostream.h"
Anton Korobeynikov430e68a12006-12-22 22:29:05 +000023#include "llvm/Target/TargetMachine.h"
Rafael Espindola65596562011-09-07 16:10:57 +000024#include "llvm/Target/TargetOptions.h"
Evan Cheng54b68e32011-07-01 20:45:01 +000025
Chris Lattner3ad60b12009-04-25 18:27:23 +000026#if defined(_MSC_VER)
Bill Wendling6eecd562009-08-03 00:11:34 +000027#include <intrin.h>
Chris Lattner3ad60b12009-04-25 18:27:23 +000028#endif
29
Chandler Carruth84e68b22014-04-22 02:41:26 +000030using namespace llvm;
31
32#define DEBUG_TYPE "subtarget"
33
Chandler Carruthd174b722014-04-22 02:03:14 +000034#define GET_SUBTARGETINFO_TARGET_DESC
35#define GET_SUBTARGETINFO_CTOR
36#include "X86GenSubtargetInfo.inc"
37
Eric Christopher6b0fcfe2014-05-21 23:40:26 +000038// Temporary option to control early if-conversion for x86 while adding machine
39// models.
40static cl::opt<bool>
41X86EarlyIfConv("x86-early-ifcvt", cl::Hidden,
42 cl::desc("Enable early if-conversion on X86"));
43
44
Dan Gohman7a6611792009-11-20 23:18:13 +000045/// ClassifyBlockAddressReference - Classify a blockaddress reference for the
46/// current subtarget according to how we should reference it in a non-pcrel
47/// context.
Eric Christophere2fbc672013-04-02 23:06:40 +000048unsigned char X86Subtarget::ClassifyBlockAddressReference() const {
Dan Gohman7a6611792009-11-20 23:18:13 +000049 if (isPICStyleGOT()) // 32-bit ELF targets.
50 return X86II::MO_GOTOFF;
Chad Rosier24c19d22012-08-01 18:39:17 +000051
Dan Gohman7a6611792009-11-20 23:18:13 +000052 if (isPICStyleStubPIC()) // Darwin/32 in PIC mode.
53 return X86II::MO_PIC_BASE_OFFSET;
Chad Rosier24c19d22012-08-01 18:39:17 +000054
Dan Gohman7a6611792009-11-20 23:18:13 +000055 // Direct static reference to label.
56 return X86II::MO_NO_FLAG;
57}
58
Chris Lattnerdc842c02009-07-10 07:20:05 +000059/// ClassifyGlobalReference - Classify a global variable reference for the
60/// current subtarget according to how we should reference it in a non-pcrel
61/// context.
62unsigned char X86Subtarget::
63ClassifyGlobalReference(const GlobalValue *GV, const TargetMachine &TM) const {
64 // DLLImport only exists on windows, it is implemented as a load from a
65 // DLLIMPORT stub.
Nico Rieck7157bb72014-01-14 15:22:47 +000066 if (GV->hasDLLImportStorageClass())
Chris Lattnerdc842c02009-07-10 07:20:05 +000067 return X86II::MO_DLLIMPORT;
68
Chris Lattnerfaa7bdc2010-06-14 20:11:56 +000069 // Determine whether this is a reference to a definition or a declaration.
70 // Materializable GVs (in JIT lazy compilation mode) do not require an extra
71 // load from stub.
72 bool isDecl = GV->hasAvailableExternallyLinkage();
73 if (GV->isDeclaration() && !GV->isMaterializable())
74 isDecl = true;
Evan Cheng02a76522009-07-16 22:53:10 +000075
Chris Lattnerdc842c02009-07-10 07:20:05 +000076 // X86-64 in PIC mode.
77 if (isPICStyleRIPRel()) {
78 // Large model never uses stubs.
79 if (TM.getCodeModel() == CodeModel::Large)
80 return X86II::MO_NO_FLAG;
Chad Rosier24c19d22012-08-01 18:39:17 +000081
Chris Lattner7dce9912009-07-10 21:01:59 +000082 if (isTargetDarwin()) {
83 // If symbol visibility is hidden, the extra load is not needed if
84 // target is x86-64 or the symbol is definitely defined in the current
85 // translation unit.
86 if (GV->hasDefaultVisibility() &&
Evan Cheng02a76522009-07-16 22:53:10 +000087 (isDecl || GV->isWeakForLinker()))
Chris Lattner7dce9912009-07-10 21:01:59 +000088 return X86II::MO_GOTPCREL;
Anton Korobeynikovdb9820e2010-08-21 17:21:11 +000089 } else if (!isTargetWin64()) {
Chris Lattner7dce9912009-07-10 21:01:59 +000090 assert(isTargetELF() && "Unknown rip-relative target");
Chris Lattnerdc842c02009-07-10 07:20:05 +000091
Chris Lattner7dce9912009-07-10 21:01:59 +000092 // Extra load is needed for all externally visible.
93 if (!GV->hasLocalLinkage() && GV->hasDefaultVisibility())
94 return X86II::MO_GOTPCREL;
95 }
Chris Lattnerdc842c02009-07-10 07:20:05 +000096
97 return X86II::MO_NO_FLAG;
98 }
Chad Rosier24c19d22012-08-01 18:39:17 +000099
Chris Lattnerdc842c02009-07-10 07:20:05 +0000100 if (isPICStyleGOT()) { // 32-bit ELF targets.
101 // Extra load is needed for all externally visible.
102 if (GV->hasLocalLinkage() || GV->hasHiddenVisibility())
103 return X86II::MO_GOTOFF;
104 return X86II::MO_GOT;
105 }
Chad Rosier24c19d22012-08-01 18:39:17 +0000106
Chris Lattner21c29402009-07-10 21:00:45 +0000107 if (isPICStyleStubPIC()) { // Darwin/32 in PIC mode.
Chris Lattnerbd3e5602009-07-10 20:53:38 +0000108 // Determine whether we have a stub reference and/or whether the reference
109 // is relative to the PIC base or not.
Chad Rosier24c19d22012-08-01 18:39:17 +0000110
Chris Lattnerdc842c02009-07-10 07:20:05 +0000111 // If this is a strong reference to a definition, it is definitely not
112 // through a stub.
Evan Cheng02a76522009-07-16 22:53:10 +0000113 if (!isDecl && !GV->isWeakForLinker())
Chris Lattnerbd3e5602009-07-10 20:53:38 +0000114 return X86II::MO_PIC_BASE_OFFSET;
Chris Lattnerdc842c02009-07-10 07:20:05 +0000115
116 // Unless we have a symbol with hidden visibility, we have to go through a
117 // normal $non_lazy_ptr stub because this symbol might be resolved late.
Chris Lattnerbd3e5602009-07-10 20:53:38 +0000118 if (!GV->hasHiddenVisibility()) // Non-hidden $non_lazy_ptr reference.
119 return X86II::MO_DARWIN_NONLAZY_PIC_BASE;
Chad Rosier24c19d22012-08-01 18:39:17 +0000120
Chris Lattnerdc842c02009-07-10 07:20:05 +0000121 // If symbol visibility is hidden, we have a stub for common symbol
122 // references and external declarations.
Evan Cheng02a76522009-07-16 22:53:10 +0000123 if (isDecl || GV->hasCommonLinkage()) {
Chris Lattnerdc842c02009-07-10 07:20:05 +0000124 // Hidden $non_lazy_ptr reference.
Chris Lattnerbd3e5602009-07-10 20:53:38 +0000125 return X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE;
Chris Lattnerdc842c02009-07-10 07:20:05 +0000126 }
Chad Rosier24c19d22012-08-01 18:39:17 +0000127
Chris Lattnerdc842c02009-07-10 07:20:05 +0000128 // Otherwise, no stub.
Chris Lattnerbd3e5602009-07-10 20:53:38 +0000129 return X86II::MO_PIC_BASE_OFFSET;
130 }
Chad Rosier24c19d22012-08-01 18:39:17 +0000131
Chris Lattner21c29402009-07-10 21:00:45 +0000132 if (isPICStyleStubNoDynamic()) { // Darwin/32 in -mdynamic-no-pic mode.
Chris Lattnerbd3e5602009-07-10 20:53:38 +0000133 // Determine whether we have a stub reference.
Chad Rosier24c19d22012-08-01 18:39:17 +0000134
Chris Lattnerbd3e5602009-07-10 20:53:38 +0000135 // If this is a strong reference to a definition, it is definitely not
136 // through a stub.
Evan Cheng02a76522009-07-16 22:53:10 +0000137 if (!isDecl && !GV->isWeakForLinker())
Chris Lattnerbd3e5602009-07-10 20:53:38 +0000138 return X86II::MO_NO_FLAG;
Chad Rosier24c19d22012-08-01 18:39:17 +0000139
Chris Lattnerbd3e5602009-07-10 20:53:38 +0000140 // Unless we have a symbol with hidden visibility, we have to go through a
141 // normal $non_lazy_ptr stub because this symbol might be resolved late.
142 if (!GV->hasHiddenVisibility()) // Non-hidden $non_lazy_ptr reference.
143 return X86II::MO_DARWIN_NONLAZY;
Evan Cheng1b389522009-09-03 07:04:02 +0000144
Chris Lattnerbd3e5602009-07-10 20:53:38 +0000145 // Otherwise, no stub.
146 return X86II::MO_NO_FLAG;
Chris Lattnerdc842c02009-07-10 07:20:05 +0000147 }
Chad Rosier24c19d22012-08-01 18:39:17 +0000148
Chris Lattnerdc842c02009-07-10 07:20:05 +0000149 // Direct static reference to global.
150 return X86II::MO_NO_FLAG;
151}
152
Anton Korobeynikov6dbdfe22006-11-30 22:42:55 +0000153
Bill Wendlingbd092622008-09-30 21:22:07 +0000154/// getBZeroEntry - This function returns the name of a function which has an
155/// interface like the non-standard bzero function, if such a function exists on
156/// the current subtarget and it is considered prefereable over memset with zero
157/// passed as the second argument. Otherwise it returns null.
Bill Wendling17825842008-09-30 22:05:33 +0000158const char *X86Subtarget::getBZeroEntry() const {
Dan Gohman980d7202008-04-01 20:38:36 +0000159 // Darwin 10 has a __bzero entry point for this purpose.
Daniel Dunbarcd01ed52011-04-20 00:14:25 +0000160 if (getTargetTriple().isMacOSX() &&
161 !getTargetTriple().isMacOSXVersionLT(10, 6))
Bill Wendling17825842008-09-30 22:05:33 +0000162 return "__bzero";
Dan Gohman980d7202008-04-01 20:38:36 +0000163
Craig Topper062a2ba2014-04-25 05:30:21 +0000164 return nullptr;
Dan Gohman980d7202008-04-01 20:38:36 +0000165}
166
Evan Cheng0e88c7d2013-01-29 02:32:37 +0000167bool X86Subtarget::hasSinCos() const {
168 return getTargetTriple().isMacOSX() &&
Evan Chengd2ca4e22013-01-30 22:56:35 +0000169 !getTargetTriple().isMacOSXVersionLT(10, 9) &&
170 is64Bit();
Evan Cheng0e88c7d2013-01-29 02:32:37 +0000171}
172
Evan Cheng96098332009-05-20 04:53:57 +0000173/// IsLegalToCallImmediateAddr - Return true if the subtarget allows calls
174/// to immediate address.
175bool X86Subtarget::IsLegalToCallImmediateAddr(const TargetMachine &TM) const {
David Majnemer02f21882014-03-28 21:40:47 +0000176 // FIXME: I386 PE/COFF supports PC relative calls using IMAGE_REL_I386_REL32
177 // but WinCOFFObjectWriter::RecordRelocation cannot emit them. Once it does,
178 // the following check for Win32 should be removed.
179 if (In64BitMode || isTargetWin32())
Evan Cheng96098332009-05-20 04:53:57 +0000180 return false;
181 return isTargetELF() || TM.getRelocationModel() == Reloc::Static;
182}
183
Bill Wendlingaef9c372013-02-15 22:31:27 +0000184void X86Subtarget::resetSubtargetFeatures(const MachineFunction *MF) {
185 AttributeSet FnAttrs = MF->getFunction()->getAttributes();
Eric Christopherb8f97682014-05-07 21:05:47 +0000186 Attribute CPUAttr =
187 FnAttrs.getAttribute(AttributeSet::FunctionIndex, "target-cpu");
188 Attribute FSAttr =
189 FnAttrs.getAttribute(AttributeSet::FunctionIndex, "target-features");
Nadav Rotem08ab8772013-02-27 05:56:20 +0000190 std::string CPU =
Eric Christopherb8f97682014-05-07 21:05:47 +0000191 !CPUAttr.hasAttribute(Attribute::None) ? CPUAttr.getValueAsString() : "";
Nadav Rotem08ab8772013-02-27 05:56:20 +0000192 std::string FS =
Eric Christopherb8f97682014-05-07 21:05:47 +0000193 !FSAttr.hasAttribute(Attribute::None) ? FSAttr.getValueAsString() : "";
Bill Wendling61375d82013-02-16 01:36:26 +0000194 if (!FS.empty()) {
195 initializeEnvironment();
Bill Wendlingaef9c372013-02-15 22:31:27 +0000196 resetSubtargetFeatures(CPU, FS);
Bill Wendling61375d82013-02-16 01:36:26 +0000197 }
Bill Wendlingaef9c372013-02-15 22:31:27 +0000198}
199
200void X86Subtarget::resetSubtargetFeatures(StringRef CPU, StringRef FS) {
Nadav Rotem08ab8772013-02-27 05:56:20 +0000201 std::string CPUName = CPU;
Jim Grosbach48551fb2014-04-12 01:34:29 +0000202 if (CPUName.empty())
203 CPUName = "generic";
Evan Cheng964cb5f2011-07-08 21:14:14 +0000204
Jim Grosbach48551fb2014-04-12 01:34:29 +0000205 // Make sure 64-bit features are available in 64-bit mode. (But make sure
206 // SSE2 can be turned off explicitly.)
207 std::string FullFS = FS;
208 if (In64BitMode) {
209 if (!FullFS.empty())
210 FullFS = "+64bit,+sse2," + FullFS;
211 else
212 FullFS = "+64bit,+sse2";
Evan Cheng11b0a5d2006-09-08 06:48:29 +0000213 }
Evan Chengc5e6d2f2011-07-11 03:57:24 +0000214
Jim Grosbach48551fb2014-04-12 01:34:29 +0000215 // If feature string is not empty, parse features string.
216 ParseSubtargetFeatures(CPUName, FullFS);
217
218 // Make sure the right MCSchedModel is used.
Craig Toppera8442342013-09-18 05:54:09 +0000219 InitCPUSchedModel(CPUName);
Preston Gurd35fcb542012-10-03 15:55:13 +0000220
Preston Gurd3fe264d2013-09-13 19:23:28 +0000221 if (X86ProcFamily == IntelAtom || X86ProcFamily == IntelSLM)
Andrew Trick8523b162012-02-01 23:20:51 +0000222 PostRAScheduler = true;
Andrew Tricke0c83b12012-08-07 00:25:30 +0000223
224 InstrItins = getInstrItineraryForCPU(CPUName);
Andrew Trick8523b162012-02-01 23:20:51 +0000225
Evan Chengc5e6d2f2011-07-11 03:57:24 +0000226 // It's important to keep the MCSubtargetInfo feature bits in sync with
227 // target data structure which is shared with MC code emitter, etc.
228 if (In64BitMode)
229 ToggleFeature(X86::Mode64Bit);
Craig Topper3c80d622014-01-06 04:55:54 +0000230 else if (In32BitMode)
231 ToggleFeature(X86::Mode32Bit);
232 else if (In16BitMode)
233 ToggleFeature(X86::Mode16Bit);
234 else
235 llvm_unreachable("Not 16-bit, 32-bit or 64-bit mode!");
Evan Chengc5e6d2f2011-07-11 03:57:24 +0000236
David Greene00411812010-01-05 01:29:13 +0000237 DEBUG(dbgs() << "Subtarget features: SSELevel " << X86SSELevel
Bill Wendling6eecd562009-08-03 00:11:34 +0000238 << ", 3DNowLevel " << X863DNowLevel
239 << ", 64bit " << HasX86_64 << "\n");
Evan Cheng13bcc6c2011-07-07 21:06:52 +0000240 assert((!In64BitMode || HasX86_64) &&
Dan Gohman74037512009-02-03 00:04:43 +0000241 "64-bit code requested on a subtarget that doesn't support it!");
Evan Cheng11b0a5d2006-09-08 06:48:29 +0000242
Roman Divacky22135672012-11-09 20:10:44 +0000243 // Stack alignment is 16 bytes on Darwin, Linux and Solaris (both
Roman Divackye8a93fe82011-02-22 17:30:05 +0000244 // 32 and 64 bit) and for all 64-bit targets.
Evan Cheng3a0c5e52011-06-23 17:54:54 +0000245 if (StackAlignOverride)
246 stackAlignment = StackAlignOverride;
Roman Divacky22135672012-11-09 20:10:44 +0000247 else if (isTargetDarwin() || isTargetLinux() || isTargetSolaris() ||
248 In64BitMode)
Nate Begemanf26625e2005-07-12 01:41:54 +0000249 stackAlignment = 16;
Dan Gohmandc53f1c2010-05-27 18:43:40 +0000250}
Andrew Trick8523b162012-02-01 23:20:51 +0000251
Bill Wendling61375d82013-02-16 01:36:26 +0000252void X86Subtarget::initializeEnvironment() {
253 X86SSELevel = NoMMXSSE;
254 X863DNowLevel = NoThreeDNow;
255 HasCMov = false;
256 HasX86_64 = false;
257 HasPOPCNT = false;
258 HasSSE4A = false;
259 HasAES = false;
260 HasPCLMUL = false;
261 HasFMA = false;
262 HasFMA4 = false;
263 HasXOP = false;
Yunzhong Gaodd36e932013-09-24 18:21:52 +0000264 HasTBM = false;
Bill Wendling61375d82013-02-16 01:36:26 +0000265 HasMOVBE = false;
266 HasRDRAND = false;
267 HasF16C = false;
268 HasFSGSBase = false;
269 HasLZCNT = false;
270 HasBMI = false;
271 HasBMI2 = false;
272 HasRTM = false;
Michael Liaoe344ec92013-03-26 22:46:02 +0000273 HasHLE = false;
Elena Demikhovsky003e7d72013-07-28 08:28:38 +0000274 HasERI = false;
275 HasCDI = false;
Craig Topper7a8cf012013-08-20 05:23:59 +0000276 HasPFI = false;
Bill Wendling61375d82013-02-16 01:36:26 +0000277 HasADX = false;
Ben Langmuir16501752013-09-12 15:51:31 +0000278 HasSHA = false;
Michael Liao5173ee02013-03-26 17:47:11 +0000279 HasPRFCHW = false;
Michael Liaoa486a112013-03-28 23:41:26 +0000280 HasRDSEED = false;
Bill Wendling61375d82013-02-16 01:36:26 +0000281 IsBTMemSlow = false;
Ekaterina Romanovad5fa5542013-11-21 23:21:26 +0000282 IsSHLDSlow = false;
Bill Wendling61375d82013-02-16 01:36:26 +0000283 IsUAMemFast = false;
284 HasVectorUAMem = false;
285 HasCmpxchg16b = false;
286 UseLeaForSP = false;
287 HasSlowDivide = false;
288 PostRAScheduler = false;
289 PadShortFunctions = false;
Preston Gurd663e6f92013-03-27 19:14:02 +0000290 CallRegIndirect = false;
Preston Gurd8b7ab4b2013-04-25 20:29:37 +0000291 LEAUsesAG = false;
Alexey Volkov6226de62014-05-20 08:55:50 +0000292 SlowLEA = false;
Bill Wendling61375d82013-02-16 01:36:26 +0000293 stackAlignment = 4;
294 // FIXME: this is a known good value for Yonah. How about others?
295 MaxInlineSizeThreshold = 128;
296}
297
Bill Wendlingaef9c372013-02-15 22:31:27 +0000298X86Subtarget::X86Subtarget(const std::string &TT, const std::string &CPU,
Eric Christopherb8f97682014-05-07 21:05:47 +0000299 const std::string &FS, unsigned StackAlignOverride)
300 : X86GenSubtargetInfo(TT, CPU, FS), X86ProcFamily(Others),
301 PICStyle(PICStyles::None), TargetTriple(TT),
302 StackAlignOverride(StackAlignOverride),
303 In64BitMode(TargetTriple.getArch() == Triple::x86_64),
304 In32BitMode(TargetTriple.getArch() == Triple::x86 &&
305 TargetTriple.getEnvironment() != Triple::CODE16),
306 In16BitMode(TargetTriple.getArch() == Triple::x86 &&
307 TargetTriple.getEnvironment() == Triple::CODE16) {
Bill Wendling61375d82013-02-16 01:36:26 +0000308 initializeEnvironment();
Bill Wendlingaef9c372013-02-15 22:31:27 +0000309 resetSubtargetFeatures(CPU, FS);
310}
311
Eric Christopherb8f97682014-05-07 21:05:47 +0000312bool
313X86Subtarget::enablePostRAScheduler(CodeGenOpt::Level OptLevel,
314 TargetSubtargetInfo::AntiDepBreakMode &Mode,
315 RegClassVector &CriticalPathRCs) const {
Preston Gurd9a091472012-04-23 21:39:35 +0000316 Mode = TargetSubtargetInfo::ANTIDEP_CRITICAL;
Andrew Trick8523b162012-02-01 23:20:51 +0000317 CriticalPathRCs.clear();
318 return PostRAScheduler && OptLevel >= CodeGenOpt::Default;
319}
Eric Christopher6b0fcfe2014-05-21 23:40:26 +0000320
321bool
322X86Subtarget::enableEarlyIfConversion() const override {
323 return hasCMOV() && X86EarlyIfConv;
324}