ARMSubtarget.cpp revision 4788d14b484ba9e2fe19855fd6c97a3659980fca
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" 2294214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng 2394214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng#define GET_SUBTARGETINFO_TARGET_DESC 24ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng#define GET_SUBTARGETINFO_CTOR 25385e930d55f3ecd3c9538823dfa5896a12461845Evan Cheng#include "ARMGenSubtargetInfo.inc" 2694214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng 27a8e2989ece6dc46df59b0768184028257f913843Evan Chengusing namespace llvm; 28a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 2954fc124d72512d65d62565cabcd85c7b07496513Bob Wilsonstatic cl::opt<bool> 3054fc124d72512d65d62565cabcd85c7b07496513Bob WilsonReserveR9("arm-reserve-r9", cl::Hidden, 3154fc124d72512d65d62565cabcd85c7b07496513Bob Wilson cl::desc("Reserve R9, making it unavailable as GPR")); 3254fc124d72512d65d62565cabcd85c7b07496513Bob Wilson 335cdc3a949af0cef7f2163f8a7acbf3049c226321Anton Korobeynikovstatic cl::opt<bool> 3453519f015e3e84e9f57b677cc8724805a6009b73Evan ChengDarwinUseMOVT("arm-darwin-use-movt", cl::init(true), cl::Hidden); 355cdc3a949af0cef7f2163f8a7acbf3049c226321Anton Korobeynikov 3602aba73a9ec04d0de9424422249af3948ca9573aBob Wilsonstatic cl::opt<bool> 37eb1641d54a7eda7717304bc4d55d059208d8ebedBob WilsonUseFusedMulOps("arm-use-mulops", 38eb1641d54a7eda7717304bc4d55d059208d8ebedBob Wilson cl::init(true), cl::Hidden); 39eb1641d54a7eda7717304bc4d55d059208d8ebedBob Wilson 40eb1641d54a7eda7717304bc4d55d059208d8ebedBob Wilsonstatic cl::opt<bool> 4102aba73a9ec04d0de9424422249af3948ca9573aBob WilsonStrictAlign("arm-strict-align", cl::Hidden, 4202aba73a9ec04d0de9424422249af3948ca9573aBob Wilson cl::desc("Disallow all unaligned memory accesses")); 4302aba73a9ec04d0de9424422249af3948ca9573aBob Wilson 44276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan ChengARMSubtarget::ARMSubtarget(const std::string &TT, const std::string &CPU, 4594ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng const std::string &FS) 460ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng : ARMGenSubtargetInfo(TT, CPU, FS) 473ef1c8759a20167457eb7fd82ebcaffe7ccaa1d1Evan Cheng , ARMProcFamily(Others) 4839dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng , HasV4TOps(false) 4939dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng , HasV5TOps(false) 5039dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng , HasV5TEOps(false) 5139dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng , HasV6Ops(false) 5239dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng , HasV6T2Ops(false) 5339dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng , HasV7Ops(false) 5439dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng , HasVFPv2(false) 5539dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng , HasVFPv3(false) 564b4e62219be91839091f9e35d8accf877f925d81Anton Korobeynikov , HasVFPv4(false) 5739dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng , HasNEON(false) 587ec7a0e96b34fedf11445c1dde27a4fac8e8a1a7Jim Grosbach , UseNEONForSinglePrecisionFP(false) 59eb1641d54a7eda7717304bc4d55d059208d8ebedBob Wilson , UseMulOps(UseFusedMulOps) 6048575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng , SlowFPVMLx(false) 610e3ee43ea058a35ab5ce69cceafd316d49eaad34Benjamin Kramer , HasVMLxForwarding(false) 629de1ac267e197d40cec7a14041f2bf69498536c9Evan Cheng , SlowFPBrcc(false) 63963b03c1a9f6a9742671459f103ee9a566c6de58Evan Cheng , InThumbMode(false) 6494ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng , HasThumb2(false) 65acad68da50581de905a994ed3c6b9c197bcea687James Molloy , IsMClass(false) 667b4d31176efe6894bcfaa05257dd5783acda5ddcEvan Cheng , NoARM(false) 670dad89fa94536284d51f60868326294b725a0c61David Goodwin , PostRAScheduler(false) 6854fc124d72512d65d62565cabcd85c7b07496513Bob Wilson , IsR9Reserved(ReserveR9) 695de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng , UseMovt(false) 706d2f9cec715c50bca44816d9bdea97f8b63bf2a0Bob Wilson , SupportsTailCall(false) 71631379e79c0971c5bac13629b8caf8912ed4c35cAnton Korobeynikov , HasFP16(false) 7277f42b52781b6923924a93b8ab338d183887a592Bob Wilson , HasD16(false) 7329402132f3e890a2771818f44987ede213297431Jim Grosbach , HasHardwareDivide(false) 74eb1641d54a7eda7717304bc4d55d059208d8ebedBob Wilson , HasHardwareDivideInARM(false) 7529402132f3e890a2771818f44987ede213297431Jim Grosbach , HasT2ExtractPack(false) 7611db068721d44fd5f9b0c2a3a4c90f813d2eae9cEvan Cheng , HasDataBarrier(false) 779de1ac267e197d40cec7a14041f2bf69498536c9Evan Cheng , Pref32BitThumb(false) 785dde893c2bac9e1569c38429f756c1d723e8edf2Bob Wilson , AvoidCPSRPartialUpdate(false) 79139e407d526193017d42473c8d4892933de78f14Evan Cheng , AvoidMOVsShifterOperand(false) 80bfae1fd1fce97e73299e8ad67a22ae18de5112e9Benjamin Kramer , HasRAS(false) 81dfed19fe2c34c1209108afa58e8ab014ffd894e2Evan Cheng , HasMPExtension(false) 82fcba5e6b645df89ae6b93911fe0f80b08fa6b44cJim Grosbach , FPOnlySP(false) 8302aba73a9ec04d0de9424422249af3948ca9573aBob Wilson , AllowsUnalignedMem(false) 84a7603982dbf9e240ecc7ed6eddcd1cdb868107acJim Grosbach , Thumb2DSP(false) 850f156af8312a0f3ce88e5c006bf2a52691039cebEli Bendersky , UseNaClTrap(false) 863630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio , stackAlignment(4) 87276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng , CPUString(CPU) 88b72d2a92b75daa9cbac7338aff0cd8ae04c2b4bdEvan Cheng , TargetTriple(TT) 893630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio , TargetABI(ARM_ABI_APCS) { 904788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling resetSubtargetFeatures(CPU, FS); 914788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling} 924788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling 934788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendlingvoid ARMSubtarget::resetSubtargetFeatures(const MachineFunction *MF) { 944788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling AttributeSet FnAttrs = MF->getFunction()->getAttributes(); 954788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling Attribute CPUAttr = FnAttrs.getAttribute(AttributeSet::FunctionIndex, 964788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling "target-cpu"); 974788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling Attribute FSAttr = FnAttrs.getAttribute(AttributeSet::FunctionIndex, 984788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling "target-features"); 994788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling std::string CPU = 1004788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling !CPUAttr.hasAttribute(Attribute::None) ?CPUAttr.getValueAsString() : ""; 1014788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling std::string FS = 1024788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling !FSAttr.hasAttribute(Attribute::None) ? FSAttr.getValueAsString() : ""; 1034788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling if (!FS.empty()) 1044788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling resetSubtargetFeatures(CPU, FS); 1054788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling} 1064788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling 1074788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendlingvoid ARMSubtarget::resetSubtargetFeatures(StringRef CPU, StringRef FS) { 108276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng if (CPUString.empty()) 109276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng CPUString = "generic"; 1104b1747430a2d67702958b95d6776396734f184a0Evan Cheng 1114cc446bc400b2ff58af81c91f5e145b81d6beb26Evan Cheng // Insert the architecture feature derived from the target triple into the 1124cc446bc400b2ff58af81c91f5e145b81d6beb26Evan Cheng // feature string. This is important for setting features that are implied 1134cc446bc400b2ff58af81c91f5e145b81d6beb26Evan Cheng // based on the architecture version. 1144788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling std::string ArchFS = ARM_MC::ParseARMTriple(TargetTriple.getTriple(), 1154788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling CPUString); 11694ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng if (!FS.empty()) { 11794ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng if (!ArchFS.empty()) 1184788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling ArchFS = ArchFS + "," + FS.str(); 11994ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng else 12094ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng ArchFS = FS; 12194ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng } 1220ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng ParseSubtargetFeatures(CPUString, ArchFS); 12394ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng 12494ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng // Thumb2 implies at least V6T2. FIXME: Fix tests to explicitly specify a 12594ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng // ARM version or CPU and then remove this. 12639dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng if (!HasV6T2Ops && hasThumb2()) 12739dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng HasV4TOps = HasV5TOps = HasV5TEOps = HasV6Ops = HasV6T2Ops = true; 12866f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson 129d43b5c97cff06d7840b974ca84fa0639d2567968Andrew Trick // Keep a pointer to static instruction cost data for the specified CPU. 130d43b5c97cff06d7840b974ca84fa0639d2567968Andrew Trick SchedModel = getSchedModelForCPU(CPUString); 131d43b5c97cff06d7840b974ca84fa0639d2567968Andrew Trick 13294214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng // Initialize scheduling itinerary for the specified CPU. 13394214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng InstrItins = getInstrItineraryForCPU(CPUString); 13494214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng 1354788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling if ((TargetTriple.getTriple().find("eabi") != std::string::npos) || 1364788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling (isTargetIOS() && isMClass())) 13707043279f60622243d16d8a3f60805960482083cEvan Cheng // FIXME: We might want to separate AAPCS and EABI. Some systems, e.g. 13807043279f60622243d16d8a3f60805960482083cEvan Cheng // Darwin-EABI conforms to AACPS but not the rest of EABI. 1390ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng TargetABI = ARM_ABI_AAPCS; 1400ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng 1413630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio if (isAAPCS_ABI()) 1423630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio stackAlignment = 8; 1433630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio 144afff941211526a31f931aa9fcac84ae42ff60ef0Evan Cheng if (!isTargetIOS()) 1455de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng UseMovt = hasV6T2Ops(); 1465de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng else { 14739dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng IsR9Reserved = ReserveR9 | !HasV6Ops; 14853519f015e3e84e9f57b677cc8724805a6009b73Evan Cheng UseMovt = DarwinUseMOVT && hasV6T2Ops(); 14907043279f60622243d16d8a3f60805960482083cEvan Cheng SupportsTailCall = !getTargetTriple().isOSVersionLT(5, 0); 1505de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng } 151471850ab84301dd47cab2bf8d694fcb5766c1169David Goodwin 152d3dd50fec00fbbb76edbfaff4d613f1248d21c9eEvan Cheng if (!isThumb() || hasThumb2()) 153d3dd50fec00fbbb76edbfaff4d613f1248d21c9eEvan Cheng PostRAScheduler = true; 15402aba73a9ec04d0de9424422249af3948ca9573aBob Wilson 15502aba73a9ec04d0de9424422249af3948ca9573aBob Wilson // v6+ may or may not support unaligned mem access depending on the system 15602aba73a9ec04d0de9424422249af3948ca9573aBob Wilson // configuration. 15702aba73a9ec04d0de9424422249af3948ca9573aBob Wilson if (!StrictAlign && hasV6Ops() && isTargetDarwin()) 15802aba73a9ec04d0de9424422249af3948ca9573aBob Wilson AllowsUnalignedMem = true; 159a8e2989ece6dc46df59b0768184028257f913843Evan Cheng} 160e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng 161e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng/// GVIsIndirectSymbol - true if the GV will be accessed via an indirect symbol. 16263476a80404125e5196b6c09113c1d4796da0604Evan Chengbool 16346510a73e977273ec67747eb34cbdb43f815e451Dan GohmanARMSubtarget::GVIsIndirectSymbol(const GlobalValue *GV, 16446510a73e977273ec67747eb34cbdb43f815e451Dan Gohman Reloc::Model RelocM) const { 16563476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (RelocM == Reloc::Static) 166e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng return false; 16763476a80404125e5196b6c09113c1d4796da0604Evan Cheng 168f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin // Materializable GVs (in JIT lazy compilation mode) do not require an extra 169f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin // load from stub. 170af05c69ba024b1838ae6f1071d6fd0f9fe33999fEvan Cheng bool isDecl = GV->hasAvailableExternallyLinkage(); 171af05c69ba024b1838ae6f1071d6fd0f9fe33999fEvan Cheng if (GV->isDeclaration() && !GV->isMaterializable()) 172af05c69ba024b1838ae6f1071d6fd0f9fe33999fEvan Cheng isDecl = true; 17363476a80404125e5196b6c09113c1d4796da0604Evan Cheng 17463476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (!isTargetDarwin()) { 17563476a80404125e5196b6c09113c1d4796da0604Evan Cheng // Extra load is needed for all externally visible. 17663476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (GV->hasLocalLinkage() || GV->hasHiddenVisibility()) 17763476a80404125e5196b6c09113c1d4796da0604Evan Cheng return false; 17863476a80404125e5196b6c09113c1d4796da0604Evan Cheng return true; 17963476a80404125e5196b6c09113c1d4796da0604Evan Cheng } else { 18063476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (RelocM == Reloc::PIC_) { 18163476a80404125e5196b6c09113c1d4796da0604Evan Cheng // If this is a strong reference to a definition, it is definitely not 18263476a80404125e5196b6c09113c1d4796da0604Evan Cheng // through a stub. 18363476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (!isDecl && !GV->isWeakForLinker()) 18463476a80404125e5196b6c09113c1d4796da0604Evan Cheng return false; 18563476a80404125e5196b6c09113c1d4796da0604Evan Cheng 18663476a80404125e5196b6c09113c1d4796da0604Evan Cheng // Unless we have a symbol with hidden visibility, we have to go through a 18763476a80404125e5196b6c09113c1d4796da0604Evan Cheng // normal $non_lazy_ptr stub because this symbol might be resolved late. 18863476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (!GV->hasHiddenVisibility()) // Non-hidden $non_lazy_ptr reference. 18963476a80404125e5196b6c09113c1d4796da0604Evan Cheng return true; 19063476a80404125e5196b6c09113c1d4796da0604Evan Cheng 19163476a80404125e5196b6c09113c1d4796da0604Evan Cheng // If symbol visibility is hidden, we have a stub for common symbol 19263476a80404125e5196b6c09113c1d4796da0604Evan Cheng // references and external declarations. 19363476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (isDecl || GV->hasCommonLinkage()) 19463476a80404125e5196b6c09113c1d4796da0604Evan Cheng // Hidden $non_lazy_ptr reference. 19563476a80404125e5196b6c09113c1d4796da0604Evan Cheng return true; 19663476a80404125e5196b6c09113c1d4796da0604Evan Cheng 19763476a80404125e5196b6c09113c1d4796da0604Evan Cheng return false; 19863476a80404125e5196b6c09113c1d4796da0604Evan Cheng } else { 19963476a80404125e5196b6c09113c1d4796da0604Evan Cheng // If this is a strong reference to a definition, it is definitely not 20063476a80404125e5196b6c09113c1d4796da0604Evan Cheng // through a stub. 20163476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (!isDecl && !GV->isWeakForLinker()) 20263476a80404125e5196b6c09113c1d4796da0604Evan Cheng return false; 2036e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick 20463476a80404125e5196b6c09113c1d4796da0604Evan Cheng // Unless we have a symbol with hidden visibility, we have to go through a 20563476a80404125e5196b6c09113c1d4796da0604Evan Cheng // normal $non_lazy_ptr stub because this symbol might be resolved late. 20663476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (!GV->hasHiddenVisibility()) // Non-hidden $non_lazy_ptr reference. 20763476a80404125e5196b6c09113c1d4796da0604Evan Cheng return true; 20863476a80404125e5196b6c09113c1d4796da0604Evan Cheng } 20963476a80404125e5196b6c09113c1d4796da0604Evan Cheng } 21063476a80404125e5196b6c09113c1d4796da0604Evan Cheng 21163476a80404125e5196b6c09113c1d4796da0604Evan Cheng return false; 212e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng} 213c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin 214654d5440a477b1f6c89b051107e041a331f78e27Owen Andersonunsigned ARMSubtarget::getMispredictionPenalty() const { 215d43b5c97cff06d7840b974ca84fa0639d2567968Andrew Trick return SchedModel->MispredictPenalty; 216654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson} 217654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson 218c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwinbool ARMSubtarget::enablePostRAScheduler( 219c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin CodeGenOpt::Level OptLevel, 2205b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng TargetSubtargetInfo::AntiDepBreakMode& Mode, 22187d21b92fc42f6b3bd8567a83fc5b5191c1205e5David Goodwin RegClassVector& CriticalPathRCs) const { 2225b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng Mode = TargetSubtargetInfo::ANTIDEP_CRITICAL; 22387d21b92fc42f6b3bd8567a83fc5b5191c1205e5David Goodwin CriticalPathRCs.clear(); 22487d21b92fc42f6b3bd8567a83fc5b5191c1205e5David Goodwin CriticalPathRCs.push_back(&ARM::GPRRegClass); 225c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin return PostRAScheduler && OptLevel >= CodeGenOpt::Default; 226c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin} 227