ARMSubtarget.cpp revision 849eedce9921eb8f285cd0df0ad69ee5133459d1
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> 3553519f015e3e84e9f57b677cc8724805a6009b73Evan ChengDarwinUseMOVT("arm-darwin-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; 84901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasNEON = false; 85901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling UseNEONForSinglePrecisionFP = false; 86901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling UseMulOps = UseFusedMulOps; 87901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling SlowFPVMLx = false; 88901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasVMLxForwarding = false; 89901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling SlowFPBrcc = false; 90901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling InThumbMode = false; 91901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasThumb2 = false; 92901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling IsMClass = false; 93901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling NoARM = false; 94901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling PostRAScheduler = false; 95901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling IsR9Reserved = ReserveR9; 96901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling UseMovt = false; 97901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling SupportsTailCall = false; 98901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasFP16 = false; 99901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasD16 = false; 100901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasHardwareDivide = false; 101901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasHardwareDivideInARM = false; 102901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasT2ExtractPack = false; 103901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasDataBarrier = false; 104901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling Pref32BitThumb = false; 105901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling AvoidCPSRPartialUpdate = false; 106901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling AvoidMOVsShifterOperand = false; 107901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasRAS = false; 108901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasMPExtension = false; 109901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling FPOnlySP = false; 110b94a353242b26af5c0969926a6b84664e342b586Tim Northover HasPerfMon = false; 1118c9e52a9fc1f99cf80c499ef10e6c8a54ef899d4Tim Northover HasTrustZone = false; 112901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling AllowsUnalignedMem = false; 113901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling Thumb2DSP = false; 114901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling UseNaClTrap = false; 1153382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin UnsafeFPMath = false; 116901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling} 117901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling 1184788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendlingvoid ARMSubtarget::resetSubtargetFeatures(const MachineFunction *MF) { 1194788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling AttributeSet FnAttrs = MF->getFunction()->getAttributes(); 1204788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling Attribute CPUAttr = FnAttrs.getAttribute(AttributeSet::FunctionIndex, 1214788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling "target-cpu"); 1224788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling Attribute FSAttr = FnAttrs.getAttribute(AttributeSet::FunctionIndex, 1234788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling "target-features"); 1244788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling std::string CPU = 1254788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling !CPUAttr.hasAttribute(Attribute::None) ?CPUAttr.getValueAsString() : ""; 1264788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling std::string FS = 1274788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling !FSAttr.hasAttribute(Attribute::None) ? FSAttr.getValueAsString() : ""; 128901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling if (!FS.empty()) { 129901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling initializeEnvironment(); 1304788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling resetSubtargetFeatures(CPU, FS); 131901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling } 1324788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling} 1334788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling 1344788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendlingvoid ARMSubtarget::resetSubtargetFeatures(StringRef CPU, StringRef FS) { 135276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng if (CPUString.empty()) 136276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng CPUString = "generic"; 1374b1747430a2d67702958b95d6776396734f184a0Evan Cheng 1384cc446bc400b2ff58af81c91f5e145b81d6beb26Evan Cheng // Insert the architecture feature derived from the target triple into the 1394cc446bc400b2ff58af81c91f5e145b81d6beb26Evan Cheng // feature string. This is important for setting features that are implied 1404cc446bc400b2ff58af81c91f5e145b81d6beb26Evan Cheng // based on the architecture version. 1414788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling std::string ArchFS = ARM_MC::ParseARMTriple(TargetTriple.getTriple(), 1424788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling CPUString); 14394ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng if (!FS.empty()) { 14494ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng if (!ArchFS.empty()) 1454788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling ArchFS = ArchFS + "," + FS.str(); 14694ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng else 14794ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng ArchFS = FS; 14894ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng } 1490ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng ParseSubtargetFeatures(CPUString, ArchFS); 15094ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng 15194ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng // Thumb2 implies at least V6T2. FIXME: Fix tests to explicitly specify a 15294ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng // ARM version or CPU and then remove this. 15339dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng if (!HasV6T2Ops && hasThumb2()) 15439dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng HasV4TOps = HasV5TOps = HasV5TEOps = HasV6Ops = HasV6T2Ops = true; 15566f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson 156d43b5c97cff06d7840b974ca84fa0639d2567968Andrew Trick // Keep a pointer to static instruction cost data for the specified CPU. 157d43b5c97cff06d7840b974ca84fa0639d2567968Andrew Trick SchedModel = getSchedModelForCPU(CPUString); 158d43b5c97cff06d7840b974ca84fa0639d2567968Andrew Trick 15994214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng // Initialize scheduling itinerary for the specified CPU. 16094214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng InstrItins = getInstrItineraryForCPU(CPUString); 16194214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng 1624788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling if ((TargetTriple.getTriple().find("eabi") != std::string::npos) || 1634788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling (isTargetIOS() && isMClass())) 16407043279f60622243d16d8a3f60805960482083cEvan Cheng // FIXME: We might want to separate AAPCS and EABI. Some systems, e.g. 16507043279f60622243d16d8a3f60805960482083cEvan Cheng // Darwin-EABI conforms to AACPS but not the rest of EABI. 1660ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng TargetABI = ARM_ABI_AAPCS; 1670ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng 1683630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio if (isAAPCS_ABI()) 1693630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio stackAlignment = 8; 1703630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio 171afff941211526a31f931aa9fcac84ae42ff60ef0Evan Cheng if (!isTargetIOS()) 1725de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng UseMovt = hasV6T2Ops(); 1735de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng else { 17439dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng IsR9Reserved = ReserveR9 | !HasV6Ops; 17553519f015e3e84e9f57b677cc8724805a6009b73Evan Cheng UseMovt = DarwinUseMOVT && hasV6T2Ops(); 17607043279f60622243d16d8a3f60805960482083cEvan Cheng SupportsTailCall = !getTargetTriple().isOSVersionLT(5, 0); 1775de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng } 178471850ab84301dd47cab2bf8d694fcb5766c1169David Goodwin 179d3dd50fec00fbbb76edbfaff4d613f1248d21c9eEvan Cheng if (!isThumb() || hasThumb2()) 180d3dd50fec00fbbb76edbfaff4d613f1248d21c9eEvan Cheng PostRAScheduler = true; 18102aba73a9ec04d0de9424422249af3948ca9573aBob Wilson 182bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien switch (Align) { 183bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien case DefaultAlign: 184bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // Assume pre-ARMv6 doesn't support unaligned accesses. 185bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // 186bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // ARMv6 may or may not support unaligned accesses depending on the 187bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // SCTLR.U bit, which is architecture-specific. We assume ARMv6 188bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // Darwin targets support unaligned accesses, and others don't. 189bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // 190bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit 191bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // which raises an alignment fault on unaligned accesses. Linux 192bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // defaults this bit to 0 and handles it as a system-wide (not 193bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // per-process) setting. It is therefore safe to assume that ARMv7+ 194bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // Linux targets support unaligned accesses. The same goes for NaCl. 195bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // 196bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // The above behavior is consistent with GCC. 197bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien AllowsUnalignedMem = ( 198bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien (hasV7Ops() && (isTargetLinux() || isTargetNaCl())) || 199bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien (hasV6Ops() && isTargetDarwin())); 200bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien break; 201bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien case StrictAlign: 202bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien AllowsUnalignedMem = false; 203bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien break; 204bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien case NoStrictAlign: 205bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien AllowsUnalignedMem = true; 206bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien break; 207bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien } 2083382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin 2093382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin // NEON f32 ops are non-IEEE 754 compliant. Darwin is ok with it by default. 2103382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin uint64_t Bits = getFeatureBits(); 2113382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin if ((Bits & ARM::ProcA5 || Bits & ARM::ProcA8) && // Where this matters 2123382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin (Options.UnsafeFPMath || isTargetDarwin())) 2133382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin UseNEONForSinglePrecisionFP = true; 214a8e2989ece6dc46df59b0768184028257f913843Evan Cheng} 215e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng 216e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng/// GVIsIndirectSymbol - true if the GV will be accessed via an indirect symbol. 21763476a80404125e5196b6c09113c1d4796da0604Evan Chengbool 21846510a73e977273ec67747eb34cbdb43f815e451Dan GohmanARMSubtarget::GVIsIndirectSymbol(const GlobalValue *GV, 21946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman Reloc::Model RelocM) const { 22063476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (RelocM == Reloc::Static) 221e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng return false; 22263476a80404125e5196b6c09113c1d4796da0604Evan Cheng 223f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin // Materializable GVs (in JIT lazy compilation mode) do not require an extra 224f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin // load from stub. 225af05c69ba024b1838ae6f1071d6fd0f9fe33999fEvan Cheng bool isDecl = GV->hasAvailableExternallyLinkage(); 226af05c69ba024b1838ae6f1071d6fd0f9fe33999fEvan Cheng if (GV->isDeclaration() && !GV->isMaterializable()) 227af05c69ba024b1838ae6f1071d6fd0f9fe33999fEvan Cheng isDecl = true; 22863476a80404125e5196b6c09113c1d4796da0604Evan Cheng 22963476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (!isTargetDarwin()) { 23063476a80404125e5196b6c09113c1d4796da0604Evan Cheng // Extra load is needed for all externally visible. 23163476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (GV->hasLocalLinkage() || GV->hasHiddenVisibility()) 23263476a80404125e5196b6c09113c1d4796da0604Evan Cheng return false; 23363476a80404125e5196b6c09113c1d4796da0604Evan Cheng return true; 23463476a80404125e5196b6c09113c1d4796da0604Evan Cheng } else { 23563476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (RelocM == Reloc::PIC_) { 23663476a80404125e5196b6c09113c1d4796da0604Evan Cheng // If this is a strong reference to a definition, it is definitely not 23763476a80404125e5196b6c09113c1d4796da0604Evan Cheng // through a stub. 23863476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (!isDecl && !GV->isWeakForLinker()) 23963476a80404125e5196b6c09113c1d4796da0604Evan Cheng return false; 24063476a80404125e5196b6c09113c1d4796da0604Evan Cheng 24163476a80404125e5196b6c09113c1d4796da0604Evan Cheng // Unless we have a symbol with hidden visibility, we have to go through a 24263476a80404125e5196b6c09113c1d4796da0604Evan Cheng // normal $non_lazy_ptr stub because this symbol might be resolved late. 24363476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (!GV->hasHiddenVisibility()) // Non-hidden $non_lazy_ptr reference. 24463476a80404125e5196b6c09113c1d4796da0604Evan Cheng return true; 24563476a80404125e5196b6c09113c1d4796da0604Evan Cheng 24663476a80404125e5196b6c09113c1d4796da0604Evan Cheng // If symbol visibility is hidden, we have a stub for common symbol 24763476a80404125e5196b6c09113c1d4796da0604Evan Cheng // references and external declarations. 24863476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (isDecl || GV->hasCommonLinkage()) 24963476a80404125e5196b6c09113c1d4796da0604Evan Cheng // Hidden $non_lazy_ptr reference. 25063476a80404125e5196b6c09113c1d4796da0604Evan Cheng return true; 25163476a80404125e5196b6c09113c1d4796da0604Evan Cheng 25263476a80404125e5196b6c09113c1d4796da0604Evan Cheng return false; 25363476a80404125e5196b6c09113c1d4796da0604Evan Cheng } else { 25463476a80404125e5196b6c09113c1d4796da0604Evan Cheng // If this is a strong reference to a definition, it is definitely not 25563476a80404125e5196b6c09113c1d4796da0604Evan Cheng // through a stub. 25663476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (!isDecl && !GV->isWeakForLinker()) 25763476a80404125e5196b6c09113c1d4796da0604Evan Cheng return false; 2586e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick 25963476a80404125e5196b6c09113c1d4796da0604Evan Cheng // Unless we have a symbol with hidden visibility, we have to go through a 26063476a80404125e5196b6c09113c1d4796da0604Evan Cheng // normal $non_lazy_ptr stub because this symbol might be resolved late. 26163476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (!GV->hasHiddenVisibility()) // Non-hidden $non_lazy_ptr reference. 26263476a80404125e5196b6c09113c1d4796da0604Evan Cheng return true; 26363476a80404125e5196b6c09113c1d4796da0604Evan Cheng } 26463476a80404125e5196b6c09113c1d4796da0604Evan Cheng } 26563476a80404125e5196b6c09113c1d4796da0604Evan Cheng 26663476a80404125e5196b6c09113c1d4796da0604Evan Cheng return false; 267e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng} 268c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin 269654d5440a477b1f6c89b051107e041a331f78e27Owen Andersonunsigned ARMSubtarget::getMispredictionPenalty() const { 270d43b5c97cff06d7840b974ca84fa0639d2567968Andrew Trick return SchedModel->MispredictPenalty; 271654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson} 272654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson 273c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwinbool ARMSubtarget::enablePostRAScheduler( 274c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin CodeGenOpt::Level OptLevel, 2755b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng TargetSubtargetInfo::AntiDepBreakMode& Mode, 27687d21b92fc42f6b3bd8567a83fc5b5191c1205e5David Goodwin RegClassVector& CriticalPathRCs) const { 2775b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng Mode = TargetSubtargetInfo::ANTIDEP_CRITICAL; 27887d21b92fc42f6b3bd8567a83fc5b5191c1205e5David Goodwin CriticalPathRCs.clear(); 27987d21b92fc42f6b3bd8567a83fc5b5191c1205e5David Goodwin CriticalPathRCs.push_back(&ARM::GPRRegClass); 280c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin return PostRAScheduler && OptLevel >= CodeGenOpt::Default; 281c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin} 282