1*0b57cec5SDimitry Andric//===-- ARM.td - Describe the ARM Target Machine -----------*- tablegen -*-===// 2*0b57cec5SDimitry Andric// 3*0b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric// 7*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric// 9*0b57cec5SDimitry Andric// 10*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 11*0b57cec5SDimitry Andric 12*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 13*0b57cec5SDimitry Andric// Target-independent interfaces which we are implementing 14*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 15*0b57cec5SDimitry Andric 16*0b57cec5SDimitry Andricinclude "llvm/Target/Target.td" 17*0b57cec5SDimitry Andric 18*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 19*0b57cec5SDimitry Andric// ARM Subtarget state. 20*0b57cec5SDimitry Andric// 21*0b57cec5SDimitry Andric 22*0b57cec5SDimitry Andricdef ModeThumb : SubtargetFeature<"thumb-mode", "InThumbMode", 23*0b57cec5SDimitry Andric "true", "Thumb mode">; 24*0b57cec5SDimitry Andric 25*0b57cec5SDimitry Andricdef ModeSoftFloat : SubtargetFeature<"soft-float","UseSoftFloat", 26*0b57cec5SDimitry Andric "true", "Use software floating " 27*0b57cec5SDimitry Andric "point features.">; 28*0b57cec5SDimitry Andric 29*0b57cec5SDimitry Andric 30*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 31*0b57cec5SDimitry Andric// ARM Subtarget features. 32*0b57cec5SDimitry Andric// 33*0b57cec5SDimitry Andric 34*0b57cec5SDimitry Andric// Floating Point, HW Division and Neon Support 35*0b57cec5SDimitry Andric 36*0b57cec5SDimitry Andric// FP loads/stores/moves, shared between VFP and MVE (even in the integer-only 37*0b57cec5SDimitry Andric// version). 38*0b57cec5SDimitry Andricdef FeatureFPRegs : SubtargetFeature<"fpregs", "HasFPRegs", "true", 39*0b57cec5SDimitry Andric "Enable FP registers">; 40*0b57cec5SDimitry Andric 41*0b57cec5SDimitry Andric// 16-bit FP loads/stores/moves, shared between VFP (with the v8.2A FP16 42*0b57cec5SDimitry Andric// extension) and MVE (even in the integer-only version). 43*0b57cec5SDimitry Andricdef FeatureFPRegs16 : SubtargetFeature<"fpregs16", "HasFPRegs16", "true", 44*0b57cec5SDimitry Andric "Enable 16-bit FP registers", 45*0b57cec5SDimitry Andric [FeatureFPRegs]>; 46*0b57cec5SDimitry Andric 47*0b57cec5SDimitry Andricdef FeatureFPRegs64 : SubtargetFeature<"fpregs64", "HasFPRegs64", "true", 48*0b57cec5SDimitry Andric "Enable 64-bit FP registers", 49*0b57cec5SDimitry Andric [FeatureFPRegs]>; 50*0b57cec5SDimitry Andric 51*0b57cec5SDimitry Andricdef FeatureFP64 : SubtargetFeature<"fp64", "HasFP64", "true", 52*0b57cec5SDimitry Andric "Floating point unit supports " 53*0b57cec5SDimitry Andric "double precision", 54*0b57cec5SDimitry Andric [FeatureFPRegs64]>; 55*0b57cec5SDimitry Andric 56*0b57cec5SDimitry Andricdef FeatureD32 : SubtargetFeature<"d32", "HasD32", "true", 57*0b57cec5SDimitry Andric "Extend FP to 32 double registers">; 58*0b57cec5SDimitry Andric 59*0b57cec5SDimitry Andricmulticlass VFPver<string name, string query, string description, 60*0b57cec5SDimitry Andric list<SubtargetFeature> prev, 61*0b57cec5SDimitry Andric list<SubtargetFeature> otherimplies, 62*0b57cec5SDimitry Andric list<SubtargetFeature> vfp2prev = []> { 63*0b57cec5SDimitry Andric def _D16_SP: SubtargetFeature< 64*0b57cec5SDimitry Andric name#"d16sp", query#"D16SP", "true", 65*0b57cec5SDimitry Andric description#" with only 16 d-registers and no double precision", 66*0b57cec5SDimitry Andric !foreach(v, prev, !cast<SubtargetFeature>(v # "_D16_SP")) # 67*0b57cec5SDimitry Andric !foreach(v, vfp2prev, !cast<SubtargetFeature>(v # "_SP")) # 68*0b57cec5SDimitry Andric otherimplies>; 69*0b57cec5SDimitry Andric def _SP: SubtargetFeature< 70*0b57cec5SDimitry Andric name#"sp", query#"SP", "true", 71*0b57cec5SDimitry Andric description#" with no double precision", 72*0b57cec5SDimitry Andric !foreach(v, prev, !cast<SubtargetFeature>(v # "_SP")) # 73*0b57cec5SDimitry Andric otherimplies # [FeatureD32, !cast<SubtargetFeature>(NAME # "_D16_SP")]>; 74*0b57cec5SDimitry Andric def _D16: SubtargetFeature< 75*0b57cec5SDimitry Andric name#"d16", query#"D16", "true", 76*0b57cec5SDimitry Andric description#" with only 16 d-registers", 77*0b57cec5SDimitry Andric !foreach(v, prev, !cast<SubtargetFeature>(v # "_D16")) # 78*0b57cec5SDimitry Andric vfp2prev # 79*0b57cec5SDimitry Andric otherimplies # [FeatureFP64, !cast<SubtargetFeature>(NAME # "_D16_SP")]>; 80*0b57cec5SDimitry Andric def "": SubtargetFeature< 81*0b57cec5SDimitry Andric name, query, "true", description, 82*0b57cec5SDimitry Andric prev # otherimplies # [ 83*0b57cec5SDimitry Andric !cast<SubtargetFeature>(NAME # "_D16"), 84*0b57cec5SDimitry Andric !cast<SubtargetFeature>(NAME # "_SP")]>; 85*0b57cec5SDimitry Andric} 86*0b57cec5SDimitry Andric 87*0b57cec5SDimitry Andricdef FeatureVFP2_SP : SubtargetFeature<"vfp2sp", "HasVFPv2SP", "true", 88*0b57cec5SDimitry Andric "Enable VFP2 instructions with " 89*0b57cec5SDimitry Andric "no double precision", 90*0b57cec5SDimitry Andric [FeatureFPRegs]>; 91*0b57cec5SDimitry Andric 92*0b57cec5SDimitry Andricdef FeatureVFP2 : SubtargetFeature<"vfp2", "HasVFPv2", "true", 93*0b57cec5SDimitry Andric "Enable VFP2 instructions", 94*0b57cec5SDimitry Andric [FeatureFP64, FeatureVFP2_SP]>; 95*0b57cec5SDimitry Andric 96*0b57cec5SDimitry Andricdefm FeatureVFP3: VFPver<"vfp3", "HasVFPv3", "Enable VFP3 instructions", 97*0b57cec5SDimitry Andric [], [], [FeatureVFP2]>; 98*0b57cec5SDimitry Andric 99*0b57cec5SDimitry Andricdef FeatureNEON : SubtargetFeature<"neon", "HasNEON", "true", 100*0b57cec5SDimitry Andric "Enable NEON instructions", 101*0b57cec5SDimitry Andric [FeatureVFP3]>; 102*0b57cec5SDimitry Andric 103*0b57cec5SDimitry Andricdef FeatureFP16 : SubtargetFeature<"fp16", "HasFP16", "true", 104*0b57cec5SDimitry Andric "Enable half-precision " 105*0b57cec5SDimitry Andric "floating point">; 106*0b57cec5SDimitry Andric 107*0b57cec5SDimitry Andricdefm FeatureVFP4: VFPver<"vfp4", "HasVFPv4", "Enable VFP4 instructions", 108*0b57cec5SDimitry Andric [FeatureVFP3], [FeatureFP16]>; 109*0b57cec5SDimitry Andric 110*0b57cec5SDimitry Andricdefm FeatureFPARMv8: VFPver<"fp-armv8", "HasFPARMv8", "Enable ARMv8 FP", 111*0b57cec5SDimitry Andric [FeatureVFP4], []>; 112*0b57cec5SDimitry Andric 113*0b57cec5SDimitry Andricdef FeatureFullFP16 : SubtargetFeature<"fullfp16", "HasFullFP16", "true", 114*0b57cec5SDimitry Andric "Enable full half-precision " 115*0b57cec5SDimitry Andric "floating point", 116*0b57cec5SDimitry Andric [FeatureFPARMv8_D16_SP, FeatureFPRegs16]>; 117*0b57cec5SDimitry Andric 118*0b57cec5SDimitry Andricdef FeatureFP16FML : SubtargetFeature<"fp16fml", "HasFP16FML", "true", 119*0b57cec5SDimitry Andric "Enable full half-precision " 120*0b57cec5SDimitry Andric "floating point fml instructions", 121*0b57cec5SDimitry Andric [FeatureFullFP16]>; 122*0b57cec5SDimitry Andric 123*0b57cec5SDimitry Andricdef FeatureHWDivThumb : SubtargetFeature<"hwdiv", 124*0b57cec5SDimitry Andric "HasHardwareDivideInThumb", "true", 125*0b57cec5SDimitry Andric "Enable divide instructions in Thumb">; 126*0b57cec5SDimitry Andric 127*0b57cec5SDimitry Andricdef FeatureHWDivARM : SubtargetFeature<"hwdiv-arm", 128*0b57cec5SDimitry Andric "HasHardwareDivideInARM", "true", 129*0b57cec5SDimitry Andric "Enable divide instructions in ARM mode">; 130*0b57cec5SDimitry Andric 131*0b57cec5SDimitry Andric// Atomic Support 132*0b57cec5SDimitry Andricdef FeatureDB : SubtargetFeature<"db", "HasDataBarrier", "true", 133*0b57cec5SDimitry Andric "Has data barrier (dmb/dsb) instructions">; 134*0b57cec5SDimitry Andric 135*0b57cec5SDimitry Andricdef FeatureV7Clrex : SubtargetFeature<"v7clrex", "HasV7Clrex", "true", 136*0b57cec5SDimitry Andric "Has v7 clrex instruction">; 137*0b57cec5SDimitry Andric 138*0b57cec5SDimitry Andricdef FeatureDFB : SubtargetFeature<"dfb", "HasFullDataBarrier", "true", 139*0b57cec5SDimitry Andric "Has full data barrier (dfb) instruction">; 140*0b57cec5SDimitry Andric 141*0b57cec5SDimitry Andricdef FeatureAcquireRelease : SubtargetFeature<"acquire-release", 142*0b57cec5SDimitry Andric "HasAcquireRelease", "true", 143*0b57cec5SDimitry Andric "Has v8 acquire/release (lda/ldaex " 144*0b57cec5SDimitry Andric " etc) instructions">; 145*0b57cec5SDimitry Andric 146*0b57cec5SDimitry Andric 147*0b57cec5SDimitry Andricdef FeatureSlowFPBrcc : SubtargetFeature<"slow-fp-brcc", "SlowFPBrcc", "true", 148*0b57cec5SDimitry Andric "FP compare + branch is slow">; 149*0b57cec5SDimitry Andric 150*0b57cec5SDimitry Andricdef FeaturePerfMon : SubtargetFeature<"perfmon", "HasPerfMon", "true", 151*0b57cec5SDimitry Andric "Enable support for Performance " 152*0b57cec5SDimitry Andric "Monitor extensions">; 153*0b57cec5SDimitry Andric 154*0b57cec5SDimitry Andric 155*0b57cec5SDimitry Andric// TrustZone Security Extensions 156*0b57cec5SDimitry Andricdef FeatureTrustZone : SubtargetFeature<"trustzone", "HasTrustZone", "true", 157*0b57cec5SDimitry Andric "Enable support for TrustZone " 158*0b57cec5SDimitry Andric "security extensions">; 159*0b57cec5SDimitry Andric 160*0b57cec5SDimitry Andricdef Feature8MSecExt : SubtargetFeature<"8msecext", "Has8MSecExt", "true", 161*0b57cec5SDimitry Andric "Enable support for ARMv8-M " 162*0b57cec5SDimitry Andric "Security Extensions">; 163*0b57cec5SDimitry Andric 164*0b57cec5SDimitry Andricdef FeatureSHA2 : SubtargetFeature<"sha2", "HasSHA2", "true", 165*0b57cec5SDimitry Andric "Enable SHA1 and SHA256 support", [FeatureNEON]>; 166*0b57cec5SDimitry Andric 167*0b57cec5SDimitry Andricdef FeatureAES : SubtargetFeature<"aes", "HasAES", "true", 168*0b57cec5SDimitry Andric "Enable AES support", [FeatureNEON]>; 169*0b57cec5SDimitry Andric 170*0b57cec5SDimitry Andricdef FeatureCrypto : SubtargetFeature<"crypto", "HasCrypto", "true", 171*0b57cec5SDimitry Andric "Enable support for " 172*0b57cec5SDimitry Andric "Cryptography extensions", 173*0b57cec5SDimitry Andric [FeatureNEON, FeatureSHA2, FeatureAES]>; 174*0b57cec5SDimitry Andric 175*0b57cec5SDimitry Andricdef FeatureCRC : SubtargetFeature<"crc", "HasCRC", "true", 176*0b57cec5SDimitry Andric "Enable support for CRC instructions">; 177*0b57cec5SDimitry Andric 178*0b57cec5SDimitry Andricdef FeatureDotProd : SubtargetFeature<"dotprod", "HasDotProd", "true", 179*0b57cec5SDimitry Andric "Enable support for dot product instructions", 180*0b57cec5SDimitry Andric [FeatureNEON]>; 181*0b57cec5SDimitry Andric 182*0b57cec5SDimitry Andric// Not to be confused with FeatureHasRetAddrStack (return address stack) 183*0b57cec5SDimitry Andricdef FeatureRAS : SubtargetFeature<"ras", "HasRAS", "true", 184*0b57cec5SDimitry Andric "Enable Reliability, Availability " 185*0b57cec5SDimitry Andric "and Serviceability extensions">; 186*0b57cec5SDimitry Andric 187*0b57cec5SDimitry Andric// Fast computation of non-negative address offsets 188*0b57cec5SDimitry Andricdef FeatureFPAO : SubtargetFeature<"fpao", "HasFPAO", "true", 189*0b57cec5SDimitry Andric "Enable fast computation of " 190*0b57cec5SDimitry Andric "positive address offsets">; 191*0b57cec5SDimitry Andric 192*0b57cec5SDimitry Andric// Fast execution of AES crypto operations 193*0b57cec5SDimitry Andricdef FeatureFuseAES : SubtargetFeature<"fuse-aes", "HasFuseAES", "true", 194*0b57cec5SDimitry Andric "CPU fuses AES crypto operations">; 195*0b57cec5SDimitry Andric 196*0b57cec5SDimitry Andric// Fast execution of bottom and top halves of literal generation 197*0b57cec5SDimitry Andricdef FeatureFuseLiterals : SubtargetFeature<"fuse-literals", "HasFuseLiterals", "true", 198*0b57cec5SDimitry Andric "CPU fuses literal generation operations">; 199*0b57cec5SDimitry Andric 200*0b57cec5SDimitry Andric// The way of reading thread pointer 201*0b57cec5SDimitry Andricdef FeatureReadTp : SubtargetFeature<"read-tp-hard", "ReadTPHard", "true", 202*0b57cec5SDimitry Andric "Reading thread pointer from register">; 203*0b57cec5SDimitry Andric 204*0b57cec5SDimitry Andric// Cyclone can zero VFP registers in 0 cycles. 205*0b57cec5SDimitry Andricdef FeatureZCZeroing : SubtargetFeature<"zcz", "HasZeroCycleZeroing", "true", 206*0b57cec5SDimitry Andric "Has zero-cycle zeroing instructions">; 207*0b57cec5SDimitry Andric 208*0b57cec5SDimitry Andric// Whether it is profitable to unpredicate certain instructions during if-conversion 209*0b57cec5SDimitry Andricdef FeatureProfUnpredicate : SubtargetFeature<"prof-unpr", 210*0b57cec5SDimitry Andric "IsProfitableToUnpredicate", "true", 211*0b57cec5SDimitry Andric "Is profitable to unpredicate">; 212*0b57cec5SDimitry Andric 213*0b57cec5SDimitry Andric// Some targets (e.g. Swift) have microcoded VGETLNi32. 214*0b57cec5SDimitry Andricdef FeatureSlowVGETLNi32 : SubtargetFeature<"slow-vgetlni32", 215*0b57cec5SDimitry Andric "HasSlowVGETLNi32", "true", 216*0b57cec5SDimitry Andric "Has slow VGETLNi32 - prefer VMOV">; 217*0b57cec5SDimitry Andric 218*0b57cec5SDimitry Andric// Some targets (e.g. Swift) have microcoded VDUP32. 219*0b57cec5SDimitry Andricdef FeatureSlowVDUP32 : SubtargetFeature<"slow-vdup32", "HasSlowVDUP32", 220*0b57cec5SDimitry Andric "true", 221*0b57cec5SDimitry Andric "Has slow VDUP32 - prefer VMOV">; 222*0b57cec5SDimitry Andric 223*0b57cec5SDimitry Andric// Some targets (e.g. Cortex-A9) prefer VMOVSR to VMOVDRR even when using NEON 224*0b57cec5SDimitry Andric// for scalar FP, as this allows more effective execution domain optimization. 225*0b57cec5SDimitry Andricdef FeaturePreferVMOVSR : SubtargetFeature<"prefer-vmovsr", "PreferVMOVSR", 226*0b57cec5SDimitry Andric "true", "Prefer VMOVSR">; 227*0b57cec5SDimitry Andric 228*0b57cec5SDimitry Andric// Swift has ISHST barriers compatible with Atomic Release semantics but weaker 229*0b57cec5SDimitry Andric// than ISH 230*0b57cec5SDimitry Andricdef FeaturePrefISHSTBarrier : SubtargetFeature<"prefer-ishst", "PreferISHST", 231*0b57cec5SDimitry Andric "true", "Prefer ISHST barriers">; 232*0b57cec5SDimitry Andric 233*0b57cec5SDimitry Andric// Some targets (e.g. Cortex-A9) have muxed AGU and NEON/FPU. 234*0b57cec5SDimitry Andricdef FeatureMuxedUnits : SubtargetFeature<"muxed-units", "HasMuxedUnits", 235*0b57cec5SDimitry Andric "true", 236*0b57cec5SDimitry Andric "Has muxed AGU and NEON/FPU">; 237*0b57cec5SDimitry Andric 238*0b57cec5SDimitry Andric// Whether VLDM/VSTM starting with odd register number need more microops 239*0b57cec5SDimitry Andric// than single VLDRS 240*0b57cec5SDimitry Andricdef FeatureSlowOddRegister : SubtargetFeature<"slow-odd-reg", "SlowOddRegister", 241*0b57cec5SDimitry Andric "true", "VLDM/VSTM starting " 242*0b57cec5SDimitry Andric "with an odd register is slow">; 243*0b57cec5SDimitry Andric 244*0b57cec5SDimitry Andric// Some targets have a renaming dependency when loading into D subregisters. 245*0b57cec5SDimitry Andricdef FeatureSlowLoadDSubreg : SubtargetFeature<"slow-load-D-subreg", 246*0b57cec5SDimitry Andric "SlowLoadDSubregister", "true", 247*0b57cec5SDimitry Andric "Loading into D subregs is slow">; 248*0b57cec5SDimitry Andric 249*0b57cec5SDimitry Andricdef FeatureUseWideStrideVFP : SubtargetFeature<"wide-stride-vfp", 250*0b57cec5SDimitry Andric "UseWideStrideVFP", "true", 251*0b57cec5SDimitry Andric "Use a wide stride when allocating VFP registers">; 252*0b57cec5SDimitry Andric 253*0b57cec5SDimitry Andric// Some targets (e.g. Cortex-A15) never want VMOVS to be widened to VMOVD. 254*0b57cec5SDimitry Andricdef FeatureDontWidenVMOVS : SubtargetFeature<"dont-widen-vmovs", 255*0b57cec5SDimitry Andric "DontWidenVMOVS", "true", 256*0b57cec5SDimitry Andric "Don't widen VMOVS to VMOVD">; 257*0b57cec5SDimitry Andric 258*0b57cec5SDimitry Andric// Some targets (e.g. Cortex-A15) prefer to avoid mixing operations on different 259*0b57cec5SDimitry Andric// VFP register widths. 260*0b57cec5SDimitry Andricdef FeatureSplatVFPToNeon : SubtargetFeature<"splat-vfp-neon", 261*0b57cec5SDimitry Andric "SplatVFPToNeon", "true", 262*0b57cec5SDimitry Andric "Splat register from VFP to NEON", 263*0b57cec5SDimitry Andric [FeatureDontWidenVMOVS]>; 264*0b57cec5SDimitry Andric 265*0b57cec5SDimitry Andric// Whether or not it is profitable to expand VFP/NEON MLA/MLS instructions. 266*0b57cec5SDimitry Andricdef FeatureExpandMLx : SubtargetFeature<"expand-fp-mlx", 267*0b57cec5SDimitry Andric "ExpandMLx", "true", 268*0b57cec5SDimitry Andric "Expand VFP/NEON MLA/MLS instructions">; 269*0b57cec5SDimitry Andric 270*0b57cec5SDimitry Andric// Some targets have special RAW hazards for VFP/NEON VMLA/VMLS. 271*0b57cec5SDimitry Andricdef FeatureHasVMLxHazards : SubtargetFeature<"vmlx-hazards", "HasVMLxHazards", 272*0b57cec5SDimitry Andric "true", "Has VMLx hazards">; 273*0b57cec5SDimitry Andric 274*0b57cec5SDimitry Andric// Some targets (e.g. Cortex-A9) want to convert VMOVRS, VMOVSR and VMOVS from 275*0b57cec5SDimitry Andric// VFP to NEON, as an execution domain optimization. 276*0b57cec5SDimitry Andricdef FeatureNEONForFPMovs : SubtargetFeature<"neon-fpmovs", 277*0b57cec5SDimitry Andric "UseNEONForFPMovs", "true", 278*0b57cec5SDimitry Andric "Convert VMOVSR, VMOVRS, " 279*0b57cec5SDimitry Andric "VMOVS to NEON">; 280*0b57cec5SDimitry Andric 281*0b57cec5SDimitry Andric// Some processors benefit from using NEON instructions for scalar 282*0b57cec5SDimitry Andric// single-precision FP operations. This affects instruction selection and should 283*0b57cec5SDimitry Andric// only be enabled if the handling of denormals is not important. 284*0b57cec5SDimitry Andricdef FeatureNEONForFP : SubtargetFeature<"neonfp", 285*0b57cec5SDimitry Andric "UseNEONForSinglePrecisionFP", 286*0b57cec5SDimitry Andric "true", 287*0b57cec5SDimitry Andric "Use NEON for single precision FP">; 288*0b57cec5SDimitry Andric 289*0b57cec5SDimitry Andric// On some processors, VLDn instructions that access unaligned data take one 290*0b57cec5SDimitry Andric// extra cycle. Take that into account when computing operand latencies. 291*0b57cec5SDimitry Andricdef FeatureCheckVLDnAlign : SubtargetFeature<"vldn-align", "CheckVLDnAlign", 292*0b57cec5SDimitry Andric "true", 293*0b57cec5SDimitry Andric "Check for VLDn unaligned access">; 294*0b57cec5SDimitry Andric 295*0b57cec5SDimitry Andric// Some processors have a nonpipelined VFP coprocessor. 296*0b57cec5SDimitry Andricdef FeatureNonpipelinedVFP : SubtargetFeature<"nonpipelined-vfp", 297*0b57cec5SDimitry Andric "NonpipelinedVFP", "true", 298*0b57cec5SDimitry Andric "VFP instructions are not pipelined">; 299*0b57cec5SDimitry Andric 300*0b57cec5SDimitry Andric// Some processors have FP multiply-accumulate instructions that don't 301*0b57cec5SDimitry Andric// play nicely with other VFP / NEON instructions, and it's generally better 302*0b57cec5SDimitry Andric// to just not use them. 303*0b57cec5SDimitry Andricdef FeatureHasSlowFPVMLx : SubtargetFeature<"slowfpvmlx", "SlowFPVMLx", "true", 304*0b57cec5SDimitry Andric "Disable VFP / NEON MAC instructions">; 305*0b57cec5SDimitry Andric 306*0b57cec5SDimitry Andric// Cortex-A8 / A9 Advanced SIMD has multiplier accumulator forwarding. 307*0b57cec5SDimitry Andricdef FeatureVMLxForwarding : SubtargetFeature<"vmlx-forwarding", 308*0b57cec5SDimitry Andric "HasVMLxForwarding", "true", 309*0b57cec5SDimitry Andric "Has multiplier accumulator forwarding">; 310*0b57cec5SDimitry Andric 311*0b57cec5SDimitry Andric// Disable 32-bit to 16-bit narrowing for experimentation. 312*0b57cec5SDimitry Andricdef FeaturePref32BitThumb : SubtargetFeature<"32bit", "Pref32BitThumb", "true", 313*0b57cec5SDimitry Andric "Prefer 32-bit Thumb instrs">; 314*0b57cec5SDimitry Andric 315*0b57cec5SDimitry Andricdef FeaturePrefLoopAlign32 : SubtargetFeature<"loop-align", "PrefLoopAlignment","2", 316*0b57cec5SDimitry Andric "Prefer 32-bit alignment for loops">; 317*0b57cec5SDimitry Andric 318*0b57cec5SDimitry Andric/// Some instructions update CPSR partially, which can add false dependency for 319*0b57cec5SDimitry Andric/// out-of-order implementation, e.g. Cortex-A9, unless each individual bit is 320*0b57cec5SDimitry Andric/// mapped to a separate physical register. Avoid partial CPSR update for these 321*0b57cec5SDimitry Andric/// processors. 322*0b57cec5SDimitry Andricdef FeatureAvoidPartialCPSR : SubtargetFeature<"avoid-partial-cpsr", 323*0b57cec5SDimitry Andric "AvoidCPSRPartialUpdate", "true", 324*0b57cec5SDimitry Andric "Avoid CPSR partial update for OOO execution">; 325*0b57cec5SDimitry Andric 326*0b57cec5SDimitry Andric/// Disable +1 predication cost for instructions updating CPSR. 327*0b57cec5SDimitry Andric/// Enabled for Cortex-A57. 328*0b57cec5SDimitry Andricdef FeatureCheapPredicableCPSR : SubtargetFeature<"cheap-predicable-cpsr", 329*0b57cec5SDimitry Andric "CheapPredicableCPSRDef", 330*0b57cec5SDimitry Andric "true", 331*0b57cec5SDimitry Andric "Disable +1 predication cost for instructions updating CPSR">; 332*0b57cec5SDimitry Andric 333*0b57cec5SDimitry Andricdef FeatureAvoidMOVsShOp : SubtargetFeature<"avoid-movs-shop", 334*0b57cec5SDimitry Andric "AvoidMOVsShifterOperand", "true", 335*0b57cec5SDimitry Andric "Avoid movs instructions with " 336*0b57cec5SDimitry Andric "shifter operand">; 337*0b57cec5SDimitry Andric 338*0b57cec5SDimitry Andric// Some processors perform return stack prediction. CodeGen should avoid issue 339*0b57cec5SDimitry Andric// "normal" call instructions to callees which do not return. 340*0b57cec5SDimitry Andricdef FeatureHasRetAddrStack : SubtargetFeature<"ret-addr-stack", 341*0b57cec5SDimitry Andric "HasRetAddrStack", "true", 342*0b57cec5SDimitry Andric "Has return address stack">; 343*0b57cec5SDimitry Andric 344*0b57cec5SDimitry Andric// Some processors have no branch predictor, which changes the expected cost of 345*0b57cec5SDimitry Andric// taking a branch which affects the choice of whether to use predicated 346*0b57cec5SDimitry Andric// instructions. 347*0b57cec5SDimitry Andricdef FeatureHasNoBranchPredictor : SubtargetFeature<"no-branch-predictor", 348*0b57cec5SDimitry Andric "HasBranchPredictor", "false", 349*0b57cec5SDimitry Andric "Has no branch predictor">; 350*0b57cec5SDimitry Andric 351*0b57cec5SDimitry Andric/// DSP extension. 352*0b57cec5SDimitry Andricdef FeatureDSP : SubtargetFeature<"dsp", "HasDSP", "true", 353*0b57cec5SDimitry Andric "Supports DSP instructions in " 354*0b57cec5SDimitry Andric "ARM and/or Thumb2">; 355*0b57cec5SDimitry Andric 356*0b57cec5SDimitry Andric// Multiprocessing extension. 357*0b57cec5SDimitry Andricdef FeatureMP : SubtargetFeature<"mp", "HasMPExtension", "true", 358*0b57cec5SDimitry Andric "Supports Multiprocessing extension">; 359*0b57cec5SDimitry Andric 360*0b57cec5SDimitry Andric// Virtualization extension - requires HW divide (ARMv7-AR ARMARM - 4.4.8). 361*0b57cec5SDimitry Andricdef FeatureVirtualization : SubtargetFeature<"virtualization", 362*0b57cec5SDimitry Andric "HasVirtualization", "true", 363*0b57cec5SDimitry Andric "Supports Virtualization extension", 364*0b57cec5SDimitry Andric [FeatureHWDivThumb, FeatureHWDivARM]>; 365*0b57cec5SDimitry Andric 366*0b57cec5SDimitry Andric// Special TRAP encoding for NaCl, which looks like a TRAP in Thumb too. 367*0b57cec5SDimitry Andric// See ARMInstrInfo.td for details. 368*0b57cec5SDimitry Andricdef FeatureNaClTrap : SubtargetFeature<"nacl-trap", "UseNaClTrap", "true", 369*0b57cec5SDimitry Andric "NaCl trap">; 370*0b57cec5SDimitry Andric 371*0b57cec5SDimitry Andricdef FeatureStrictAlign : SubtargetFeature<"strict-align", 372*0b57cec5SDimitry Andric "StrictAlign", "true", 373*0b57cec5SDimitry Andric "Disallow all unaligned memory " 374*0b57cec5SDimitry Andric "access">; 375*0b57cec5SDimitry Andric 376*0b57cec5SDimitry Andricdef FeatureLongCalls : SubtargetFeature<"long-calls", "GenLongCalls", "true", 377*0b57cec5SDimitry Andric "Generate calls via indirect call " 378*0b57cec5SDimitry Andric "instructions">; 379*0b57cec5SDimitry Andric 380*0b57cec5SDimitry Andricdef FeatureExecuteOnly : SubtargetFeature<"execute-only", 381*0b57cec5SDimitry Andric "GenExecuteOnly", "true", 382*0b57cec5SDimitry Andric "Enable the generation of " 383*0b57cec5SDimitry Andric "execute only code.">; 384*0b57cec5SDimitry Andric 385*0b57cec5SDimitry Andricdef FeatureReserveR9 : SubtargetFeature<"reserve-r9", "ReserveR9", "true", 386*0b57cec5SDimitry Andric "Reserve R9, making it unavailable" 387*0b57cec5SDimitry Andric " as GPR">; 388*0b57cec5SDimitry Andric 389*0b57cec5SDimitry Andricdef FeatureNoMovt : SubtargetFeature<"no-movt", "NoMovt", "true", 390*0b57cec5SDimitry Andric "Don't use movt/movw pairs for " 391*0b57cec5SDimitry Andric "32-bit imms">; 392*0b57cec5SDimitry Andric 393*0b57cec5SDimitry Andricdef FeatureNoNegativeImmediates 394*0b57cec5SDimitry Andric : SubtargetFeature<"no-neg-immediates", 395*0b57cec5SDimitry Andric "NegativeImmediates", "false", 396*0b57cec5SDimitry Andric "Convert immediates and instructions " 397*0b57cec5SDimitry Andric "to their negated or complemented " 398*0b57cec5SDimitry Andric "equivalent when the immediate does " 399*0b57cec5SDimitry Andric "not fit in the encoding.">; 400*0b57cec5SDimitry Andric 401*0b57cec5SDimitry Andric// Use the MachineScheduler for instruction scheduling for the subtarget. 402*0b57cec5SDimitry Andricdef FeatureUseMISched: SubtargetFeature<"use-misched", "UseMISched", "true", 403*0b57cec5SDimitry Andric "Use the MachineScheduler">; 404*0b57cec5SDimitry Andric 405*0b57cec5SDimitry Andricdef FeatureNoPostRASched : SubtargetFeature<"disable-postra-scheduler", 406*0b57cec5SDimitry Andric "DisablePostRAScheduler", "true", 407*0b57cec5SDimitry Andric "Don't schedule again after register allocation">; 408*0b57cec5SDimitry Andric 409*0b57cec5SDimitry Andric// Enable use of alias analysis during code generation 410*0b57cec5SDimitry Andricdef FeatureUseAA : SubtargetFeature<"use-aa", "UseAA", "true", 411*0b57cec5SDimitry Andric "Use alias analysis during codegen">; 412*0b57cec5SDimitry Andric 413*0b57cec5SDimitry Andric// Armv8.5-A extensions 414*0b57cec5SDimitry Andric 415*0b57cec5SDimitry Andricdef FeatureSB : SubtargetFeature<"sb", "HasSB", "true", 416*0b57cec5SDimitry Andric "Enable v8.5a Speculation Barrier" >; 417*0b57cec5SDimitry Andric 418*0b57cec5SDimitry Andric// Armv8.1-M extensions 419*0b57cec5SDimitry Andric 420*0b57cec5SDimitry Andricdef FeatureLOB : SubtargetFeature<"lob", "HasLOB", "true", 421*0b57cec5SDimitry Andric "Enable Low Overhead Branch " 422*0b57cec5SDimitry Andric "extensions">; 423*0b57cec5SDimitry Andric 424*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 425*0b57cec5SDimitry Andric// ARM architecture class 426*0b57cec5SDimitry Andric// 427*0b57cec5SDimitry Andric 428*0b57cec5SDimitry Andric// A-series ISA 429*0b57cec5SDimitry Andricdef FeatureAClass : SubtargetFeature<"aclass", "ARMProcClass", "AClass", 430*0b57cec5SDimitry Andric "Is application profile ('A' series)">; 431*0b57cec5SDimitry Andric 432*0b57cec5SDimitry Andric// R-series ISA 433*0b57cec5SDimitry Andricdef FeatureRClass : SubtargetFeature<"rclass", "ARMProcClass", "RClass", 434*0b57cec5SDimitry Andric "Is realtime profile ('R' series)">; 435*0b57cec5SDimitry Andric 436*0b57cec5SDimitry Andric// M-series ISA 437*0b57cec5SDimitry Andricdef FeatureMClass : SubtargetFeature<"mclass", "ARMProcClass", "MClass", 438*0b57cec5SDimitry Andric "Is microcontroller profile ('M' series)">; 439*0b57cec5SDimitry Andric 440*0b57cec5SDimitry Andric 441*0b57cec5SDimitry Andricdef FeatureThumb2 : SubtargetFeature<"thumb2", "HasThumb2", "true", 442*0b57cec5SDimitry Andric "Enable Thumb2 instructions">; 443*0b57cec5SDimitry Andric 444*0b57cec5SDimitry Andricdef FeatureNoARM : SubtargetFeature<"noarm", "NoARM", "true", 445*0b57cec5SDimitry Andric "Does not support ARM mode execution">; 446*0b57cec5SDimitry Andric 447*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 448*0b57cec5SDimitry Andric// ARM ISAa. 449*0b57cec5SDimitry Andric// 450*0b57cec5SDimitry Andric 451*0b57cec5SDimitry Andricdef HasV4TOps : SubtargetFeature<"v4t", "HasV4TOps", "true", 452*0b57cec5SDimitry Andric "Support ARM v4T instructions">; 453*0b57cec5SDimitry Andric 454*0b57cec5SDimitry Andricdef HasV5TOps : SubtargetFeature<"v5t", "HasV5TOps", "true", 455*0b57cec5SDimitry Andric "Support ARM v5T instructions", 456*0b57cec5SDimitry Andric [HasV4TOps]>; 457*0b57cec5SDimitry Andric 458*0b57cec5SDimitry Andricdef HasV5TEOps : SubtargetFeature<"v5te", "HasV5TEOps", "true", 459*0b57cec5SDimitry Andric "Support ARM v5TE, v5TEj, and " 460*0b57cec5SDimitry Andric "v5TExp instructions", 461*0b57cec5SDimitry Andric [HasV5TOps]>; 462*0b57cec5SDimitry Andric 463*0b57cec5SDimitry Andricdef HasV6Ops : SubtargetFeature<"v6", "HasV6Ops", "true", 464*0b57cec5SDimitry Andric "Support ARM v6 instructions", 465*0b57cec5SDimitry Andric [HasV5TEOps]>; 466*0b57cec5SDimitry Andric 467*0b57cec5SDimitry Andricdef HasV6MOps : SubtargetFeature<"v6m", "HasV6MOps", "true", 468*0b57cec5SDimitry Andric "Support ARM v6M instructions", 469*0b57cec5SDimitry Andric [HasV6Ops]>; 470*0b57cec5SDimitry Andric 471*0b57cec5SDimitry Andricdef HasV8MBaselineOps : SubtargetFeature<"v8m", "HasV8MBaselineOps", "true", 472*0b57cec5SDimitry Andric "Support ARM v8M Baseline instructions", 473*0b57cec5SDimitry Andric [HasV6MOps]>; 474*0b57cec5SDimitry Andric 475*0b57cec5SDimitry Andricdef HasV6KOps : SubtargetFeature<"v6k", "HasV6KOps", "true", 476*0b57cec5SDimitry Andric "Support ARM v6k instructions", 477*0b57cec5SDimitry Andric [HasV6Ops]>; 478*0b57cec5SDimitry Andric 479*0b57cec5SDimitry Andricdef HasV6T2Ops : SubtargetFeature<"v6t2", "HasV6T2Ops", "true", 480*0b57cec5SDimitry Andric "Support ARM v6t2 instructions", 481*0b57cec5SDimitry Andric [HasV8MBaselineOps, HasV6KOps, FeatureThumb2]>; 482*0b57cec5SDimitry Andric 483*0b57cec5SDimitry Andricdef HasV7Ops : SubtargetFeature<"v7", "HasV7Ops", "true", 484*0b57cec5SDimitry Andric "Support ARM v7 instructions", 485*0b57cec5SDimitry Andric [HasV6T2Ops, FeaturePerfMon, 486*0b57cec5SDimitry Andric FeatureV7Clrex]>; 487*0b57cec5SDimitry Andric 488*0b57cec5SDimitry Andricdef HasV8MMainlineOps : 489*0b57cec5SDimitry Andric SubtargetFeature<"v8m.main", "HasV8MMainlineOps", "true", 490*0b57cec5SDimitry Andric "Support ARM v8M Mainline instructions", 491*0b57cec5SDimitry Andric [HasV7Ops]>; 492*0b57cec5SDimitry Andric 493*0b57cec5SDimitry Andricdef HasV8Ops : SubtargetFeature<"v8", "HasV8Ops", "true", 494*0b57cec5SDimitry Andric "Support ARM v8 instructions", 495*0b57cec5SDimitry Andric [HasV7Ops, FeatureAcquireRelease]>; 496*0b57cec5SDimitry Andric 497*0b57cec5SDimitry Andricdef HasV8_1aOps : SubtargetFeature<"v8.1a", "HasV8_1aOps", "true", 498*0b57cec5SDimitry Andric "Support ARM v8.1a instructions", 499*0b57cec5SDimitry Andric [HasV8Ops]>; 500*0b57cec5SDimitry Andric 501*0b57cec5SDimitry Andricdef HasV8_2aOps : SubtargetFeature<"v8.2a", "HasV8_2aOps", "true", 502*0b57cec5SDimitry Andric "Support ARM v8.2a instructions", 503*0b57cec5SDimitry Andric [HasV8_1aOps]>; 504*0b57cec5SDimitry Andric 505*0b57cec5SDimitry Andricdef HasV8_3aOps : SubtargetFeature<"v8.3a", "HasV8_3aOps", "true", 506*0b57cec5SDimitry Andric "Support ARM v8.3a instructions", 507*0b57cec5SDimitry Andric [HasV8_2aOps]>; 508*0b57cec5SDimitry Andric 509*0b57cec5SDimitry Andricdef HasV8_4aOps : SubtargetFeature<"v8.4a", "HasV8_4aOps", "true", 510*0b57cec5SDimitry Andric "Support ARM v8.4a instructions", 511*0b57cec5SDimitry Andric [HasV8_3aOps, FeatureDotProd]>; 512*0b57cec5SDimitry Andric 513*0b57cec5SDimitry Andricdef HasV8_5aOps : SubtargetFeature<"v8.5a", "HasV8_5aOps", "true", 514*0b57cec5SDimitry Andric "Support ARM v8.5a instructions", 515*0b57cec5SDimitry Andric [HasV8_4aOps, FeatureSB]>; 516*0b57cec5SDimitry Andric 517*0b57cec5SDimitry Andricdef HasV8_1MMainlineOps : SubtargetFeature< 518*0b57cec5SDimitry Andric "v8.1m.main", "HasV8_1MMainlineOps", "true", 519*0b57cec5SDimitry Andric "Support ARM v8-1M Mainline instructions", 520*0b57cec5SDimitry Andric [HasV8MMainlineOps]>; 521*0b57cec5SDimitry Andricdef HasMVEIntegerOps : SubtargetFeature< 522*0b57cec5SDimitry Andric "mve", "HasMVEIntegerOps", "true", 523*0b57cec5SDimitry Andric "Support M-Class Vector Extension with integer ops", 524*0b57cec5SDimitry Andric [HasV8_1MMainlineOps, FeatureDSP, FeatureFPRegs16, FeatureFPRegs64]>; 525*0b57cec5SDimitry Andricdef HasMVEFloatOps : SubtargetFeature< 526*0b57cec5SDimitry Andric "mve.fp", "HasMVEFloatOps", "true", 527*0b57cec5SDimitry Andric "Support M-Class Vector Extension with integer and floating ops", 528*0b57cec5SDimitry Andric [HasMVEIntegerOps, FeatureFPARMv8_D16_SP, FeatureFullFP16]>; 529*0b57cec5SDimitry Andric 530*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 531*0b57cec5SDimitry Andric// ARM Processor subtarget features. 532*0b57cec5SDimitry Andric// 533*0b57cec5SDimitry Andric 534*0b57cec5SDimitry Andricdef ProcA5 : SubtargetFeature<"a5", "ARMProcFamily", "CortexA5", 535*0b57cec5SDimitry Andric "Cortex-A5 ARM processors", []>; 536*0b57cec5SDimitry Andricdef ProcA7 : SubtargetFeature<"a7", "ARMProcFamily", "CortexA7", 537*0b57cec5SDimitry Andric "Cortex-A7 ARM processors", []>; 538*0b57cec5SDimitry Andricdef ProcA8 : SubtargetFeature<"a8", "ARMProcFamily", "CortexA8", 539*0b57cec5SDimitry Andric "Cortex-A8 ARM processors", []>; 540*0b57cec5SDimitry Andricdef ProcA9 : SubtargetFeature<"a9", "ARMProcFamily", "CortexA9", 541*0b57cec5SDimitry Andric "Cortex-A9 ARM processors", []>; 542*0b57cec5SDimitry Andricdef ProcA12 : SubtargetFeature<"a12", "ARMProcFamily", "CortexA12", 543*0b57cec5SDimitry Andric "Cortex-A12 ARM processors", []>; 544*0b57cec5SDimitry Andricdef ProcA15 : SubtargetFeature<"a15", "ARMProcFamily", "CortexA15", 545*0b57cec5SDimitry Andric "Cortex-A15 ARM processors", []>; 546*0b57cec5SDimitry Andricdef ProcA17 : SubtargetFeature<"a17", "ARMProcFamily", "CortexA17", 547*0b57cec5SDimitry Andric "Cortex-A17 ARM processors", []>; 548*0b57cec5SDimitry Andricdef ProcA32 : SubtargetFeature<"a32", "ARMProcFamily", "CortexA32", 549*0b57cec5SDimitry Andric "Cortex-A32 ARM processors", []>; 550*0b57cec5SDimitry Andricdef ProcA35 : SubtargetFeature<"a35", "ARMProcFamily", "CortexA35", 551*0b57cec5SDimitry Andric "Cortex-A35 ARM processors", []>; 552*0b57cec5SDimitry Andricdef ProcA53 : SubtargetFeature<"a53", "ARMProcFamily", "CortexA53", 553*0b57cec5SDimitry Andric "Cortex-A53 ARM processors", []>; 554*0b57cec5SDimitry Andricdef ProcA55 : SubtargetFeature<"a55", "ARMProcFamily", "CortexA55", 555*0b57cec5SDimitry Andric "Cortex-A55 ARM processors", []>; 556*0b57cec5SDimitry Andricdef ProcA57 : SubtargetFeature<"a57", "ARMProcFamily", "CortexA57", 557*0b57cec5SDimitry Andric "Cortex-A57 ARM processors", []>; 558*0b57cec5SDimitry Andricdef ProcA72 : SubtargetFeature<"a72", "ARMProcFamily", "CortexA72", 559*0b57cec5SDimitry Andric "Cortex-A72 ARM processors", []>; 560*0b57cec5SDimitry Andricdef ProcA73 : SubtargetFeature<"a73", "ARMProcFamily", "CortexA73", 561*0b57cec5SDimitry Andric "Cortex-A73 ARM processors", []>; 562*0b57cec5SDimitry Andricdef ProcA75 : SubtargetFeature<"a75", "ARMProcFamily", "CortexA75", 563*0b57cec5SDimitry Andric "Cortex-A75 ARM processors", []>; 564*0b57cec5SDimitry Andricdef ProcA76 : SubtargetFeature<"a76", "ARMProcFamily", "CortexA76", 565*0b57cec5SDimitry Andric "Cortex-A76 ARM processors", []>; 566*0b57cec5SDimitry Andric 567*0b57cec5SDimitry Andricdef ProcKrait : SubtargetFeature<"krait", "ARMProcFamily", "Krait", 568*0b57cec5SDimitry Andric "Qualcomm Krait processors", []>; 569*0b57cec5SDimitry Andricdef ProcKryo : SubtargetFeature<"kryo", "ARMProcFamily", "Kryo", 570*0b57cec5SDimitry Andric "Qualcomm Kryo processors", []>; 571*0b57cec5SDimitry Andricdef ProcSwift : SubtargetFeature<"swift", "ARMProcFamily", "Swift", 572*0b57cec5SDimitry Andric "Swift ARM processors", []>; 573*0b57cec5SDimitry Andric 574*0b57cec5SDimitry Andricdef ProcExynos : SubtargetFeature<"exynos", "ARMProcFamily", "Exynos", 575*0b57cec5SDimitry Andric "Samsung Exynos processors", 576*0b57cec5SDimitry Andric [FeatureZCZeroing, 577*0b57cec5SDimitry Andric FeatureUseWideStrideVFP, 578*0b57cec5SDimitry Andric FeatureUseAA, 579*0b57cec5SDimitry Andric FeatureSplatVFPToNeon, 580*0b57cec5SDimitry Andric FeatureSlowVGETLNi32, 581*0b57cec5SDimitry Andric FeatureSlowVDUP32, 582*0b57cec5SDimitry Andric FeatureSlowFPBrcc, 583*0b57cec5SDimitry Andric FeatureProfUnpredicate, 584*0b57cec5SDimitry Andric FeatureHWDivThumb, 585*0b57cec5SDimitry Andric FeatureHWDivARM, 586*0b57cec5SDimitry Andric FeatureHasSlowFPVMLx, 587*0b57cec5SDimitry Andric FeatureHasRetAddrStack, 588*0b57cec5SDimitry Andric FeatureFuseLiterals, 589*0b57cec5SDimitry Andric FeatureFuseAES, 590*0b57cec5SDimitry Andric FeatureExpandMLx, 591*0b57cec5SDimitry Andric FeatureCrypto, 592*0b57cec5SDimitry Andric FeatureCRC]>; 593*0b57cec5SDimitry Andric 594*0b57cec5SDimitry Andricdef ProcR4 : SubtargetFeature<"r4", "ARMProcFamily", "CortexR4", 595*0b57cec5SDimitry Andric "Cortex-R4 ARM processors", []>; 596*0b57cec5SDimitry Andricdef ProcR5 : SubtargetFeature<"r5", "ARMProcFamily", "CortexR5", 597*0b57cec5SDimitry Andric "Cortex-R5 ARM processors", []>; 598*0b57cec5SDimitry Andricdef ProcR7 : SubtargetFeature<"r7", "ARMProcFamily", "CortexR7", 599*0b57cec5SDimitry Andric "Cortex-R7 ARM processors", []>; 600*0b57cec5SDimitry Andricdef ProcR52 : SubtargetFeature<"r52", "ARMProcFamily", "CortexR52", 601*0b57cec5SDimitry Andric "Cortex-R52 ARM processors", []>; 602*0b57cec5SDimitry Andric 603*0b57cec5SDimitry Andricdef ProcM3 : SubtargetFeature<"m3", "ARMProcFamily", "CortexM3", 604*0b57cec5SDimitry Andric "Cortex-M3 ARM processors", []>; 605*0b57cec5SDimitry Andric 606*0b57cec5SDimitry Andric 607*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 608*0b57cec5SDimitry Andric// ARM Helper classes. 609*0b57cec5SDimitry Andric// 610*0b57cec5SDimitry Andric 611*0b57cec5SDimitry Andricclass Architecture<string fname, string aname, list<SubtargetFeature> features> 612*0b57cec5SDimitry Andric : SubtargetFeature<fname, "ARMArch", aname, 613*0b57cec5SDimitry Andric !strconcat(aname, " architecture"), features>; 614*0b57cec5SDimitry Andric 615*0b57cec5SDimitry Andricclass ProcNoItin<string Name, list<SubtargetFeature> Features> 616*0b57cec5SDimitry Andric : Processor<Name, NoItineraries, Features>; 617*0b57cec5SDimitry Andric 618*0b57cec5SDimitry Andric 619*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 620*0b57cec5SDimitry Andric// ARM architectures 621*0b57cec5SDimitry Andric// 622*0b57cec5SDimitry Andric 623*0b57cec5SDimitry Andricdef ARMv2 : Architecture<"armv2", "ARMv2", []>; 624*0b57cec5SDimitry Andric 625*0b57cec5SDimitry Andricdef ARMv2a : Architecture<"armv2a", "ARMv2a", []>; 626*0b57cec5SDimitry Andric 627*0b57cec5SDimitry Andricdef ARMv3 : Architecture<"armv3", "ARMv3", []>; 628*0b57cec5SDimitry Andric 629*0b57cec5SDimitry Andricdef ARMv3m : Architecture<"armv3m", "ARMv3m", []>; 630*0b57cec5SDimitry Andric 631*0b57cec5SDimitry Andricdef ARMv4 : Architecture<"armv4", "ARMv4", []>; 632*0b57cec5SDimitry Andric 633*0b57cec5SDimitry Andricdef ARMv4t : Architecture<"armv4t", "ARMv4t", [HasV4TOps]>; 634*0b57cec5SDimitry Andric 635*0b57cec5SDimitry Andricdef ARMv5t : Architecture<"armv5t", "ARMv5t", [HasV5TOps]>; 636*0b57cec5SDimitry Andric 637*0b57cec5SDimitry Andricdef ARMv5te : Architecture<"armv5te", "ARMv5te", [HasV5TEOps]>; 638*0b57cec5SDimitry Andric 639*0b57cec5SDimitry Andricdef ARMv5tej : Architecture<"armv5tej", "ARMv5tej", [HasV5TEOps]>; 640*0b57cec5SDimitry Andric 641*0b57cec5SDimitry Andricdef ARMv6 : Architecture<"armv6", "ARMv6", [HasV6Ops, 642*0b57cec5SDimitry Andric FeatureDSP]>; 643*0b57cec5SDimitry Andric 644*0b57cec5SDimitry Andricdef ARMv6t2 : Architecture<"armv6t2", "ARMv6t2", [HasV6T2Ops, 645*0b57cec5SDimitry Andric FeatureDSP]>; 646*0b57cec5SDimitry Andric 647*0b57cec5SDimitry Andricdef ARMv6k : Architecture<"armv6k", "ARMv6k", [HasV6KOps]>; 648*0b57cec5SDimitry Andric 649*0b57cec5SDimitry Andricdef ARMv6kz : Architecture<"armv6kz", "ARMv6kz", [HasV6KOps, 650*0b57cec5SDimitry Andric FeatureTrustZone]>; 651*0b57cec5SDimitry Andric 652*0b57cec5SDimitry Andricdef ARMv6m : Architecture<"armv6-m", "ARMv6m", [HasV6MOps, 653*0b57cec5SDimitry Andric FeatureNoARM, 654*0b57cec5SDimitry Andric ModeThumb, 655*0b57cec5SDimitry Andric FeatureDB, 656*0b57cec5SDimitry Andric FeatureMClass, 657*0b57cec5SDimitry Andric FeatureStrictAlign]>; 658*0b57cec5SDimitry Andric 659*0b57cec5SDimitry Andricdef ARMv6sm : Architecture<"armv6s-m", "ARMv6sm", [HasV6MOps, 660*0b57cec5SDimitry Andric FeatureNoARM, 661*0b57cec5SDimitry Andric ModeThumb, 662*0b57cec5SDimitry Andric FeatureDB, 663*0b57cec5SDimitry Andric FeatureMClass, 664*0b57cec5SDimitry Andric FeatureStrictAlign]>; 665*0b57cec5SDimitry Andric 666*0b57cec5SDimitry Andricdef ARMv7a : Architecture<"armv7-a", "ARMv7a", [HasV7Ops, 667*0b57cec5SDimitry Andric FeatureNEON, 668*0b57cec5SDimitry Andric FeatureDB, 669*0b57cec5SDimitry Andric FeatureDSP, 670*0b57cec5SDimitry Andric FeatureAClass]>; 671*0b57cec5SDimitry Andric 672*0b57cec5SDimitry Andricdef ARMv7ve : Architecture<"armv7ve", "ARMv7ve", [HasV7Ops, 673*0b57cec5SDimitry Andric FeatureNEON, 674*0b57cec5SDimitry Andric FeatureDB, 675*0b57cec5SDimitry Andric FeatureDSP, 676*0b57cec5SDimitry Andric FeatureTrustZone, 677*0b57cec5SDimitry Andric FeatureMP, 678*0b57cec5SDimitry Andric FeatureVirtualization, 679*0b57cec5SDimitry Andric FeatureAClass]>; 680*0b57cec5SDimitry Andric 681*0b57cec5SDimitry Andricdef ARMv7r : Architecture<"armv7-r", "ARMv7r", [HasV7Ops, 682*0b57cec5SDimitry Andric FeatureDB, 683*0b57cec5SDimitry Andric FeatureDSP, 684*0b57cec5SDimitry Andric FeatureHWDivThumb, 685*0b57cec5SDimitry Andric FeatureRClass]>; 686*0b57cec5SDimitry Andric 687*0b57cec5SDimitry Andricdef ARMv7m : Architecture<"armv7-m", "ARMv7m", [HasV7Ops, 688*0b57cec5SDimitry Andric FeatureThumb2, 689*0b57cec5SDimitry Andric FeatureNoARM, 690*0b57cec5SDimitry Andric ModeThumb, 691*0b57cec5SDimitry Andric FeatureDB, 692*0b57cec5SDimitry Andric FeatureHWDivThumb, 693*0b57cec5SDimitry Andric FeatureMClass]>; 694*0b57cec5SDimitry Andric 695*0b57cec5SDimitry Andricdef ARMv7em : Architecture<"armv7e-m", "ARMv7em", [HasV7Ops, 696*0b57cec5SDimitry Andric FeatureThumb2, 697*0b57cec5SDimitry Andric FeatureNoARM, 698*0b57cec5SDimitry Andric ModeThumb, 699*0b57cec5SDimitry Andric FeatureDB, 700*0b57cec5SDimitry Andric FeatureHWDivThumb, 701*0b57cec5SDimitry Andric FeatureMClass, 702*0b57cec5SDimitry Andric FeatureDSP]>; 703*0b57cec5SDimitry Andric 704*0b57cec5SDimitry Andricdef ARMv8a : Architecture<"armv8-a", "ARMv8a", [HasV8Ops, 705*0b57cec5SDimitry Andric FeatureAClass, 706*0b57cec5SDimitry Andric FeatureDB, 707*0b57cec5SDimitry Andric FeatureFPARMv8, 708*0b57cec5SDimitry Andric FeatureNEON, 709*0b57cec5SDimitry Andric FeatureDSP, 710*0b57cec5SDimitry Andric FeatureTrustZone, 711*0b57cec5SDimitry Andric FeatureMP, 712*0b57cec5SDimitry Andric FeatureVirtualization, 713*0b57cec5SDimitry Andric FeatureCrypto, 714*0b57cec5SDimitry Andric FeatureCRC]>; 715*0b57cec5SDimitry Andric 716*0b57cec5SDimitry Andricdef ARMv81a : Architecture<"armv8.1-a", "ARMv81a", [HasV8_1aOps, 717*0b57cec5SDimitry Andric FeatureAClass, 718*0b57cec5SDimitry Andric FeatureDB, 719*0b57cec5SDimitry Andric FeatureFPARMv8, 720*0b57cec5SDimitry Andric FeatureNEON, 721*0b57cec5SDimitry Andric FeatureDSP, 722*0b57cec5SDimitry Andric FeatureTrustZone, 723*0b57cec5SDimitry Andric FeatureMP, 724*0b57cec5SDimitry Andric FeatureVirtualization, 725*0b57cec5SDimitry Andric FeatureCrypto, 726*0b57cec5SDimitry Andric FeatureCRC]>; 727*0b57cec5SDimitry Andric 728*0b57cec5SDimitry Andricdef ARMv82a : Architecture<"armv8.2-a", "ARMv82a", [HasV8_2aOps, 729*0b57cec5SDimitry Andric FeatureAClass, 730*0b57cec5SDimitry Andric FeatureDB, 731*0b57cec5SDimitry Andric FeatureFPARMv8, 732*0b57cec5SDimitry Andric FeatureNEON, 733*0b57cec5SDimitry Andric FeatureDSP, 734*0b57cec5SDimitry Andric FeatureTrustZone, 735*0b57cec5SDimitry Andric FeatureMP, 736*0b57cec5SDimitry Andric FeatureVirtualization, 737*0b57cec5SDimitry Andric FeatureCrypto, 738*0b57cec5SDimitry Andric FeatureCRC, 739*0b57cec5SDimitry Andric FeatureRAS]>; 740*0b57cec5SDimitry Andric 741*0b57cec5SDimitry Andricdef ARMv83a : Architecture<"armv8.3-a", "ARMv83a", [HasV8_3aOps, 742*0b57cec5SDimitry Andric FeatureAClass, 743*0b57cec5SDimitry Andric FeatureDB, 744*0b57cec5SDimitry Andric FeatureFPARMv8, 745*0b57cec5SDimitry Andric FeatureNEON, 746*0b57cec5SDimitry Andric FeatureDSP, 747*0b57cec5SDimitry Andric FeatureTrustZone, 748*0b57cec5SDimitry Andric FeatureMP, 749*0b57cec5SDimitry Andric FeatureVirtualization, 750*0b57cec5SDimitry Andric FeatureCrypto, 751*0b57cec5SDimitry Andric FeatureCRC, 752*0b57cec5SDimitry Andric FeatureRAS]>; 753*0b57cec5SDimitry Andric 754*0b57cec5SDimitry Andricdef ARMv84a : Architecture<"armv8.4-a", "ARMv84a", [HasV8_4aOps, 755*0b57cec5SDimitry Andric FeatureAClass, 756*0b57cec5SDimitry Andric FeatureDB, 757*0b57cec5SDimitry Andric FeatureFPARMv8, 758*0b57cec5SDimitry Andric FeatureNEON, 759*0b57cec5SDimitry Andric FeatureDSP, 760*0b57cec5SDimitry Andric FeatureTrustZone, 761*0b57cec5SDimitry Andric FeatureMP, 762*0b57cec5SDimitry Andric FeatureVirtualization, 763*0b57cec5SDimitry Andric FeatureCrypto, 764*0b57cec5SDimitry Andric FeatureCRC, 765*0b57cec5SDimitry Andric FeatureRAS, 766*0b57cec5SDimitry Andric FeatureDotProd]>; 767*0b57cec5SDimitry Andric 768*0b57cec5SDimitry Andricdef ARMv85a : Architecture<"armv8.5-a", "ARMv85a", [HasV8_5aOps, 769*0b57cec5SDimitry Andric FeatureAClass, 770*0b57cec5SDimitry Andric FeatureDB, 771*0b57cec5SDimitry Andric FeatureFPARMv8, 772*0b57cec5SDimitry Andric FeatureNEON, 773*0b57cec5SDimitry Andric FeatureDSP, 774*0b57cec5SDimitry Andric FeatureTrustZone, 775*0b57cec5SDimitry Andric FeatureMP, 776*0b57cec5SDimitry Andric FeatureVirtualization, 777*0b57cec5SDimitry Andric FeatureCrypto, 778*0b57cec5SDimitry Andric FeatureCRC, 779*0b57cec5SDimitry Andric FeatureRAS, 780*0b57cec5SDimitry Andric FeatureDotProd]>; 781*0b57cec5SDimitry Andric 782*0b57cec5SDimitry Andricdef ARMv8r : Architecture<"armv8-r", "ARMv8r", [HasV8Ops, 783*0b57cec5SDimitry Andric FeatureRClass, 784*0b57cec5SDimitry Andric FeatureDB, 785*0b57cec5SDimitry Andric FeatureDFB, 786*0b57cec5SDimitry Andric FeatureDSP, 787*0b57cec5SDimitry Andric FeatureCRC, 788*0b57cec5SDimitry Andric FeatureMP, 789*0b57cec5SDimitry Andric FeatureVirtualization, 790*0b57cec5SDimitry Andric FeatureFPARMv8, 791*0b57cec5SDimitry Andric FeatureNEON]>; 792*0b57cec5SDimitry Andric 793*0b57cec5SDimitry Andricdef ARMv8mBaseline : Architecture<"armv8-m.base", "ARMv8mBaseline", 794*0b57cec5SDimitry Andric [HasV8MBaselineOps, 795*0b57cec5SDimitry Andric FeatureNoARM, 796*0b57cec5SDimitry Andric ModeThumb, 797*0b57cec5SDimitry Andric FeatureDB, 798*0b57cec5SDimitry Andric FeatureHWDivThumb, 799*0b57cec5SDimitry Andric FeatureV7Clrex, 800*0b57cec5SDimitry Andric Feature8MSecExt, 801*0b57cec5SDimitry Andric FeatureAcquireRelease, 802*0b57cec5SDimitry Andric FeatureMClass, 803*0b57cec5SDimitry Andric FeatureStrictAlign]>; 804*0b57cec5SDimitry Andric 805*0b57cec5SDimitry Andricdef ARMv8mMainline : Architecture<"armv8-m.main", "ARMv8mMainline", 806*0b57cec5SDimitry Andric [HasV8MMainlineOps, 807*0b57cec5SDimitry Andric FeatureNoARM, 808*0b57cec5SDimitry Andric ModeThumb, 809*0b57cec5SDimitry Andric FeatureDB, 810*0b57cec5SDimitry Andric FeatureHWDivThumb, 811*0b57cec5SDimitry Andric Feature8MSecExt, 812*0b57cec5SDimitry Andric FeatureAcquireRelease, 813*0b57cec5SDimitry Andric FeatureMClass]>; 814*0b57cec5SDimitry Andric 815*0b57cec5SDimitry Andricdef ARMv81mMainline : Architecture<"armv8.1-m.main", "ARMv81mMainline", 816*0b57cec5SDimitry Andric [HasV8_1MMainlineOps, 817*0b57cec5SDimitry Andric FeatureNoARM, 818*0b57cec5SDimitry Andric ModeThumb, 819*0b57cec5SDimitry Andric FeatureDB, 820*0b57cec5SDimitry Andric FeatureHWDivThumb, 821*0b57cec5SDimitry Andric Feature8MSecExt, 822*0b57cec5SDimitry Andric FeatureAcquireRelease, 823*0b57cec5SDimitry Andric FeatureMClass, 824*0b57cec5SDimitry Andric FeatureRAS, 825*0b57cec5SDimitry Andric FeatureLOB]>; 826*0b57cec5SDimitry Andric 827*0b57cec5SDimitry Andric// Aliases 828*0b57cec5SDimitry Andricdef IWMMXT : Architecture<"iwmmxt", "ARMv5te", [ARMv5te]>; 829*0b57cec5SDimitry Andricdef IWMMXT2 : Architecture<"iwmmxt2", "ARMv5te", [ARMv5te]>; 830*0b57cec5SDimitry Andricdef XScale : Architecture<"xscale", "ARMv5te", [ARMv5te]>; 831*0b57cec5SDimitry Andricdef ARMv6j : Architecture<"armv6j", "ARMv7a", [ARMv6]>; 832*0b57cec5SDimitry Andricdef ARMv7k : Architecture<"armv7k", "ARMv7a", [ARMv7a]>; 833*0b57cec5SDimitry Andricdef ARMv7s : Architecture<"armv7s", "ARMv7a", [ARMv7a]>; 834*0b57cec5SDimitry Andric 835*0b57cec5SDimitry Andric 836*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 837*0b57cec5SDimitry Andric// ARM schedules. 838*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 839*0b57cec5SDimitry Andric// 840*0b57cec5SDimitry Andricinclude "ARMPredicates.td" 841*0b57cec5SDimitry Andricinclude "ARMSchedule.td" 842*0b57cec5SDimitry Andric 843*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 844*0b57cec5SDimitry Andric// ARM processors 845*0b57cec5SDimitry Andric// 846*0b57cec5SDimitry Andric 847*0b57cec5SDimitry Andric// Dummy CPU, used to target architectures 848*0b57cec5SDimitry Andricdef : ProcessorModel<"generic", CortexA8Model, []>; 849*0b57cec5SDimitry Andric 850*0b57cec5SDimitry Andric// FIXME: Several processors below are not using their own scheduler 851*0b57cec5SDimitry Andric// model, but one of similar/previous processor. These should be fixed. 852*0b57cec5SDimitry Andric 853*0b57cec5SDimitry Andricdef : ProcNoItin<"arm8", [ARMv4]>; 854*0b57cec5SDimitry Andricdef : ProcNoItin<"arm810", [ARMv4]>; 855*0b57cec5SDimitry Andricdef : ProcNoItin<"strongarm", [ARMv4]>; 856*0b57cec5SDimitry Andricdef : ProcNoItin<"strongarm110", [ARMv4]>; 857*0b57cec5SDimitry Andricdef : ProcNoItin<"strongarm1100", [ARMv4]>; 858*0b57cec5SDimitry Andricdef : ProcNoItin<"strongarm1110", [ARMv4]>; 859*0b57cec5SDimitry Andric 860*0b57cec5SDimitry Andricdef : ProcNoItin<"arm7tdmi", [ARMv4t]>; 861*0b57cec5SDimitry Andricdef : ProcNoItin<"arm7tdmi-s", [ARMv4t]>; 862*0b57cec5SDimitry Andricdef : ProcNoItin<"arm710t", [ARMv4t]>; 863*0b57cec5SDimitry Andricdef : ProcNoItin<"arm720t", [ARMv4t]>; 864*0b57cec5SDimitry Andricdef : ProcNoItin<"arm9", [ARMv4t]>; 865*0b57cec5SDimitry Andricdef : ProcNoItin<"arm9tdmi", [ARMv4t]>; 866*0b57cec5SDimitry Andricdef : ProcNoItin<"arm920", [ARMv4t]>; 867*0b57cec5SDimitry Andricdef : ProcNoItin<"arm920t", [ARMv4t]>; 868*0b57cec5SDimitry Andricdef : ProcNoItin<"arm922t", [ARMv4t]>; 869*0b57cec5SDimitry Andricdef : ProcNoItin<"arm940t", [ARMv4t]>; 870*0b57cec5SDimitry Andricdef : ProcNoItin<"ep9312", [ARMv4t]>; 871*0b57cec5SDimitry Andric 872*0b57cec5SDimitry Andricdef : ProcNoItin<"arm10tdmi", [ARMv5t]>; 873*0b57cec5SDimitry Andricdef : ProcNoItin<"arm1020t", [ARMv5t]>; 874*0b57cec5SDimitry Andric 875*0b57cec5SDimitry Andricdef : ProcNoItin<"arm9e", [ARMv5te]>; 876*0b57cec5SDimitry Andricdef : ProcNoItin<"arm926ej-s", [ARMv5te]>; 877*0b57cec5SDimitry Andricdef : ProcNoItin<"arm946e-s", [ARMv5te]>; 878*0b57cec5SDimitry Andricdef : ProcNoItin<"arm966e-s", [ARMv5te]>; 879*0b57cec5SDimitry Andricdef : ProcNoItin<"arm968e-s", [ARMv5te]>; 880*0b57cec5SDimitry Andricdef : ProcNoItin<"arm10e", [ARMv5te]>; 881*0b57cec5SDimitry Andricdef : ProcNoItin<"arm1020e", [ARMv5te]>; 882*0b57cec5SDimitry Andricdef : ProcNoItin<"arm1022e", [ARMv5te]>; 883*0b57cec5SDimitry Andricdef : ProcNoItin<"xscale", [ARMv5te]>; 884*0b57cec5SDimitry Andricdef : ProcNoItin<"iwmmxt", [ARMv5te]>; 885*0b57cec5SDimitry Andric 886*0b57cec5SDimitry Andricdef : Processor<"arm1136j-s", ARMV6Itineraries, [ARMv6]>; 887*0b57cec5SDimitry Andricdef : Processor<"arm1136jf-s", ARMV6Itineraries, [ARMv6, 888*0b57cec5SDimitry Andric FeatureVFP2, 889*0b57cec5SDimitry Andric FeatureHasSlowFPVMLx]>; 890*0b57cec5SDimitry Andric 891*0b57cec5SDimitry Andricdef : Processor<"cortex-m0", ARMV6Itineraries, [ARMv6m]>; 892*0b57cec5SDimitry Andricdef : Processor<"cortex-m0plus", ARMV6Itineraries, [ARMv6m]>; 893*0b57cec5SDimitry Andricdef : Processor<"cortex-m1", ARMV6Itineraries, [ARMv6m]>; 894*0b57cec5SDimitry Andricdef : Processor<"sc000", ARMV6Itineraries, [ARMv6m]>; 895*0b57cec5SDimitry Andric 896*0b57cec5SDimitry Andricdef : Processor<"arm1176j-s", ARMV6Itineraries, [ARMv6kz]>; 897*0b57cec5SDimitry Andricdef : Processor<"arm1176jz-s", ARMV6Itineraries, [ARMv6kz]>; 898*0b57cec5SDimitry Andricdef : Processor<"arm1176jzf-s", ARMV6Itineraries, [ARMv6kz, 899*0b57cec5SDimitry Andric FeatureVFP2, 900*0b57cec5SDimitry Andric FeatureHasSlowFPVMLx]>; 901*0b57cec5SDimitry Andric 902*0b57cec5SDimitry Andricdef : Processor<"mpcorenovfp", ARMV6Itineraries, [ARMv6k]>; 903*0b57cec5SDimitry Andricdef : Processor<"mpcore", ARMV6Itineraries, [ARMv6k, 904*0b57cec5SDimitry Andric FeatureVFP2, 905*0b57cec5SDimitry Andric FeatureHasSlowFPVMLx]>; 906*0b57cec5SDimitry Andric 907*0b57cec5SDimitry Andricdef : Processor<"arm1156t2-s", ARMV6Itineraries, [ARMv6t2]>; 908*0b57cec5SDimitry Andricdef : Processor<"arm1156t2f-s", ARMV6Itineraries, [ARMv6t2, 909*0b57cec5SDimitry Andric FeatureVFP2, 910*0b57cec5SDimitry Andric FeatureHasSlowFPVMLx]>; 911*0b57cec5SDimitry Andric 912*0b57cec5SDimitry Andricdef : ProcessorModel<"cortex-a5", CortexA8Model, [ARMv7a, ProcA5, 913*0b57cec5SDimitry Andric FeatureHasRetAddrStack, 914*0b57cec5SDimitry Andric FeatureTrustZone, 915*0b57cec5SDimitry Andric FeatureSlowFPBrcc, 916*0b57cec5SDimitry Andric FeatureHasSlowFPVMLx, 917*0b57cec5SDimitry Andric FeatureVMLxForwarding, 918*0b57cec5SDimitry Andric FeatureMP, 919*0b57cec5SDimitry Andric FeatureVFP4]>; 920*0b57cec5SDimitry Andric 921*0b57cec5SDimitry Andricdef : ProcessorModel<"cortex-a7", CortexA8Model, [ARMv7a, ProcA7, 922*0b57cec5SDimitry Andric FeatureHasRetAddrStack, 923*0b57cec5SDimitry Andric FeatureTrustZone, 924*0b57cec5SDimitry Andric FeatureSlowFPBrcc, 925*0b57cec5SDimitry Andric FeatureHasVMLxHazards, 926*0b57cec5SDimitry Andric FeatureHasSlowFPVMLx, 927*0b57cec5SDimitry Andric FeatureVMLxForwarding, 928*0b57cec5SDimitry Andric FeatureMP, 929*0b57cec5SDimitry Andric FeatureVFP4, 930*0b57cec5SDimitry Andric FeatureVirtualization]>; 931*0b57cec5SDimitry Andric 932*0b57cec5SDimitry Andricdef : ProcessorModel<"cortex-a8", CortexA8Model, [ARMv7a, ProcA8, 933*0b57cec5SDimitry Andric FeatureHasRetAddrStack, 934*0b57cec5SDimitry Andric FeatureNonpipelinedVFP, 935*0b57cec5SDimitry Andric FeatureTrustZone, 936*0b57cec5SDimitry Andric FeatureSlowFPBrcc, 937*0b57cec5SDimitry Andric FeatureHasVMLxHazards, 938*0b57cec5SDimitry Andric FeatureHasSlowFPVMLx, 939*0b57cec5SDimitry Andric FeatureVMLxForwarding]>; 940*0b57cec5SDimitry Andric 941*0b57cec5SDimitry Andricdef : ProcessorModel<"cortex-a9", CortexA9Model, [ARMv7a, ProcA9, 942*0b57cec5SDimitry Andric FeatureHasRetAddrStack, 943*0b57cec5SDimitry Andric FeatureTrustZone, 944*0b57cec5SDimitry Andric FeatureHasVMLxHazards, 945*0b57cec5SDimitry Andric FeatureVMLxForwarding, 946*0b57cec5SDimitry Andric FeatureFP16, 947*0b57cec5SDimitry Andric FeatureAvoidPartialCPSR, 948*0b57cec5SDimitry Andric FeatureExpandMLx, 949*0b57cec5SDimitry Andric FeaturePreferVMOVSR, 950*0b57cec5SDimitry Andric FeatureMuxedUnits, 951*0b57cec5SDimitry Andric FeatureNEONForFPMovs, 952*0b57cec5SDimitry Andric FeatureCheckVLDnAlign, 953*0b57cec5SDimitry Andric FeatureMP]>; 954*0b57cec5SDimitry Andric 955*0b57cec5SDimitry Andricdef : ProcessorModel<"cortex-a12", CortexA9Model, [ARMv7a, ProcA12, 956*0b57cec5SDimitry Andric FeatureHasRetAddrStack, 957*0b57cec5SDimitry Andric FeatureTrustZone, 958*0b57cec5SDimitry Andric FeatureVMLxForwarding, 959*0b57cec5SDimitry Andric FeatureVFP4, 960*0b57cec5SDimitry Andric FeatureAvoidPartialCPSR, 961*0b57cec5SDimitry Andric FeatureVirtualization, 962*0b57cec5SDimitry Andric FeatureMP]>; 963*0b57cec5SDimitry Andric 964*0b57cec5SDimitry Andricdef : ProcessorModel<"cortex-a15", CortexA9Model, [ARMv7a, ProcA15, 965*0b57cec5SDimitry Andric FeatureDontWidenVMOVS, 966*0b57cec5SDimitry Andric FeatureSplatVFPToNeon, 967*0b57cec5SDimitry Andric FeatureHasRetAddrStack, 968*0b57cec5SDimitry Andric FeatureMuxedUnits, 969*0b57cec5SDimitry Andric FeatureTrustZone, 970*0b57cec5SDimitry Andric FeatureVFP4, 971*0b57cec5SDimitry Andric FeatureMP, 972*0b57cec5SDimitry Andric FeatureCheckVLDnAlign, 973*0b57cec5SDimitry Andric FeatureAvoidPartialCPSR, 974*0b57cec5SDimitry Andric FeatureVirtualization]>; 975*0b57cec5SDimitry Andric 976*0b57cec5SDimitry Andricdef : ProcessorModel<"cortex-a17", CortexA9Model, [ARMv7a, ProcA17, 977*0b57cec5SDimitry Andric FeatureHasRetAddrStack, 978*0b57cec5SDimitry Andric FeatureTrustZone, 979*0b57cec5SDimitry Andric FeatureMP, 980*0b57cec5SDimitry Andric FeatureVMLxForwarding, 981*0b57cec5SDimitry Andric FeatureVFP4, 982*0b57cec5SDimitry Andric FeatureAvoidPartialCPSR, 983*0b57cec5SDimitry Andric FeatureVirtualization]>; 984*0b57cec5SDimitry Andric 985*0b57cec5SDimitry Andric// FIXME: krait has currently the same features as A9 plus VFP4 and HWDiv 986*0b57cec5SDimitry Andricdef : ProcessorModel<"krait", CortexA9Model, [ARMv7a, ProcKrait, 987*0b57cec5SDimitry Andric FeatureHasRetAddrStack, 988*0b57cec5SDimitry Andric FeatureMuxedUnits, 989*0b57cec5SDimitry Andric FeatureCheckVLDnAlign, 990*0b57cec5SDimitry Andric FeatureVMLxForwarding, 991*0b57cec5SDimitry Andric FeatureFP16, 992*0b57cec5SDimitry Andric FeatureAvoidPartialCPSR, 993*0b57cec5SDimitry Andric FeatureVFP4, 994*0b57cec5SDimitry Andric FeatureHWDivThumb, 995*0b57cec5SDimitry Andric FeatureHWDivARM]>; 996*0b57cec5SDimitry Andric 997*0b57cec5SDimitry Andricdef : ProcessorModel<"swift", SwiftModel, [ARMv7a, ProcSwift, 998*0b57cec5SDimitry Andric FeatureHasRetAddrStack, 999*0b57cec5SDimitry Andric FeatureNEONForFP, 1000*0b57cec5SDimitry Andric FeatureVFP4, 1001*0b57cec5SDimitry Andric FeatureUseWideStrideVFP, 1002*0b57cec5SDimitry Andric FeatureMP, 1003*0b57cec5SDimitry Andric FeatureHWDivThumb, 1004*0b57cec5SDimitry Andric FeatureHWDivARM, 1005*0b57cec5SDimitry Andric FeatureAvoidPartialCPSR, 1006*0b57cec5SDimitry Andric FeatureAvoidMOVsShOp, 1007*0b57cec5SDimitry Andric FeatureHasSlowFPVMLx, 1008*0b57cec5SDimitry Andric FeatureHasVMLxHazards, 1009*0b57cec5SDimitry Andric FeatureProfUnpredicate, 1010*0b57cec5SDimitry Andric FeaturePrefISHSTBarrier, 1011*0b57cec5SDimitry Andric FeatureSlowOddRegister, 1012*0b57cec5SDimitry Andric FeatureSlowLoadDSubreg, 1013*0b57cec5SDimitry Andric FeatureSlowVGETLNi32, 1014*0b57cec5SDimitry Andric FeatureSlowVDUP32, 1015*0b57cec5SDimitry Andric FeatureUseMISched, 1016*0b57cec5SDimitry Andric FeatureNoPostRASched]>; 1017*0b57cec5SDimitry Andric 1018*0b57cec5SDimitry Andricdef : ProcessorModel<"cortex-r4", CortexA8Model, [ARMv7r, ProcR4, 1019*0b57cec5SDimitry Andric FeatureHasRetAddrStack, 1020*0b57cec5SDimitry Andric FeatureAvoidPartialCPSR]>; 1021*0b57cec5SDimitry Andric 1022*0b57cec5SDimitry Andricdef : ProcessorModel<"cortex-r4f", CortexA8Model, [ARMv7r, ProcR4, 1023*0b57cec5SDimitry Andric FeatureHasRetAddrStack, 1024*0b57cec5SDimitry Andric FeatureSlowFPBrcc, 1025*0b57cec5SDimitry Andric FeatureHasSlowFPVMLx, 1026*0b57cec5SDimitry Andric FeatureVFP3_D16, 1027*0b57cec5SDimitry Andric FeatureAvoidPartialCPSR]>; 1028*0b57cec5SDimitry Andric 1029*0b57cec5SDimitry Andricdef : ProcessorModel<"cortex-r5", CortexA8Model, [ARMv7r, ProcR5, 1030*0b57cec5SDimitry Andric FeatureHasRetAddrStack, 1031*0b57cec5SDimitry Andric FeatureVFP3_D16, 1032*0b57cec5SDimitry Andric FeatureSlowFPBrcc, 1033*0b57cec5SDimitry Andric FeatureHWDivARM, 1034*0b57cec5SDimitry Andric FeatureHasSlowFPVMLx, 1035*0b57cec5SDimitry Andric FeatureAvoidPartialCPSR]>; 1036*0b57cec5SDimitry Andric 1037*0b57cec5SDimitry Andricdef : ProcessorModel<"cortex-r7", CortexA8Model, [ARMv7r, ProcR7, 1038*0b57cec5SDimitry Andric FeatureHasRetAddrStack, 1039*0b57cec5SDimitry Andric FeatureVFP3_D16, 1040*0b57cec5SDimitry Andric FeatureFP16, 1041*0b57cec5SDimitry Andric FeatureMP, 1042*0b57cec5SDimitry Andric FeatureSlowFPBrcc, 1043*0b57cec5SDimitry Andric FeatureHWDivARM, 1044*0b57cec5SDimitry Andric FeatureHasSlowFPVMLx, 1045*0b57cec5SDimitry Andric FeatureAvoidPartialCPSR]>; 1046*0b57cec5SDimitry Andric 1047*0b57cec5SDimitry Andricdef : ProcessorModel<"cortex-r8", CortexA8Model, [ARMv7r, 1048*0b57cec5SDimitry Andric FeatureHasRetAddrStack, 1049*0b57cec5SDimitry Andric FeatureVFP3_D16, 1050*0b57cec5SDimitry Andric FeatureFP16, 1051*0b57cec5SDimitry Andric FeatureMP, 1052*0b57cec5SDimitry Andric FeatureSlowFPBrcc, 1053*0b57cec5SDimitry Andric FeatureHWDivARM, 1054*0b57cec5SDimitry Andric FeatureHasSlowFPVMLx, 1055*0b57cec5SDimitry Andric FeatureAvoidPartialCPSR]>; 1056*0b57cec5SDimitry Andric 1057*0b57cec5SDimitry Andricdef : ProcessorModel<"cortex-m3", CortexM4Model, [ARMv7m, 1058*0b57cec5SDimitry Andric ProcM3, 1059*0b57cec5SDimitry Andric FeaturePrefLoopAlign32, 1060*0b57cec5SDimitry Andric FeatureUseMISched, 1061*0b57cec5SDimitry Andric FeatureUseAA, 1062*0b57cec5SDimitry Andric FeatureHasNoBranchPredictor]>; 1063*0b57cec5SDimitry Andric 1064*0b57cec5SDimitry Andricdef : ProcessorModel<"sc300", CortexM4Model, [ARMv7m, 1065*0b57cec5SDimitry Andric ProcM3, 1066*0b57cec5SDimitry Andric FeatureUseMISched, 1067*0b57cec5SDimitry Andric FeatureUseAA, 1068*0b57cec5SDimitry Andric FeatureHasNoBranchPredictor]>; 1069*0b57cec5SDimitry Andric 1070*0b57cec5SDimitry Andricdef : ProcessorModel<"cortex-m4", CortexM4Model, [ARMv7em, 1071*0b57cec5SDimitry Andric FeatureVFP4_D16_SP, 1072*0b57cec5SDimitry Andric FeaturePrefLoopAlign32, 1073*0b57cec5SDimitry Andric FeatureHasSlowFPVMLx, 1074*0b57cec5SDimitry Andric FeatureUseMISched, 1075*0b57cec5SDimitry Andric FeatureUseAA, 1076*0b57cec5SDimitry Andric FeatureHasNoBranchPredictor]>; 1077*0b57cec5SDimitry Andric 1078*0b57cec5SDimitry Andricdef : ProcNoItin<"cortex-m7", [ARMv7em, 1079*0b57cec5SDimitry Andric FeatureFPARMv8_D16]>; 1080*0b57cec5SDimitry Andric 1081*0b57cec5SDimitry Andricdef : ProcNoItin<"cortex-m23", [ARMv8mBaseline, 1082*0b57cec5SDimitry Andric FeatureNoMovt]>; 1083*0b57cec5SDimitry Andric 1084*0b57cec5SDimitry Andricdef : ProcessorModel<"cortex-m33", CortexM4Model, [ARMv8mMainline, 1085*0b57cec5SDimitry Andric FeatureDSP, 1086*0b57cec5SDimitry Andric FeatureFPARMv8_D16_SP, 1087*0b57cec5SDimitry Andric FeaturePrefLoopAlign32, 1088*0b57cec5SDimitry Andric FeatureHasSlowFPVMLx, 1089*0b57cec5SDimitry Andric FeatureUseMISched, 1090*0b57cec5SDimitry Andric FeatureUseAA, 1091*0b57cec5SDimitry Andric FeatureHasNoBranchPredictor]>; 1092*0b57cec5SDimitry Andric 1093*0b57cec5SDimitry Andricdef : ProcessorModel<"cortex-m35p", CortexM4Model, [ARMv8mMainline, 1094*0b57cec5SDimitry Andric FeatureDSP, 1095*0b57cec5SDimitry Andric FeatureFPARMv8_D16_SP, 1096*0b57cec5SDimitry Andric FeaturePrefLoopAlign32, 1097*0b57cec5SDimitry Andric FeatureHasSlowFPVMLx, 1098*0b57cec5SDimitry Andric FeatureUseMISched, 1099*0b57cec5SDimitry Andric FeatureUseAA, 1100*0b57cec5SDimitry Andric FeatureHasNoBranchPredictor]>; 1101*0b57cec5SDimitry Andric 1102*0b57cec5SDimitry Andric 1103*0b57cec5SDimitry Andricdef : ProcNoItin<"cortex-a32", [ARMv8a, 1104*0b57cec5SDimitry Andric FeatureHWDivThumb, 1105*0b57cec5SDimitry Andric FeatureHWDivARM, 1106*0b57cec5SDimitry Andric FeatureCrypto, 1107*0b57cec5SDimitry Andric FeatureCRC]>; 1108*0b57cec5SDimitry Andric 1109*0b57cec5SDimitry Andricdef : ProcNoItin<"cortex-a35", [ARMv8a, ProcA35, 1110*0b57cec5SDimitry Andric FeatureHWDivThumb, 1111*0b57cec5SDimitry Andric FeatureHWDivARM, 1112*0b57cec5SDimitry Andric FeatureCrypto, 1113*0b57cec5SDimitry Andric FeatureCRC]>; 1114*0b57cec5SDimitry Andric 1115*0b57cec5SDimitry Andricdef : ProcNoItin<"cortex-a53", [ARMv8a, ProcA53, 1116*0b57cec5SDimitry Andric FeatureHWDivThumb, 1117*0b57cec5SDimitry Andric FeatureHWDivARM, 1118*0b57cec5SDimitry Andric FeatureCrypto, 1119*0b57cec5SDimitry Andric FeatureCRC, 1120*0b57cec5SDimitry Andric FeatureFPAO]>; 1121*0b57cec5SDimitry Andric 1122*0b57cec5SDimitry Andricdef : ProcNoItin<"cortex-a55", [ARMv82a, ProcA55, 1123*0b57cec5SDimitry Andric FeatureHWDivThumb, 1124*0b57cec5SDimitry Andric FeatureHWDivARM, 1125*0b57cec5SDimitry Andric FeatureDotProd]>; 1126*0b57cec5SDimitry Andric 1127*0b57cec5SDimitry Andricdef : ProcessorModel<"cortex-a57", CortexA57Model, [ARMv8a, ProcA57, 1128*0b57cec5SDimitry Andric FeatureHWDivThumb, 1129*0b57cec5SDimitry Andric FeatureHWDivARM, 1130*0b57cec5SDimitry Andric FeatureCrypto, 1131*0b57cec5SDimitry Andric FeatureCRC, 1132*0b57cec5SDimitry Andric FeatureFPAO, 1133*0b57cec5SDimitry Andric FeatureAvoidPartialCPSR, 1134*0b57cec5SDimitry Andric FeatureCheapPredicableCPSR]>; 1135*0b57cec5SDimitry Andric 1136*0b57cec5SDimitry Andricdef : ProcessorModel<"cortex-a72", CortexA57Model, [ARMv8a, ProcA72, 1137*0b57cec5SDimitry Andric FeatureHWDivThumb, 1138*0b57cec5SDimitry Andric FeatureHWDivARM, 1139*0b57cec5SDimitry Andric FeatureCrypto, 1140*0b57cec5SDimitry Andric FeatureCRC]>; 1141*0b57cec5SDimitry Andric 1142*0b57cec5SDimitry Andricdef : ProcNoItin<"cortex-a73", [ARMv8a, ProcA73, 1143*0b57cec5SDimitry Andric FeatureHWDivThumb, 1144*0b57cec5SDimitry Andric FeatureHWDivARM, 1145*0b57cec5SDimitry Andric FeatureCrypto, 1146*0b57cec5SDimitry Andric FeatureCRC]>; 1147*0b57cec5SDimitry Andric 1148*0b57cec5SDimitry Andricdef : ProcNoItin<"cortex-a75", [ARMv82a, ProcA75, 1149*0b57cec5SDimitry Andric FeatureHWDivThumb, 1150*0b57cec5SDimitry Andric FeatureHWDivARM, 1151*0b57cec5SDimitry Andric FeatureDotProd]>; 1152*0b57cec5SDimitry Andric 1153*0b57cec5SDimitry Andricdef : ProcNoItin<"cortex-a76", [ARMv82a, ProcA76, 1154*0b57cec5SDimitry Andric FeatureHWDivThumb, 1155*0b57cec5SDimitry Andric FeatureHWDivARM, 1156*0b57cec5SDimitry Andric FeatureCrypto, 1157*0b57cec5SDimitry Andric FeatureCRC, 1158*0b57cec5SDimitry Andric FeatureFullFP16, 1159*0b57cec5SDimitry Andric FeatureDotProd]>; 1160*0b57cec5SDimitry Andric 1161*0b57cec5SDimitry Andricdef : ProcNoItin<"cortex-a76ae", [ARMv82a, ProcA76, 1162*0b57cec5SDimitry Andric FeatureHWDivThumb, 1163*0b57cec5SDimitry Andric FeatureHWDivARM, 1164*0b57cec5SDimitry Andric FeatureCrypto, 1165*0b57cec5SDimitry Andric FeatureCRC, 1166*0b57cec5SDimitry Andric FeatureFullFP16, 1167*0b57cec5SDimitry Andric FeatureDotProd]>; 1168*0b57cec5SDimitry Andric 1169*0b57cec5SDimitry Andricdef : ProcessorModel<"cyclone", SwiftModel, [ARMv8a, ProcSwift, 1170*0b57cec5SDimitry Andric FeatureHasRetAddrStack, 1171*0b57cec5SDimitry Andric FeatureNEONForFP, 1172*0b57cec5SDimitry Andric FeatureVFP4, 1173*0b57cec5SDimitry Andric FeatureMP, 1174*0b57cec5SDimitry Andric FeatureHWDivThumb, 1175*0b57cec5SDimitry Andric FeatureHWDivARM, 1176*0b57cec5SDimitry Andric FeatureAvoidPartialCPSR, 1177*0b57cec5SDimitry Andric FeatureAvoidMOVsShOp, 1178*0b57cec5SDimitry Andric FeatureHasSlowFPVMLx, 1179*0b57cec5SDimitry Andric FeatureCrypto, 1180*0b57cec5SDimitry Andric FeatureUseMISched, 1181*0b57cec5SDimitry Andric FeatureZCZeroing, 1182*0b57cec5SDimitry Andric FeatureNoPostRASched]>; 1183*0b57cec5SDimitry Andric 1184*0b57cec5SDimitry Andricdef : ProcNoItin<"exynos-m1", [ARMv8a, ProcExynos]>; 1185*0b57cec5SDimitry Andricdef : ProcNoItin<"exynos-m2", [ARMv8a, ProcExynos]>; 1186*0b57cec5SDimitry Andricdef : ProcNoItin<"exynos-m3", [ARMv8a, ProcExynos]>; 1187*0b57cec5SDimitry Andricdef : ProcNoItin<"exynos-m4", [ARMv82a, ProcExynos, 1188*0b57cec5SDimitry Andric FeatureFullFP16, 1189*0b57cec5SDimitry Andric FeatureDotProd]>; 1190*0b57cec5SDimitry Andricdef : ProcNoItin<"exynos-m5", [ARMv82a, ProcExynos, 1191*0b57cec5SDimitry Andric FeatureFullFP16, 1192*0b57cec5SDimitry Andric FeatureDotProd]>; 1193*0b57cec5SDimitry Andric 1194*0b57cec5SDimitry Andricdef : ProcNoItin<"kryo", [ARMv8a, ProcKryo, 1195*0b57cec5SDimitry Andric FeatureHWDivThumb, 1196*0b57cec5SDimitry Andric FeatureHWDivARM, 1197*0b57cec5SDimitry Andric FeatureCrypto, 1198*0b57cec5SDimitry Andric FeatureCRC]>; 1199*0b57cec5SDimitry Andric 1200*0b57cec5SDimitry Andricdef : ProcessorModel<"cortex-r52", CortexR52Model, [ARMv8r, ProcR52, 1201*0b57cec5SDimitry Andric FeatureUseMISched, 1202*0b57cec5SDimitry Andric FeatureFPAO, 1203*0b57cec5SDimitry Andric FeatureUseAA]>; 1204*0b57cec5SDimitry Andric 1205*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 1206*0b57cec5SDimitry Andric// Register File Description 1207*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 1208*0b57cec5SDimitry Andric 1209*0b57cec5SDimitry Andricinclude "ARMRegisterInfo.td" 1210*0b57cec5SDimitry Andricinclude "ARMRegisterBanks.td" 1211*0b57cec5SDimitry Andricinclude "ARMCallingConv.td" 1212*0b57cec5SDimitry Andric 1213*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 1214*0b57cec5SDimitry Andric// Instruction Descriptions 1215*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 1216*0b57cec5SDimitry Andric 1217*0b57cec5SDimitry Andricinclude "ARMInstrInfo.td" 1218*0b57cec5SDimitry Andricdef ARMInstrInfo : InstrInfo; 1219*0b57cec5SDimitry Andric 1220*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 1221*0b57cec5SDimitry Andric// Declare the target which we are implementing 1222*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 1223*0b57cec5SDimitry Andric 1224*0b57cec5SDimitry Andricdef ARMAsmWriter : AsmWriter { 1225*0b57cec5SDimitry Andric string AsmWriterClassName = "InstPrinter"; 1226*0b57cec5SDimitry Andric int PassSubtarget = 1; 1227*0b57cec5SDimitry Andric int Variant = 0; 1228*0b57cec5SDimitry Andric bit isMCAsmWriter = 1; 1229*0b57cec5SDimitry Andric} 1230*0b57cec5SDimitry Andric 1231*0b57cec5SDimitry Andricdef ARMAsmParser : AsmParser { 1232*0b57cec5SDimitry Andric bit ReportMultipleNearMisses = 1; 1233*0b57cec5SDimitry Andric} 1234*0b57cec5SDimitry Andric 1235*0b57cec5SDimitry Andricdef ARMAsmParserVariant : AsmParserVariant { 1236*0b57cec5SDimitry Andric int Variant = 0; 1237*0b57cec5SDimitry Andric string Name = "ARM"; 1238*0b57cec5SDimitry Andric string BreakCharacters = "."; 1239*0b57cec5SDimitry Andric} 1240*0b57cec5SDimitry Andric 1241*0b57cec5SDimitry Andricdef ARM : Target { 1242*0b57cec5SDimitry Andric // Pull in Instruction Info. 1243*0b57cec5SDimitry Andric let InstructionSet = ARMInstrInfo; 1244*0b57cec5SDimitry Andric let AssemblyWriters = [ARMAsmWriter]; 1245*0b57cec5SDimitry Andric let AssemblyParsers = [ARMAsmParser]; 1246*0b57cec5SDimitry Andric let AssemblyParserVariants = [ARMAsmParserVariant]; 1247*0b57cec5SDimitry Andric let AllowRegisterRenaming = 1; 1248*0b57cec5SDimitry Andric} 1249