1*9880d681SAndroid Build Coastguard Worker //===-- ARMSubtarget.h - Define Subtarget for the ARM ----------*- C++ -*--===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker // This file declares the ARM specific subclass of TargetSubtargetInfo. 11*9880d681SAndroid Build Coastguard Worker // 12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_ARM_ARMSUBTARGET_H 15*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_ARM_ARMSUBTARGET_H 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker #include "ARMFrameLowering.h" 19*9880d681SAndroid Build Coastguard Worker #include "ARMISelLowering.h" 20*9880d681SAndroid Build Coastguard Worker #include "ARMInstrInfo.h" 21*9880d681SAndroid Build Coastguard Worker #include "ARMSelectionDAGInfo.h" 22*9880d681SAndroid Build Coastguard Worker #include "ARMSubtarget.h" 23*9880d681SAndroid Build Coastguard Worker #include "MCTargetDesc/ARMMCTargetDesc.h" 24*9880d681SAndroid Build Coastguard Worker #include "Thumb1FrameLowering.h" 25*9880d681SAndroid Build Coastguard Worker #include "Thumb1InstrInfo.h" 26*9880d681SAndroid Build Coastguard Worker #include "Thumb2InstrInfo.h" 27*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Triple.h" 28*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DataLayout.h" 29*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCInstrItineraries.h" 30*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetSubtargetInfo.h" 31*9880d681SAndroid Build Coastguard Worker #include <string> 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker #define GET_SUBTARGETINFO_HEADER 34*9880d681SAndroid Build Coastguard Worker #include "ARMGenSubtargetInfo.inc" 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker namespace llvm { 37*9880d681SAndroid Build Coastguard Worker class GlobalValue; 38*9880d681SAndroid Build Coastguard Worker class StringRef; 39*9880d681SAndroid Build Coastguard Worker class TargetOptions; 40*9880d681SAndroid Build Coastguard Worker class ARMBaseTargetMachine; 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker class ARMSubtarget : public ARMGenSubtargetInfo { 43*9880d681SAndroid Build Coastguard Worker protected: 44*9880d681SAndroid Build Coastguard Worker enum ARMProcFamilyEnum { 45*9880d681SAndroid Build Coastguard Worker Others, CortexA5, CortexA7, CortexA8, CortexA9, CortexA12, CortexA15, 46*9880d681SAndroid Build Coastguard Worker CortexA17, CortexR4, CortexR4F, CortexR5, CortexR7, CortexM3, 47*9880d681SAndroid Build Coastguard Worker CortexA32, CortexA35, CortexA53, CortexA57, CortexA72, CortexA73, 48*9880d681SAndroid Build Coastguard Worker Krait, Swift, ExynosM1 49*9880d681SAndroid Build Coastguard Worker }; 50*9880d681SAndroid Build Coastguard Worker enum ARMProcClassEnum { 51*9880d681SAndroid Build Coastguard Worker None, AClass, RClass, MClass 52*9880d681SAndroid Build Coastguard Worker }; 53*9880d681SAndroid Build Coastguard Worker enum ARMArchEnum { 54*9880d681SAndroid Build Coastguard Worker ARMv2, ARMv2a, ARMv3, ARMv3m, ARMv4, ARMv4t, ARMv5, ARMv5t, ARMv5te, 55*9880d681SAndroid Build Coastguard Worker ARMv5tej, ARMv6, ARMv6k, ARMv6kz, ARMv6t2, ARMv6m, ARMv6sm, ARMv7a, ARMv7r, 56*9880d681SAndroid Build Coastguard Worker ARMv7m, ARMv7em, ARMv8a, ARMv81a, ARMv82a, ARMv8mMainline, ARMv8mBaseline 57*9880d681SAndroid Build Coastguard Worker }; 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker public: 60*9880d681SAndroid Build Coastguard Worker /// What kind of timing do load multiple/store multiple instructions have. 61*9880d681SAndroid Build Coastguard Worker enum ARMLdStMultipleTiming { 62*9880d681SAndroid Build Coastguard Worker /// Can load/store 2 registers/cycle. 63*9880d681SAndroid Build Coastguard Worker DoubleIssue, 64*9880d681SAndroid Build Coastguard Worker /// Can load/store 2 registers/cycle, but needs an extra cycle if the access 65*9880d681SAndroid Build Coastguard Worker /// is not 64-bit aligned. 66*9880d681SAndroid Build Coastguard Worker DoubleIssueCheckUnalignedAccess, 67*9880d681SAndroid Build Coastguard Worker /// Can load/store 1 register/cycle. 68*9880d681SAndroid Build Coastguard Worker SingleIssue, 69*9880d681SAndroid Build Coastguard Worker /// Can load/store 1 register/cycle, but needs an extra cycle for address 70*9880d681SAndroid Build Coastguard Worker /// computation and potentially also for register writeback. 71*9880d681SAndroid Build Coastguard Worker SingleIssuePlusExtras, 72*9880d681SAndroid Build Coastguard Worker }; 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker protected: 75*9880d681SAndroid Build Coastguard Worker /// ARMProcFamily - ARM processor family: Cortex-A8, Cortex-A9, and others. 76*9880d681SAndroid Build Coastguard Worker ARMProcFamilyEnum ARMProcFamily = Others; 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker /// ARMProcClass - ARM processor class: None, AClass, RClass or MClass. 79*9880d681SAndroid Build Coastguard Worker ARMProcClassEnum ARMProcClass = None; 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker /// ARMArch - ARM architecture 82*9880d681SAndroid Build Coastguard Worker ARMArchEnum ARMArch = ARMv4t; 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker /// HasV4TOps, HasV5TOps, HasV5TEOps, 85*9880d681SAndroid Build Coastguard Worker /// HasV6Ops, HasV6MOps, HasV6KOps, HasV6T2Ops, HasV7Ops, HasV8Ops - 86*9880d681SAndroid Build Coastguard Worker /// Specify whether target support specific ARM ISA variants. 87*9880d681SAndroid Build Coastguard Worker bool HasV4TOps = false; 88*9880d681SAndroid Build Coastguard Worker bool HasV5TOps = false; 89*9880d681SAndroid Build Coastguard Worker bool HasV5TEOps = false; 90*9880d681SAndroid Build Coastguard Worker bool HasV6Ops = false; 91*9880d681SAndroid Build Coastguard Worker bool HasV6MOps = false; 92*9880d681SAndroid Build Coastguard Worker bool HasV6KOps = false; 93*9880d681SAndroid Build Coastguard Worker bool HasV6T2Ops = false; 94*9880d681SAndroid Build Coastguard Worker bool HasV7Ops = false; 95*9880d681SAndroid Build Coastguard Worker bool HasV8Ops = false; 96*9880d681SAndroid Build Coastguard Worker bool HasV8_1aOps = false; 97*9880d681SAndroid Build Coastguard Worker bool HasV8_2aOps = false; 98*9880d681SAndroid Build Coastguard Worker bool HasV8MBaselineOps = false; 99*9880d681SAndroid Build Coastguard Worker bool HasV8MMainlineOps = false; 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker /// HasVFPv2, HasVFPv3, HasVFPv4, HasFPARMv8, HasNEON - Specify what 102*9880d681SAndroid Build Coastguard Worker /// floating point ISAs are supported. 103*9880d681SAndroid Build Coastguard Worker bool HasVFPv2 = false; 104*9880d681SAndroid Build Coastguard Worker bool HasVFPv3 = false; 105*9880d681SAndroid Build Coastguard Worker bool HasVFPv4 = false; 106*9880d681SAndroid Build Coastguard Worker bool HasFPARMv8 = false; 107*9880d681SAndroid Build Coastguard Worker bool HasNEON = false; 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Worker /// UseNEONForSinglePrecisionFP - if the NEONFP attribute has been 110*9880d681SAndroid Build Coastguard Worker /// specified. Use the method useNEONForSinglePrecisionFP() to 111*9880d681SAndroid Build Coastguard Worker /// determine if NEON should actually be used. 112*9880d681SAndroid Build Coastguard Worker bool UseNEONForSinglePrecisionFP = false; 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker /// UseMulOps - True if non-microcoded fused integer multiply-add and 115*9880d681SAndroid Build Coastguard Worker /// multiply-subtract instructions should be used. 116*9880d681SAndroid Build Coastguard Worker bool UseMulOps = false; 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker /// SlowFPVMLx - If the VFP2 / NEON instructions are available, indicates 119*9880d681SAndroid Build Coastguard Worker /// whether the FP VML[AS] instructions are slow (if so, don't use them). 120*9880d681SAndroid Build Coastguard Worker bool SlowFPVMLx = false; 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker /// HasVMLxForwarding - If true, NEON has special multiplier accumulator 123*9880d681SAndroid Build Coastguard Worker /// forwarding to allow mul + mla being issued back to back. 124*9880d681SAndroid Build Coastguard Worker bool HasVMLxForwarding = false; 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker /// SlowFPBrcc - True if floating point compare + branch is slow. 127*9880d681SAndroid Build Coastguard Worker bool SlowFPBrcc = false; 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker /// InThumbMode - True if compiling for Thumb, false for ARM. 130*9880d681SAndroid Build Coastguard Worker bool InThumbMode = false; 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker /// UseSoftFloat - True if we're using software floating point features. 133*9880d681SAndroid Build Coastguard Worker bool UseSoftFloat = false; 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker /// HasThumb2 - True if Thumb2 instructions are supported. 136*9880d681SAndroid Build Coastguard Worker bool HasThumb2 = false; 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker /// NoARM - True if subtarget does not support ARM mode execution. 139*9880d681SAndroid Build Coastguard Worker bool NoARM = false; 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Worker /// ReserveR9 - True if R9 is not available as a general purpose register. 142*9880d681SAndroid Build Coastguard Worker bool ReserveR9 = false; 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker /// NoMovt - True if MOVT / MOVW pairs are not used for materialization of 145*9880d681SAndroid Build Coastguard Worker /// 32-bit imms (including global addresses). 146*9880d681SAndroid Build Coastguard Worker bool NoMovt = false; 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker /// SupportsTailCall - True if the OS supports tail call. The dynamic linker 149*9880d681SAndroid Build Coastguard Worker /// must be able to synthesize call stubs for interworking between ARM and 150*9880d681SAndroid Build Coastguard Worker /// Thumb. 151*9880d681SAndroid Build Coastguard Worker bool SupportsTailCall = false; 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Worker /// HasFP16 - True if subtarget supports half-precision FP conversions 154*9880d681SAndroid Build Coastguard Worker bool HasFP16 = false; 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Worker /// HasFullFP16 - True if subtarget supports half-precision FP operations 157*9880d681SAndroid Build Coastguard Worker bool HasFullFP16 = false; 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Worker /// HasD16 - True if subtarget is limited to 16 double precision 160*9880d681SAndroid Build Coastguard Worker /// FP registers for VFPv3. 161*9880d681SAndroid Build Coastguard Worker bool HasD16 = false; 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Worker /// HasHardwareDivide - True if subtarget supports [su]div 164*9880d681SAndroid Build Coastguard Worker bool HasHardwareDivide = false; 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Worker /// HasHardwareDivideInARM - True if subtarget supports [su]div in ARM mode 167*9880d681SAndroid Build Coastguard Worker bool HasHardwareDivideInARM = false; 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker /// HasT2ExtractPack - True if subtarget supports thumb2 extract/pack 170*9880d681SAndroid Build Coastguard Worker /// instructions. 171*9880d681SAndroid Build Coastguard Worker bool HasT2ExtractPack = false; 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker /// HasDataBarrier - True if the subtarget supports DMB / DSB data barrier 174*9880d681SAndroid Build Coastguard Worker /// instructions. 175*9880d681SAndroid Build Coastguard Worker bool HasDataBarrier = false; 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Worker /// HasV7Clrex - True if the subtarget supports CLREX instructions 178*9880d681SAndroid Build Coastguard Worker bool HasV7Clrex = false; 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Worker /// HasAcquireRelease - True if the subtarget supports v8 atomics (LDA/LDAEX etc) 181*9880d681SAndroid Build Coastguard Worker /// instructions 182*9880d681SAndroid Build Coastguard Worker bool HasAcquireRelease = false; 183*9880d681SAndroid Build Coastguard Worker 184*9880d681SAndroid Build Coastguard Worker /// Pref32BitThumb - If true, codegen would prefer 32-bit Thumb instructions 185*9880d681SAndroid Build Coastguard Worker /// over 16-bit ones. 186*9880d681SAndroid Build Coastguard Worker bool Pref32BitThumb = false; 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Worker /// AvoidCPSRPartialUpdate - If true, codegen would avoid using instructions 189*9880d681SAndroid Build Coastguard Worker /// that partially update CPSR and add false dependency on the previous 190*9880d681SAndroid Build Coastguard Worker /// CPSR setting instruction. 191*9880d681SAndroid Build Coastguard Worker bool AvoidCPSRPartialUpdate = false; 192*9880d681SAndroid Build Coastguard Worker 193*9880d681SAndroid Build Coastguard Worker /// AvoidMOVsShifterOperand - If true, codegen should avoid using flag setting 194*9880d681SAndroid Build Coastguard Worker /// movs with shifter operand (i.e. asr, lsl, lsr). 195*9880d681SAndroid Build Coastguard Worker bool AvoidMOVsShifterOperand = false; 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Worker /// HasRetAddrStack - Some processors perform return stack prediction. CodeGen should 198*9880d681SAndroid Build Coastguard Worker /// avoid issue "normal" call instructions to callees which do not return. 199*9880d681SAndroid Build Coastguard Worker bool HasRetAddrStack = false; 200*9880d681SAndroid Build Coastguard Worker 201*9880d681SAndroid Build Coastguard Worker /// HasMPExtension - True if the subtarget supports Multiprocessing 202*9880d681SAndroid Build Coastguard Worker /// extension (ARMv7 only). 203*9880d681SAndroid Build Coastguard Worker bool HasMPExtension = false; 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Worker /// HasVirtualization - True if the subtarget supports the Virtualization 206*9880d681SAndroid Build Coastguard Worker /// extension. 207*9880d681SAndroid Build Coastguard Worker bool HasVirtualization = false; 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Worker /// FPOnlySP - If true, the floating point unit only supports single 210*9880d681SAndroid Build Coastguard Worker /// precision. 211*9880d681SAndroid Build Coastguard Worker bool FPOnlySP = false; 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Worker /// If true, the processor supports the Performance Monitor Extensions. These 214*9880d681SAndroid Build Coastguard Worker /// include a generic cycle-counter as well as more fine-grained (often 215*9880d681SAndroid Build Coastguard Worker /// implementation-specific) events. 216*9880d681SAndroid Build Coastguard Worker bool HasPerfMon = false; 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Worker /// HasTrustZone - if true, processor supports TrustZone security extensions 219*9880d681SAndroid Build Coastguard Worker bool HasTrustZone = false; 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard Worker /// Has8MSecExt - if true, processor supports ARMv8-M Security Extensions 222*9880d681SAndroid Build Coastguard Worker bool Has8MSecExt = false; 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Worker /// HasCrypto - if true, processor supports Cryptography extensions 225*9880d681SAndroid Build Coastguard Worker bool HasCrypto = false; 226*9880d681SAndroid Build Coastguard Worker 227*9880d681SAndroid Build Coastguard Worker /// HasCRC - if true, processor supports CRC instructions 228*9880d681SAndroid Build Coastguard Worker bool HasCRC = false; 229*9880d681SAndroid Build Coastguard Worker 230*9880d681SAndroid Build Coastguard Worker /// HasRAS - if true, the processor supports RAS extensions 231*9880d681SAndroid Build Coastguard Worker bool HasRAS = false; 232*9880d681SAndroid Build Coastguard Worker 233*9880d681SAndroid Build Coastguard Worker /// If true, the instructions "vmov.i32 d0, #0" and "vmov.i32 q0, #0" are 234*9880d681SAndroid Build Coastguard Worker /// particularly effective at zeroing a VFP register. 235*9880d681SAndroid Build Coastguard Worker bool HasZeroCycleZeroing = false; 236*9880d681SAndroid Build Coastguard Worker 237*9880d681SAndroid Build Coastguard Worker /// If true, if conversion may decide to leave some instructions unpredicated. 238*9880d681SAndroid Build Coastguard Worker bool IsProfitableToUnpredicate = false; 239*9880d681SAndroid Build Coastguard Worker 240*9880d681SAndroid Build Coastguard Worker /// If true, VMOV will be favored over VGETLNi32. 241*9880d681SAndroid Build Coastguard Worker bool HasSlowVGETLNi32 = false; 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Worker /// If true, VMOV will be favored over VDUP. 244*9880d681SAndroid Build Coastguard Worker bool HasSlowVDUP32 = false; 245*9880d681SAndroid Build Coastguard Worker 246*9880d681SAndroid Build Coastguard Worker /// If true, VMOVSR will be favored over VMOVDRR. 247*9880d681SAndroid Build Coastguard Worker bool PreferVMOVSR = false; 248*9880d681SAndroid Build Coastguard Worker 249*9880d681SAndroid Build Coastguard Worker /// If true, ISHST barriers will be used for Release semantics. 250*9880d681SAndroid Build Coastguard Worker bool PreferISHST = false; 251*9880d681SAndroid Build Coastguard Worker 252*9880d681SAndroid Build Coastguard Worker /// If true, a VLDM/VSTM starting with an odd register number is considered to 253*9880d681SAndroid Build Coastguard Worker /// take more microops than single VLDRS/VSTRS. 254*9880d681SAndroid Build Coastguard Worker bool SlowOddRegister = false; 255*9880d681SAndroid Build Coastguard Worker 256*9880d681SAndroid Build Coastguard Worker /// If true, loading into a D subregister will be penalized. 257*9880d681SAndroid Build Coastguard Worker bool SlowLoadDSubregister = false; 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Worker /// If true, the AGU and NEON/FPU units are multiplexed. 260*9880d681SAndroid Build Coastguard Worker bool HasMuxedUnits = false; 261*9880d681SAndroid Build Coastguard Worker 262*9880d681SAndroid Build Coastguard Worker /// If true, VMOVS will never be widened to VMOVD 263*9880d681SAndroid Build Coastguard Worker bool DontWidenVMOVS = false; 264*9880d681SAndroid Build Coastguard Worker 265*9880d681SAndroid Build Coastguard Worker /// If true, run the MLx expansion pass. 266*9880d681SAndroid Build Coastguard Worker bool ExpandMLx = false; 267*9880d681SAndroid Build Coastguard Worker 268*9880d681SAndroid Build Coastguard Worker /// If true, VFP/NEON VMLA/VMLS have special RAW hazards. 269*9880d681SAndroid Build Coastguard Worker bool HasVMLxHazards = false; 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Worker /// If true, VMOVRS, VMOVSR and VMOVS will be converted from VFP to NEON. 272*9880d681SAndroid Build Coastguard Worker bool UseNEONForFPMovs = false; 273*9880d681SAndroid Build Coastguard Worker 274*9880d681SAndroid Build Coastguard Worker /// If true, VLDn instructions take an extra cycle for unaligned accesses. 275*9880d681SAndroid Build Coastguard Worker bool CheckVLDnAlign = false; 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Worker /// If true, VFP instructions are not pipelined. 278*9880d681SAndroid Build Coastguard Worker bool NonpipelinedVFP = false; 279*9880d681SAndroid Build Coastguard Worker 280*9880d681SAndroid Build Coastguard Worker /// StrictAlign - If true, the subtarget disallows unaligned memory 281*9880d681SAndroid Build Coastguard Worker /// accesses for some types. For details, see 282*9880d681SAndroid Build Coastguard Worker /// ARMTargetLowering::allowsMisalignedMemoryAccesses(). 283*9880d681SAndroid Build Coastguard Worker bool StrictAlign = false; 284*9880d681SAndroid Build Coastguard Worker 285*9880d681SAndroid Build Coastguard Worker /// RestrictIT - If true, the subtarget disallows generation of deprecated IT 286*9880d681SAndroid Build Coastguard Worker /// blocks to conform to ARMv8 rule. 287*9880d681SAndroid Build Coastguard Worker bool RestrictIT = false; 288*9880d681SAndroid Build Coastguard Worker 289*9880d681SAndroid Build Coastguard Worker /// HasDSP - If true, the subtarget supports the DSP (saturating arith 290*9880d681SAndroid Build Coastguard Worker /// and such) instructions. 291*9880d681SAndroid Build Coastguard Worker bool HasDSP = false; 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Worker /// NaCl TRAP instruction is generated instead of the regular TRAP. 294*9880d681SAndroid Build Coastguard Worker bool UseNaClTrap = false; 295*9880d681SAndroid Build Coastguard Worker 296*9880d681SAndroid Build Coastguard Worker /// Generate calls via indirect call instructions. 297*9880d681SAndroid Build Coastguard Worker bool GenLongCalls = false; 298*9880d681SAndroid Build Coastguard Worker 299*9880d681SAndroid Build Coastguard Worker /// Target machine allowed unsafe FP math (such as use of NEON fp) 300*9880d681SAndroid Build Coastguard Worker bool UnsafeFPMath = false; 301*9880d681SAndroid Build Coastguard Worker 302*9880d681SAndroid Build Coastguard Worker /// UseSjLjEH - If true, the target uses SjLj exception handling (e.g. iOS). 303*9880d681SAndroid Build Coastguard Worker bool UseSjLjEH = false; 304*9880d681SAndroid Build Coastguard Worker 305*9880d681SAndroid Build Coastguard Worker /// stackAlignment - The minimum alignment known to hold of the stack frame on 306*9880d681SAndroid Build Coastguard Worker /// entry to the function and which must be maintained by every function. 307*9880d681SAndroid Build Coastguard Worker unsigned stackAlignment = 4; 308*9880d681SAndroid Build Coastguard Worker 309*9880d681SAndroid Build Coastguard Worker /// CPUString - String name of used CPU. 310*9880d681SAndroid Build Coastguard Worker std::string CPUString; 311*9880d681SAndroid Build Coastguard Worker 312*9880d681SAndroid Build Coastguard Worker unsigned MaxInterleaveFactor = 1; 313*9880d681SAndroid Build Coastguard Worker 314*9880d681SAndroid Build Coastguard Worker /// Clearance before partial register updates (in number of instructions) 315*9880d681SAndroid Build Coastguard Worker unsigned PartialUpdateClearance = 0; 316*9880d681SAndroid Build Coastguard Worker 317*9880d681SAndroid Build Coastguard Worker /// What kind of timing do load multiple/store multiple have (double issue, 318*9880d681SAndroid Build Coastguard Worker /// single issue etc). 319*9880d681SAndroid Build Coastguard Worker ARMLdStMultipleTiming LdStMultipleTiming = SingleIssue; 320*9880d681SAndroid Build Coastguard Worker 321*9880d681SAndroid Build Coastguard Worker /// The adjustment that we need to apply to get the operand latency from the 322*9880d681SAndroid Build Coastguard Worker /// operand cycle returned by the itinerary data for pre-ISel operands. 323*9880d681SAndroid Build Coastguard Worker int PreISelOperandLatencyAdjustment = 2; 324*9880d681SAndroid Build Coastguard Worker 325*9880d681SAndroid Build Coastguard Worker /// IsLittle - The target is Little Endian 326*9880d681SAndroid Build Coastguard Worker bool IsLittle; 327*9880d681SAndroid Build Coastguard Worker 328*9880d681SAndroid Build Coastguard Worker /// TargetTriple - What processor and OS we're targeting. 329*9880d681SAndroid Build Coastguard Worker Triple TargetTriple; 330*9880d681SAndroid Build Coastguard Worker 331*9880d681SAndroid Build Coastguard Worker /// SchedModel - Processor specific instruction costs. 332*9880d681SAndroid Build Coastguard Worker MCSchedModel SchedModel; 333*9880d681SAndroid Build Coastguard Worker 334*9880d681SAndroid Build Coastguard Worker /// Selected instruction itineraries (one entry per itinerary class.) 335*9880d681SAndroid Build Coastguard Worker InstrItineraryData InstrItins; 336*9880d681SAndroid Build Coastguard Worker 337*9880d681SAndroid Build Coastguard Worker /// Options passed via command line that could influence the target 338*9880d681SAndroid Build Coastguard Worker const TargetOptions &Options; 339*9880d681SAndroid Build Coastguard Worker 340*9880d681SAndroid Build Coastguard Worker const ARMBaseTargetMachine &TM; 341*9880d681SAndroid Build Coastguard Worker 342*9880d681SAndroid Build Coastguard Worker public: 343*9880d681SAndroid Build Coastguard Worker /// This constructor initializes the data members to match that 344*9880d681SAndroid Build Coastguard Worker /// of the specified triple. 345*9880d681SAndroid Build Coastguard Worker /// 346*9880d681SAndroid Build Coastguard Worker ARMSubtarget(const Triple &TT, const std::string &CPU, const std::string &FS, 347*9880d681SAndroid Build Coastguard Worker const ARMBaseTargetMachine &TM, bool IsLittle); 348*9880d681SAndroid Build Coastguard Worker 349*9880d681SAndroid Build Coastguard Worker /// getMaxInlineSizeThreshold - Returns the maximum memset / memcpy size 350*9880d681SAndroid Build Coastguard Worker /// that still makes it profitable to inline the call. getMaxInlineSizeThreshold()351*9880d681SAndroid Build Coastguard Worker unsigned getMaxInlineSizeThreshold() const { 352*9880d681SAndroid Build Coastguard Worker return 64; 353*9880d681SAndroid Build Coastguard Worker } 354*9880d681SAndroid Build Coastguard Worker /// ParseSubtargetFeatures - Parses features string setting specified 355*9880d681SAndroid Build Coastguard Worker /// subtarget options. Definition of function is auto generated by tblgen. 356*9880d681SAndroid Build Coastguard Worker void ParseSubtargetFeatures(StringRef CPU, StringRef FS); 357*9880d681SAndroid Build Coastguard Worker 358*9880d681SAndroid Build Coastguard Worker /// initializeSubtargetDependencies - Initializes using a CPU and feature string 359*9880d681SAndroid Build Coastguard Worker /// so that we can use initializer lists for subtarget initialization. 360*9880d681SAndroid Build Coastguard Worker ARMSubtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS); 361*9880d681SAndroid Build Coastguard Worker getSelectionDAGInfo()362*9880d681SAndroid Build Coastguard Worker const ARMSelectionDAGInfo *getSelectionDAGInfo() const override { 363*9880d681SAndroid Build Coastguard Worker return &TSInfo; 364*9880d681SAndroid Build Coastguard Worker } getInstrInfo()365*9880d681SAndroid Build Coastguard Worker const ARMBaseInstrInfo *getInstrInfo() const override { 366*9880d681SAndroid Build Coastguard Worker return InstrInfo.get(); 367*9880d681SAndroid Build Coastguard Worker } getTargetLowering()368*9880d681SAndroid Build Coastguard Worker const ARMTargetLowering *getTargetLowering() const override { 369*9880d681SAndroid Build Coastguard Worker return &TLInfo; 370*9880d681SAndroid Build Coastguard Worker } getFrameLowering()371*9880d681SAndroid Build Coastguard Worker const ARMFrameLowering *getFrameLowering() const override { 372*9880d681SAndroid Build Coastguard Worker return FrameLowering.get(); 373*9880d681SAndroid Build Coastguard Worker } getRegisterInfo()374*9880d681SAndroid Build Coastguard Worker const ARMBaseRegisterInfo *getRegisterInfo() const override { 375*9880d681SAndroid Build Coastguard Worker return &InstrInfo->getRegisterInfo(); 376*9880d681SAndroid Build Coastguard Worker } 377*9880d681SAndroid Build Coastguard Worker 378*9880d681SAndroid Build Coastguard Worker private: 379*9880d681SAndroid Build Coastguard Worker ARMSelectionDAGInfo TSInfo; 380*9880d681SAndroid Build Coastguard Worker // Either Thumb1FrameLowering or ARMFrameLowering. 381*9880d681SAndroid Build Coastguard Worker std::unique_ptr<ARMFrameLowering> FrameLowering; 382*9880d681SAndroid Build Coastguard Worker // Either Thumb1InstrInfo or Thumb2InstrInfo. 383*9880d681SAndroid Build Coastguard Worker std::unique_ptr<ARMBaseInstrInfo> InstrInfo; 384*9880d681SAndroid Build Coastguard Worker ARMTargetLowering TLInfo; 385*9880d681SAndroid Build Coastguard Worker 386*9880d681SAndroid Build Coastguard Worker void initializeEnvironment(); 387*9880d681SAndroid Build Coastguard Worker void initSubtargetFeatures(StringRef CPU, StringRef FS); 388*9880d681SAndroid Build Coastguard Worker ARMFrameLowering *initializeFrameLowering(StringRef CPU, StringRef FS); 389*9880d681SAndroid Build Coastguard Worker 390*9880d681SAndroid Build Coastguard Worker public: 391*9880d681SAndroid Build Coastguard Worker void computeIssueWidth(); 392*9880d681SAndroid Build Coastguard Worker hasV4TOps()393*9880d681SAndroid Build Coastguard Worker bool hasV4TOps() const { return HasV4TOps; } hasV5TOps()394*9880d681SAndroid Build Coastguard Worker bool hasV5TOps() const { return HasV5TOps; } hasV5TEOps()395*9880d681SAndroid Build Coastguard Worker bool hasV5TEOps() const { return HasV5TEOps; } hasV6Ops()396*9880d681SAndroid Build Coastguard Worker bool hasV6Ops() const { return HasV6Ops; } hasV6MOps()397*9880d681SAndroid Build Coastguard Worker bool hasV6MOps() const { return HasV6MOps; } hasV6KOps()398*9880d681SAndroid Build Coastguard Worker bool hasV6KOps() const { return HasV6KOps; } hasV6T2Ops()399*9880d681SAndroid Build Coastguard Worker bool hasV6T2Ops() const { return HasV6T2Ops; } hasV7Ops()400*9880d681SAndroid Build Coastguard Worker bool hasV7Ops() const { return HasV7Ops; } hasV8Ops()401*9880d681SAndroid Build Coastguard Worker bool hasV8Ops() const { return HasV8Ops; } hasV8_1aOps()402*9880d681SAndroid Build Coastguard Worker bool hasV8_1aOps() const { return HasV8_1aOps; } hasV8_2aOps()403*9880d681SAndroid Build Coastguard Worker bool hasV8_2aOps() const { return HasV8_2aOps; } hasV8MBaselineOps()404*9880d681SAndroid Build Coastguard Worker bool hasV8MBaselineOps() const { return HasV8MBaselineOps; } hasV8MMainlineOps()405*9880d681SAndroid Build Coastguard Worker bool hasV8MMainlineOps() const { return HasV8MMainlineOps; } 406*9880d681SAndroid Build Coastguard Worker 407*9880d681SAndroid Build Coastguard Worker /// @{ 408*9880d681SAndroid Build Coastguard Worker /// These functions are obsolete, please consider adding subtarget features 409*9880d681SAndroid Build Coastguard Worker /// or properties instead of calling them. isCortexA5()410*9880d681SAndroid Build Coastguard Worker bool isCortexA5() const { return ARMProcFamily == CortexA5; } isCortexA7()411*9880d681SAndroid Build Coastguard Worker bool isCortexA7() const { return ARMProcFamily == CortexA7; } isCortexA8()412*9880d681SAndroid Build Coastguard Worker bool isCortexA8() const { return ARMProcFamily == CortexA8; } isCortexA9()413*9880d681SAndroid Build Coastguard Worker bool isCortexA9() const { return ARMProcFamily == CortexA9; } isCortexA15()414*9880d681SAndroid Build Coastguard Worker bool isCortexA15() const { return ARMProcFamily == CortexA15; } isSwift()415*9880d681SAndroid Build Coastguard Worker bool isSwift() const { return ARMProcFamily == Swift; } isCortexM3()416*9880d681SAndroid Build Coastguard Worker bool isCortexM3() const { return ARMProcFamily == CortexM3; } isLikeA9()417*9880d681SAndroid Build Coastguard Worker bool isLikeA9() const { return isCortexA9() || isCortexA15() || isKrait(); } isCortexR5()418*9880d681SAndroid Build Coastguard Worker bool isCortexR5() const { return ARMProcFamily == CortexR5; } isKrait()419*9880d681SAndroid Build Coastguard Worker bool isKrait() const { return ARMProcFamily == Krait; } 420*9880d681SAndroid Build Coastguard Worker /// @} 421*9880d681SAndroid Build Coastguard Worker hasARMOps()422*9880d681SAndroid Build Coastguard Worker bool hasARMOps() const { return !NoARM; } 423*9880d681SAndroid Build Coastguard Worker hasVFP2()424*9880d681SAndroid Build Coastguard Worker bool hasVFP2() const { return HasVFPv2; } hasVFP3()425*9880d681SAndroid Build Coastguard Worker bool hasVFP3() const { return HasVFPv3; } hasVFP4()426*9880d681SAndroid Build Coastguard Worker bool hasVFP4() const { return HasVFPv4; } hasFPARMv8()427*9880d681SAndroid Build Coastguard Worker bool hasFPARMv8() const { return HasFPARMv8; } hasNEON()428*9880d681SAndroid Build Coastguard Worker bool hasNEON() const { return HasNEON; } hasCrypto()429*9880d681SAndroid Build Coastguard Worker bool hasCrypto() const { return HasCrypto; } hasCRC()430*9880d681SAndroid Build Coastguard Worker bool hasCRC() const { return HasCRC; } hasRAS()431*9880d681SAndroid Build Coastguard Worker bool hasRAS() const { return HasRAS; } hasVirtualization()432*9880d681SAndroid Build Coastguard Worker bool hasVirtualization() const { return HasVirtualization; } useNEONForSinglePrecisionFP()433*9880d681SAndroid Build Coastguard Worker bool useNEONForSinglePrecisionFP() const { 434*9880d681SAndroid Build Coastguard Worker return hasNEON() && UseNEONForSinglePrecisionFP; 435*9880d681SAndroid Build Coastguard Worker } 436*9880d681SAndroid Build Coastguard Worker hasDivide()437*9880d681SAndroid Build Coastguard Worker bool hasDivide() const { return HasHardwareDivide; } hasDivideInARMMode()438*9880d681SAndroid Build Coastguard Worker bool hasDivideInARMMode() const { return HasHardwareDivideInARM; } hasT2ExtractPack()439*9880d681SAndroid Build Coastguard Worker bool hasT2ExtractPack() const { return HasT2ExtractPack; } hasDataBarrier()440*9880d681SAndroid Build Coastguard Worker bool hasDataBarrier() const { return HasDataBarrier; } hasV7Clrex()441*9880d681SAndroid Build Coastguard Worker bool hasV7Clrex() const { return HasV7Clrex; } hasAcquireRelease()442*9880d681SAndroid Build Coastguard Worker bool hasAcquireRelease() const { return HasAcquireRelease; } hasAnyDataBarrier()443*9880d681SAndroid Build Coastguard Worker bool hasAnyDataBarrier() const { 444*9880d681SAndroid Build Coastguard Worker return HasDataBarrier || (hasV6Ops() && !isThumb()); 445*9880d681SAndroid Build Coastguard Worker } useMulOps()446*9880d681SAndroid Build Coastguard Worker bool useMulOps() const { return UseMulOps; } useFPVMLx()447*9880d681SAndroid Build Coastguard Worker bool useFPVMLx() const { return !SlowFPVMLx; } hasVMLxForwarding()448*9880d681SAndroid Build Coastguard Worker bool hasVMLxForwarding() const { return HasVMLxForwarding; } isFPBrccSlow()449*9880d681SAndroid Build Coastguard Worker bool isFPBrccSlow() const { return SlowFPBrcc; } isFPOnlySP()450*9880d681SAndroid Build Coastguard Worker bool isFPOnlySP() const { return FPOnlySP; } hasPerfMon()451*9880d681SAndroid Build Coastguard Worker bool hasPerfMon() const { return HasPerfMon; } hasTrustZone()452*9880d681SAndroid Build Coastguard Worker bool hasTrustZone() const { return HasTrustZone; } has8MSecExt()453*9880d681SAndroid Build Coastguard Worker bool has8MSecExt() const { return Has8MSecExt; } hasZeroCycleZeroing()454*9880d681SAndroid Build Coastguard Worker bool hasZeroCycleZeroing() const { return HasZeroCycleZeroing; } isProfitableToUnpredicate()455*9880d681SAndroid Build Coastguard Worker bool isProfitableToUnpredicate() const { return IsProfitableToUnpredicate; } hasSlowVGETLNi32()456*9880d681SAndroid Build Coastguard Worker bool hasSlowVGETLNi32() const { return HasSlowVGETLNi32; } hasSlowVDUP32()457*9880d681SAndroid Build Coastguard Worker bool hasSlowVDUP32() const { return HasSlowVDUP32; } preferVMOVSR()458*9880d681SAndroid Build Coastguard Worker bool preferVMOVSR() const { return PreferVMOVSR; } preferISHSTBarriers()459*9880d681SAndroid Build Coastguard Worker bool preferISHSTBarriers() const { return PreferISHST; } expandMLx()460*9880d681SAndroid Build Coastguard Worker bool expandMLx() const { return ExpandMLx; } hasVMLxHazards()461*9880d681SAndroid Build Coastguard Worker bool hasVMLxHazards() const { return HasVMLxHazards; } hasSlowOddRegister()462*9880d681SAndroid Build Coastguard Worker bool hasSlowOddRegister() const { return SlowOddRegister; } hasSlowLoadDSubregister()463*9880d681SAndroid Build Coastguard Worker bool hasSlowLoadDSubregister() const { return SlowLoadDSubregister; } hasMuxedUnits()464*9880d681SAndroid Build Coastguard Worker bool hasMuxedUnits() const { return HasMuxedUnits; } dontWidenVMOVS()465*9880d681SAndroid Build Coastguard Worker bool dontWidenVMOVS() const { return DontWidenVMOVS; } useNEONForFPMovs()466*9880d681SAndroid Build Coastguard Worker bool useNEONForFPMovs() const { return UseNEONForFPMovs; } checkVLDnAccessAlignment()467*9880d681SAndroid Build Coastguard Worker bool checkVLDnAccessAlignment() const { return CheckVLDnAlign; } nonpipelinedVFP()468*9880d681SAndroid Build Coastguard Worker bool nonpipelinedVFP() const { return NonpipelinedVFP; } prefers32BitThumb()469*9880d681SAndroid Build Coastguard Worker bool prefers32BitThumb() const { return Pref32BitThumb; } avoidCPSRPartialUpdate()470*9880d681SAndroid Build Coastguard Worker bool avoidCPSRPartialUpdate() const { return AvoidCPSRPartialUpdate; } avoidMOVsShifterOperand()471*9880d681SAndroid Build Coastguard Worker bool avoidMOVsShifterOperand() const { return AvoidMOVsShifterOperand; } hasRetAddrStack()472*9880d681SAndroid Build Coastguard Worker bool hasRetAddrStack() const { return HasRetAddrStack; } hasMPExtension()473*9880d681SAndroid Build Coastguard Worker bool hasMPExtension() const { return HasMPExtension; } hasDSP()474*9880d681SAndroid Build Coastguard Worker bool hasDSP() const { return HasDSP; } useNaClTrap()475*9880d681SAndroid Build Coastguard Worker bool useNaClTrap() const { return UseNaClTrap; } useSjLjEH()476*9880d681SAndroid Build Coastguard Worker bool useSjLjEH() const { return UseSjLjEH; } genLongCalls()477*9880d681SAndroid Build Coastguard Worker bool genLongCalls() const { return GenLongCalls; } 478*9880d681SAndroid Build Coastguard Worker hasFP16()479*9880d681SAndroid Build Coastguard Worker bool hasFP16() const { return HasFP16; } hasD16()480*9880d681SAndroid Build Coastguard Worker bool hasD16() const { return HasD16; } hasFullFP16()481*9880d681SAndroid Build Coastguard Worker bool hasFullFP16() const { return HasFullFP16; } 482*9880d681SAndroid Build Coastguard Worker getTargetTriple()483*9880d681SAndroid Build Coastguard Worker const Triple &getTargetTriple() const { return TargetTriple; } 484*9880d681SAndroid Build Coastguard Worker isTargetDarwin()485*9880d681SAndroid Build Coastguard Worker bool isTargetDarwin() const { return TargetTriple.isOSDarwin(); } isTargetIOS()486*9880d681SAndroid Build Coastguard Worker bool isTargetIOS() const { return TargetTriple.isiOS(); } isTargetWatchOS()487*9880d681SAndroid Build Coastguard Worker bool isTargetWatchOS() const { return TargetTriple.isWatchOS(); } isTargetWatchABI()488*9880d681SAndroid Build Coastguard Worker bool isTargetWatchABI() const { return TargetTriple.isWatchABI(); } isTargetLinux()489*9880d681SAndroid Build Coastguard Worker bool isTargetLinux() const { return TargetTriple.isOSLinux(); } isTargetNaCl()490*9880d681SAndroid Build Coastguard Worker bool isTargetNaCl() const { return TargetTriple.isOSNaCl(); } isTargetNetBSD()491*9880d681SAndroid Build Coastguard Worker bool isTargetNetBSD() const { return TargetTriple.isOSNetBSD(); } isTargetWindows()492*9880d681SAndroid Build Coastguard Worker bool isTargetWindows() const { return TargetTriple.isOSWindows(); } 493*9880d681SAndroid Build Coastguard Worker isTargetCOFF()494*9880d681SAndroid Build Coastguard Worker bool isTargetCOFF() const { return TargetTriple.isOSBinFormatCOFF(); } isTargetELF()495*9880d681SAndroid Build Coastguard Worker bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); } isTargetMachO()496*9880d681SAndroid Build Coastguard Worker bool isTargetMachO() const { return TargetTriple.isOSBinFormatMachO(); } 497*9880d681SAndroid Build Coastguard Worker 498*9880d681SAndroid Build Coastguard Worker // ARM EABI is the bare-metal EABI described in ARM ABI documents and 499*9880d681SAndroid Build Coastguard Worker // can be accessed via -target arm-none-eabi. This is NOT GNUEABI. 500*9880d681SAndroid Build Coastguard Worker // FIXME: Add a flag for bare-metal for that target and set Triple::EABI 501*9880d681SAndroid Build Coastguard Worker // even for GNUEABI, so we can make a distinction here and still conform to 502*9880d681SAndroid Build Coastguard Worker // the EABI on GNU (and Android) mode. This requires change in Clang, too. 503*9880d681SAndroid Build Coastguard Worker // FIXME: The Darwin exception is temporary, while we move users to 504*9880d681SAndroid Build Coastguard Worker // "*-*-*-macho" triples as quickly as possible. isTargetAEABI()505*9880d681SAndroid Build Coastguard Worker bool isTargetAEABI() const { 506*9880d681SAndroid Build Coastguard Worker return (TargetTriple.getEnvironment() == Triple::EABI || 507*9880d681SAndroid Build Coastguard Worker TargetTriple.getEnvironment() == Triple::EABIHF) && 508*9880d681SAndroid Build Coastguard Worker !isTargetDarwin() && !isTargetWindows(); 509*9880d681SAndroid Build Coastguard Worker } isTargetGNUAEABI()510*9880d681SAndroid Build Coastguard Worker bool isTargetGNUAEABI() const { 511*9880d681SAndroid Build Coastguard Worker return (TargetTriple.getEnvironment() == Triple::GNUEABI || 512*9880d681SAndroid Build Coastguard Worker TargetTriple.getEnvironment() == Triple::GNUEABIHF) && 513*9880d681SAndroid Build Coastguard Worker !isTargetDarwin() && !isTargetWindows(); 514*9880d681SAndroid Build Coastguard Worker } isTargetMuslAEABI()515*9880d681SAndroid Build Coastguard Worker bool isTargetMuslAEABI() const { 516*9880d681SAndroid Build Coastguard Worker return (TargetTriple.getEnvironment() == Triple::MuslEABI || 517*9880d681SAndroid Build Coastguard Worker TargetTriple.getEnvironment() == Triple::MuslEABIHF) && 518*9880d681SAndroid Build Coastguard Worker !isTargetDarwin() && !isTargetWindows(); 519*9880d681SAndroid Build Coastguard Worker } 520*9880d681SAndroid Build Coastguard Worker 521*9880d681SAndroid Build Coastguard Worker // ARM Targets that support EHABI exception handling standard 522*9880d681SAndroid Build Coastguard Worker // Darwin uses SjLj. Other targets might need more checks. isTargetEHABICompatible()523*9880d681SAndroid Build Coastguard Worker bool isTargetEHABICompatible() const { 524*9880d681SAndroid Build Coastguard Worker return (TargetTriple.getEnvironment() == Triple::EABI || 525*9880d681SAndroid Build Coastguard Worker TargetTriple.getEnvironment() == Triple::GNUEABI || 526*9880d681SAndroid Build Coastguard Worker TargetTriple.getEnvironment() == Triple::MuslEABI || 527*9880d681SAndroid Build Coastguard Worker TargetTriple.getEnvironment() == Triple::EABIHF || 528*9880d681SAndroid Build Coastguard Worker TargetTriple.getEnvironment() == Triple::GNUEABIHF || 529*9880d681SAndroid Build Coastguard Worker TargetTriple.getEnvironment() == Triple::MuslEABIHF || 530*9880d681SAndroid Build Coastguard Worker isTargetAndroid()) && 531*9880d681SAndroid Build Coastguard Worker !isTargetDarwin() && !isTargetWindows(); 532*9880d681SAndroid Build Coastguard Worker } 533*9880d681SAndroid Build Coastguard Worker isTargetHardFloat()534*9880d681SAndroid Build Coastguard Worker bool isTargetHardFloat() const { 535*9880d681SAndroid Build Coastguard Worker // FIXME: this is invalid for WindowsCE 536*9880d681SAndroid Build Coastguard Worker return TargetTriple.getEnvironment() == Triple::GNUEABIHF || 537*9880d681SAndroid Build Coastguard Worker TargetTriple.getEnvironment() == Triple::MuslEABIHF || 538*9880d681SAndroid Build Coastguard Worker TargetTriple.getEnvironment() == Triple::EABIHF || 539*9880d681SAndroid Build Coastguard Worker isTargetWindows() || isAAPCS16_ABI(); 540*9880d681SAndroid Build Coastguard Worker } isTargetAndroid()541*9880d681SAndroid Build Coastguard Worker bool isTargetAndroid() const { return TargetTriple.isAndroid(); } 542*9880d681SAndroid Build Coastguard Worker 543*9880d681SAndroid Build Coastguard Worker bool isAPCS_ABI() const; 544*9880d681SAndroid Build Coastguard Worker bool isAAPCS_ABI() const; 545*9880d681SAndroid Build Coastguard Worker bool isAAPCS16_ABI() const; 546*9880d681SAndroid Build Coastguard Worker useSoftFloat()547*9880d681SAndroid Build Coastguard Worker bool useSoftFloat() const { return UseSoftFloat; } isThumb()548*9880d681SAndroid Build Coastguard Worker bool isThumb() const { return InThumbMode; } isThumb1Only()549*9880d681SAndroid Build Coastguard Worker bool isThumb1Only() const { return InThumbMode && !HasThumb2; } isThumb2()550*9880d681SAndroid Build Coastguard Worker bool isThumb2() const { return InThumbMode && HasThumb2; } hasThumb2()551*9880d681SAndroid Build Coastguard Worker bool hasThumb2() const { return HasThumb2; } isMClass()552*9880d681SAndroid Build Coastguard Worker bool isMClass() const { return ARMProcClass == MClass; } isRClass()553*9880d681SAndroid Build Coastguard Worker bool isRClass() const { return ARMProcClass == RClass; } isAClass()554*9880d681SAndroid Build Coastguard Worker bool isAClass() const { return ARMProcClass == AClass; } 555*9880d681SAndroid Build Coastguard Worker isR9Reserved()556*9880d681SAndroid Build Coastguard Worker bool isR9Reserved() const { 557*9880d681SAndroid Build Coastguard Worker return isTargetMachO() ? (ReserveR9 || !HasV6Ops) : ReserveR9; 558*9880d681SAndroid Build Coastguard Worker } 559*9880d681SAndroid Build Coastguard Worker 560*9880d681SAndroid Build Coastguard Worker /// Returns true if the frame setup is split into two separate pushes (first 561*9880d681SAndroid Build Coastguard Worker /// r0-r7,lr then r8-r11), principally so that the frame pointer is adjacent 562*9880d681SAndroid Build Coastguard Worker /// to lr. splitFramePushPop()563*9880d681SAndroid Build Coastguard Worker bool splitFramePushPop() const { 564*9880d681SAndroid Build Coastguard Worker return isTargetMachO(); 565*9880d681SAndroid Build Coastguard Worker } 566*9880d681SAndroid Build Coastguard Worker 567*9880d681SAndroid Build Coastguard Worker bool useStride4VFPs(const MachineFunction &MF) const; 568*9880d681SAndroid Build Coastguard Worker 569*9880d681SAndroid Build Coastguard Worker bool useMovt(const MachineFunction &MF) const; 570*9880d681SAndroid Build Coastguard Worker supportsTailCall()571*9880d681SAndroid Build Coastguard Worker bool supportsTailCall() const { return SupportsTailCall; } 572*9880d681SAndroid Build Coastguard Worker allowsUnalignedMem()573*9880d681SAndroid Build Coastguard Worker bool allowsUnalignedMem() const { return !StrictAlign; } 574*9880d681SAndroid Build Coastguard Worker restrictIT()575*9880d681SAndroid Build Coastguard Worker bool restrictIT() const { return RestrictIT; } 576*9880d681SAndroid Build Coastguard Worker getCPUString()577*9880d681SAndroid Build Coastguard Worker const std::string & getCPUString() const { return CPUString; } 578*9880d681SAndroid Build Coastguard Worker isLittle()579*9880d681SAndroid Build Coastguard Worker bool isLittle() const { return IsLittle; } 580*9880d681SAndroid Build Coastguard Worker 581*9880d681SAndroid Build Coastguard Worker unsigned getMispredictionPenalty() const; 582*9880d681SAndroid Build Coastguard Worker 583*9880d681SAndroid Build Coastguard Worker /// This function returns true if the target has sincos() routine in its 584*9880d681SAndroid Build Coastguard Worker /// compiler runtime or math libraries. 585*9880d681SAndroid Build Coastguard Worker bool hasSinCos() const; 586*9880d681SAndroid Build Coastguard Worker 587*9880d681SAndroid Build Coastguard Worker /// Returns true if machine scheduler should be enabled. 588*9880d681SAndroid Build Coastguard Worker bool enableMachineScheduler() const override; 589*9880d681SAndroid Build Coastguard Worker 590*9880d681SAndroid Build Coastguard Worker /// True for some subtargets at > -O0. 591*9880d681SAndroid Build Coastguard Worker bool enablePostRAScheduler() const override; 592*9880d681SAndroid Build Coastguard Worker 593*9880d681SAndroid Build Coastguard Worker // enableAtomicExpand- True if we need to expand our atomics. 594*9880d681SAndroid Build Coastguard Worker bool enableAtomicExpand() const override; 595*9880d681SAndroid Build Coastguard Worker 596*9880d681SAndroid Build Coastguard Worker /// getInstrItins - Return the instruction itineraries based on subtarget 597*9880d681SAndroid Build Coastguard Worker /// selection. getInstrItineraryData()598*9880d681SAndroid Build Coastguard Worker const InstrItineraryData *getInstrItineraryData() const override { 599*9880d681SAndroid Build Coastguard Worker return &InstrItins; 600*9880d681SAndroid Build Coastguard Worker } 601*9880d681SAndroid Build Coastguard Worker 602*9880d681SAndroid Build Coastguard Worker /// getStackAlignment - Returns the minimum alignment known to hold of the 603*9880d681SAndroid Build Coastguard Worker /// stack frame on entry to the function and which must be maintained by every 604*9880d681SAndroid Build Coastguard Worker /// function for this subtarget. getStackAlignment()605*9880d681SAndroid Build Coastguard Worker unsigned getStackAlignment() const { return stackAlignment; } 606*9880d681SAndroid Build Coastguard Worker getMaxInterleaveFactor()607*9880d681SAndroid Build Coastguard Worker unsigned getMaxInterleaveFactor() const { return MaxInterleaveFactor; } 608*9880d681SAndroid Build Coastguard Worker getPartialUpdateClearance()609*9880d681SAndroid Build Coastguard Worker unsigned getPartialUpdateClearance() const { return PartialUpdateClearance; } 610*9880d681SAndroid Build Coastguard Worker getLdStMultipleTiming()611*9880d681SAndroid Build Coastguard Worker ARMLdStMultipleTiming getLdStMultipleTiming() const { 612*9880d681SAndroid Build Coastguard Worker return LdStMultipleTiming; 613*9880d681SAndroid Build Coastguard Worker } 614*9880d681SAndroid Build Coastguard Worker getPreISelOperandLatencyAdjustment()615*9880d681SAndroid Build Coastguard Worker int getPreISelOperandLatencyAdjustment() const { 616*9880d681SAndroid Build Coastguard Worker return PreISelOperandLatencyAdjustment; 617*9880d681SAndroid Build Coastguard Worker } 618*9880d681SAndroid Build Coastguard Worker 619*9880d681SAndroid Build Coastguard Worker /// True if the GV will be accessed via an indirect symbol. 620*9880d681SAndroid Build Coastguard Worker bool isGVIndirectSymbol(const GlobalValue *GV) const; 621*9880d681SAndroid Build Coastguard Worker 622*9880d681SAndroid Build Coastguard Worker /// True if fast-isel is used. 623*9880d681SAndroid Build Coastguard Worker bool useFastISel() const; 624*9880d681SAndroid Build Coastguard Worker }; 625*9880d681SAndroid Build Coastguard Worker } // End llvm namespace 626*9880d681SAndroid Build Coastguard Worker 627*9880d681SAndroid Build Coastguard Worker #endif // ARMSUBTARGET_H 628