ARMSubtarget.cpp revision 195dd8a1ce38970e3463ee1425647280373b60a7
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"
15e127dfd0b175b5a336e61fecaad7fc2aec65d95cAndrew Trick#include "ARMBaseInstrInfo.h"
16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "ARMBaseRegisterInfo.h"
174788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling#include "llvm/IR/Attributes.h"
180b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalValue.h"
194788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling#include "llvm/IR/Function.h"
2054fc124d72512d65d62565cabcd85c7b07496513Bob Wilson#include "llvm/Support/CommandLine.h"
21d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetInstrInfo.h"
223382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin#include "llvm/Target/TargetOptions.h"
2394214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng
2494214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng#define GET_SUBTARGETINFO_TARGET_DESC
25ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng#define GET_SUBTARGETINFO_CTOR
26385e930d55f3ecd3c9538823dfa5896a12461845Evan Cheng#include "ARMGenSubtargetInfo.inc"
2794214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng
28a8e2989ece6dc46df59b0768184028257f913843Evan Chengusing namespace llvm;
29a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
3054fc124d72512d65d62565cabcd85c7b07496513Bob Wilsonstatic cl::opt<bool>
3154fc124d72512d65d62565cabcd85c7b07496513Bob WilsonReserveR9("arm-reserve-r9", cl::Hidden,
3254fc124d72512d65d62565cabcd85c7b07496513Bob Wilson          cl::desc("Reserve R9, making it unavailable as GPR"));
3354fc124d72512d65d62565cabcd85c7b07496513Bob Wilson
345cdc3a949af0cef7f2163f8a7acbf3049c226321Anton Korobeynikovstatic cl::opt<bool>
3514c41370e36068ae25c871d5bd8f99f92bbb7d45Renato GolinArmUseMOVT("arm-use-movt", cl::init(true), cl::Hidden);
365cdc3a949af0cef7f2163f8a7acbf3049c226321Anton Korobeynikov
3702aba73a9ec04d0de9424422249af3948ca9573aBob Wilsonstatic cl::opt<bool>
38eb1641d54a7eda7717304bc4d55d059208d8ebedBob WilsonUseFusedMulOps("arm-use-mulops",
39eb1641d54a7eda7717304bc4d55d059208d8ebedBob Wilson               cl::init(true), cl::Hidden);
40eb1641d54a7eda7717304bc4d55d059208d8ebedBob Wilson
41bab06ba696694e7f62f964af7ee5290a13f78340JF Bastienenum AlignMode {
42bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien  DefaultAlign,
43bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien  StrictAlign,
44bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien  NoStrictAlign
45bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien};
46bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien
47bab06ba696694e7f62f964af7ee5290a13f78340JF Bastienstatic cl::opt<AlignMode>
48bab06ba696694e7f62f964af7ee5290a13f78340JF BastienAlign(cl::desc("Load/store alignment support"),
49bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      cl::Hidden, cl::init(DefaultAlign),
50bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      cl::values(
51bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien          clEnumValN(DefaultAlign,  "arm-default-align",
52bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien                     "Generate unaligned accesses only on hardware/OS "
53bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien                     "combinations that are known to support them"),
54bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien          clEnumValN(StrictAlign,   "arm-strict-align",
55bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien                     "Disallow all unaligned memory accesses"),
56bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien          clEnumValN(NoStrictAlign, "arm-no-strict-align",
57bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien                     "Allow unaligned memory accesses"),
58bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien          clEnumValEnd));
5902aba73a9ec04d0de9424422249af3948ca9573aBob Wilson
60276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan ChengARMSubtarget::ARMSubtarget(const std::string &TT, const std::string &CPU,
613382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin                           const std::string &FS, const TargetOptions &Options)
620ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng  : ARMGenSubtargetInfo(TT, CPU, FS)
633ef1c8759a20167457eb7fd82ebcaffe7ccaa1d1Evan Cheng  , ARMProcFamily(Others)
643630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio  , stackAlignment(4)
65276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng  , CPUString(CPU)
66b72d2a92b75daa9cbac7338aff0cd8ae04c2b4bdEvan Cheng  , TargetTriple(TT)
673382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin  , Options(Options)
683630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio  , TargetABI(ARM_ABI_APCS) {
69901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  initializeEnvironment();
704788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling  resetSubtargetFeatures(CPU, FS);
714788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling}
724788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling
73901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendlingvoid ARMSubtarget::initializeEnvironment() {
74901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasV4TOps = false;
75901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasV5TOps = false;
76901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasV5TEOps = false;
77901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasV6Ops = false;
78901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasV6T2Ops = false;
79901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasV7Ops = false;
80849eedce9921eb8f285cd0df0ad69ee5133459d1Joey Gouly  HasV8Ops = false;
81901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasVFPv2 = false;
82901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasVFPv3 = false;
83901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasVFPv4 = false;
8431d2f08f8893f38d2d7293195f3707edfefbeeb6Joey Gouly  HasV8FP = false;
85901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasNEON = false;
86901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  UseNEONForSinglePrecisionFP = false;
87901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  UseMulOps = UseFusedMulOps;
88901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  SlowFPVMLx = false;
89901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasVMLxForwarding = false;
90901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  SlowFPBrcc = false;
91901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  InThumbMode = false;
92901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasThumb2 = false;
93901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  IsMClass = false;
94901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  NoARM = false;
95901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  PostRAScheduler = false;
96901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  IsR9Reserved = ReserveR9;
97901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  UseMovt = false;
98901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  SupportsTailCall = false;
99901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasFP16 = false;
100901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasD16 = false;
101901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasHardwareDivide = false;
102901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasHardwareDivideInARM = false;
103901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasT2ExtractPack = false;
104901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasDataBarrier = false;
105901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  Pref32BitThumb = false;
106901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  AvoidCPSRPartialUpdate = false;
107901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  AvoidMOVsShifterOperand = false;
108901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasRAS = false;
109901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  HasMPExtension = false;
110901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  FPOnlySP = false;
111b94a353242b26af5c0969926a6b84664e342b586Tim Northover  HasPerfMon = false;
1128c9e52a9fc1f99cf80c499ef10e6c8a54ef899d4Tim Northover  HasTrustZone = false;
113901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  AllowsUnalignedMem = false;
114901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  Thumb2DSP = false;
115901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  UseNaClTrap = false;
1163382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin  UnsafeFPMath = false;
117901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling}
118901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling
1194788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendlingvoid ARMSubtarget::resetSubtargetFeatures(const MachineFunction *MF) {
1204788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling  AttributeSet FnAttrs = MF->getFunction()->getAttributes();
1214788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling  Attribute CPUAttr = FnAttrs.getAttribute(AttributeSet::FunctionIndex,
1224788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling                                           "target-cpu");
1234788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling  Attribute FSAttr = FnAttrs.getAttribute(AttributeSet::FunctionIndex,
1244788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling                                          "target-features");
1254788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling  std::string CPU =
1264788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling    !CPUAttr.hasAttribute(Attribute::None) ?CPUAttr.getValueAsString() : "";
1274788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling  std::string FS =
1284788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling    !FSAttr.hasAttribute(Attribute::None) ? FSAttr.getValueAsString() : "";
129901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  if (!FS.empty()) {
130901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling    initializeEnvironment();
1314788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling    resetSubtargetFeatures(CPU, FS);
132901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  }
1334788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling}
1344788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling
1354788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendlingvoid ARMSubtarget::resetSubtargetFeatures(StringRef CPU, StringRef FS) {
136195dd8a1ce38970e3463ee1425647280373b60a7Tilmann Scheller  if (CPUString.empty()) {
137195dd8a1ce38970e3463ee1425647280373b60a7Tilmann Scheller    if (isTargetIOS() && TargetTriple.getArchName().endswith("v7s"))
138195dd8a1ce38970e3463ee1425647280373b60a7Tilmann Scheller      // Default to the Swift CPU when targeting armv7s/thumbv7s.
139195dd8a1ce38970e3463ee1425647280373b60a7Tilmann Scheller      CPUString = "swift";
140195dd8a1ce38970e3463ee1425647280373b60a7Tilmann Scheller    else
141195dd8a1ce38970e3463ee1425647280373b60a7Tilmann Scheller      CPUString = "generic";
142195dd8a1ce38970e3463ee1425647280373b60a7Tilmann Scheller  }
1434b1747430a2d67702958b95d6776396734f184a0Evan Cheng
1444cc446bc400b2ff58af81c91f5e145b81d6beb26Evan Cheng  // Insert the architecture feature derived from the target triple into the
1454cc446bc400b2ff58af81c91f5e145b81d6beb26Evan Cheng  // feature string. This is important for setting features that are implied
1464cc446bc400b2ff58af81c91f5e145b81d6beb26Evan Cheng  // based on the architecture version.
1474788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling  std::string ArchFS = ARM_MC::ParseARMTriple(TargetTriple.getTriple(),
1484788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling                                              CPUString);
14994ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng  if (!FS.empty()) {
15094ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng    if (!ArchFS.empty())
1514788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling      ArchFS = ArchFS + "," + FS.str();
15294ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng    else
15394ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng      ArchFS = FS;
15494ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng  }
1550ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng  ParseSubtargetFeatures(CPUString, ArchFS);
15694ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng
15794ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng  // Thumb2 implies at least V6T2. FIXME: Fix tests to explicitly specify a
15894ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng  // ARM version or CPU and then remove this.
15939dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng  if (!HasV6T2Ops && hasThumb2())
16039dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng    HasV4TOps = HasV5TOps = HasV5TEOps = HasV6Ops = HasV6T2Ops = true;
16166f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson
162d43b5c97cff06d7840b974ca84fa0639d2567968Andrew Trick  // Keep a pointer to static instruction cost data for the specified CPU.
163d43b5c97cff06d7840b974ca84fa0639d2567968Andrew Trick  SchedModel = getSchedModelForCPU(CPUString);
164d43b5c97cff06d7840b974ca84fa0639d2567968Andrew Trick
16594214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng  // Initialize scheduling itinerary for the specified CPU.
16694214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng  InstrItins = getInstrItineraryForCPU(CPUString);
16794214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng
1684788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling  if ((TargetTriple.getTriple().find("eabi") != std::string::npos) ||
1694788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling      (isTargetIOS() && isMClass()))
17007043279f60622243d16d8a3f60805960482083cEvan Cheng    // FIXME: We might want to separate AAPCS and EABI. Some systems, e.g.
17107043279f60622243d16d8a3f60805960482083cEvan Cheng    // Darwin-EABI conforms to AACPS but not the rest of EABI.
1720ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng    TargetABI = ARM_ABI_AAPCS;
1730ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng
1743630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio  if (isAAPCS_ABI())
1753630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio    stackAlignment = 8;
1763630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio
17714c41370e36068ae25c871d5bd8f99f92bbb7d45Renato Golin  UseMovt = hasV6T2Ops() && ArmUseMOVT;
17814c41370e36068ae25c871d5bd8f99f92bbb7d45Renato Golin
17924adc8f60f0a39e45363eef5392fe1a7e27bd12fRenato Golin  if (!isTargetIOS()) {
18024adc8f60f0a39e45363eef5392fe1a7e27bd12fRenato Golin    IsR9Reserved = ReserveR9;
18124adc8f60f0a39e45363eef5392fe1a7e27bd12fRenato Golin  } else {
18239dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng    IsR9Reserved = ReserveR9 | !HasV6Ops;
18307043279f60622243d16d8a3f60805960482083cEvan Cheng    SupportsTailCall = !getTargetTriple().isOSVersionLT(5, 0);
1845de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng  }
185471850ab84301dd47cab2bf8d694fcb5766c1169David Goodwin
186d3dd50fec00fbbb76edbfaff4d613f1248d21c9eEvan Cheng  if (!isThumb() || hasThumb2())
187d3dd50fec00fbbb76edbfaff4d613f1248d21c9eEvan Cheng    PostRAScheduler = true;
18802aba73a9ec04d0de9424422249af3948ca9573aBob Wilson
189bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien  switch (Align) {
190bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien    case DefaultAlign:
191bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      // Assume pre-ARMv6 doesn't support unaligned accesses.
192bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      //
193bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      // ARMv6 may or may not support unaligned accesses depending on the
194bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      // SCTLR.U bit, which is architecture-specific. We assume ARMv6
195bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      // Darwin targets support unaligned accesses, and others don't.
196bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      //
197bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
198bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      // which raises an alignment fault on unaligned accesses. Linux
199bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      // defaults this bit to 0 and handles it as a system-wide (not
200bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      // per-process) setting. It is therefore safe to assume that ARMv7+
201bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      // Linux targets support unaligned accesses. The same goes for NaCl.
202bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      //
203bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      // The above behavior is consistent with GCC.
204bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      AllowsUnalignedMem = (
205bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien          (hasV7Ops() && (isTargetLinux() || isTargetNaCl())) ||
206bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien          (hasV6Ops() && isTargetDarwin()));
207bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      break;
208bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien    case StrictAlign:
209bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      AllowsUnalignedMem = false;
210bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      break;
211bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien    case NoStrictAlign:
212bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      AllowsUnalignedMem = true;
213bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien      break;
214bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien  }
2153382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin
2163382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin  // NEON f32 ops are non-IEEE 754 compliant. Darwin is ok with it by default.
2173382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin  uint64_t Bits = getFeatureBits();
2183382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin  if ((Bits & ARM::ProcA5 || Bits & ARM::ProcA8) && // Where this matters
2193382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin      (Options.UnsafeFPMath || isTargetDarwin()))
2203382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin    UseNEONForSinglePrecisionFP = true;
221a8e2989ece6dc46df59b0768184028257f913843Evan Cheng}
222e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng
223e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng/// GVIsIndirectSymbol - true if the GV will be accessed via an indirect symbol.
22463476a80404125e5196b6c09113c1d4796da0604Evan Chengbool
22546510a73e977273ec67747eb34cbdb43f815e451Dan GohmanARMSubtarget::GVIsIndirectSymbol(const GlobalValue *GV,
22646510a73e977273ec67747eb34cbdb43f815e451Dan Gohman                                 Reloc::Model RelocM) const {
22763476a80404125e5196b6c09113c1d4796da0604Evan Cheng  if (RelocM == Reloc::Static)
228e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng    return false;
22963476a80404125e5196b6c09113c1d4796da0604Evan Cheng
230f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  // Materializable GVs (in JIT lazy compilation mode) do not require an extra
231f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  // load from stub.
232af05c69ba024b1838ae6f1071d6fd0f9fe33999fEvan Cheng  bool isDecl = GV->hasAvailableExternallyLinkage();
233af05c69ba024b1838ae6f1071d6fd0f9fe33999fEvan Cheng  if (GV->isDeclaration() && !GV->isMaterializable())
234af05c69ba024b1838ae6f1071d6fd0f9fe33999fEvan Cheng    isDecl = true;
23563476a80404125e5196b6c09113c1d4796da0604Evan Cheng
23663476a80404125e5196b6c09113c1d4796da0604Evan Cheng  if (!isTargetDarwin()) {
23763476a80404125e5196b6c09113c1d4796da0604Evan Cheng    // Extra load is needed for all externally visible.
23863476a80404125e5196b6c09113c1d4796da0604Evan Cheng    if (GV->hasLocalLinkage() || GV->hasHiddenVisibility())
23963476a80404125e5196b6c09113c1d4796da0604Evan Cheng      return false;
24063476a80404125e5196b6c09113c1d4796da0604Evan Cheng    return true;
24163476a80404125e5196b6c09113c1d4796da0604Evan Cheng  } else {
24263476a80404125e5196b6c09113c1d4796da0604Evan Cheng    if (RelocM == Reloc::PIC_) {
24363476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // If this is a strong reference to a definition, it is definitely not
24463476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // through a stub.
24563476a80404125e5196b6c09113c1d4796da0604Evan Cheng      if (!isDecl && !GV->isWeakForLinker())
24663476a80404125e5196b6c09113c1d4796da0604Evan Cheng        return false;
24763476a80404125e5196b6c09113c1d4796da0604Evan Cheng
24863476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // Unless we have a symbol with hidden visibility, we have to go through a
24963476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // normal $non_lazy_ptr stub because this symbol might be resolved late.
25063476a80404125e5196b6c09113c1d4796da0604Evan Cheng      if (!GV->hasHiddenVisibility())  // Non-hidden $non_lazy_ptr reference.
25163476a80404125e5196b6c09113c1d4796da0604Evan Cheng        return true;
25263476a80404125e5196b6c09113c1d4796da0604Evan Cheng
25363476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // If symbol visibility is hidden, we have a stub for common symbol
25463476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // references and external declarations.
25563476a80404125e5196b6c09113c1d4796da0604Evan Cheng      if (isDecl || GV->hasCommonLinkage())
25663476a80404125e5196b6c09113c1d4796da0604Evan Cheng        // Hidden $non_lazy_ptr reference.
25763476a80404125e5196b6c09113c1d4796da0604Evan Cheng        return true;
25863476a80404125e5196b6c09113c1d4796da0604Evan Cheng
25963476a80404125e5196b6c09113c1d4796da0604Evan Cheng      return false;
26063476a80404125e5196b6c09113c1d4796da0604Evan Cheng    } else {
26163476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // If this is a strong reference to a definition, it is definitely not
26263476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // through a stub.
26363476a80404125e5196b6c09113c1d4796da0604Evan Cheng      if (!isDecl && !GV->isWeakForLinker())
26463476a80404125e5196b6c09113c1d4796da0604Evan Cheng        return false;
2656e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
26663476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // Unless we have a symbol with hidden visibility, we have to go through a
26763476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // normal $non_lazy_ptr stub because this symbol might be resolved late.
26863476a80404125e5196b6c09113c1d4796da0604Evan Cheng      if (!GV->hasHiddenVisibility())  // Non-hidden $non_lazy_ptr reference.
26963476a80404125e5196b6c09113c1d4796da0604Evan Cheng        return true;
27063476a80404125e5196b6c09113c1d4796da0604Evan Cheng    }
27163476a80404125e5196b6c09113c1d4796da0604Evan Cheng  }
27263476a80404125e5196b6c09113c1d4796da0604Evan Cheng
27363476a80404125e5196b6c09113c1d4796da0604Evan Cheng  return false;
274e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng}
275c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin
276654d5440a477b1f6c89b051107e041a331f78e27Owen Andersonunsigned ARMSubtarget::getMispredictionPenalty() const {
277d43b5c97cff06d7840b974ca84fa0639d2567968Andrew Trick  return SchedModel->MispredictPenalty;
278654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson}
279654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson
280c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwinbool ARMSubtarget::enablePostRAScheduler(
281c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin           CodeGenOpt::Level OptLevel,
2825b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng           TargetSubtargetInfo::AntiDepBreakMode& Mode,
28387d21b92fc42f6b3bd8567a83fc5b5191c1205e5David Goodwin           RegClassVector& CriticalPathRCs) const {
2845b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng  Mode = TargetSubtargetInfo::ANTIDEP_CRITICAL;
28587d21b92fc42f6b3bd8567a83fc5b5191c1205e5David Goodwin  CriticalPathRCs.clear();
28687d21b92fc42f6b3bd8567a83fc5b5191c1205e5David Goodwin  CriticalPathRCs.push_back(&ARM::GPRRegClass);
287c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin  return PostRAScheduler && OptLevel >= CodeGenOpt::Default;
288c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin}
289