ARMSubtarget.cpp revision af05c69ba024b1838ae6f1071d6fd0f9fe33999f
1a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//===-- ARMSubtarget.cpp - ARM Subtarget Information ------------*- C++ -*-===//
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//
10a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// This file implements the ARM specific subclass of TargetSubtarget.
11a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//
12a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//===----------------------------------------------------------------------===//
13a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
14a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include "ARMSubtarget.h"
15a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include "ARMGenSubtarget.inc"
16b72d2a92b75daa9cbac7338aff0cd8ae04c2b4bdEvan Cheng#include "ARMBaseRegisterInfo.h"
17e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng#include "llvm/GlobalValue.h"
180eebf653a7b2978e7761f8d068b6fbec22aea0f6Anton Korobeynikov#include "llvm/Target/TargetOptions.h"
1954fc124d72512d65d62565cabcd85c7b07496513Bob Wilson#include "llvm/Support/CommandLine.h"
20c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin#include "llvm/ADT/SmallVector.h"
21a8e2989ece6dc46df59b0768184028257f913843Evan Chengusing namespace llvm;
22a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
2354fc124d72512d65d62565cabcd85c7b07496513Bob Wilsonstatic cl::opt<bool>
2454fc124d72512d65d62565cabcd85c7b07496513Bob WilsonReserveR9("arm-reserve-r9", cl::Hidden,
2554fc124d72512d65d62565cabcd85c7b07496513Bob Wilson          cl::desc("Reserve R9, making it unavailable as GPR"));
2654fc124d72512d65d62565cabcd85c7b07496513Bob Wilson
275cdc3a949af0cef7f2163f8a7acbf3049c226321Anton Korobeynikovstatic cl::opt<bool>
2853519f015e3e84e9f57b677cc8724805a6009b73Evan ChengDarwinUseMOVT("arm-darwin-use-movt", cl::init(true), cl::Hidden);
295cdc3a949af0cef7f2163f8a7acbf3049c226321Anton Korobeynikov
3002aba73a9ec04d0de9424422249af3948ca9573aBob Wilsonstatic cl::opt<bool>
3102aba73a9ec04d0de9424422249af3948ca9573aBob WilsonStrictAlign("arm-strict-align", cl::Hidden,
3202aba73a9ec04d0de9424422249af3948ca9573aBob Wilson            cl::desc("Disallow all unaligned memory accesses"));
3302aba73a9ec04d0de9424422249af3948ca9573aBob Wilson
343be03406c9c3b2075d5ae416499af2f15f703d6fDaniel DunbarARMSubtarget::ARMSubtarget(const std::string &TT, const std::string &FS,
35d3dd50fec00fbbb76edbfaff4d613f1248d21c9eEvan Cheng                           bool isT)
36ce7bf1c55f5238870bae2909cd368151f1d813d1Anton Korobeynikov  : ARMArchVersion(V4)
373ef1c8759a20167457eb7fd82ebcaffe7ccaa1d1Evan Cheng  , ARMProcFamily(Others)
386d7d2aa38a247426e2ccf53e3c6ad0315c9a4d8cAnton Korobeynikov  , ARMFPUType(None)
397ec7a0e96b34fedf11445c1dde27a4fac8e8a1a7Jim Grosbach  , UseNEONForSinglePrecisionFP(false)
4048575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng  , SlowFPVMLx(false)
419de1ac267e197d40cec7a14041f2bf69498536c9Evan Cheng  , SlowFPBrcc(false)
42d3dd50fec00fbbb76edbfaff4d613f1248d21c9eEvan Cheng  , IsThumb(isT)
4370459bef9ccd73b3a2a44fdd62f2509861112745Anton Korobeynikov  , ThumbMode(Thumb1)
447b4d31176efe6894bcfaa05257dd5783acda5ddcEvan Cheng  , NoARM(false)
450dad89fa94536284d51f60868326294b725a0c61David Goodwin  , PostRAScheduler(false)
4654fc124d72512d65d62565cabcd85c7b07496513Bob Wilson  , IsR9Reserved(ReserveR9)
475de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng  , UseMovt(false)
48631379e79c0971c5bac13629b8caf8912ed4c35cAnton Korobeynikov  , HasFP16(false)
4977f42b52781b6923924a93b8ab338d183887a592Bob Wilson  , HasD16(false)
5029402132f3e890a2771818f44987ede213297431Jim Grosbach  , HasHardwareDivide(false)
5129402132f3e890a2771818f44987ede213297431Jim Grosbach  , HasT2ExtractPack(false)
5211db068721d44fd5f9b0c2a3a4c90f813d2eae9cEvan Cheng  , HasDataBarrier(false)
539de1ac267e197d40cec7a14041f2bf69498536c9Evan Cheng  , Pref32BitThumb(false)
54dfed19fe2c34c1209108afa58e8ab014ffd894e2Evan Cheng  , HasMPExtension(false)
55fcba5e6b645df89ae6b93911fe0f80b08fa6b44cJim Grosbach  , FPOnlySP(false)
5602aba73a9ec04d0de9424422249af3948ca9573aBob Wilson  , AllowsUnalignedMem(false)
573630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio  , stackAlignment(4)
5841a024385f1220eadc48b48cb4c044a5fbc1b361Anton Korobeynikov  , CPUString("generic")
59b72d2a92b75daa9cbac7338aff0cd8ae04c2b4bdEvan Cheng  , TargetTriple(TT)
603630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio  , TargetABI(ARM_ABI_APCS) {
613ef1c8759a20167457eb7fd82ebcaffe7ccaa1d1Evan Cheng  // Default to soft float ABI
620eebf653a7b2978e7761f8d068b6fbec22aea0f6Anton Korobeynikov  if (FloatABIType == FloatABI::Default)
630eebf653a7b2978e7761f8d068b6fbec22aea0f6Anton Korobeynikov    FloatABIType = FloatABI::Soft;
640eebf653a7b2978e7761f8d068b6fbec22aea0f6Anton Korobeynikov
65a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  // Determine default and user specified characteristics
66a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
67ce7bf1c55f5238870bae2909cd368151f1d813d1Anton Korobeynikov  // When no arch is specified either by CPU or by attributes, make the default
68ce7bf1c55f5238870bae2909cd368151f1d813d1Anton Korobeynikov  // ARMv4T.
6966f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson  const char *ARMArchFeature = "";
7066f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson  if (CPUString == "generic" && (FS.empty() || FS == "generic")) {
71ce7bf1c55f5238870bae2909cd368151f1d813d1Anton Korobeynikov    ARMArchVersion = V4T;
7266f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson    ARMArchFeature = ",+v4t";
7366f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson  }
74ce7bf1c55f5238870bae2909cd368151f1d813d1Anton Korobeynikov
75a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  // Set the boolean corresponding to the current target triple, or the default
76a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  // if one cannot be determined, to true.
774b1747430a2d67702958b95d6776396734f184a0Evan Cheng  unsigned Len = TT.length();
788c6b991635ff589fbe4b8db013bcc1d2ef57a0e0Evan Cheng  unsigned Idx = 0;
79d4022c3fbb0705abdc8eddc3ee4a5059f5ef8094Anton Korobeynikov
808c6b991635ff589fbe4b8db013bcc1d2ef57a0e0Evan Cheng  if (Len >= 5 && TT.substr(0, 4) == "armv")
818c6b991635ff589fbe4b8db013bcc1d2ef57a0e0Evan Cheng    Idx = 4;
829170ab6685fcd820c6274e761b8c3a71f25ae074Bob Wilson  else if (Len >= 6 && TT.substr(0, 5) == "thumb") {
8370459bef9ccd73b3a2a44fdd62f2509861112745Anton Korobeynikov    IsThumb = true;
848c6b991635ff589fbe4b8db013bcc1d2ef57a0e0Evan Cheng    if (Len >= 7 && TT[5] == 'v')
858c6b991635ff589fbe4b8db013bcc1d2ef57a0e0Evan Cheng      Idx = 6;
868c6b991635ff589fbe4b8db013bcc1d2ef57a0e0Evan Cheng  }
878c6b991635ff589fbe4b8db013bcc1d2ef57a0e0Evan Cheng  if (Idx) {
888c6b991635ff589fbe4b8db013bcc1d2ef57a0e0Evan Cheng    unsigned SubVer = TT[Idx];
89ce7bf1c55f5238870bae2909cd368151f1d813d1Anton Korobeynikov    if (SubVer >= '7' && SubVer <= '9') {
90ce7bf1c55f5238870bae2909cd368151f1d813d1Anton Korobeynikov      ARMArchVersion = V7A;
9166f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson      ARMArchFeature = ",+v7a";
9266f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson      if (Len >= Idx+2 && TT[Idx+1] == 'm') {
93b1dc393bd56365ad8fabb51f22c2f3ace707c39aJim Grosbach        ARMArchVersion = V7M;
9466f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson        ARMArchFeature = ",+v7m";
9566f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson      }
96ce7bf1c55f5238870bae2909cd368151f1d813d1Anton Korobeynikov    } else if (SubVer == '6') {
97ce7bf1c55f5238870bae2909cd368151f1d813d1Anton Korobeynikov      ARMArchVersion = V6;
9866f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson      ARMArchFeature = ",+v6";
9966f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson      if (Len >= Idx+3 && TT[Idx+1] == 't' && TT[Idx+2] == '2') {
100ce7bf1c55f5238870bae2909cd368151f1d813d1Anton Korobeynikov        ARMArchVersion = V6T2;
10166f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson        ARMArchFeature = ",+v6t2";
10266f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson      }
103ce7bf1c55f5238870bae2909cd368151f1d813d1Anton Korobeynikov    } else if (SubVer == '5') {
104ce7bf1c55f5238870bae2909cd368151f1d813d1Anton Korobeynikov      ARMArchVersion = V5T;
10566f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson      ARMArchFeature = ",+v5t";
10666f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson      if (Len >= Idx+3 && TT[Idx+1] == 't' && TT[Idx+2] == 'e') {
107ce7bf1c55f5238870bae2909cd368151f1d813d1Anton Korobeynikov        ARMArchVersion = V5TE;
10866f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson        ARMArchFeature = ",+v5te";
10966f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson      }
110ce7bf1c55f5238870bae2909cd368151f1d813d1Anton Korobeynikov    } else if (SubVer == '4') {
11166f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson      if (Len >= Idx+2 && TT[Idx+1] == 't') {
112ce7bf1c55f5238870bae2909cd368151f1d813d1Anton Korobeynikov        ARMArchVersion = V4T;
11366f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson        ARMArchFeature = ",+v4t";
11466f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson      } else {
115ce7bf1c55f5238870bae2909cd368151f1d813d1Anton Korobeynikov        ARMArchVersion = V4;
11666f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson        ARMArchFeature = "";
11766f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson      }
1184b1747430a2d67702958b95d6776396734f184a0Evan Cheng    }
1194b1747430a2d67702958b95d6776396734f184a0Evan Cheng  }
1204b1747430a2d67702958b95d6776396734f184a0Evan Cheng
1213630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio  if (TT.find("eabi") != std::string::npos)
1223630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio    TargetABI = ARM_ABI_AAPCS;
1233630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio
12466f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson  // Parse features string.  If the first entry in FS (the CPU) is missing,
12566f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson  // insert the architecture feature derived from the target triple.  This is
12666f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson  // important for setting features that are implied based on the architecture
12766f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson  // version.
12866f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson  std::string FSWithArch;
12966f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson  if (FS.empty())
13066f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson    FSWithArch = std::string(ARMArchFeature);
13166f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson  else if (FS.find(',') == 0)
13266f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson    FSWithArch = std::string(ARMArchFeature) + FS;
13366f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson  else
13466f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson    FSWithArch = FS;
13566f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson  CPUString = ParseSubtargetFeatures(FSWithArch, CPUString);
13666f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson
1372da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick  // After parsing Itineraries, set ItinData.IssueWidth.
1382da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick  computeIssueWidth();
1392da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick
14066f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson  // Thumb2 implies at least V6T2.
14166f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson  if (ARMArchVersion >= V6T2)
14266f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson    ThumbMode = Thumb2;
14366f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson  else if (ThumbMode >= Thumb2)
14466f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson    ARMArchVersion = V6T2;
14566f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson
1463630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio  if (isAAPCS_ABI())
1473630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio    stackAlignment = 8;
1483630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio
1495de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng  if (!isTargetDarwin())
1505de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng    UseMovt = hasV6T2Ops();
1515de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng  else {
15254fc124d72512d65d62565cabcd85c7b07496513Bob Wilson    IsR9Reserved = ReserveR9 | (ARMArchVersion < V6);
15353519f015e3e84e9f57b677cc8724805a6009b73Evan Cheng    UseMovt = DarwinUseMOVT && hasV6T2Ops();
1545de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng  }
155471850ab84301dd47cab2bf8d694fcb5766c1169David Goodwin
156d3dd50fec00fbbb76edbfaff4d613f1248d21c9eEvan Cheng  if (!isThumb() || hasThumb2())
157d3dd50fec00fbbb76edbfaff4d613f1248d21c9eEvan Cheng    PostRAScheduler = true;
15802aba73a9ec04d0de9424422249af3948ca9573aBob Wilson
15902aba73a9ec04d0de9424422249af3948ca9573aBob Wilson  // v6+ may or may not support unaligned mem access depending on the system
16002aba73a9ec04d0de9424422249af3948ca9573aBob Wilson  // configuration.
16102aba73a9ec04d0de9424422249af3948ca9573aBob Wilson  if (!StrictAlign && hasV6Ops() && isTargetDarwin())
16202aba73a9ec04d0de9424422249af3948ca9573aBob Wilson    AllowsUnalignedMem = true;
163a8e2989ece6dc46df59b0768184028257f913843Evan Cheng}
164e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng
165e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng/// GVIsIndirectSymbol - true if the GV will be accessed via an indirect symbol.
16663476a80404125e5196b6c09113c1d4796da0604Evan Chengbool
16746510a73e977273ec67747eb34cbdb43f815e451Dan GohmanARMSubtarget::GVIsIndirectSymbol(const GlobalValue *GV,
16846510a73e977273ec67747eb34cbdb43f815e451Dan Gohman                                 Reloc::Model RelocM) const {
16963476a80404125e5196b6c09113c1d4796da0604Evan Cheng  if (RelocM == Reloc::Static)
170e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng    return false;
17163476a80404125e5196b6c09113c1d4796da0604Evan Cheng
172f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  // Materializable GVs (in JIT lazy compilation mode) do not require an extra
173f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  // load from stub.
174af05c69ba024b1838ae6f1071d6fd0f9fe33999fEvan Cheng  bool isDecl = GV->hasAvailableExternallyLinkage();
175af05c69ba024b1838ae6f1071d6fd0f9fe33999fEvan Cheng  if (GV->isDeclaration() && !GV->isMaterializable())
176af05c69ba024b1838ae6f1071d6fd0f9fe33999fEvan Cheng    isDecl = true;
17763476a80404125e5196b6c09113c1d4796da0604Evan Cheng
17863476a80404125e5196b6c09113c1d4796da0604Evan Cheng  if (!isTargetDarwin()) {
17963476a80404125e5196b6c09113c1d4796da0604Evan Cheng    // Extra load is needed for all externally visible.
18063476a80404125e5196b6c09113c1d4796da0604Evan Cheng    if (GV->hasLocalLinkage() || GV->hasHiddenVisibility())
18163476a80404125e5196b6c09113c1d4796da0604Evan Cheng      return false;
18263476a80404125e5196b6c09113c1d4796da0604Evan Cheng    return true;
18363476a80404125e5196b6c09113c1d4796da0604Evan Cheng  } else {
18463476a80404125e5196b6c09113c1d4796da0604Evan Cheng    if (RelocM == Reloc::PIC_) {
18563476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // If this is a strong reference to a definition, it is definitely not
18663476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // through a stub.
18763476a80404125e5196b6c09113c1d4796da0604Evan Cheng      if (!isDecl && !GV->isWeakForLinker())
18863476a80404125e5196b6c09113c1d4796da0604Evan Cheng        return false;
18963476a80404125e5196b6c09113c1d4796da0604Evan Cheng
19063476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // Unless we have a symbol with hidden visibility, we have to go through a
19163476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // normal $non_lazy_ptr stub because this symbol might be resolved late.
19263476a80404125e5196b6c09113c1d4796da0604Evan Cheng      if (!GV->hasHiddenVisibility())  // Non-hidden $non_lazy_ptr reference.
19363476a80404125e5196b6c09113c1d4796da0604Evan Cheng        return true;
19463476a80404125e5196b6c09113c1d4796da0604Evan Cheng
19563476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // If symbol visibility is hidden, we have a stub for common symbol
19663476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // references and external declarations.
19763476a80404125e5196b6c09113c1d4796da0604Evan Cheng      if (isDecl || GV->hasCommonLinkage())
19863476a80404125e5196b6c09113c1d4796da0604Evan Cheng        // Hidden $non_lazy_ptr reference.
19963476a80404125e5196b6c09113c1d4796da0604Evan Cheng        return true;
20063476a80404125e5196b6c09113c1d4796da0604Evan Cheng
20163476a80404125e5196b6c09113c1d4796da0604Evan Cheng      return false;
20263476a80404125e5196b6c09113c1d4796da0604Evan Cheng    } else {
20363476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // If this is a strong reference to a definition, it is definitely not
20463476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // through a stub.
20563476a80404125e5196b6c09113c1d4796da0604Evan Cheng      if (!isDecl && !GV->isWeakForLinker())
20663476a80404125e5196b6c09113c1d4796da0604Evan Cheng        return false;
2076e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
20863476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // Unless we have a symbol with hidden visibility, we have to go through a
20963476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // normal $non_lazy_ptr stub because this symbol might be resolved late.
21063476a80404125e5196b6c09113c1d4796da0604Evan Cheng      if (!GV->hasHiddenVisibility())  // Non-hidden $non_lazy_ptr reference.
21163476a80404125e5196b6c09113c1d4796da0604Evan Cheng        return true;
21263476a80404125e5196b6c09113c1d4796da0604Evan Cheng    }
21363476a80404125e5196b6c09113c1d4796da0604Evan Cheng  }
21463476a80404125e5196b6c09113c1d4796da0604Evan Cheng
21563476a80404125e5196b6c09113c1d4796da0604Evan Cheng  return false;
216e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng}
217c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin
218654d5440a477b1f6c89b051107e041a331f78e27Owen Andersonunsigned ARMSubtarget::getMispredictionPenalty() const {
219654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson  // If we have a reasonable estimate of the pipeline depth, then we can
220654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson  // estimate the penalty of a misprediction based on that.
221654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson  if (isCortexA8())
222654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson    return 13;
223654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson  else if (isCortexA9())
224654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson    return 8;
2256e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
226654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson  // Otherwise, just return a sensible default.
227654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson  return 10;
228654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson}
229654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson
2302da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trickvoid ARMSubtarget::computeIssueWidth() {
2312da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick  unsigned allStage1Units = 0;
2322da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick  for (const InstrItinerary *itin = InstrItins.Itineraries;
2332da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick       itin->FirstStage != ~0U; ++itin) {
2342da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick    const InstrStage *IS = InstrItins.Stages + itin->FirstStage;
2352da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick    allStage1Units |= IS->getUnits();
2362da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick  }
2372da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick  InstrItins.IssueWidth = 0;
2382da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick  while (allStage1Units) {
2392da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick    ++InstrItins.IssueWidth;
2402da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick    // clear the lowest bit
2412da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick    allStage1Units ^= allStage1Units & ~(allStage1Units - 1);
2422da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick  }
2436018deefe823598a3bbe03de9af354d269ae2130Andrew Trick  assert(InstrItins.IssueWidth <= 2 && "itinerary bug, too many stage 1 units");
2442da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick}
2452da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick
246c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwinbool ARMSubtarget::enablePostRAScheduler(
247c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin           CodeGenOpt::Level OptLevel,
248c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin           TargetSubtarget::AntiDepBreakMode& Mode,
24987d21b92fc42f6b3bd8567a83fc5b5191c1205e5David Goodwin           RegClassVector& CriticalPathRCs) const {
250c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin  Mode = TargetSubtarget::ANTIDEP_CRITICAL;
25187d21b92fc42f6b3bd8567a83fc5b5191c1205e5David Goodwin  CriticalPathRCs.clear();
25287d21b92fc42f6b3bd8567a83fc5b5191c1205e5David Goodwin  CriticalPathRCs.push_back(&ARM::GPRRegClass);
253c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin  return PostRAScheduler && OptLevel >= CodeGenOpt::Default;
254c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin}
255