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