1//===-- ARM.td - Describe the ARM Target Machine -----------*- tablegen -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// 10//===----------------------------------------------------------------------===// 11 12//===----------------------------------------------------------------------===// 13// Target-independent interfaces which we are implementing 14//===----------------------------------------------------------------------===// 15 16include "llvm/Target/Target.td" 17 18//===----------------------------------------------------------------------===// 19// ARM Subtarget state. 20// 21 22// True if compiling for Thumb, false for ARM. 23def ModeThumb : SubtargetFeature<"thumb-mode", "IsThumb", 24 "true", "Thumb mode">; 25 26// True if we're using software floating point features. 27def ModeSoftFloat : SubtargetFeature<"soft-float","UseSoftFloat", 28 "true", "Use software floating " 29 "point features.">; 30 31 32//===----------------------------------------------------------------------===// 33// ARM Subtarget features. 34// 35 36// Floating Point, HW Division and Neon Support 37 38// FP loads/stores/moves, shared between VFP and MVE (even in the integer-only 39// version). 40def FeatureFPRegs : SubtargetFeature<"fpregs", "HasFPRegs", "true", 41 "Enable FP registers">; 42 43// 16-bit FP loads/stores/moves, shared between VFP (with the v8.2A FP16 44// extension) and MVE (even in the integer-only version). 45def FeatureFPRegs16 : SubtargetFeature<"fpregs16", "HasFPRegs16", "true", 46 "Enable 16-bit FP registers", 47 [FeatureFPRegs]>; 48 49def FeatureFPRegs64 : SubtargetFeature<"fpregs64", "HasFPRegs64", "true", 50 "Enable 64-bit FP registers", 51 [FeatureFPRegs]>; 52 53// True if the floating point unit supports double precision. 54def FeatureFP64 : SubtargetFeature<"fp64", "HasFP64", "true", 55 "Floating point unit supports " 56 "double precision", 57 [FeatureFPRegs64]>; 58 59// True if subtarget has the full 32 double precision FP registers for VFPv3. 60def FeatureD32 : SubtargetFeature<"d32", "HasD32", "true", 61 "Extend FP to 32 double registers">; 62 63/// Versions of the VFP flags restricted to single precision, or to 64/// 16 d-registers, or both. 65multiclass VFPver<string name, string query, string description, 66 list<SubtargetFeature> prev, 67 list<SubtargetFeature> otherimplies, 68 list<SubtargetFeature> vfp2prev = []> { 69 def _D16_SP: SubtargetFeature< 70 name#"d16sp", query#"D16SP", "true", 71 description#" with only 16 d-registers and no double precision", 72 !foreach(v, prev, !cast<SubtargetFeature>(v # "_D16_SP")) # 73 !foreach(v, vfp2prev, !cast<SubtargetFeature>(v # "_SP")) # 74 otherimplies>; 75 def _SP: SubtargetFeature< 76 name#"sp", query#"SP", "true", 77 description#" with no double precision", 78 !foreach(v, prev, !cast<SubtargetFeature>(v # "_SP")) # 79 otherimplies # [FeatureD32, !cast<SubtargetFeature>(NAME # "_D16_SP")]>; 80 def _D16: SubtargetFeature< 81 name#"d16", query#"D16", "true", 82 description#" with only 16 d-registers", 83 !foreach(v, prev, !cast<SubtargetFeature>(v # "_D16")) # 84 vfp2prev # 85 otherimplies # [FeatureFP64, !cast<SubtargetFeature>(NAME # "_D16_SP")]>; 86 def "": SubtargetFeature< 87 name, query, "true", description, 88 prev # otherimplies # [ 89 !cast<SubtargetFeature>(NAME # "_D16"), 90 !cast<SubtargetFeature>(NAME # "_SP")]>; 91} 92 93def FeatureVFP2_SP : SubtargetFeature<"vfp2sp", "HasVFPv2SP", "true", 94 "Enable VFP2 instructions with " 95 "no double precision", 96 [FeatureFPRegs]>; 97 98def FeatureVFP2 : SubtargetFeature<"vfp2", "HasVFPv2", "true", 99 "Enable VFP2 instructions", 100 [FeatureFP64, FeatureVFP2_SP]>; 101 102defm FeatureVFP3: VFPver<"vfp3", "HasVFPv3", "Enable VFP3 instructions", 103 [], [], [FeatureVFP2]>; 104 105def FeatureNEON : SubtargetFeature<"neon", "HasNEON", "true", 106 "Enable NEON instructions", 107 [FeatureVFP3]>; 108 109// True if subtarget supports half-precision FP conversions. 110def FeatureFP16 : SubtargetFeature<"fp16", "HasFP16", "true", 111 "Enable half-precision " 112 "floating point">; 113 114defm FeatureVFP4: VFPver<"vfp4", "HasVFPv4", "Enable VFP4 instructions", 115 [FeatureVFP3], [FeatureFP16]>; 116 117defm FeatureFPARMv8: VFPver<"fp-armv8", "HasFPARMv8", "Enable ARMv8 FP", 118 [FeatureVFP4], []>; 119 120// True if subtarget supports half-precision FP operations. 121def FeatureFullFP16 : SubtargetFeature<"fullfp16", "HasFullFP16", "true", 122 "Enable full half-precision " 123 "floating point", 124 [FeatureFPARMv8_D16_SP, FeatureFPRegs16]>; 125 126// True if subtarget supports half-precision FP fml operations. 127def FeatureFP16FML : SubtargetFeature<"fp16fml", "HasFP16FML", "true", 128 "Enable full half-precision " 129 "floating point fml instructions", 130 [FeatureFullFP16]>; 131 132// True if subtarget supports [su]div in Thumb mode. 133def FeatureHWDivThumb : SubtargetFeature<"hwdiv", 134 "HasDivideInThumbMode", "true", 135 "Enable divide instructions in Thumb">; 136 137// True if subtarget supports [su]div in ARM mode. 138def FeatureHWDivARM : SubtargetFeature<"hwdiv-arm", 139 "HasDivideInARMMode", "true", 140 "Enable divide instructions in ARM mode">; 141 142// Atomic Support 143 144// True if the subtarget supports DMB / DSB data barrier instructions. 145def FeatureDB : SubtargetFeature<"db", "HasDataBarrier", "true", 146 "Has data barrier (dmb/dsb) instructions">; 147 148// True if the subtarget supports CLREX instructions. 149def FeatureV7Clrex : SubtargetFeature<"v7clrex", "HasV7Clrex", "true", 150 "Has v7 clrex instruction">; 151 152// True if the subtarget supports DFB data barrier instruction. 153def FeatureDFB : SubtargetFeature<"dfb", "HasFullDataBarrier", "true", 154 "Has full data barrier (dfb) instruction">; 155 156// True if the subtarget supports v8 atomics (LDA/LDAEX etc) instructions. 157def FeatureAcquireRelease : SubtargetFeature<"acquire-release", 158 "HasAcquireRelease", "true", 159 "Has v8 acquire/release (lda/ldaex " 160 " etc) instructions">; 161 162 163// True if floating point compare + branch is slow. 164def FeatureSlowFPBrcc : SubtargetFeature<"slow-fp-brcc", "IsFPBrccSlow", "true", 165 "FP compare + branch is slow">; 166 167// True if the processor supports the Performance Monitor Extensions. These 168// include a generic cycle-counter as well as more fine-grained (often 169// implementation-specific) events. 170def FeaturePerfMon : SubtargetFeature<"perfmon", "HasPerfMon", "true", 171 "Enable support for Performance " 172 "Monitor extensions">; 173 174 175// TrustZone Security Extensions 176 177// True if processor supports TrustZone security extensions. 178def FeatureTrustZone : SubtargetFeature<"trustzone", "HasTrustZone", "true", 179 "Enable support for TrustZone " 180 "security extensions">; 181 182// True if processor supports ARMv8-M Security Extensions. 183def Feature8MSecExt : SubtargetFeature<"8msecext", "Has8MSecExt", "true", 184 "Enable support for ARMv8-M " 185 "Security Extensions">; 186 187// True if processor supports SHA1 and SHA256. 188def FeatureSHA2 : SubtargetFeature<"sha2", "HasSHA2", "true", 189 "Enable SHA1 and SHA256 support", [FeatureNEON]>; 190 191def FeatureAES : SubtargetFeature<"aes", "HasAES", "true", 192 "Enable AES support", [FeatureNEON]>; 193 194// True if processor supports Cryptography extensions. 195def FeatureCrypto : SubtargetFeature<"crypto", "HasCrypto", "true", 196 "Enable support for " 197 "Cryptography extensions", 198 [FeatureNEON, FeatureSHA2, FeatureAES]>; 199 200// True if processor supports CRC instructions. 201def FeatureCRC : SubtargetFeature<"crc", "HasCRC", "true", 202 "Enable support for CRC instructions">; 203 204// True if the ARMv8.2A dot product instructions are supported. 205def FeatureDotProd : SubtargetFeature<"dotprod", "HasDotProd", "true", 206 "Enable support for dot product instructions", 207 [FeatureNEON]>; 208 209// True if the processor supports RAS extensions. 210// Not to be confused with FeatureHasRetAddrStack (return address stack). 211def FeatureRAS : SubtargetFeature<"ras", "HasRAS", "true", 212 "Enable Reliability, Availability " 213 "and Serviceability extensions">; 214 215// Fast computation of non-negative address offsets. 216// True if processor does positive address offset computation faster. 217def FeatureFPAO : SubtargetFeature<"fpao", "HasFPAO", "true", 218 "Enable fast computation of " 219 "positive address offsets">; 220 221// Fast execution of AES crypto operations. 222// True if processor executes back to back AES instruction pairs faster. 223def FeatureFuseAES : SubtargetFeature<"fuse-aes", "HasFuseAES", "true", 224 "CPU fuses AES crypto operations">; 225 226// Fast execution of bottom and top halves of literal generation. 227// True if processor executes back to back bottom and top halves of literal generation faster. 228def FeatureFuseLiterals : SubtargetFeature<"fuse-literals", "HasFuseLiterals", "true", 229 "CPU fuses literal generation operations">; 230 231// The way of reading thread pointer. 232// True if read thread pointer from coprocessor register. 233def FeatureReadTp : SubtargetFeature<"read-tp-hard", "IsReadTPHard", "true", 234 "Reading thread pointer from register">; 235 236// Cyclone can zero VFP registers in 0 cycles. 237// True if the instructions "vmov.i32 d0, #0" and "vmov.i32 q0, #0" are 238// particularly effective at zeroing a VFP register. 239def FeatureZCZeroing : SubtargetFeature<"zcz", "HasZeroCycleZeroing", "true", 240 "Has zero-cycle zeroing instructions">; 241 242// Whether it is profitable to unpredicate certain instructions during if-conversion. 243// True if if conversion may decide to leave some instructions unpredicated. 244def FeatureProfUnpredicate : SubtargetFeature<"prof-unpr", 245 "IsProfitableToUnpredicate", "true", 246 "Is profitable to unpredicate">; 247 248// Some targets (e.g. Swift) have microcoded VGETLNi32. 249// True if VMOV will be favored over VGETLNi32. 250def FeatureSlowVGETLNi32 : SubtargetFeature<"slow-vgetlni32", 251 "HasSlowVGETLNi32", "true", 252 "Has slow VGETLNi32 - prefer VMOV">; 253 254// Some targets (e.g. Swift) have microcoded VDUP32. 255// True if VMOV will be favored over VDUP. 256def FeatureSlowVDUP32 : SubtargetFeature<"slow-vdup32", "HasSlowVDUP32", 257 "true", 258 "Has slow VDUP32 - prefer VMOV">; 259 260// Some targets (e.g. Cortex-A9) prefer VMOVSR to VMOVDRR even when using NEON 261// for scalar FP, as this allows more effective execution domain optimization. 262// True if VMOVSR will be favored over VMOVDRR. 263def FeaturePreferVMOVSR : SubtargetFeature<"prefer-vmovsr", "PreferVMOVSR", 264 "true", "Prefer VMOVSR">; 265 266// Swift has ISHST barriers compatible with Atomic Release semantics but weaker 267// than ISH. 268// True if ISHST barriers will be used for Release semantics. 269def FeaturePrefISHSTBarrier : SubtargetFeature<"prefer-ishst", "PreferISHSTBarriers", 270 "true", "Prefer ISHST barriers">; 271 272// Some targets (e.g. Cortex-A9) have muxed AGU and NEON/FPU. 273// True if the AGU and NEON/FPU units are multiplexed. 274def FeatureMuxedUnits : SubtargetFeature<"muxed-units", "HasMuxedUnits", 275 "true", 276 "Has muxed AGU and NEON/FPU">; 277 278// Whether VLDM/VSTM starting with odd register number need more microops 279// than single VLDRS. 280// True if a VLDM/VSTM starting with an odd register number is considered to 281// take more microops than single VLDRS/VSTRS. 282def FeatureSlowOddRegister : SubtargetFeature<"slow-odd-reg", "HasSlowOddRegister", 283 "true", "VLDM/VSTM starting " 284 "with an odd register is slow">; 285 286// Some targets have a renaming dependency when loading into D subregisters. 287// True if loading into a D subregister will be penalized. 288def FeatureSlowLoadDSubreg : SubtargetFeature<"slow-load-D-subreg", 289 "HasSlowLoadDSubregister", "true", 290 "Loading into D subregs is slow">; 291 292// True if use a wider stride when allocating VFP registers. 293def FeatureUseWideStrideVFP : SubtargetFeature<"wide-stride-vfp", 294 "UseWideStrideVFP", "true", 295 "Use a wide stride when allocating VFP registers">; 296 297// Some targets (e.g. Cortex-A15) never want VMOVS to be widened to VMOVD. 298// True if VMOVS will never be widened to VMOVD. 299def FeatureDontWidenVMOVS : SubtargetFeature<"dont-widen-vmovs", 300 "DontWidenVMOVS", "true", 301 "Don't widen VMOVS to VMOVD">; 302 303// Some targets (e.g. Cortex-A15) prefer to avoid mixing operations on different 304// VFP register widths. 305// True if splat a register between VFP and NEON instructions. 306def FeatureSplatVFPToNeon : SubtargetFeature<"splat-vfp-neon", 307 "UseSplatVFPToNeon", "true", 308 "Splat register from VFP to NEON", 309 [FeatureDontWidenVMOVS]>; 310 311// Whether or not it is profitable to expand VFP/NEON MLA/MLS instructions. 312// True if run the MLx expansion pass. 313def FeatureExpandMLx : SubtargetFeature<"expand-fp-mlx", 314 "ExpandMLx", "true", 315 "Expand VFP/NEON MLA/MLS instructions">; 316 317// Some targets have special RAW hazards for VFP/NEON VMLA/VMLS. 318// True if VFP/NEON VMLA/VMLS have special RAW hazards. 319def FeatureHasVMLxHazards : SubtargetFeature<"vmlx-hazards", "HasVMLxHazards", 320 "true", "Has VMLx hazards">; 321 322// Some targets (e.g. Cortex-A9) want to convert VMOVRS, VMOVSR and VMOVS from 323// VFP to NEON, as an execution domain optimization. 324// True if VMOVRS, VMOVSR and VMOVS will be converted from VFP to NEON. 325def FeatureNEONForFPMovs : SubtargetFeature<"neon-fpmovs", 326 "UseNEONForFPMovs", "true", 327 "Convert VMOVSR, VMOVRS, " 328 "VMOVS to NEON">; 329 330// Some processors benefit from using NEON instructions for scalar 331// single-precision FP operations. This affects instruction selection and should 332// only be enabled if the handling of denormals is not important. 333// Use the method useNEONForSinglePrecisionFP() to determine if NEON should actually be used. 334def FeatureNEONForFP : SubtargetFeature<"neonfp", 335 "HasNEONForFP", 336 "true", 337 "Use NEON for single precision FP">; 338 339// On some processors, VLDn instructions that access unaligned data take one 340// extra cycle. Take that into account when computing operand latencies. 341// True if VLDn instructions take an extra cycle for unaligned accesses. 342def FeatureCheckVLDnAlign : SubtargetFeature<"vldn-align", "CheckVLDnAccessAlignment", 343 "true", 344 "Check for VLDn unaligned access">; 345 346// Some processors have a nonpipelined VFP coprocessor. 347// True if VFP instructions are not pipelined. 348def FeatureNonpipelinedVFP : SubtargetFeature<"nonpipelined-vfp", 349 "NonpipelinedVFP", "true", 350 "VFP instructions are not pipelined">; 351 352// Some processors have FP multiply-accumulate instructions that don't 353// play nicely with other VFP / NEON instructions, and it's generally better 354// to just not use them. 355// If the VFP2 / NEON instructions are available, indicates 356// whether the FP VML[AS] instructions are slow (if so, don't use them). 357def FeatureHasSlowFPVMLx : SubtargetFeature<"slowfpvmlx", "SlowFPVMLx", "true", 358 "Disable VFP / NEON MAC instructions">; 359 360// VFPv4 added VFMA instructions that can similarly be fast or slow. 361// If the VFP4 / NEON instructions are available, indicates 362// whether the FP VFM[AS] instructions are slow (if so, don't use them). 363def FeatureHasSlowFPVFMx : SubtargetFeature<"slowfpvfmx", "SlowFPVFMx", "true", 364 "Disable VFP / NEON FMA instructions">; 365 366// Cortex-A8 / A9 Advanced SIMD has multiplier accumulator forwarding. 367/// True if NEON has special multiplier accumulator 368/// forwarding to allow mul + mla being issued back to back. 369def FeatureVMLxForwarding : SubtargetFeature<"vmlx-forwarding", 370 "HasVMLxForwarding", "true", 371 "Has multiplier accumulator forwarding">; 372 373// Disable 32-bit to 16-bit narrowing for experimentation. 374// True if codegen would prefer 32-bit Thumb instructions over 16-bit ones. 375def FeaturePref32BitThumb : SubtargetFeature<"32bit", "Prefers32BitThumb", "true", 376 "Prefer 32-bit Thumb instrs">; 377 378def FeaturePrefLoopAlign32 : SubtargetFeature<"loop-align", "PrefLoopLogAlignment","2", 379 "Prefer 32-bit alignment for loops">; 380 381def FeatureMVEVectorCostFactor1 : SubtargetFeature<"mve1beat", "MVEVectorCostFactor", "4", 382 "Model MVE instructions as a 1 beat per tick architecture">; 383 384def FeatureMVEVectorCostFactor2 : SubtargetFeature<"mve2beat", "MVEVectorCostFactor", "2", 385 "Model MVE instructions as a 2 beats per tick architecture">; 386 387def FeatureMVEVectorCostFactor4 : SubtargetFeature<"mve4beat", "MVEVectorCostFactor", "1", 388 "Model MVE instructions as a 4 beats per tick architecture">; 389 390/// Some instructions update CPSR partially, which can add false dependency for 391/// out-of-order implementation, e.g. Cortex-A9, unless each individual bit is 392/// mapped to a separate physical register. Avoid partial CPSR update for these 393/// processors. 394/// True if codegen would avoid using instructions 395/// that partially update CPSR and add false dependency on the previous 396/// CPSR setting instruction. 397def FeatureAvoidPartialCPSR : SubtargetFeature<"avoid-partial-cpsr", 398 "AvoidCPSRPartialUpdate", "true", 399 "Avoid CPSR partial update for OOO execution">; 400 401/// Disable +1 predication cost for instructions updating CPSR. 402/// Enabled for Cortex-A57. 403/// True if disable +1 predication cost for instructions updating CPSR. Enabled for Cortex-A57. 404def FeatureCheapPredicableCPSR : SubtargetFeature<"cheap-predicable-cpsr", 405 "CheapPredicableCPSRDef", 406 "true", 407 "Disable +1 predication cost for instructions updating CPSR">; 408 409// True if codegen should avoid using flag setting movs with shifter operand (i.e. asr, lsl, lsr). 410def FeatureAvoidMOVsShOp : SubtargetFeature<"avoid-movs-shop", 411 "AvoidMOVsShifterOperand", "true", 412 "Avoid movs instructions with " 413 "shifter operand">; 414 415// Some processors perform return stack prediction. CodeGen should avoid issue 416// "normal" call instructions to callees which do not return. 417def FeatureHasRetAddrStack : SubtargetFeature<"ret-addr-stack", 418 "HasRetAddrStack", "true", 419 "Has return address stack">; 420 421// Some processors have no branch predictor, which changes the expected cost of 422// taking a branch which affects the choice of whether to use predicated 423// instructions. 424// True if the subtarget has a branch predictor. Having 425// a branch predictor or not changes the expected cost of taking a branch 426// which affects the choice of whether to use predicated instructions. 427def FeatureHasNoBranchPredictor : SubtargetFeature<"no-branch-predictor", 428 "HasBranchPredictor", "false", 429 "Has no branch predictor">; 430 431/// DSP extension. 432/// True if the subtarget supports the DSP (saturating arith and such) instructions. 433def FeatureDSP : SubtargetFeature<"dsp", "HasDSP", "true", 434 "Supports DSP instructions in " 435 "ARM and/or Thumb2">; 436 437// True if the subtarget supports Multiprocessing extension (ARMv7 only). 438def FeatureMP : SubtargetFeature<"mp", "HasMPExtension", "true", 439 "Supports Multiprocessing extension">; 440 441// Virtualization extension - requires HW divide (ARMv7-AR ARMARM - 4.4.8). 442def FeatureVirtualization : SubtargetFeature<"virtualization", 443 "HasVirtualization", "true", 444 "Supports Virtualization extension", 445 [FeatureHWDivThumb, FeatureHWDivARM]>; 446 447// Special TRAP encoding for NaCl, which looks like a TRAP in Thumb too. 448// See ARMInstrInfo.td for details. 449// True if NaCl TRAP instruction is generated instead of the regular TRAP. 450def FeatureNaClTrap : SubtargetFeature<"nacl-trap", "UseNaClTrap", "true", 451 "NaCl trap">; 452 453// True if the subtarget disallows unaligned memory 454// accesses for some types. For details, see 455// ARMTargetLowering::allowsMisalignedMemoryAccesses(). 456def FeatureStrictAlign : SubtargetFeature<"strict-align", 457 "StrictAlign", "true", 458 "Disallow all unaligned memory " 459 "access">; 460 461// Generate calls via indirect call instructions. 462def FeatureLongCalls : SubtargetFeature<"long-calls", "GenLongCalls", "true", 463 "Generate calls via indirect call " 464 "instructions">; 465 466// Generate code that does not contain data access to code sections. 467def FeatureExecuteOnly : SubtargetFeature<"execute-only", 468 "GenExecuteOnly", "true", 469 "Enable the generation of " 470 "execute only code.">; 471 472// True if R9 is not available as a general purpose register. 473def FeatureReserveR9 : SubtargetFeature<"reserve-r9", "ReserveR9", "true", 474 "Reserve R9, making it unavailable" 475 " as GPR">; 476 477// True if MOVT / MOVW pairs are not used for materialization of 478// 32-bit imms (including global addresses). 479def FeatureNoMovt : SubtargetFeature<"no-movt", "NoMovt", "true", 480 "Don't use movt/movw pairs for " 481 "32-bit imms">; 482 483/// Implicitly convert an instruction to a different one if its immediates 484/// cannot be encoded. For example, ADD r0, r1, #FFFFFFFF -> SUB r0, r1, #1. 485def FeatureNoNegativeImmediates 486 : SubtargetFeature<"no-neg-immediates", 487 "NegativeImmediates", "false", 488 "Convert immediates and instructions " 489 "to their negated or complemented " 490 "equivalent when the immediate does " 491 "not fit in the encoding.">; 492 493// Use the MachineScheduler for instruction scheduling for the subtarget. 494def FeatureUseMISched: SubtargetFeature<"use-misched", "UseMISched", "true", 495 "Use the MachineScheduler">; 496 497// Use the MachinePipeliner for instruction scheduling for the subtarget. 498def FeatureUseMIPipeliner: SubtargetFeature<"use-mipipeliner", "UseMIPipeliner", "true", 499 "Use the MachinePipeliner">; 500 501// False if scheduling should happen again after register allocation. 502def FeatureNoPostRASched : SubtargetFeature<"disable-postra-scheduler", 503 "DisablePostRAScheduler", "true", 504 "Don't schedule again after register allocation">; 505 506// Armv8.5-A extensions 507 508// Has speculation barrier. 509def FeatureSB : SubtargetFeature<"sb", "HasSB", "true", 510 "Enable v8.5a Speculation Barrier" >; 511 512// Armv8.6-A extensions 513 514// True if subtarget supports BFloat16 floating point operations. 515def FeatureBF16 : SubtargetFeature<"bf16", "HasBF16", "true", 516 "Enable support for BFloat16 instructions", [FeatureNEON]>; 517 518// True if subtarget supports 8-bit integer matrix multiply. 519def FeatureMatMulInt8 : SubtargetFeature<"i8mm", "HasMatMulInt8", 520 "true", "Enable Matrix Multiply Int8 Extension", [FeatureNEON]>; 521 522// Armv8.1-M extensions 523 524// True if the processor supports the Low Overhead Branch extension. 525def FeatureLOB : SubtargetFeature<"lob", "HasLOB", "true", 526 "Enable Low Overhead Branch " 527 "extensions">; 528 529// Mitigate against the cve-2021-35465 security vulnurability. 530def FeatureFixCMSE_CVE_2021_35465 : SubtargetFeature<"fix-cmse-cve-2021-35465", 531 "FixCMSE_CVE_2021_35465", "true", 532 "Mitigate against the cve-2021-35465 " 533 "security vulnurability">; 534 535def FeaturePACBTI : SubtargetFeature<"pacbti", "HasPACBTI", "true", 536 "Enable Pointer Authentication and Branch " 537 "Target Identification">; 538 539/// Don't place a BTI instruction after return-twice constructs (setjmp). 540def FeatureNoBTIAtReturnTwice : SubtargetFeature<"no-bti-at-return-twice", 541 "NoBTIAtReturnTwice", "true", 542 "Don't place a BTI instruction " 543 "after a return-twice">; 544 545// Armv8.9-A/Armv9.4-A 2022 Architecture Extensions 546def FeatureCLRBHB : SubtargetFeature<"clrbhb", "HasCLRBHB", "true", 547 "Enable Clear BHB instruction">; 548 549 550def FeatureFixCortexA57AES1742098 : SubtargetFeature<"fix-cortex-a57-aes-1742098", 551 "FixCortexA57AES1742098", "true", 552 "Work around Cortex-A57 Erratum 1742098 / Cortex-A72 Erratum 1655431 (AES)">; 553 554def FeatureAAPCSFrameChain : SubtargetFeature<"aapcs-frame-chain", 555 "CreateAAPCSFrameChain", "true", 556 "Create an AAPCS compliant frame chain">; 557 558def FeatureAAPCSFrameChainLeaf : SubtargetFeature<"aapcs-frame-chain-leaf", 559 "CreateAAPCSFrameChainLeaf", "true", 560 "Create an AAPCS compliant frame chain " 561 "for leaf functions", 562 [FeatureAAPCSFrameChain]>; 563 564// Assume that lock-free 32-bit atomics are available, even if the target 565// and operating system combination would not usually provide them. The user 566// is responsible for providing any necessary __sync implementations. Code 567// built with this feature is not ABI-compatible with code built without this 568// feature, if atomic variables are exposed across the ABI boundary. 569def FeatureAtomics32 : SubtargetFeature< 570 "atomics-32", "HasForced32BitAtomics", "true", 571 "Assume that lock-free 32-bit atomics are available">; 572 573//===----------------------------------------------------------------------===// 574// ARM architecture class 575// 576 577// A-series ISA 578def FeatureAClass : SubtargetFeature<"aclass", "ARMProcClass", "AClass", 579 "Is application profile ('A' series)">; 580 581// R-series ISA 582def FeatureRClass : SubtargetFeature<"rclass", "ARMProcClass", "RClass", 583 "Is realtime profile ('R' series)">; 584 585// M-series ISA 586def FeatureMClass : SubtargetFeature<"mclass", "ARMProcClass", "MClass", 587 "Is microcontroller profile ('M' series)">; 588 589// True if Thumb2 instructions are supported. 590def FeatureThumb2 : SubtargetFeature<"thumb2", "HasThumb2", "true", 591 "Enable Thumb2 instructions">; 592 593// True if subtarget does not support ARM mode execution. 594def FeatureNoARM : SubtargetFeature<"noarm", "NoARM", "true", 595 "Does not support ARM mode execution">; 596 597//===----------------------------------------------------------------------===// 598// ARM ISAa. 599// 600// Specify whether target support specific ARM ISA variants. 601 602def HasV4TOps : SubtargetFeature<"v4t", "HasV4TOps", "true", 603 "Support ARM v4T instructions">; 604 605def HasV5TOps : SubtargetFeature<"v5t", "HasV5TOps", "true", 606 "Support ARM v5T instructions", 607 [HasV4TOps]>; 608 609def HasV5TEOps : SubtargetFeature<"v5te", "HasV5TEOps", "true", 610 "Support ARM v5TE, v5TEj, and " 611 "v5TExp instructions", 612 [HasV5TOps]>; 613 614def HasV6Ops : SubtargetFeature<"v6", "HasV6Ops", "true", 615 "Support ARM v6 instructions", 616 [HasV5TEOps]>; 617 618def HasV6MOps : SubtargetFeature<"v6m", "HasV6MOps", "true", 619 "Support ARM v6M instructions", 620 [HasV6Ops]>; 621 622def HasV8MBaselineOps : SubtargetFeature<"v8m", "HasV8MBaselineOps", "true", 623 "Support ARM v8M Baseline instructions", 624 [HasV6MOps]>; 625 626def HasV6KOps : SubtargetFeature<"v6k", "HasV6KOps", "true", 627 "Support ARM v6k instructions", 628 [HasV6Ops]>; 629 630def HasV6T2Ops : SubtargetFeature<"v6t2", "HasV6T2Ops", "true", 631 "Support ARM v6t2 instructions", 632 [HasV8MBaselineOps, HasV6KOps, FeatureThumb2]>; 633 634def HasV7Ops : SubtargetFeature<"v7", "HasV7Ops", "true", 635 "Support ARM v7 instructions", 636 [HasV6T2Ops, FeatureV7Clrex]>; 637 638def HasV8MMainlineOps : 639 SubtargetFeature<"v8m.main", "HasV8MMainlineOps", "true", 640 "Support ARM v8M Mainline instructions", 641 [HasV7Ops]>; 642 643def HasV8Ops : SubtargetFeature<"v8", "HasV8Ops", "true", 644 "Support ARM v8 instructions", 645 [HasV7Ops, FeaturePerfMon, FeatureAcquireRelease]>; 646 647def HasV8_1aOps : SubtargetFeature<"v8.1a", "HasV8_1aOps", "true", 648 "Support ARM v8.1a instructions", 649 [HasV8Ops]>; 650 651def HasV8_2aOps : SubtargetFeature<"v8.2a", "HasV8_2aOps", "true", 652 "Support ARM v8.2a instructions", 653 [HasV8_1aOps]>; 654 655def HasV8_3aOps : SubtargetFeature<"v8.3a", "HasV8_3aOps", "true", 656 "Support ARM v8.3a instructions", 657 [HasV8_2aOps]>; 658 659def HasV8_4aOps : SubtargetFeature<"v8.4a", "HasV8_4aOps", "true", 660 "Support ARM v8.4a instructions", 661 [HasV8_3aOps, FeatureDotProd]>; 662 663def HasV8_5aOps : SubtargetFeature<"v8.5a", "HasV8_5aOps", "true", 664 "Support ARM v8.5a instructions", 665 [HasV8_4aOps, FeatureSB]>; 666 667def HasV8_6aOps : SubtargetFeature<"v8.6a", "HasV8_6aOps", "true", 668 "Support ARM v8.6a instructions", 669 [HasV8_5aOps, FeatureBF16, 670 FeatureMatMulInt8]>; 671 672def HasV8_7aOps : SubtargetFeature<"v8.7a", "HasV8_7aOps", "true", 673 "Support ARM v8.7a instructions", 674 [HasV8_6aOps]>; 675 676def HasV8_8aOps : SubtargetFeature<"v8.8a", "HasV8_8aOps", "true", 677 "Support ARM v8.8a instructions", 678 [HasV8_7aOps]>; 679 680def HasV8_9aOps : SubtargetFeature<"v8.9a", "HasV8_9aOps", "true", 681 "Support ARM v8.9a instructions", 682 [HasV8_8aOps, FeatureCLRBHB]>; 683 684def HasV9_0aOps : SubtargetFeature<"v9a", "HasV9_0aOps", "true", 685 "Support ARM v9a instructions", 686 [HasV8_5aOps]>; 687 688def HasV9_1aOps : SubtargetFeature<"v9.1a", "HasV9_1aOps", "true", 689 "Support ARM v9.1a instructions", 690 [HasV8_6aOps, HasV9_0aOps]>; 691 692def HasV9_2aOps : SubtargetFeature<"v9.2a", "HasV9_2aOps", "true", 693 "Support ARM v9.2a instructions", 694 [HasV8_7aOps, HasV9_1aOps]>; 695 696def HasV9_3aOps : SubtargetFeature<"v9.3a", "HasV9_3aOps", "true", 697 "Support ARM v9.3a instructions", 698 [HasV8_8aOps, HasV9_2aOps]>; 699 700def HasV9_4aOps : SubtargetFeature<"v9.4a", "HasV9_4aOps", "true", 701 "Support ARM v9.4a instructions", 702 [HasV8_9aOps, HasV9_3aOps]>; 703 704def HasV8_1MMainlineOps : SubtargetFeature< 705 "v8.1m.main", "HasV8_1MMainlineOps", "true", 706 "Support ARM v8-1M Mainline instructions", 707 [HasV8MMainlineOps]>; 708def HasMVEIntegerOps : SubtargetFeature< 709 "mve", "HasMVEIntegerOps", "true", 710 "Support M-Class Vector Extension with integer ops", 711 [HasV8_1MMainlineOps, FeatureDSP, FeatureFPRegs16, FeatureFPRegs64]>; 712def HasMVEFloatOps : SubtargetFeature< 713 "mve.fp", "HasMVEFloatOps", "true", 714 "Support M-Class Vector Extension with integer and floating ops", 715 [HasMVEIntegerOps, FeatureFPARMv8_D16_SP, FeatureFullFP16]>; 716 717def HasCDEOps : SubtargetFeature<"cde", "HasCDEOps", "true", 718 "Support CDE instructions", 719 [HasV8MMainlineOps]>; 720 721foreach i = {0-7} in 722 def FeatureCoprocCDE#i : SubtargetFeature<"cdecp"#i, 723 "CoprocCDE["#i#"]", "true", 724 "Coprocessor "#i#" ISA is CDEv1", 725 [HasCDEOps]>; 726 727//===----------------------------------------------------------------------===// 728// Control codegen mitigation against Straight Line Speculation vulnerability. 729//===----------------------------------------------------------------------===// 730 731/// Harden against Straight Line Speculation for Returns and Indirect Branches. 732def FeatureHardenSlsRetBr : SubtargetFeature<"harden-sls-retbr", 733 "HardenSlsRetBr", "true", 734 "Harden against straight line speculation across RETurn and BranchRegister " 735 "instructions">; 736/// Harden against Straight Line Speculation for indirect calls. 737def FeatureHardenSlsBlr : SubtargetFeature<"harden-sls-blr", 738 "HardenSlsBlr", "true", 739 "Harden against straight line speculation across indirect calls">; 740/// Generate thunk code for SLS mitigation in the normal text section. 741def FeatureHardenSlsNoComdat : SubtargetFeature<"harden-sls-nocomdat", 742 "HardenSlsNoComdat", "true", 743 "Generate thunk code for SLS mitigation in the normal text section">; 744 745//===----------------------------------------------------------------------===// 746// Endianness of instruction encodings in memory. 747// 748// In the current Arm architecture, this is usually little-endian regardless of 749// data endianness. But before Armv7 it was typical for instruction endianness 750// to match data endianness, so that a big-endian system was consistently big- 751// endian. And Armv7-R can be configured to use big-endian instructions. 752// 753// Additionally, even when targeting Armv7-A, big-endian instructions can be 754// found in relocatable object files, because the Arm ABI specifies that the 755// linker byte-reverses them depending on the target architecture. 756// 757// So we have a feature here to indicate that instructions are stored big- 758// endian, which you can set when instantiating an MCDisassembler. 759def ModeBigEndianInstructions : SubtargetFeature<"big-endian-instructions", 760 "BigEndianInstructions", "true", 761 "Expect instructions to be stored big-endian.">; 762 763//===----------------------------------------------------------------------===// 764// ARM Processor subtarget features. 765// 766 767def ProcA5 : SubtargetFeature<"a5", "ARMProcFamily", "CortexA5", 768 "Cortex-A5 ARM processors", []>; 769def ProcA7 : SubtargetFeature<"a7", "ARMProcFamily", "CortexA7", 770 "Cortex-A7 ARM processors", []>; 771def ProcA8 : SubtargetFeature<"a8", "ARMProcFamily", "CortexA8", 772 "Cortex-A8 ARM processors", []>; 773def ProcA9 : SubtargetFeature<"a9", "ARMProcFamily", "CortexA9", 774 "Cortex-A9 ARM processors", []>; 775def ProcA12 : SubtargetFeature<"a12", "ARMProcFamily", "CortexA12", 776 "Cortex-A12 ARM processors", []>; 777def ProcA15 : SubtargetFeature<"a15", "ARMProcFamily", "CortexA15", 778 "Cortex-A15 ARM processors", []>; 779def ProcA17 : SubtargetFeature<"a17", "ARMProcFamily", "CortexA17", 780 "Cortex-A17 ARM processors", []>; 781def ProcA32 : SubtargetFeature<"a32", "ARMProcFamily", "CortexA32", 782 "Cortex-A32 ARM processors", []>; 783def ProcA35 : SubtargetFeature<"a35", "ARMProcFamily", "CortexA35", 784 "Cortex-A35 ARM processors", []>; 785def ProcA53 : SubtargetFeature<"a53", "ARMProcFamily", "CortexA53", 786 "Cortex-A53 ARM processors", []>; 787def ProcA55 : SubtargetFeature<"a55", "ARMProcFamily", "CortexA55", 788 "Cortex-A55 ARM processors", []>; 789def ProcA57 : SubtargetFeature<"a57", "ARMProcFamily", "CortexA57", 790 "Cortex-A57 ARM processors", []>; 791def ProcA72 : SubtargetFeature<"a72", "ARMProcFamily", "CortexA72", 792 "Cortex-A72 ARM processors", []>; 793def ProcA73 : SubtargetFeature<"a73", "ARMProcFamily", "CortexA73", 794 "Cortex-A73 ARM processors", []>; 795def ProcA75 : SubtargetFeature<"a75", "ARMProcFamily", "CortexA75", 796 "Cortex-A75 ARM processors", []>; 797def ProcA76 : SubtargetFeature<"a76", "ARMProcFamily", "CortexA76", 798 "Cortex-A76 ARM processors", []>; 799def ProcA77 : SubtargetFeature<"a77", "ARMProcFamily", "CortexA77", 800 "Cortex-A77 ARM processors", []>; 801def ProcA78 : SubtargetFeature<"cortex-a78", "ARMProcFamily", "CortexA78", 802 "Cortex-A78 ARM processors", []>; 803def ProcA78C : SubtargetFeature<"a78c", "ARMProcFamily", "CortexA78C", 804 "Cortex-A78C ARM processors", []>; 805def ProcA710 : SubtargetFeature<"cortex-a710", "ARMProcFamily", 806 "CortexA710", "Cortex-A710 ARM processors", []>; 807def ProcX1 : SubtargetFeature<"cortex-x1", "ARMProcFamily", "CortexX1", 808 "Cortex-X1 ARM processors", []>; 809def ProcX1C : SubtargetFeature<"cortex-x1c", "ARMProcFamily", "CortexX1C", 810 "Cortex-X1C ARM processors", []>; 811 812def ProcV1 : SubtargetFeature<"neoverse-v1", "ARMProcFamily", 813 "NeoverseV1", "Neoverse-V1 ARM processors", []>; 814 815def ProcKrait : SubtargetFeature<"krait", "ARMProcFamily", "Krait", 816 "Qualcomm Krait processors", []>; 817def ProcKryo : SubtargetFeature<"kryo", "ARMProcFamily", "Kryo", 818 "Qualcomm Kryo processors", []>; 819def ProcSwift : SubtargetFeature<"swift", "ARMProcFamily", "Swift", 820 "Swift ARM processors", []>; 821 822def ProcExynos : SubtargetFeature<"exynos", "ARMProcFamily", "Exynos", 823 "Samsung Exynos processors", 824 [FeatureZCZeroing, 825 FeatureUseWideStrideVFP, 826 FeatureSplatVFPToNeon, 827 FeatureSlowVGETLNi32, 828 FeatureSlowVDUP32, 829 FeatureSlowFPBrcc, 830 FeatureProfUnpredicate, 831 FeatureHWDivThumb, 832 FeatureHWDivARM, 833 FeatureHasSlowFPVMLx, 834 FeatureHasSlowFPVFMx, 835 FeatureHasRetAddrStack, 836 FeatureFuseLiterals, 837 FeatureFuseAES, 838 FeatureExpandMLx, 839 FeatureCrypto, 840 FeatureCRC]>; 841 842def ProcR4 : SubtargetFeature<"r4", "ARMProcFamily", "CortexR4", 843 "Cortex-R4 ARM processors", []>; 844def ProcR5 : SubtargetFeature<"r5", "ARMProcFamily", "CortexR5", 845 "Cortex-R5 ARM processors", []>; 846def ProcR7 : SubtargetFeature<"r7", "ARMProcFamily", "CortexR7", 847 "Cortex-R7 ARM processors", []>; 848def ProcR52 : SubtargetFeature<"r52", "ARMProcFamily", "CortexR52", 849 "Cortex-R52 ARM processors", []>; 850 851def ProcM3 : SubtargetFeature<"m3", "ARMProcFamily", "CortexM3", 852 "Cortex-M3 ARM processors", []>; 853def ProcM7 : SubtargetFeature<"m7", "ARMProcFamily", "CortexM7", 854 "Cortex-M7 ARM processors", []>; 855 856//===----------------------------------------------------------------------===// 857// ARM Helper classes. 858// 859 860class Architecture<string fname, string aname, list<SubtargetFeature> features> 861 : SubtargetFeature<fname, "ARMArch", aname, 862 !strconcat(aname, " architecture"), features>; 863 864class ProcNoItin<string Name, list<SubtargetFeature> Features> 865 : Processor<Name, NoItineraries, Features>; 866 867 868//===----------------------------------------------------------------------===// 869// ARM architectures 870// 871 872def ARMv4 : Architecture<"armv4", "ARMv4", []>; 873 874def ARMv4t : Architecture<"armv4t", "ARMv4t", [HasV4TOps]>; 875 876def ARMv5t : Architecture<"armv5t", "ARMv5t", [HasV5TOps]>; 877 878def ARMv5te : Architecture<"armv5te", "ARMv5te", [HasV5TEOps]>; 879 880def ARMv5tej : Architecture<"armv5tej", "ARMv5tej", [HasV5TEOps]>; 881 882def ARMv6 : Architecture<"armv6", "ARMv6", [HasV6Ops, 883 FeatureDSP]>; 884 885def ARMv6t2 : Architecture<"armv6t2", "ARMv6t2", [HasV6T2Ops, 886 FeatureDSP]>; 887 888def ARMv6k : Architecture<"armv6k", "ARMv6k", [HasV6KOps]>; 889 890def ARMv6kz : Architecture<"armv6kz", "ARMv6kz", [HasV6KOps, 891 FeatureTrustZone]>; 892 893def ARMv6m : Architecture<"armv6-m", "ARMv6m", [HasV6MOps, 894 FeatureNoARM, 895 ModeThumb, 896 FeatureDB, 897 FeatureMClass, 898 FeatureStrictAlign]>; 899 900def ARMv6sm : Architecture<"armv6s-m", "ARMv6sm", [HasV6MOps, 901 FeatureNoARM, 902 ModeThumb, 903 FeatureDB, 904 FeatureMClass, 905 FeatureStrictAlign]>; 906 907def ARMv7a : Architecture<"armv7-a", "ARMv7a", [HasV7Ops, 908 FeatureNEON, 909 FeatureDB, 910 FeatureDSP, 911 FeatureAClass, 912 FeaturePerfMon]>; 913 914def ARMv7ve : Architecture<"armv7ve", "ARMv7ve", [HasV7Ops, 915 FeatureNEON, 916 FeatureDB, 917 FeatureDSP, 918 FeatureTrustZone, 919 FeatureMP, 920 FeatureVirtualization, 921 FeatureAClass, 922 FeaturePerfMon]>; 923 924def ARMv7r : Architecture<"armv7-r", "ARMv7r", [HasV7Ops, 925 FeatureDB, 926 FeatureDSP, 927 FeatureHWDivThumb, 928 FeatureRClass, 929 FeaturePerfMon]>; 930 931def ARMv7m : Architecture<"armv7-m", "ARMv7m", [HasV7Ops, 932 FeatureThumb2, 933 FeatureNoARM, 934 ModeThumb, 935 FeatureDB, 936 FeatureHWDivThumb, 937 FeatureMClass]>; 938 939def ARMv7em : Architecture<"armv7e-m", "ARMv7em", [HasV7Ops, 940 FeatureThumb2, 941 FeatureNoARM, 942 ModeThumb, 943 FeatureDB, 944 FeatureHWDivThumb, 945 FeatureMClass, 946 FeatureDSP]>; 947 948def ARMv8a : Architecture<"armv8-a", "ARMv8a", [HasV8Ops, 949 FeatureAClass, 950 FeatureDB, 951 FeatureFPARMv8, 952 FeatureNEON, 953 FeatureDSP, 954 FeatureTrustZone, 955 FeatureMP, 956 FeatureVirtualization, 957 FeatureCrypto, 958 FeatureCRC]>; 959 960def ARMv81a : Architecture<"armv8.1-a", "ARMv81a", [HasV8_1aOps, 961 FeatureAClass, 962 FeatureDB, 963 FeatureFPARMv8, 964 FeatureNEON, 965 FeatureDSP, 966 FeatureTrustZone, 967 FeatureMP, 968 FeatureVirtualization, 969 FeatureCrypto, 970 FeatureCRC]>; 971 972def ARMv82a : Architecture<"armv8.2-a", "ARMv82a", [HasV8_2aOps, 973 FeatureAClass, 974 FeatureDB, 975 FeatureFPARMv8, 976 FeatureNEON, 977 FeatureDSP, 978 FeatureTrustZone, 979 FeatureMP, 980 FeatureVirtualization, 981 FeatureCrypto, 982 FeatureCRC, 983 FeatureRAS]>; 984 985def ARMv83a : Architecture<"armv8.3-a", "ARMv83a", [HasV8_3aOps, 986 FeatureAClass, 987 FeatureDB, 988 FeatureFPARMv8, 989 FeatureNEON, 990 FeatureDSP, 991 FeatureTrustZone, 992 FeatureMP, 993 FeatureVirtualization, 994 FeatureCrypto, 995 FeatureCRC, 996 FeatureRAS]>; 997 998def ARMv84a : Architecture<"armv8.4-a", "ARMv84a", [HasV8_4aOps, 999 FeatureAClass, 1000 FeatureDB, 1001 FeatureFPARMv8, 1002 FeatureNEON, 1003 FeatureDSP, 1004 FeatureTrustZone, 1005 FeatureMP, 1006 FeatureVirtualization, 1007 FeatureCrypto, 1008 FeatureCRC, 1009 FeatureRAS, 1010 FeatureDotProd]>; 1011 1012def ARMv85a : Architecture<"armv8.5-a", "ARMv85a", [HasV8_5aOps, 1013 FeatureAClass, 1014 FeatureDB, 1015 FeatureFPARMv8, 1016 FeatureNEON, 1017 FeatureDSP, 1018 FeatureTrustZone, 1019 FeatureMP, 1020 FeatureVirtualization, 1021 FeatureCrypto, 1022 FeatureCRC, 1023 FeatureRAS, 1024 FeatureDotProd]>; 1025def ARMv86a : Architecture<"armv8.6-a", "ARMv86a", [HasV8_6aOps, 1026 FeatureAClass, 1027 FeatureDB, 1028 FeatureFPARMv8, 1029 FeatureNEON, 1030 FeatureDSP, 1031 FeatureTrustZone, 1032 FeatureMP, 1033 FeatureVirtualization, 1034 FeatureCrypto, 1035 FeatureCRC, 1036 FeatureRAS, 1037 FeatureDotProd]>; 1038def ARMv87a : Architecture<"armv8.7-a", "ARMv87a", [HasV8_7aOps, 1039 FeatureAClass, 1040 FeatureDB, 1041 FeatureFPARMv8, 1042 FeatureNEON, 1043 FeatureDSP, 1044 FeatureTrustZone, 1045 FeatureMP, 1046 FeatureVirtualization, 1047 FeatureCrypto, 1048 FeatureCRC, 1049 FeatureRAS, 1050 FeatureDotProd]>; 1051def ARMv88a : Architecture<"armv8.8-a", "ARMv88a", [HasV8_8aOps, 1052 FeatureAClass, 1053 FeatureDB, 1054 FeatureFPARMv8, 1055 FeatureNEON, 1056 FeatureDSP, 1057 FeatureTrustZone, 1058 FeatureMP, 1059 FeatureVirtualization, 1060 FeatureCrypto, 1061 FeatureCRC, 1062 FeatureRAS, 1063 FeatureDotProd]>; 1064def ARMv89a : Architecture<"armv8.9-a", "ARMv89a", [HasV8_9aOps, 1065 FeatureAClass, 1066 FeatureDB, 1067 FeatureFPARMv8, 1068 FeatureNEON, 1069 FeatureDSP, 1070 FeatureTrustZone, 1071 FeatureMP, 1072 FeatureVirtualization, 1073 FeatureCrypto, 1074 FeatureCRC, 1075 FeatureRAS, 1076 FeatureDotProd]>; 1077 1078def ARMv9a : Architecture<"armv9-a", "ARMv9a", [HasV9_0aOps, 1079 FeatureAClass, 1080 FeatureDB, 1081 FeatureFPARMv8, 1082 FeatureNEON, 1083 FeatureDSP, 1084 FeatureTrustZone, 1085 FeatureMP, 1086 FeatureVirtualization, 1087 FeatureCRC, 1088 FeatureRAS, 1089 FeatureDotProd]>; 1090def ARMv91a : Architecture<"armv9.1-a", "ARMv91a", [HasV9_1aOps, 1091 FeatureAClass, 1092 FeatureDB, 1093 FeatureFPARMv8, 1094 FeatureNEON, 1095 FeatureDSP, 1096 FeatureTrustZone, 1097 FeatureMP, 1098 FeatureVirtualization, 1099 FeatureCRC, 1100 FeatureRAS, 1101 FeatureDotProd]>; 1102def ARMv92a : Architecture<"armv9.2-a", "ARMv92a", [HasV9_2aOps, 1103 FeatureAClass, 1104 FeatureDB, 1105 FeatureFPARMv8, 1106 FeatureNEON, 1107 FeatureDSP, 1108 FeatureTrustZone, 1109 FeatureMP, 1110 FeatureVirtualization, 1111 FeatureCRC, 1112 FeatureRAS, 1113 FeatureDotProd]>; 1114def ARMv93a : Architecture<"armv9.3-a", "ARMv93a", [HasV9_3aOps, 1115 FeatureAClass, 1116 FeatureDB, 1117 FeatureFPARMv8, 1118 FeatureNEON, 1119 FeatureDSP, 1120 FeatureTrustZone, 1121 FeatureMP, 1122 FeatureVirtualization, 1123 FeatureCrypto, 1124 FeatureCRC, 1125 FeatureRAS, 1126 FeatureDotProd]>; 1127def ARMv94a : Architecture<"armv9.4-a", "ARMv94a", [HasV9_4aOps, 1128 FeatureAClass, 1129 FeatureDB, 1130 FeatureFPARMv8, 1131 FeatureNEON, 1132 FeatureDSP, 1133 FeatureTrustZone, 1134 FeatureMP, 1135 FeatureVirtualization, 1136 FeatureCRC, 1137 FeatureRAS, 1138 FeatureDotProd]>; 1139 1140def ARMv8r : Architecture<"armv8-r", "ARMv8r", [HasV8Ops, 1141 FeatureRClass, 1142 FeatureDB, 1143 FeatureDFB, 1144 FeatureDSP, 1145 FeatureCRC, 1146 FeatureMP, 1147 FeatureVirtualization, 1148 FeatureFPARMv8, 1149 FeatureNEON]>; 1150 1151def ARMv8mBaseline : Architecture<"armv8-m.base", "ARMv8mBaseline", 1152 [HasV8MBaselineOps, 1153 FeatureNoARM, 1154 ModeThumb, 1155 FeatureDB, 1156 FeatureHWDivThumb, 1157 FeatureV7Clrex, 1158 Feature8MSecExt, 1159 FeatureAcquireRelease, 1160 FeatureMClass, 1161 FeatureStrictAlign]>; 1162 1163def ARMv8mMainline : Architecture<"armv8-m.main", "ARMv8mMainline", 1164 [HasV8MMainlineOps, 1165 FeatureNoARM, 1166 ModeThumb, 1167 FeatureDB, 1168 FeatureHWDivThumb, 1169 Feature8MSecExt, 1170 FeatureAcquireRelease, 1171 FeatureMClass]>; 1172 1173def ARMv81mMainline : Architecture<"armv8.1-m.main", "ARMv81mMainline", 1174 [HasV8_1MMainlineOps, 1175 FeatureNoARM, 1176 ModeThumb, 1177 FeatureDB, 1178 FeatureHWDivThumb, 1179 Feature8MSecExt, 1180 FeatureAcquireRelease, 1181 FeatureMClass, 1182 FeatureRAS, 1183 FeatureLOB]>; 1184 1185// Aliases 1186def IWMMXT : Architecture<"iwmmxt", "ARMv5te", [ARMv5te]>; 1187def IWMMXT2 : Architecture<"iwmmxt2", "ARMv5te", [ARMv5te]>; 1188def XScale : Architecture<"xscale", "ARMv5te", [ARMv5te]>; 1189def ARMv6j : Architecture<"armv6j", "ARMv7a", [ARMv6]>; 1190def ARMv7k : Architecture<"armv7k", "ARMv7a", [ARMv7a]>; 1191def ARMv7s : Architecture<"armv7s", "ARMv7a", [ARMv7a]>; 1192 1193//===----------------------------------------------------------------------===// 1194// Register File Description 1195//===----------------------------------------------------------------------===// 1196 1197include "ARMRegisterInfo.td" 1198include "ARMRegisterBanks.td" 1199include "ARMCallingConv.td" 1200 1201//===----------------------------------------------------------------------===// 1202// ARM schedules. 1203//===----------------------------------------------------------------------===// 1204// 1205include "ARMPredicates.td" 1206include "ARMSchedule.td" 1207 1208//===----------------------------------------------------------------------===// 1209// Instruction Descriptions 1210//===----------------------------------------------------------------------===// 1211 1212include "ARMInstrInfo.td" 1213def ARMInstrInfo : InstrInfo; 1214 1215//===----------------------------------------------------------------------===// 1216// ARM schedules 1217// 1218include "ARMScheduleV6.td" 1219include "ARMScheduleA8.td" 1220include "ARMScheduleA9.td" 1221include "ARMScheduleSwift.td" 1222include "ARMScheduleR52.td" 1223include "ARMScheduleA57.td" 1224include "ARMScheduleM4.td" 1225include "ARMScheduleM55.td" 1226include "ARMScheduleM7.td" 1227 1228//===----------------------------------------------------------------------===// 1229// ARM processors 1230// 1231// Dummy CPU, used to target architectures 1232def : ProcessorModel<"generic", CortexA8Model, []>; 1233 1234// FIXME: Several processors below are not using their own scheduler 1235// model, but one of similar/previous processor. These should be fixed. 1236 1237def : ProcNoItin<"arm8", [ARMv4]>; 1238def : ProcNoItin<"arm810", [ARMv4]>; 1239def : ProcNoItin<"strongarm", [ARMv4]>; 1240def : ProcNoItin<"strongarm110", [ARMv4]>; 1241def : ProcNoItin<"strongarm1100", [ARMv4]>; 1242def : ProcNoItin<"strongarm1110", [ARMv4]>; 1243 1244def : ProcNoItin<"arm7tdmi", [ARMv4t]>; 1245def : ProcNoItin<"arm7tdmi-s", [ARMv4t]>; 1246def : ProcNoItin<"arm710t", [ARMv4t]>; 1247def : ProcNoItin<"arm720t", [ARMv4t]>; 1248def : ProcNoItin<"arm9", [ARMv4t]>; 1249def : ProcNoItin<"arm9tdmi", [ARMv4t]>; 1250def : ProcNoItin<"arm920", [ARMv4t]>; 1251def : ProcNoItin<"arm920t", [ARMv4t]>; 1252def : ProcNoItin<"arm922t", [ARMv4t]>; 1253def : ProcNoItin<"arm940t", [ARMv4t]>; 1254def : ProcNoItin<"ep9312", [ARMv4t]>; 1255 1256def : ProcNoItin<"arm10tdmi", [ARMv5t]>; 1257def : ProcNoItin<"arm1020t", [ARMv5t]>; 1258 1259def : ProcNoItin<"arm9e", [ARMv5te]>; 1260def : ProcNoItin<"arm926ej-s", [ARMv5te]>; 1261def : ProcNoItin<"arm946e-s", [ARMv5te]>; 1262def : ProcNoItin<"arm966e-s", [ARMv5te]>; 1263def : ProcNoItin<"arm968e-s", [ARMv5te]>; 1264def : ProcNoItin<"arm10e", [ARMv5te]>; 1265def : ProcNoItin<"arm1020e", [ARMv5te]>; 1266def : ProcNoItin<"arm1022e", [ARMv5te]>; 1267def : ProcNoItin<"xscale", [ARMv5te]>; 1268def : ProcNoItin<"iwmmxt", [ARMv5te]>; 1269 1270def : Processor<"arm1136j-s", ARMV6Itineraries, [ARMv6]>; 1271def : Processor<"arm1136jf-s", ARMV6Itineraries, [ARMv6, 1272 FeatureVFP2, 1273 FeatureHasSlowFPVMLx]>; 1274 1275def : Processor<"cortex-m0", ARMV6Itineraries, [ARMv6m, 1276 FeatureHasNoBranchPredictor]>; 1277def : Processor<"cortex-m0plus", ARMV6Itineraries, [ARMv6m, 1278 FeatureHasNoBranchPredictor]>; 1279def : Processor<"cortex-m1", ARMV6Itineraries, [ARMv6m, 1280 FeatureHasNoBranchPredictor]>; 1281def : Processor<"sc000", ARMV6Itineraries, [ARMv6m, 1282 FeatureHasNoBranchPredictor]>; 1283 1284def : Processor<"arm1176jz-s", ARMV6Itineraries, [ARMv6kz]>; 1285def : Processor<"arm1176jzf-s", ARMV6Itineraries, [ARMv6kz, 1286 FeatureVFP2, 1287 FeatureHasSlowFPVMLx]>; 1288 1289def : Processor<"mpcorenovfp", ARMV6Itineraries, [ARMv6k]>; 1290def : Processor<"mpcore", ARMV6Itineraries, [ARMv6k, 1291 FeatureVFP2, 1292 FeatureHasSlowFPVMLx]>; 1293 1294def : Processor<"arm1156t2-s", ARMV6Itineraries, [ARMv6t2]>; 1295def : Processor<"arm1156t2f-s", ARMV6Itineraries, [ARMv6t2, 1296 FeatureVFP2, 1297 FeatureHasSlowFPVMLx]>; 1298 1299def : ProcessorModel<"cortex-a5", CortexA8Model, [ARMv7a, ProcA5, 1300 FeatureHasRetAddrStack, 1301 FeatureTrustZone, 1302 FeatureSlowFPBrcc, 1303 FeatureHasSlowFPVMLx, 1304 FeatureHasSlowFPVFMx, 1305 FeatureVMLxForwarding, 1306 FeatureMP, 1307 FeatureVFP4]>; 1308 1309def : ProcessorModel<"cortex-a7", CortexA8Model, [ARMv7a, ProcA7, 1310 FeatureHasRetAddrStack, 1311 FeatureTrustZone, 1312 FeatureSlowFPBrcc, 1313 FeatureHasVMLxHazards, 1314 FeatureHasSlowFPVMLx, 1315 FeatureHasSlowFPVFMx, 1316 FeatureVMLxForwarding, 1317 FeatureMP, 1318 FeatureVFP4, 1319 FeatureVirtualization]>; 1320 1321def : ProcessorModel<"cortex-a8", CortexA8Model, [ARMv7a, ProcA8, 1322 FeatureHasRetAddrStack, 1323 FeatureNonpipelinedVFP, 1324 FeatureTrustZone, 1325 FeatureSlowFPBrcc, 1326 FeatureHasVMLxHazards, 1327 FeatureHasSlowFPVMLx, 1328 FeatureHasSlowFPVFMx, 1329 FeatureVMLxForwarding]>; 1330 1331def : ProcessorModel<"cortex-a9", CortexA9Model, [ARMv7a, ProcA9, 1332 FeatureHasRetAddrStack, 1333 FeatureTrustZone, 1334 FeatureHasVMLxHazards, 1335 FeatureVMLxForwarding, 1336 FeatureFP16, 1337 FeatureAvoidPartialCPSR, 1338 FeatureExpandMLx, 1339 FeaturePreferVMOVSR, 1340 FeatureMuxedUnits, 1341 FeatureNEONForFPMovs, 1342 FeatureCheckVLDnAlign, 1343 FeatureMP]>; 1344 1345def : ProcessorModel<"cortex-a12", CortexA9Model, [ARMv7a, ProcA12, 1346 FeatureHasRetAddrStack, 1347 FeatureTrustZone, 1348 FeatureVMLxForwarding, 1349 FeatureVFP4, 1350 FeatureAvoidPartialCPSR, 1351 FeatureVirtualization, 1352 FeatureMP]>; 1353 1354def : ProcessorModel<"cortex-a15", CortexA9Model, [ARMv7a, ProcA15, 1355 FeatureDontWidenVMOVS, 1356 FeatureSplatVFPToNeon, 1357 FeatureHasRetAddrStack, 1358 FeatureMuxedUnits, 1359 FeatureTrustZone, 1360 FeatureVFP4, 1361 FeatureMP, 1362 FeatureCheckVLDnAlign, 1363 FeatureAvoidPartialCPSR, 1364 FeatureVirtualization]>; 1365 1366def : ProcessorModel<"cortex-a17", CortexA9Model, [ARMv7a, ProcA17, 1367 FeatureHasRetAddrStack, 1368 FeatureTrustZone, 1369 FeatureMP, 1370 FeatureVMLxForwarding, 1371 FeatureVFP4, 1372 FeatureAvoidPartialCPSR, 1373 FeatureVirtualization]>; 1374 1375// FIXME: krait has currently the same features as A9 plus VFP4 and HWDiv 1376def : ProcessorModel<"krait", CortexA9Model, [ARMv7a, ProcKrait, 1377 FeatureHasRetAddrStack, 1378 FeatureMuxedUnits, 1379 FeatureCheckVLDnAlign, 1380 FeatureVMLxForwarding, 1381 FeatureFP16, 1382 FeatureAvoidPartialCPSR, 1383 FeatureVFP4, 1384 FeatureHWDivThumb, 1385 FeatureHWDivARM]>; 1386 1387def : ProcessorModel<"swift", SwiftModel, [ARMv7a, ProcSwift, 1388 FeatureHasRetAddrStack, 1389 FeatureNEONForFP, 1390 FeatureVFP4, 1391 FeatureUseWideStrideVFP, 1392 FeatureMP, 1393 FeatureHWDivThumb, 1394 FeatureHWDivARM, 1395 FeatureAvoidPartialCPSR, 1396 FeatureAvoidMOVsShOp, 1397 FeatureHasSlowFPVMLx, 1398 FeatureHasSlowFPVFMx, 1399 FeatureHasVMLxHazards, 1400 FeatureProfUnpredicate, 1401 FeaturePrefISHSTBarrier, 1402 FeatureSlowOddRegister, 1403 FeatureSlowLoadDSubreg, 1404 FeatureSlowVGETLNi32, 1405 FeatureSlowVDUP32, 1406 FeatureUseMISched, 1407 FeatureNoPostRASched]>; 1408 1409def : ProcessorModel<"cortex-r4", CortexA8Model, [ARMv7r, ProcR4, 1410 FeatureHasRetAddrStack, 1411 FeatureAvoidPartialCPSR]>; 1412 1413def : ProcessorModel<"cortex-r4f", CortexA8Model, [ARMv7r, ProcR4, 1414 FeatureHasRetAddrStack, 1415 FeatureSlowFPBrcc, 1416 FeatureHasSlowFPVMLx, 1417 FeatureHasSlowFPVFMx, 1418 FeatureVFP3_D16, 1419 FeatureAvoidPartialCPSR]>; 1420 1421def : ProcessorModel<"cortex-r5", CortexA8Model, [ARMv7r, ProcR5, 1422 FeatureHasRetAddrStack, 1423 FeatureVFP3_D16, 1424 FeatureSlowFPBrcc, 1425 FeatureHWDivARM, 1426 FeatureHasSlowFPVMLx, 1427 FeatureHasSlowFPVFMx, 1428 FeatureAvoidPartialCPSR]>; 1429 1430def : ProcessorModel<"cortex-r7", CortexA8Model, [ARMv7r, ProcR7, 1431 FeatureHasRetAddrStack, 1432 FeatureVFP3_D16, 1433 FeatureFP16, 1434 FeatureMP, 1435 FeatureSlowFPBrcc, 1436 FeatureHWDivARM, 1437 FeatureHasSlowFPVMLx, 1438 FeatureHasSlowFPVFMx, 1439 FeatureAvoidPartialCPSR]>; 1440 1441def : ProcessorModel<"cortex-r8", CortexA8Model, [ARMv7r, 1442 FeatureHasRetAddrStack, 1443 FeatureVFP3_D16, 1444 FeatureFP16, 1445 FeatureMP, 1446 FeatureSlowFPBrcc, 1447 FeatureHWDivARM, 1448 FeatureHasSlowFPVMLx, 1449 FeatureHasSlowFPVFMx, 1450 FeatureAvoidPartialCPSR]>; 1451 1452def : ProcessorModel<"cortex-m3", CortexM4Model, [ARMv7m, 1453 ProcM3, 1454 FeaturePrefLoopAlign32, 1455 FeatureUseMISched, 1456 FeatureHasNoBranchPredictor]>; 1457 1458def : ProcessorModel<"sc300", CortexM4Model, [ARMv7m, 1459 ProcM3, 1460 FeatureUseMISched, 1461 FeatureHasNoBranchPredictor]>; 1462 1463def : ProcessorModel<"cortex-m4", CortexM4Model, [ARMv7em, 1464 FeatureVFP4_D16_SP, 1465 FeaturePrefLoopAlign32, 1466 FeatureHasSlowFPVMLx, 1467 FeatureHasSlowFPVFMx, 1468 FeatureUseMISched, 1469 FeatureHasNoBranchPredictor]>; 1470 1471def : ProcessorModel<"cortex-m7", CortexM7Model, [ARMv7em, 1472 ProcM7, 1473 FeatureFPARMv8_D16, 1474 FeatureUseMIPipeliner, 1475 FeatureUseMISched]>; 1476 1477def : ProcNoItin<"cortex-m23", [ARMv8mBaseline, 1478 FeatureNoMovt, 1479 FeatureHasNoBranchPredictor]>; 1480 1481def : ProcessorModel<"cortex-m33", CortexM4Model, [ARMv8mMainline, 1482 FeatureDSP, 1483 FeatureFPARMv8_D16_SP, 1484 FeaturePrefLoopAlign32, 1485 FeatureHasSlowFPVMLx, 1486 FeatureHasSlowFPVFMx, 1487 FeatureUseMISched, 1488 FeatureHasNoBranchPredictor, 1489 FeatureFixCMSE_CVE_2021_35465]>; 1490 1491def : ProcessorModel<"cortex-m35p", CortexM4Model, [ARMv8mMainline, 1492 FeatureDSP, 1493 FeatureFPARMv8_D16_SP, 1494 FeaturePrefLoopAlign32, 1495 FeatureHasSlowFPVMLx, 1496 FeatureHasSlowFPVFMx, 1497 FeatureUseMISched, 1498 FeatureHasNoBranchPredictor, 1499 FeatureFixCMSE_CVE_2021_35465]>; 1500 1501def : ProcessorModel<"cortex-m55", CortexM55Model, [ARMv81mMainline, 1502 FeatureDSP, 1503 FeatureFPARMv8_D16, 1504 FeatureUseMISched, 1505 FeatureHasNoBranchPredictor, 1506 FeaturePrefLoopAlign32, 1507 FeatureHasSlowFPVMLx, 1508 HasMVEFloatOps, 1509 FeatureFixCMSE_CVE_2021_35465]>; 1510 1511def : ProcessorModel<"cortex-m85", CortexM7Model, [ARMv81mMainline, 1512 FeatureDSP, 1513 FeatureFPARMv8_D16, 1514 FeaturePACBTI, 1515 FeatureUseMISched, 1516 HasMVEFloatOps]>; 1517 1518def : ProcNoItin<"cortex-a32", [ARMv8a, 1519 FeatureHWDivThumb, 1520 FeatureHWDivARM, 1521 FeatureCrypto, 1522 FeatureCRC]>; 1523 1524def : ProcNoItin<"cortex-a35", [ARMv8a, ProcA35, 1525 FeatureHWDivThumb, 1526 FeatureHWDivARM, 1527 FeatureCrypto, 1528 FeatureCRC]>; 1529 1530def : ProcNoItin<"cortex-a53", [ARMv8a, ProcA53, 1531 FeatureHWDivThumb, 1532 FeatureHWDivARM, 1533 FeatureCrypto, 1534 FeatureCRC, 1535 FeatureFPAO]>; 1536 1537def : ProcNoItin<"cortex-a55", [ARMv82a, ProcA55, 1538 FeatureHWDivThumb, 1539 FeatureHWDivARM, 1540 FeatureDotProd]>; 1541 1542def : ProcessorModel<"cortex-a57", CortexA57Model, [ARMv8a, ProcA57, 1543 FeatureHWDivThumb, 1544 FeatureHWDivARM, 1545 FeatureCrypto, 1546 FeatureCRC, 1547 FeatureFPAO, 1548 FeatureAvoidPartialCPSR, 1549 FeatureCheapPredicableCPSR, 1550 FeatureFixCortexA57AES1742098]>; 1551 1552def : ProcessorModel<"cortex-a72", CortexA57Model, [ARMv8a, ProcA72, 1553 FeatureHWDivThumb, 1554 FeatureHWDivARM, 1555 FeatureCrypto, 1556 FeatureCRC, 1557 FeatureFixCortexA57AES1742098]>; 1558 1559def : ProcNoItin<"cortex-a73", [ARMv8a, ProcA73, 1560 FeatureHWDivThumb, 1561 FeatureHWDivARM, 1562 FeatureCrypto, 1563 FeatureCRC]>; 1564 1565def : ProcNoItin<"cortex-a75", [ARMv82a, ProcA75, 1566 FeatureHWDivThumb, 1567 FeatureHWDivARM, 1568 FeatureDotProd]>; 1569 1570def : ProcNoItin<"cortex-a76", [ARMv82a, ProcA76, 1571 FeatureHWDivThumb, 1572 FeatureHWDivARM, 1573 FeatureCrypto, 1574 FeatureCRC, 1575 FeatureFullFP16, 1576 FeatureDotProd]>; 1577 1578def : ProcNoItin<"cortex-a76ae", [ARMv82a, ProcA76, 1579 FeatureHWDivThumb, 1580 FeatureHWDivARM, 1581 FeatureCrypto, 1582 FeatureCRC, 1583 FeatureFullFP16, 1584 FeatureDotProd]>; 1585 1586def : ProcNoItin<"cortex-a77", [ARMv82a, ProcA77, 1587 FeatureHWDivThumb, 1588 FeatureHWDivARM, 1589 FeatureCrypto, 1590 FeatureCRC, 1591 FeatureFullFP16, 1592 FeatureDotProd]>; 1593 1594def : ProcNoItin<"cortex-a78", [ARMv82a, ProcA78, 1595 FeatureHWDivThumb, 1596 FeatureHWDivARM, 1597 FeatureCrypto, 1598 FeatureCRC, 1599 FeatureFullFP16, 1600 FeatureDotProd]>; 1601 1602def : ProcNoItin<"cortex-a78c", [ARMv82a, ProcA78C, 1603 FeatureHWDivThumb, 1604 FeatureHWDivARM, 1605 FeatureCrypto, 1606 FeatureCRC, 1607 FeatureDotProd, 1608 FeatureFullFP16]>; 1609 1610def : ProcNoItin<"cortex-a710", [ARMv9a, ProcA710, 1611 FeatureHWDivThumb, 1612 FeatureHWDivARM, 1613 FeatureFP16FML, 1614 FeatureBF16, 1615 FeatureMatMulInt8, 1616 FeatureSB]>; 1617 1618def : ProcNoItin<"cortex-x1", [ARMv82a, ProcX1, 1619 FeatureHWDivThumb, 1620 FeatureHWDivARM, 1621 FeatureCrypto, 1622 FeatureCRC, 1623 FeatureFullFP16, 1624 FeatureDotProd]>; 1625 1626def : ProcNoItin<"cortex-x1c", [ARMv82a, ProcX1C, 1627 FeatureHWDivThumb, 1628 FeatureHWDivARM, 1629 FeatureCrypto, 1630 FeatureCRC, 1631 FeatureFullFP16, 1632 FeatureDotProd]>; 1633 1634def : ProcNoItin<"neoverse-v1", [ARMv84a, 1635 FeatureHWDivThumb, 1636 FeatureHWDivARM, 1637 FeatureCrypto, 1638 FeatureCRC, 1639 FeatureFullFP16, 1640 FeatureBF16, 1641 FeatureMatMulInt8]>; 1642 1643def : ProcNoItin<"neoverse-n1", [ARMv82a, 1644 FeatureHWDivThumb, 1645 FeatureHWDivARM, 1646 FeatureCrypto, 1647 FeatureCRC, 1648 FeatureDotProd]>; 1649 1650def : ProcNoItin<"neoverse-n2", [ARMv85a, 1651 FeatureBF16, 1652 FeatureMatMulInt8]>; 1653 1654def : ProcessorModel<"cyclone", SwiftModel, [ARMv8a, ProcSwift, 1655 FeatureHasRetAddrStack, 1656 FeatureNEONForFP, 1657 FeatureVFP4, 1658 FeatureMP, 1659 FeatureHWDivThumb, 1660 FeatureHWDivARM, 1661 FeatureAvoidPartialCPSR, 1662 FeatureAvoidMOVsShOp, 1663 FeatureHasSlowFPVMLx, 1664 FeatureHasSlowFPVFMx, 1665 FeatureCrypto, 1666 FeatureUseMISched, 1667 FeatureZCZeroing, 1668 FeatureNoPostRASched]>; 1669 1670def : ProcNoItin<"exynos-m3", [ARMv8a, ProcExynos]>; 1671def : ProcNoItin<"exynos-m4", [ARMv82a, ProcExynos, 1672 FeatureFullFP16, 1673 FeatureDotProd]>; 1674def : ProcNoItin<"exynos-m5", [ARMv82a, ProcExynos, 1675 FeatureFullFP16, 1676 FeatureDotProd]>; 1677 1678def : ProcNoItin<"kryo", [ARMv8a, ProcKryo, 1679 FeatureHWDivThumb, 1680 FeatureHWDivARM, 1681 FeatureCrypto, 1682 FeatureCRC]>; 1683 1684def : ProcessorModel<"cortex-r52", CortexR52Model, [ARMv8r, ProcR52, 1685 FeatureUseMISched, 1686 FeatureFPAO]>; 1687 1688//===----------------------------------------------------------------------===// 1689// Declare the target which we are implementing 1690//===----------------------------------------------------------------------===// 1691 1692def ARMAsmWriter : AsmWriter { 1693 string AsmWriterClassName = "InstPrinter"; 1694 int PassSubtarget = 1; 1695 int Variant = 0; 1696 bit isMCAsmWriter = 1; 1697} 1698 1699def ARMAsmParser : AsmParser { 1700 bit ReportMultipleNearMisses = 1; 1701} 1702 1703def ARMAsmParserVariant : AsmParserVariant { 1704 int Variant = 0; 1705 string Name = "ARM"; 1706 string BreakCharacters = "."; 1707} 1708 1709def ARM : Target { 1710 // Pull in Instruction Info. 1711 let InstructionSet = ARMInstrInfo; 1712 let AssemblyWriters = [ARMAsmWriter]; 1713 let AssemblyParsers = [ARMAsmParser]; 1714 let AssemblyParserVariants = [ARMAsmParserVariant]; 1715 let AllowRegisterRenaming = 1; 1716} 1717