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" 15cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "ARMFrameLowering.h" 16cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "ARMISelLowering.h" 17cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "ARMInstrInfo.h" 18cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "ARMJITInfo.h" 19cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "ARMSelectionDAGInfo.h" 20cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "ARMSubtarget.h" 21cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "Thumb1FrameLowering.h" 22cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "Thumb1InstrInfo.h" 23cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "Thumb2InstrInfo.h" 244788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling#include "llvm/IR/Attributes.h" 254788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling#include "llvm/IR/Function.h" 2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/GlobalValue.h" 2754fc124d72512d65d62565cabcd85c7b07496513Bob Wilson#include "llvm/Support/CommandLine.h" 28d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetInstrInfo.h" 293382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin#include "llvm/Target/TargetOptions.h" 3094214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng 31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesusing namespace llvm; 32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 33dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "arm-subtarget" 34dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 3594214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng#define GET_SUBTARGETINFO_TARGET_DESC 36ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng#define GET_SUBTARGETINFO_CTOR 37385e930d55f3ecd3c9538823dfa5896a12461845Evan Cheng#include "ARMGenSubtargetInfo.inc" 3894214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng 3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstatic cl::opt<bool> 4054fc124d72512d65d62565cabcd85c7b07496513Bob WilsonReserveR9("arm-reserve-r9", cl::Hidden, 4154fc124d72512d65d62565cabcd85c7b07496513Bob Wilson cl::desc("Reserve R9, making it unavailable as GPR")); 4254fc124d72512d65d62565cabcd85c7b07496513Bob Wilson 435cdc3a949af0cef7f2163f8a7acbf3049c226321Anton Korobeynikovstatic cl::opt<bool> 4414c41370e36068ae25c871d5bd8f99f92bbb7d45Renato GolinArmUseMOVT("arm-use-movt", cl::init(true), cl::Hidden); 455cdc3a949af0cef7f2163f8a7acbf3049c226321Anton Korobeynikov 4602aba73a9ec04d0de9424422249af3948ca9573aBob Wilsonstatic cl::opt<bool> 47eb1641d54a7eda7717304bc4d55d059208d8ebedBob WilsonUseFusedMulOps("arm-use-mulops", 48eb1641d54a7eda7717304bc4d55d059208d8ebedBob Wilson cl::init(true), cl::Hidden); 49eb1641d54a7eda7717304bc4d55d059208d8ebedBob Wilson 50bab06ba696694e7f62f964af7ee5290a13f78340JF Bastienenum AlignMode { 51bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien DefaultAlign, 52bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien StrictAlign, 53bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien NoStrictAlign 54bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien}; 55bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien 56bab06ba696694e7f62f964af7ee5290a13f78340JF Bastienstatic cl::opt<AlignMode> 57bab06ba696694e7f62f964af7ee5290a13f78340JF BastienAlign(cl::desc("Load/store alignment support"), 58bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien cl::Hidden, cl::init(DefaultAlign), 59bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien cl::values( 60bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien clEnumValN(DefaultAlign, "arm-default-align", 61bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien "Generate unaligned accesses only on hardware/OS " 62bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien "combinations that are known to support them"), 63bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien clEnumValN(StrictAlign, "arm-strict-align", 64bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien "Disallow all unaligned memory accesses"), 65bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien clEnumValN(NoStrictAlign, "arm-no-strict-align", 66bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien "Allow unaligned memory accesses"), 67bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien clEnumValEnd)); 6802aba73a9ec04d0de9424422249af3948ca9573aBob Wilson 69929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhaoenum ITMode { 70929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao DefaultIT, 71929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao RestrictedIT, 72929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao NoRestrictedIT 73929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao}; 74929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao 75929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhaostatic cl::opt<ITMode> 76929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming ZhaoIT(cl::desc("IT block support"), cl::Hidden, cl::init(DefaultIT), 77929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao cl::ZeroOrMore, 78929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao cl::values(clEnumValN(DefaultIT, "arm-default-it", 79929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao "Generate IT block based on arch"), 80929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao clEnumValN(RestrictedIT, "arm-restrict-it", 81929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao "Disallow deprecated IT based on ARMv8"), 82929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao clEnumValN(NoRestrictedIT, "arm-no-restrict-it", 83929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao "Allow IT blocks based on ARMv7"), 84929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao clEnumValEnd)); 85929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao 86cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesstatic std::string computeDataLayout(ARMSubtarget &ST) { 87cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines std::string Ret = ""; 88cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 89cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (ST.isLittle()) 90cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Little endian. 91cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Ret += "e"; 92cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines else 93cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Big endian. 94cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Ret += "E"; 95cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 96cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Ret += DataLayout::getManglingComponent(ST.getTargetTriple()); 97cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 98cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Pointers are 32 bits and aligned to 32 bits. 99cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Ret += "-p:32:32"; 100cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 101cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // On thumb, i16,i18 and i1 have natural aligment requirements, but we try to 102cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // align to 32. 103cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (ST.isThumb()) 104cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Ret += "-i1:8:32-i8:8:32-i16:16:32"; 105cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 106cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // ABIs other than APCS have 64 bit integers with natural alignment. 107cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (!ST.isAPCS_ABI()) 108cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Ret += "-i64:64"; 109cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 110cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // We have 64 bits floats. The APCS ABI requires them to be aligned to 32 111cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // bits, others to 64 bits. We always try to align to 64 bits. 112cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (ST.isAPCS_ABI()) 113cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Ret += "-f64:32:64"; 114cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 115cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // We have 128 and 64 bit vectors. The APCS ABI aligns them to 32 bits, others 116cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // to 64. We always ty to give them natural alignment. 117cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (ST.isAPCS_ABI()) 118cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Ret += "-v64:32:64-v128:32:128"; 119cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines else 120cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Ret += "-v128:64:128"; 121cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 122cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // On thumb and APCS, only try to align aggregates to 32 bits (the default is 123cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // 64 bits). 124cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (ST.isThumb() || ST.isAPCS_ABI()) 125cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Ret += "-a:0:32"; 126cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 127cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Integer registers are 32 bits. 128cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Ret += "-n32"; 129cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 130cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // The stack is 128 bit aligned on NaCl, 64 bit aligned on AAPCS and 32 bit 131cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // aligned everywhere else. 132cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (ST.isTargetNaCl()) 133cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Ret += "-S128"; 134cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines else if (ST.isAAPCS_ABI()) 135cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Ret += "-S64"; 136cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines else 137cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Ret += "-S32"; 138cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 139cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return Ret; 140cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 141cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 142cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines/// initializeSubtargetDependencies - Initializes using a CPU and feature string 143cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines/// so that we can use initializer lists for subtarget initialization. 144cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesARMSubtarget &ARMSubtarget::initializeSubtargetDependencies(StringRef CPU, 145cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines StringRef FS) { 146901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling initializeEnvironment(); 1474788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling resetSubtargetFeatures(CPU, FS); 148cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return *this; 1494788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling} 1504788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling 151cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesARMSubtarget::ARMSubtarget(const std::string &TT, const std::string &CPU, 152cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const std::string &FS, TargetMachine &TM, 153cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool IsLittle, const TargetOptions &Options) 154cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines : ARMGenSubtargetInfo(TT, CPU, FS), ARMProcFamily(Others), 155cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ARMProcClass(None), stackAlignment(4), CPUString(CPU), IsLittle(IsLittle), 156cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines TargetTriple(TT), Options(Options), TargetABI(ARM_ABI_UNKNOWN), 157cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DL(computeDataLayout(initializeSubtargetDependencies(CPU, FS))), 158cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines TSInfo(DL), JITInfo(), 159cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines InstrInfo(isThumb1Only() 160cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ? (ARMBaseInstrInfo *)new Thumb1InstrInfo(*this) 161cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines : !isThumb() 162cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ? (ARMBaseInstrInfo *)new ARMInstrInfo(*this) 163cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines : (ARMBaseInstrInfo *)new Thumb2InstrInfo(*this)), 164cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines TLInfo(TM), 165cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines FrameLowering(!isThumb1Only() 166cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ? new ARMFrameLowering(*this) 167cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines : (ARMFrameLowering *)new Thumb1FrameLowering(*this)) {} 168cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 169901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendlingvoid ARMSubtarget::initializeEnvironment() { 170901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasV4TOps = false; 171901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasV5TOps = false; 172901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasV5TEOps = false; 173901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasV6Ops = false; 174ca7b2d08d7b918e5e8e921a837623af962b27d00Amara Emerson HasV6MOps = false; 175901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasV6T2Ops = false; 176901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasV7Ops = false; 177849eedce9921eb8f285cd0df0ad69ee5133459d1Joey Gouly HasV8Ops = false; 178901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasVFPv2 = false; 179901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasVFPv3 = false; 180901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasVFPv4 = false; 1812a9af9f18eac90b0de739b6ceddf6c2209086303Joey Gouly HasFPARMv8 = false; 182901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasNEON = false; 183901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling UseNEONForSinglePrecisionFP = false; 184901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling UseMulOps = UseFusedMulOps; 185901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling SlowFPVMLx = false; 186901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasVMLxForwarding = false; 187901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling SlowFPBrcc = false; 188901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling InThumbMode = false; 189901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasThumb2 = false; 190901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling NoARM = false; 191901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling PostRAScheduler = false; 192901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling IsR9Reserved = ReserveR9; 193901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling UseMovt = false; 194901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling SupportsTailCall = false; 195901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasFP16 = false; 196901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasD16 = false; 197901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasHardwareDivide = false; 198901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasHardwareDivideInARM = false; 199901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasT2ExtractPack = false; 200901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasDataBarrier = false; 201901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling Pref32BitThumb = false; 202901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling AvoidCPSRPartialUpdate = false; 203901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling AvoidMOVsShifterOperand = false; 204901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasRAS = false; 205901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling HasMPExtension = false; 2066186de5c54b580414b2d162e0f335b62b3d9812cBradley Smith HasVirtualization = false; 207901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling FPOnlySP = false; 208b94a353242b26af5c0969926a6b84664e342b586Tim Northover HasPerfMon = false; 2098c9e52a9fc1f99cf80c499ef10e6c8a54ef899d4Tim Northover HasTrustZone = false; 2105df37dab763ce377095389c4ea1cff88db369954Amara Emerson HasCrypto = false; 21157bca7b26ec916ca1b74b1408608a6c69a1aa422Amara Emerson HasCRC = false; 21236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines HasZeroCycleZeroing = false; 213901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling AllowsUnalignedMem = false; 214901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling Thumb2DSP = false; 215901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling UseNaClTrap = false; 2163382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin UnsafeFPMath = false; 217373aa5c665fe6df6b9c5586d397dc3617f25aab5Stephen Hines UseLong64 = false; 218901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling} 219901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling 2204788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendlingvoid ARMSubtarget::resetSubtargetFeatures(const MachineFunction *MF) { 2214788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling AttributeSet FnAttrs = MF->getFunction()->getAttributes(); 2224788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling Attribute CPUAttr = FnAttrs.getAttribute(AttributeSet::FunctionIndex, 2234788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling "target-cpu"); 2244788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling Attribute FSAttr = FnAttrs.getAttribute(AttributeSet::FunctionIndex, 2254788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling "target-features"); 2264788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling std::string CPU = 2274788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling !CPUAttr.hasAttribute(Attribute::None) ?CPUAttr.getValueAsString() : ""; 2284788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling std::string FS = 2294788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling !FSAttr.hasAttribute(Attribute::None) ? FSAttr.getValueAsString() : ""; 230901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling if (!FS.empty()) { 231901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling initializeEnvironment(); 2324788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling resetSubtargetFeatures(CPU, FS); 233901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling } 2344788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling} 2354788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling 2364788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendlingvoid ARMSubtarget::resetSubtargetFeatures(StringRef CPU, StringRef FS) { 237195dd8a1ce38970e3463ee1425647280373b60a7Tilmann Scheller if (CPUString.empty()) { 238195dd8a1ce38970e3463ee1425647280373b60a7Tilmann Scheller if (isTargetIOS() && TargetTriple.getArchName().endswith("v7s")) 239195dd8a1ce38970e3463ee1425647280373b60a7Tilmann Scheller // Default to the Swift CPU when targeting armv7s/thumbv7s. 240195dd8a1ce38970e3463ee1425647280373b60a7Tilmann Scheller CPUString = "swift"; 241195dd8a1ce38970e3463ee1425647280373b60a7Tilmann Scheller else 242195dd8a1ce38970e3463ee1425647280373b60a7Tilmann Scheller CPUString = "generic"; 243195dd8a1ce38970e3463ee1425647280373b60a7Tilmann Scheller } 2444b1747430a2d67702958b95d6776396734f184a0Evan Cheng 2454cc446bc400b2ff58af81c91f5e145b81d6beb26Evan Cheng // Insert the architecture feature derived from the target triple into the 2464cc446bc400b2ff58af81c91f5e145b81d6beb26Evan Cheng // feature string. This is important for setting features that are implied 2474cc446bc400b2ff58af81c91f5e145b81d6beb26Evan Cheng // based on the architecture version. 2484788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling std::string ArchFS = ARM_MC::ParseARMTriple(TargetTriple.getTriple(), 2494788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling CPUString); 25094ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng if (!FS.empty()) { 25194ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng if (!ArchFS.empty()) 2524788d14b484ba9e2fe19855fd6c97a3659980fcaBill Wendling ArchFS = ArchFS + "," + FS.str(); 25394ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng else 25494ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng ArchFS = FS; 25594ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng } 2560ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng ParseSubtargetFeatures(CPUString, ArchFS); 25794ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng 25836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // FIXME: This used enable V6T2 support implicitly for Thumb2 mode. 25936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Assert this for now to make the change obvious. 26036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(hasV6T2Ops() || !hasThumb2()); 26166f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson 262d43b5c97cff06d7840b974ca84fa0639d2567968Andrew Trick // Keep a pointer to static instruction cost data for the specified CPU. 263d43b5c97cff06d7840b974ca84fa0639d2567968Andrew Trick SchedModel = getSchedModelForCPU(CPUString); 264d43b5c97cff06d7840b974ca84fa0639d2567968Andrew Trick 26594214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng // Initialize scheduling itinerary for the specified CPU. 26694214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng InstrItins = getInstrItineraryForCPU(CPUString); 26794214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng 26836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (TargetABI == ARM_ABI_UNKNOWN) { 26936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines switch (TargetTriple.getEnvironment()) { 27036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Triple::Android: 27136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Triple::EABI: 27236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Triple::EABIHF: 27336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Triple::GNUEABI: 27436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Triple::GNUEABIHF: 27536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines TargetABI = ARM_ABI_AAPCS; 27636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 27736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines default: 27836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if ((isTargetIOS() && isMClass()) || 27936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines (TargetTriple.isOSBinFormatMachO() && 28036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines TargetTriple.getOS() == Triple::UnknownOS)) 28136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines TargetABI = ARM_ABI_AAPCS; 28236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines else 28336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines TargetABI = ARM_ABI_APCS; 28436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines break; 28536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 28636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 28736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 28836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // FIXME: this is invalid for WindowsCE 28936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (isTargetWindows()) { 2900ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng TargetABI = ARM_ABI_AAPCS; 29136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines NoARM = true; 29236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 2930ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng 2943630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio if (isAAPCS_ABI()) 2953630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio stackAlignment = 8; 29636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (isTargetNaCl()) 29736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines stackAlignment = 16; 2983630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio 29914c41370e36068ae25c871d5bd8f99f92bbb7d45Renato Golin UseMovt = hasV6T2Ops() && ArmUseMOVT; 30014c41370e36068ae25c871d5bd8f99f92bbb7d45Renato Golin 30136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (isTargetMachO()) { 30239dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng IsR9Reserved = ReserveR9 | !HasV6Ops; 30336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SupportsTailCall = !isTargetIOS() || !getTargetTriple().isOSVersionLT(5, 0); 30436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } else { 30536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines IsR9Reserved = ReserveR9; 30636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SupportsTailCall = !isThumb1Only(); 3075de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng } 308471850ab84301dd47cab2bf8d694fcb5766c1169David Goodwin 309d3dd50fec00fbbb76edbfaff4d613f1248d21c9eEvan Cheng if (!isThumb() || hasThumb2()) 310d3dd50fec00fbbb76edbfaff4d613f1248d21c9eEvan Cheng PostRAScheduler = true; 31102aba73a9ec04d0de9424422249af3948ca9573aBob Wilson 312bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien switch (Align) { 313bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien case DefaultAlign: 314bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // Assume pre-ARMv6 doesn't support unaligned accesses. 315bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // 316bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // ARMv6 may or may not support unaligned accesses depending on the 317bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // SCTLR.U bit, which is architecture-specific. We assume ARMv6 31836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Darwin and NetBSD targets support unaligned accesses, and others don't. 319bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // 320bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit 321bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // which raises an alignment fault on unaligned accesses. Linux 322bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // defaults this bit to 0 and handles it as a system-wide (not 323bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // per-process) setting. It is therefore safe to assume that ARMv7+ 324bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // Linux targets support unaligned accesses. The same goes for NaCl. 325bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // 326bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien // The above behavior is consistent with GCC. 32736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AllowsUnalignedMem = 32836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines (hasV7Ops() && (isTargetLinux() || isTargetNaCl() || 32936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines isTargetNetBSD())) || 33036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines (hasV6Ops() && (isTargetMachO() || isTargetNetBSD())); 33136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // The one exception is cortex-m0, which despite being v6, does not 33236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // support unaligned accesses. Rather than make the above boolean 33336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // expression even more obtuse, just override the value here. 33436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (isThumb1Only() && isMClass()) 33536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AllowsUnalignedMem = false; 336bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien break; 337bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien case StrictAlign: 338bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien AllowsUnalignedMem = false; 339bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien break; 340bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien case NoStrictAlign: 341bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien AllowsUnalignedMem = true; 342bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien break; 343bab06ba696694e7f62f964af7ee5290a13f78340JF Bastien } 3443382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin 345929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao switch (IT) { 346929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao case DefaultIT: 347929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao RestrictIT = hasV8Ops() ? true : false; 348929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao break; 349929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao case RestrictedIT: 350929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao RestrictIT = true; 351929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao break; 352929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao case NoRestrictedIT: 353929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao RestrictIT = false; 354929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao break; 355929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao } 356929bdb23794b615dc6b0cc59db21f0450c3ce33bWeiming Zhao 3573382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin // NEON f32 ops are non-IEEE 754 compliant. Darwin is ok with it by default. 3583382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin uint64_t Bits = getFeatureBits(); 3593382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin if ((Bits & ARM::ProcA5 || Bits & ARM::ProcA8) && // Where this matters 3603382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin (Options.UnsafeFPMath || isTargetDarwin())) 3613382a840747c42c4a98eac802ee7b347a8ded1e4Renato Golin UseNEONForSinglePrecisionFP = true; 362a8e2989ece6dc46df59b0768184028257f913843Evan Cheng} 363e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng 364e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng/// GVIsIndirectSymbol - true if the GV will be accessed via an indirect symbol. 36563476a80404125e5196b6c09113c1d4796da0604Evan Chengbool 36646510a73e977273ec67747eb34cbdb43f815e451Dan GohmanARMSubtarget::GVIsIndirectSymbol(const GlobalValue *GV, 36746510a73e977273ec67747eb34cbdb43f815e451Dan Gohman Reloc::Model RelocM) const { 36863476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (RelocM == Reloc::Static) 369e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng return false; 37063476a80404125e5196b6c09113c1d4796da0604Evan Cheng 371f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin // Materializable GVs (in JIT lazy compilation mode) do not require an extra 372f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin // load from stub. 373af05c69ba024b1838ae6f1071d6fd0f9fe33999fEvan Cheng bool isDecl = GV->hasAvailableExternallyLinkage(); 374af05c69ba024b1838ae6f1071d6fd0f9fe33999fEvan Cheng if (GV->isDeclaration() && !GV->isMaterializable()) 375af05c69ba024b1838ae6f1071d6fd0f9fe33999fEvan Cheng isDecl = true; 37663476a80404125e5196b6c09113c1d4796da0604Evan Cheng 37736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!isTargetMachO()) { 37863476a80404125e5196b6c09113c1d4796da0604Evan Cheng // Extra load is needed for all externally visible. 37963476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (GV->hasLocalLinkage() || GV->hasHiddenVisibility()) 38063476a80404125e5196b6c09113c1d4796da0604Evan Cheng return false; 38163476a80404125e5196b6c09113c1d4796da0604Evan Cheng return true; 38263476a80404125e5196b6c09113c1d4796da0604Evan Cheng } else { 38363476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (RelocM == Reloc::PIC_) { 38463476a80404125e5196b6c09113c1d4796da0604Evan Cheng // If this is a strong reference to a definition, it is definitely not 38563476a80404125e5196b6c09113c1d4796da0604Evan Cheng // through a stub. 38663476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (!isDecl && !GV->isWeakForLinker()) 38763476a80404125e5196b6c09113c1d4796da0604Evan Cheng return false; 38863476a80404125e5196b6c09113c1d4796da0604Evan Cheng 38963476a80404125e5196b6c09113c1d4796da0604Evan Cheng // Unless we have a symbol with hidden visibility, we have to go through a 39063476a80404125e5196b6c09113c1d4796da0604Evan Cheng // normal $non_lazy_ptr stub because this symbol might be resolved late. 39163476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (!GV->hasHiddenVisibility()) // Non-hidden $non_lazy_ptr reference. 39263476a80404125e5196b6c09113c1d4796da0604Evan Cheng return true; 39363476a80404125e5196b6c09113c1d4796da0604Evan Cheng 39463476a80404125e5196b6c09113c1d4796da0604Evan Cheng // If symbol visibility is hidden, we have a stub for common symbol 39563476a80404125e5196b6c09113c1d4796da0604Evan Cheng // references and external declarations. 39663476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (isDecl || GV->hasCommonLinkage()) 39763476a80404125e5196b6c09113c1d4796da0604Evan Cheng // Hidden $non_lazy_ptr reference. 39863476a80404125e5196b6c09113c1d4796da0604Evan Cheng return true; 39963476a80404125e5196b6c09113c1d4796da0604Evan Cheng 40063476a80404125e5196b6c09113c1d4796da0604Evan Cheng return false; 40163476a80404125e5196b6c09113c1d4796da0604Evan Cheng } else { 40263476a80404125e5196b6c09113c1d4796da0604Evan Cheng // If this is a strong reference to a definition, it is definitely not 40363476a80404125e5196b6c09113c1d4796da0604Evan Cheng // through a stub. 40463476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (!isDecl && !GV->isWeakForLinker()) 40563476a80404125e5196b6c09113c1d4796da0604Evan Cheng return false; 4066e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick 40763476a80404125e5196b6c09113c1d4796da0604Evan Cheng // Unless we have a symbol with hidden visibility, we have to go through a 40863476a80404125e5196b6c09113c1d4796da0604Evan Cheng // normal $non_lazy_ptr stub because this symbol might be resolved late. 40963476a80404125e5196b6c09113c1d4796da0604Evan Cheng if (!GV->hasHiddenVisibility()) // Non-hidden $non_lazy_ptr reference. 41063476a80404125e5196b6c09113c1d4796da0604Evan Cheng return true; 41163476a80404125e5196b6c09113c1d4796da0604Evan Cheng } 41263476a80404125e5196b6c09113c1d4796da0604Evan Cheng } 41363476a80404125e5196b6c09113c1d4796da0604Evan Cheng 41463476a80404125e5196b6c09113c1d4796da0604Evan Cheng return false; 415e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng} 416c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin 417654d5440a477b1f6c89b051107e041a331f78e27Owen Andersonunsigned ARMSubtarget::getMispredictionPenalty() const { 418d43b5c97cff06d7840b974ca84fa0639d2567968Andrew Trick return SchedModel->MispredictPenalty; 419654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson} 420654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson 421cb01efb7988d119d6e2aedab1740695aa6a9cc0cBob Wilsonbool ARMSubtarget::hasSinCos() const { 422cb01efb7988d119d6e2aedab1740695aa6a9cc0cBob Wilson return getTargetTriple().getOS() == Triple::IOS && 423cb01efb7988d119d6e2aedab1740695aa6a9cc0cBob Wilson !getTargetTriple().isOSVersionLT(7, 0); 424cb01efb7988d119d6e2aedab1740695aa6a9cc0cBob Wilson} 425cb01efb7988d119d6e2aedab1740695aa6a9cc0cBob Wilson 426cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// Enable the PostMachineScheduler if the target selects it instead of 427cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// PostRAScheduler. Currently only available on the command line via 428cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// -misched-postra. 429cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesbool ARMSubtarget::enablePostMachineScheduler() const { 430cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return PostRAScheduler; 431cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 432cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 433cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesbool ARMSubtarget::enableAtomicExpandLoadLinked() const { 434cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return hasAnyDataBarrier() && !isThumb1Only(); 435cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 436cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 437c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwinbool ARMSubtarget::enablePostRAScheduler( 438c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin CodeGenOpt::Level OptLevel, 4395b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng TargetSubtargetInfo::AntiDepBreakMode& Mode, 44087d21b92fc42f6b3bd8567a83fc5b5191c1205e5David Goodwin RegClassVector& CriticalPathRCs) const { 441dfca6eec3171802d6fcb091da01604ef4420fb3bAndrew Trick Mode = TargetSubtargetInfo::ANTIDEP_NONE; 442c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin return PostRAScheduler && OptLevel >= CodeGenOpt::Default; 443c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin} 444cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 445cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesbool ARMSubtarget::useMovt(const MachineFunction &MF) const { 446cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // NOTE Windows on ARM needs to use mov.w/mov.t pairs to materialise 32-bit 447cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // immediates as it is inherently position independent, and may be out of 448cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // range otherwise. 449cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return UseMovt && (isTargetWindows() || 450cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines !MF.getFunction()->getAttributes().hasAttribute( 451cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines AttributeSet::FunctionIndex, Attribute::MinSize)); 452cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 453