131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- ARMSubtarget.cpp - ARM Subtarget Information ----------------------===//
2a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//
3a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//                     The LLVM Compiler Infrastructure
4a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//
8a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//===----------------------------------------------------------------------===//
9a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//
105b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng// This file implements the ARM specific subclass of TargetSubtargetInfo.
11a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//
12a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//===----------------------------------------------------------------------===//
13a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
14a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include "ARMSubtarget.h"
15cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "ARMFrameLowering.h"
16cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "ARMISelLowering.h"
17cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "ARMInstrInfo.h"
18cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "ARMJITInfo.h"
19cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "ARMSelectionDAGInfo.h"
20cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "ARMSubtarget.h"
21cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "Thumb1FrameLowering.h"
22cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "Thumb1InstrInfo.h"
23cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "Thumb2InstrInfo.h"
244788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling#include "llvm/IR/Attributes.h"
254788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling#include "llvm/IR/Function.h"
2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/GlobalValue.h"
2754fc124d72512d65d62565cabcd85c7b07496513Bob Wilson#include "llvm/Support/CommandLine.h"
28d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetInstrInfo.h"
293382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin#include "llvm/Target/TargetOptions.h"
3094214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng
31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesusing namespace llvm;
32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
33dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "arm-subtarget"
34dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
3594214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng#define GET_SUBTARGETINFO_TARGET_DESC
36ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng#define GET_SUBTARGETINFO_CTOR
37385e930d55f3ecd3c9538823dfa5896a12461845Evan Cheng#include "ARMGenSubtargetInfo.inc"
3894214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng
3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstatic cl::opt<bool>
4054fc124d72512d65d62565cabcd85c7b07496513Bob WilsonReserveR9("arm-reserve-r9", cl::Hidden,
4154fc124d72512d65d62565cabcd85c7b07496513Bob Wilson          cl::desc("Reserve R9, making it unavailable as GPR"));
4254fc124d72512d65d62565cabcd85c7b07496513Bob Wilson
435cdc3a949af0cef7f2163f8a7acbf3049c226321Anton Korobeynikovstatic cl::opt<bool>
4414c41370e36068ae25c871d5bd8f99f92bbb7d45Renato GolinArmUseMOVT("arm-use-movt", cl::init(true), cl::Hidden);
455cdc3a949af0cef7f2163f8a7acbf3049c226321Anton Korobeynikov
4602aba73a9ec04d0de9424422249af3948ca9573aBob Wilsonstatic cl::opt<bool>
47eb1641d54a7eda7717304bc4d55d059208d8ebedBob WilsonUseFusedMulOps("arm-use-mulops",
48eb1641d54a7eda7717304bc4d55d059208d8ebedBob Wilson               cl::init(true), cl::Hidden);
49eb1641d54a7eda7717304bc4d55d059208d8ebedBob Wilson
50bab06ba696694e7f62f964af7ee5290a13f78340JF Bastienenum AlignMode {
51bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien  DefaultAlign,
52bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien  StrictAlign,
53bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien  NoStrictAlign
54bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien};
55bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien
56bab06ba696694e7f62f964af7ee5290a13f78340JF Bastienstatic cl::opt<AlignMode>
57bab06ba696694e7f62f964af7ee5290a13f78340JF BastienAlign(cl::desc("Load/store alignment support"),
58bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      cl::Hidden, cl::init(DefaultAlign),
59bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      cl::values(
60bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien          clEnumValN(DefaultAlign,  "arm-default-align",
61bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien                     "Generate unaligned accesses only on hardware/OS "
62bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien                     "combinations that are known to support them"),
63bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien          clEnumValN(StrictAlign,   "arm-strict-align",
64bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien                     "Disallow all unaligned memory accesses"),
65bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien          clEnumValN(NoStrictAlign, "arm-no-strict-align",
66bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien                     "Allow unaligned memory accesses"),
67bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien          clEnumValEnd));
6802aba73a9ec04d0de9424422249af3948ca9573aBob Wilson
69929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhaoenum ITMode {
70929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao  DefaultIT,
71929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao  RestrictedIT,
72929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao  NoRestrictedIT
73929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao};
74929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao
75929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhaostatic cl::opt<ITMode>
76929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming ZhaoIT(cl::desc("IT block support"), cl::Hidden, cl::init(DefaultIT),
77929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao   cl::ZeroOrMore,
78929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao   cl::values(clEnumValN(DefaultIT, "arm-default-it",
79929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao                         "Generate IT block based on arch"),
80929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao              clEnumValN(RestrictedIT, "arm-restrict-it",
81929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao                         "Disallow deprecated IT based on ARMv8"),
82929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao              clEnumValN(NoRestrictedIT, "arm-no-restrict-it",
83929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao                         "Allow IT blocks based on ARMv7"),
84929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao              clEnumValEnd));
85929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao
86cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesstatic std::string computeDataLayout(ARMSubtarget &ST) {
87cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::string Ret = "";
88cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
89cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (ST.isLittle())
90cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    // Little endian.
91cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Ret += "e";
92cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  else
93cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    // Big endian.
94cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Ret += "E";
95cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
96cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  Ret += DataLayout::getManglingComponent(ST.getTargetTriple());
97cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
98cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Pointers are 32 bits and aligned to 32 bits.
99cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  Ret += "-p:32:32";
100cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
101cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // On thumb, i16,i18 and i1 have natural aligment requirements, but we try to
102cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // align to 32.
103cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (ST.isThumb())
104cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Ret += "-i1:8:32-i8:8:32-i16:16:32";
105cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
106cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // ABIs other than APCS have 64 bit integers with natural alignment.
107cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (!ST.isAPCS_ABI())
108cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Ret += "-i64:64";
109cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
110cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // We have 64 bits floats. The APCS ABI requires them to be aligned to 32
111cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // bits, others to 64 bits. We always try to align to 64 bits.
112cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (ST.isAPCS_ABI())
113cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Ret += "-f64:32:64";
114cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
115cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // We have 128 and 64 bit vectors. The APCS ABI aligns them to 32 bits, others
116cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // to 64. We always ty to give them natural alignment.
117cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (ST.isAPCS_ABI())
118cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Ret += "-v64:32:64-v128:32:128";
119cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  else
120cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Ret += "-v128:64:128";
121cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
122cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // On thumb and APCS, only try to align aggregates to 32 bits (the default is
123cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // 64 bits).
124cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (ST.isThumb() || ST.isAPCS_ABI())
125cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Ret += "-a:0:32";
126cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
127cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // Integer registers are 32 bits.
128cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  Ret += "-n32";
129cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
130cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // The stack is 128 bit aligned on NaCl, 64 bit aligned on AAPCS and 32 bit
131cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // aligned everywhere else.
132cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (ST.isTargetNaCl())
133cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Ret += "-S128";
134cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  else if (ST.isAAPCS_ABI())
135cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Ret += "-S64";
136cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  else
137cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Ret += "-S32";
138cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
139cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return Ret;
140cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
141cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
142cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines/// initializeSubtargetDependencies - Initializes using a CPU and feature string
143cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines/// so that we can use initializer lists for subtarget initialization.
144cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesARMSubtarget &ARMSubtarget::initializeSubtargetDependencies(StringRef CPU,
145cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                                            StringRef FS) {
146901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  initializeEnvironment();
1474788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling  resetSubtargetFeatures(CPU, FS);
148cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return *this;
1494788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling}
1504788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling
151cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesARMSubtarget::ARMSubtarget(const std::string &TT, const std::string &CPU,
152cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                           const std::string &FS, TargetMachine &TM,
153cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                           bool IsLittle, const TargetOptions &Options)
154cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    : ARMGenSubtargetInfo(TT, CPU, FS), ARMProcFamily(Others),
155cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ARMProcClass(None), stackAlignment(4), CPUString(CPU), IsLittle(IsLittle),
156cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      TargetTriple(TT), Options(Options), TargetABI(ARM_ABI_UNKNOWN),
157cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      DL(computeDataLayout(initializeSubtargetDependencies(CPU, FS))),
158cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      TSInfo(DL), JITInfo(),
159cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      InstrInfo(isThumb1Only()
160cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                    ? (ARMBaseInstrInfo *)new Thumb1InstrInfo(*this)
161cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                    : !isThumb()
162cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                          ? (ARMBaseInstrInfo *)new ARMInstrInfo(*this)
163cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                          : (ARMBaseInstrInfo *)new Thumb2InstrInfo(*this)),
164cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      TLInfo(TM),
165cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      FrameLowering(!isThumb1Only()
166cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                        ? new ARMFrameLowering(*this)
167cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                        : (ARMFrameLowering *)new Thumb1FrameLowering(*this)) {}
168cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
169901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendlingvoid ARMSubtarget::initializeEnvironment() {
170901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasV4TOps = false;
171901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasV5TOps = false;
172901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasV5TEOps = false;
173901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasV6Ops = false;
174ca7b2d08d7b918e5e8e921a837623af962b27d00Amara Emerson  HasV6MOps = false;
175901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasV6T2Ops = false;
176901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasV7Ops = false;
177849eedce9921eb8f285cd0df0ad69ee5133459d1Joey Gouly  HasV8Ops = false;
178901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasVFPv2 = false;
179901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasVFPv3 = false;
180901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasVFPv4 = false;
1812a9af9f18eac90b0de739b6ceddf6c2209086303Joey Gouly  HasFPARMv8 = false;
182901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasNEON = false;
183901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  UseNEONForSinglePrecisionFP = false;
184901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  UseMulOps = UseFusedMulOps;
185901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  SlowFPVMLx = false;
186901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasVMLxForwarding = false;
187901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  SlowFPBrcc = false;
188901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  InThumbMode = false;
189901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasThumb2 = false;
190901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  NoARM = false;
191901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  PostRAScheduler = false;
192901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  IsR9Reserved = ReserveR9;
193901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  UseMovt = false;
194901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  SupportsTailCall = false;
195901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasFP16 = false;
196901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasD16 = false;
197901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasHardwareDivide = false;
198901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasHardwareDivideInARM = false;
199901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasT2ExtractPack = false;
200901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasDataBarrier = false;
201901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  Pref32BitThumb = false;
202901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  AvoidCPSRPartialUpdate = false;
203901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  AvoidMOVsShifterOperand = false;
204901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasRAS = false;
205901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasMPExtension = false;
2066186de5c54b580414b2d162e0f335b62b3d9812cBradley Smith  HasVirtualization = false;
207901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  FPOnlySP = false;
208b94a353242b26af5c0969926a6b84664e342b586Tim Northover  HasPerfMon = false;
2098c9e52a9fc1f99cf80c499ef10e6c8a54ef899d4Tim Northover  HasTrustZone = false;
2105df37dab763ce377095389c4ea1cff88db369954Amara Emerson  HasCrypto = false;
21157bca7b26ec916ca1b74b1408608a6c69a1aa422Amara Emerson  HasCRC = false;
21236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  HasZeroCycleZeroing = false;
213901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  AllowsUnalignedMem = false;
214901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  Thumb2DSP = false;
215901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  UseNaClTrap = false;
2163382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin  UnsafeFPMath = false;
217373aa5c665fe6df6b9c5586d397dc3617f25aab5Stephen Hines  UseLong64 = false;
218901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling}
219901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling
2204788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendlingvoid ARMSubtarget::resetSubtargetFeatures(const MachineFunction *MF) {
2214788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling  AttributeSet FnAttrs = MF->getFunction()->getAttributes();
2224788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling  Attribute CPUAttr = FnAttrs.getAttribute(AttributeSet::FunctionIndex,
2234788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling                                           "target-cpu");
2244788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling  Attribute FSAttr = FnAttrs.getAttribute(AttributeSet::FunctionIndex,
2254788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling                                          "target-features");
2264788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling  std::string CPU =
2274788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling    !CPUAttr.hasAttribute(Attribute::None) ?CPUAttr.getValueAsString() : "";
2284788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling  std::string FS =
2294788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling    !FSAttr.hasAttribute(Attribute::None) ? FSAttr.getValueAsString() : "";
230901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  if (!FS.empty()) {
231901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling    initializeEnvironment();
2324788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling    resetSubtargetFeatures(CPU, FS);
233901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  }
2344788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling}
2354788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling
2364788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendlingvoid ARMSubtarget::resetSubtargetFeatures(StringRef CPU, StringRef FS) {
237195dd8a1ce38970e3463ee1425647280373b60a7Tilmann Scheller  if (CPUString.empty()) {
238195dd8a1ce38970e3463ee1425647280373b60a7Tilmann Scheller    if (isTargetIOS() && TargetTriple.getArchName().endswith("v7s"))
239195dd8a1ce38970e3463ee1425647280373b60a7Tilmann Scheller      // Default to the Swift CPU when targeting armv7s/thumbv7s.
240195dd8a1ce38970e3463ee1425647280373b60a7Tilmann Scheller      CPUString = "swift";
241195dd8a1ce38970e3463ee1425647280373b60a7Tilmann Scheller    else
242195dd8a1ce38970e3463ee1425647280373b60a7Tilmann Scheller      CPUString = "generic";
243195dd8a1ce38970e3463ee1425647280373b60a7Tilmann Scheller  }
2444b1747430a2d67702958b95d6776396734f184a0Evan Cheng
2454cc446bc400b2ff58af81c91f5e145b81d6beb26Evan Cheng  // Insert the architecture feature derived from the target triple into the
2464cc446bc400b2ff58af81c91f5e145b81d6beb26Evan Cheng  // feature string. This is important for setting features that are implied
2474cc446bc400b2ff58af81c91f5e145b81d6beb26Evan Cheng  // based on the architecture version.
2484788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling  std::string ArchFS = ARM_MC::ParseARMTriple(TargetTriple.getTriple(),
2494788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling                                              CPUString);
25094ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng  if (!FS.empty()) {
25194ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng    if (!ArchFS.empty())
2524788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling      ArchFS = ArchFS + "," + FS.str();
25394ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng    else
25494ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng      ArchFS = FS;
25594ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng  }
2560ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng  ParseSubtargetFeatures(CPUString, ArchFS);
25794ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng
25836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // FIXME: This used enable V6T2 support implicitly for Thumb2 mode.
25936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Assert this for now to make the change obvious.
26036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  assert(hasV6T2Ops() || !hasThumb2());
26166f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson
262d43b5c97cff06d7840b974ca84fa0639d2567968Andrew Trick  // Keep a pointer to static instruction cost data for the specified CPU.
263d43b5c97cff06d7840b974ca84fa0639d2567968Andrew Trick  SchedModel = getSchedModelForCPU(CPUString);
264d43b5c97cff06d7840b974ca84fa0639d2567968Andrew Trick
26594214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng  // Initialize scheduling itinerary for the specified CPU.
26694214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng  InstrItins = getInstrItineraryForCPU(CPUString);
26794214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng
26836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (TargetABI == ARM_ABI_UNKNOWN) {
26936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    switch (TargetTriple.getEnvironment()) {
27036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    case Triple::Android:
27136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    case Triple::EABI:
27236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    case Triple::EABIHF:
27336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    case Triple::GNUEABI:
27436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    case Triple::GNUEABIHF:
27536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      TargetABI = ARM_ABI_AAPCS;
27636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      break;
27736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    default:
27836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      if ((isTargetIOS() && isMClass()) ||
27936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          (TargetTriple.isOSBinFormatMachO() &&
28036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines           TargetTriple.getOS() == Triple::UnknownOS))
28136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        TargetABI = ARM_ABI_AAPCS;
28236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      else
28336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        TargetABI = ARM_ABI_APCS;
28436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      break;
28536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    }
28636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
28736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
28836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // FIXME: this is invalid for WindowsCE
28936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (isTargetWindows()) {
2900ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng    TargetABI = ARM_ABI_AAPCS;
29136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    NoARM = true;
29236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
2930ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng
2943630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio  if (isAAPCS_ABI())
2953630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio    stackAlignment = 8;
29636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (isTargetNaCl())
29736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    stackAlignment = 16;
2983630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio
29914c41370e36068ae25c871d5bd8f99f92bbb7d45Renato Golin  UseMovt = hasV6T2Ops() && ArmUseMOVT;
30014c41370e36068ae25c871d5bd8f99f92bbb7d45Renato Golin
30136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (isTargetMachO()) {
30239dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng    IsR9Reserved = ReserveR9 | !HasV6Ops;
30336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    SupportsTailCall = !isTargetIOS() || !getTargetTriple().isOSVersionLT(5, 0);
30436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  } else {
30536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    IsR9Reserved = ReserveR9;
30636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    SupportsTailCall = !isThumb1Only();
3075de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng  }
308471850ab84301dd47cab2bf8d694fcb5766c1169David Goodwin
309d3dd50fec00fbbb76edbfaff4d613f1248d21c9eEvan Cheng  if (!isThumb() || hasThumb2())
310d3dd50fec00fbbb76edbfaff4d613f1248d21c9eEvan Cheng    PostRAScheduler = true;
31102aba73a9ec04d0de9424422249af3948ca9573aBob Wilson
312bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien  switch (Align) {
313bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien    case DefaultAlign:
314bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      // Assume pre-ARMv6 doesn't support unaligned accesses.
315bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      //
316bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      // ARMv6 may or may not support unaligned accesses depending on the
317bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      // SCTLR.U bit, which is architecture-specific. We assume ARMv6
31836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      // Darwin and NetBSD targets support unaligned accesses, and others don't.
319bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      //
320bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
321bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      // which raises an alignment fault on unaligned accesses. Linux
322bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      // defaults this bit to 0 and handles it as a system-wide (not
323bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      // per-process) setting. It is therefore safe to assume that ARMv7+
324bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      // Linux targets support unaligned accesses. The same goes for NaCl.
325bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      //
326bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      // The above behavior is consistent with GCC.
32736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      AllowsUnalignedMem =
32836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          (hasV7Ops() && (isTargetLinux() || isTargetNaCl() ||
32936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                          isTargetNetBSD())) ||
33036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          (hasV6Ops() && (isTargetMachO() || isTargetNetBSD()));
33136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      // The one exception is cortex-m0, which despite being v6, does not
33236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      // support unaligned accesses. Rather than make the above boolean
33336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      // expression even more obtuse, just override the value here.
33436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      if (isThumb1Only() && isMClass())
33536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        AllowsUnalignedMem = false;
336bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      break;
337bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien    case StrictAlign:
338bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      AllowsUnalignedMem = false;
339bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      break;
340bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien    case NoStrictAlign:
341bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      AllowsUnalignedMem = true;
342bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      break;
343bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien  }
3443382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin
345929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao  switch (IT) {
346929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao  case DefaultIT:
347929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao    RestrictIT = hasV8Ops() ? true : false;
348929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao    break;
349929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao  case RestrictedIT:
350929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao    RestrictIT = true;
351929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao    break;
352929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao  case NoRestrictedIT:
353929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao    RestrictIT = false;
354929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao    break;
355929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao  }
356929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao
3573382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin  // NEON f32 ops are non-IEEE 754 compliant. Darwin is ok with it by default.
3583382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin  uint64_t Bits = getFeatureBits();
3593382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin  if ((Bits & ARM::ProcA5 || Bits & ARM::ProcA8) && // Where this matters
3603382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin      (Options.UnsafeFPMath || isTargetDarwin()))
3613382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin    UseNEONForSinglePrecisionFP = true;
362a8e2989ece6dc46df59b0768184028257f913843Evan Cheng}
363e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng
364e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng/// GVIsIndirectSymbol - true if the GV will be accessed via an indirect symbol.
36563476a80404125e5196b6c09113c1d4796da0604Evan Chengbool
36646510a73e977273ec67747eb34cbdb43f815e451Dan GohmanARMSubtarget::GVIsIndirectSymbol(const GlobalValue *GV,
36746510a73e977273ec67747eb34cbdb43f815e451Dan Gohman                                 Reloc::Model RelocM) const {
36863476a80404125e5196b6c09113c1d4796da0604Evan Cheng  if (RelocM == Reloc::Static)
369e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng    return false;
37063476a80404125e5196b6c09113c1d4796da0604Evan Cheng
371f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  // Materializable GVs (in JIT lazy compilation mode) do not require an extra
372f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  // load from stub.
373af05c69ba024b1838ae6f1071d6fd0f9fe33999fEvan Cheng  bool isDecl = GV->hasAvailableExternallyLinkage();
374af05c69ba024b1838ae6f1071d6fd0f9fe33999fEvan Cheng  if (GV->isDeclaration() && !GV->isMaterializable())
375af05c69ba024b1838ae6f1071d6fd0f9fe33999fEvan Cheng    isDecl = true;
37663476a80404125e5196b6c09113c1d4796da0604Evan Cheng
37736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (!isTargetMachO()) {
37863476a80404125e5196b6c09113c1d4796da0604Evan Cheng    // Extra load is needed for all externally visible.
37963476a80404125e5196b6c09113c1d4796da0604Evan Cheng    if (GV->hasLocalLinkage() || GV->hasHiddenVisibility())
38063476a80404125e5196b6c09113c1d4796da0604Evan Cheng      return false;
38163476a80404125e5196b6c09113c1d4796da0604Evan Cheng    return true;
38263476a80404125e5196b6c09113c1d4796da0604Evan Cheng  } else {
38363476a80404125e5196b6c09113c1d4796da0604Evan Cheng    if (RelocM == Reloc::PIC_) {
38463476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // If this is a strong reference to a definition, it is definitely not
38563476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // through a stub.
38663476a80404125e5196b6c09113c1d4796da0604Evan Cheng      if (!isDecl && !GV->isWeakForLinker())
38763476a80404125e5196b6c09113c1d4796da0604Evan Cheng        return false;
38863476a80404125e5196b6c09113c1d4796da0604Evan Cheng
38963476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // Unless we have a symbol with hidden visibility, we have to go through a
39063476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // normal $non_lazy_ptr stub because this symbol might be resolved late.
39163476a80404125e5196b6c09113c1d4796da0604Evan Cheng      if (!GV->hasHiddenVisibility())  // Non-hidden $non_lazy_ptr reference.
39263476a80404125e5196b6c09113c1d4796da0604Evan Cheng        return true;
39363476a80404125e5196b6c09113c1d4796da0604Evan Cheng
39463476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // If symbol visibility is hidden, we have a stub for common symbol
39563476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // references and external declarations.
39663476a80404125e5196b6c09113c1d4796da0604Evan Cheng      if (isDecl || GV->hasCommonLinkage())
39763476a80404125e5196b6c09113c1d4796da0604Evan Cheng        // Hidden $non_lazy_ptr reference.
39863476a80404125e5196b6c09113c1d4796da0604Evan Cheng        return true;
39963476a80404125e5196b6c09113c1d4796da0604Evan Cheng
40063476a80404125e5196b6c09113c1d4796da0604Evan Cheng      return false;
40163476a80404125e5196b6c09113c1d4796da0604Evan Cheng    } else {
40263476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // If this is a strong reference to a definition, it is definitely not
40363476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // through a stub.
40463476a80404125e5196b6c09113c1d4796da0604Evan Cheng      if (!isDecl && !GV->isWeakForLinker())
40563476a80404125e5196b6c09113c1d4796da0604Evan Cheng        return false;
4066e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
40763476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // Unless we have a symbol with hidden visibility, we have to go through a
40863476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // normal $non_lazy_ptr stub because this symbol might be resolved late.
40963476a80404125e5196b6c09113c1d4796da0604Evan Cheng      if (!GV->hasHiddenVisibility())  // Non-hidden $non_lazy_ptr reference.
41063476a80404125e5196b6c09113c1d4796da0604Evan Cheng        return true;
41163476a80404125e5196b6c09113c1d4796da0604Evan Cheng    }
41263476a80404125e5196b6c09113c1d4796da0604Evan Cheng  }
41363476a80404125e5196b6c09113c1d4796da0604Evan Cheng
41463476a80404125e5196b6c09113c1d4796da0604Evan Cheng  return false;
415e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng}
416c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin
417654d5440a477b1f6c89b051107e041a331f78e27Owen Andersonunsigned ARMSubtarget::getMispredictionPenalty() const {
418d43b5c97cff06d7840b974ca84fa0639d2567968Andrew Trick  return SchedModel->MispredictPenalty;
419654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson}
420654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson
421cb01efb7988d119d6e2aedab1740695aa6a9cc0cBob Wilsonbool ARMSubtarget::hasSinCos() const {
422cb01efb7988d119d6e2aedab1740695aa6a9cc0cBob Wilson  return getTargetTriple().getOS() == Triple::IOS &&
423cb01efb7988d119d6e2aedab1740695aa6a9cc0cBob Wilson    !getTargetTriple().isOSVersionLT(7, 0);
424cb01efb7988d119d6e2aedab1740695aa6a9cc0cBob Wilson}
425cb01efb7988d119d6e2aedab1740695aa6a9cc0cBob Wilson
426cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// Enable the PostMachineScheduler if the target selects it instead of
427cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// PostRAScheduler. Currently only available on the command line via
428cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// -misched-postra.
429cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesbool ARMSubtarget::enablePostMachineScheduler() const {
430cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return PostRAScheduler;
431cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
432cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
433cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesbool ARMSubtarget::enableAtomicExpandLoadLinked() const {
434cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return hasAnyDataBarrier() && !isThumb1Only();
435cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
436cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
437c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwinbool ARMSubtarget::enablePostRAScheduler(
438c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin           CodeGenOpt::Level OptLevel,
4395b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng           TargetSubtargetInfo::AntiDepBreakMode& Mode,
44087d21b92fc42f6b3bd8567a83fc5b5191c1205e5David Goodwin           RegClassVector& CriticalPathRCs) const {
441dfca6eec3171802d6fcb091da01604ef4420fb3bAndrew Trick  Mode = TargetSubtargetInfo::ANTIDEP_NONE;
442c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin  return PostRAScheduler && OptLevel >= CodeGenOpt::Default;
443c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin}
444cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
445cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesbool ARMSubtarget::useMovt(const MachineFunction &MF) const {
446cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // NOTE Windows on ARM needs to use mov.w/mov.t pairs to materialise 32-bit
447cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // immediates as it is inherently position independent, and may be out of
448cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  // range otherwise.
449cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return UseMovt && (isTargetWindows() ||
450cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                     !MF.getFunction()->getAttributes().hasAttribute(
451cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                         AttributeSet::FunctionIndex, Attribute::MinSize));
452cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
453