1 //===-- ARM.td - Describe the ARM Target Machine -----------*- tablegen -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // 11 //===----------------------------------------------------------------------===// 12 13 //===----------------------------------------------------------------------===// 14 // Target-independent interfaces which we are implementing 15 //===----------------------------------------------------------------------===// 16 17 include "llvm/Target/Target.td" 18 19 //===----------------------------------------------------------------------===// 20 // ARM Helper classes. 21 // 22 23 class ProcNoItin<string Name, list<SubtargetFeature> Features> 24 : Processor<Name, NoItineraries, Features>; 25 26 class Architecture<string fname, string aname, list<SubtargetFeature> features > 27 : SubtargetFeature<fname, "ARMArch", aname, 28 !strconcat(aname, " architecture"), features>; 29 30 //===----------------------------------------------------------------------===// 31 // ARM Subtarget state. 32 // 33 34 def ModeThumb : SubtargetFeature<"thumb-mode", "InThumbMode", "true", 35 "Thumb mode">; 36 37 def ModeSoftFloat : SubtargetFeature<"soft-float", "UseSoftFloat", "true", 38 "Use software floating point features.">; 39 40 //===----------------------------------------------------------------------===// 41 // ARM Subtarget features. 42 // 43 44 def FeatureVFP2 : SubtargetFeature<"vfp2", "HasVFPv2", "true", 45 "Enable VFP2 instructions">; 46 def FeatureVFP3 : SubtargetFeature<"vfp3", "HasVFPv3", "true", 47 "Enable VFP3 instructions", 48 [FeatureVFP2]>; 49 def FeatureNEON : SubtargetFeature<"neon", "HasNEON", "true", 50 "Enable NEON instructions", 51 [FeatureVFP3]>; 52 def FeatureThumb2 : SubtargetFeature<"thumb2", "HasThumb2", "true", 53 "Enable Thumb2 instructions">; 54 def FeatureNoARM : SubtargetFeature<"noarm", "NoARM", "true", 55 "Does not support ARM mode execution", 56 [ModeThumb]>; 57 def FeatureFP16 : SubtargetFeature<"fp16", "HasFP16", "true", 58 "Enable half-precision floating point">; 59 def FeatureVFP4 : SubtargetFeature<"vfp4", "HasVFPv4", "true", 60 "Enable VFP4 instructions", 61 [FeatureVFP3, FeatureFP16]>; 62 def FeatureFPARMv8 : SubtargetFeature<"fp-armv8", "HasFPARMv8", 63 "true", "Enable ARMv8 FP", 64 [FeatureVFP4]>; 65 def FeatureFullFP16 : SubtargetFeature<"fullfp16", "HasFullFP16", "true", 66 "Enable full half-precision floating point", 67 [FeatureFPARMv8]>; 68 def FeatureD16 : SubtargetFeature<"d16", "HasD16", "true", 69 "Restrict FP to 16 double registers">; 70 def FeatureHWDiv : SubtargetFeature<"hwdiv", "HasHardwareDivide", "true", 71 "Enable divide instructions">; 72 def FeatureHWDivARM : SubtargetFeature<"hwdiv-arm", 73 "HasHardwareDivideInARM", "true", 74 "Enable divide instructions in ARM mode">; 75 def FeatureT2XtPk : SubtargetFeature<"t2xtpk", "HasT2ExtractPack", "true", 76 "Enable Thumb2 extract and pack instructions">; 77 def FeatureDB : SubtargetFeature<"db", "HasDataBarrier", "true", 78 "Has data barrier (dmb / dsb) instructions">; 79 def FeatureSlowFPBrcc : SubtargetFeature<"slow-fp-brcc", "SlowFPBrcc", "true", 80 "FP compare + branch is slow">; 81 def FeatureVFPOnlySP : SubtargetFeature<"fp-only-sp", "FPOnlySP", "true", 82 "Floating point unit supports single precision only">; 83 def FeaturePerfMon : SubtargetFeature<"perfmon", "HasPerfMon", "true", 84 "Enable support for Performance Monitor extensions">; 85 def FeatureTrustZone : SubtargetFeature<"trustzone", "HasTrustZone", "true", 86 "Enable support for TrustZone security extensions">; 87 def FeatureCrypto : SubtargetFeature<"crypto", "HasCrypto", "true", 88 "Enable support for Cryptography extensions", 89 [FeatureNEON]>; 90 def FeatureCRC : SubtargetFeature<"crc", "HasCRC", "true", 91 "Enable support for CRC instructions">; 92 93 // Cyclone has preferred instructions for zeroing VFP registers, which can 94 // execute in 0 cycles. 95 def FeatureZCZeroing : SubtargetFeature<"zcz", "HasZeroCycleZeroing", "true", 96 "Has zero-cycle zeroing instructions">; 97 98 // Some processors have FP multiply-accumulate instructions that don't 99 // play nicely with other VFP / NEON instructions, and it's generally better 100 // to just not use them. 101 def FeatureHasSlowFPVMLx : SubtargetFeature<"slowfpvmlx", "SlowFPVMLx", "true", 102 "Disable VFP / NEON MAC instructions">; 103 104 // Cortex-A8 / A9 Advanced SIMD has multiplier accumulator forwarding. 105 def FeatureVMLxForwarding : SubtargetFeature<"vmlx-forwarding", 106 "HasVMLxForwarding", "true", 107 "Has multiplier accumulator forwarding">; 108 109 // Some processors benefit from using NEON instructions for scalar 110 // single-precision FP operations. 111 def FeatureNEONForFP : SubtargetFeature<"neonfp", "UseNEONForSinglePrecisionFP", 112 "true", 113 "Use NEON for single precision FP">; 114 115 // Disable 32-bit to 16-bit narrowing for experimentation. 116 def FeaturePref32BitThumb : SubtargetFeature<"32bit", "Pref32BitThumb", "true", 117 "Prefer 32-bit Thumb instrs">; 118 119 /// Some instructions update CPSR partially, which can add false dependency for 120 /// out-of-order implementation, e.g. Cortex-A9, unless each individual bit is 121 /// mapped to a separate physical register. Avoid partial CPSR update for these 122 /// processors. 123 def FeatureAvoidPartialCPSR : SubtargetFeature<"avoid-partial-cpsr", 124 "AvoidCPSRPartialUpdate", "true", 125 "Avoid CPSR partial update for OOO execution">; 126 127 def FeatureAvoidMOVsShOp : SubtargetFeature<"avoid-movs-shop", 128 "AvoidMOVsShifterOperand", "true", 129 "Avoid movs instructions with shifter operand">; 130 131 // Some processors perform return stack prediction. CodeGen should avoid issue 132 // "normal" call instructions to callees which do not return. 133 def FeatureHasRAS : SubtargetFeature<"ras", "HasRAS", "true", 134 "Has return address stack">; 135 136 /// DSP extension. 137 def FeatureDSP : SubtargetFeature<"dsp", "HasDSP", "true", 138 "Supports DSP instructions in ARM and/or Thumb2">; 139 140 // Multiprocessing extension. 141 def FeatureMP : SubtargetFeature<"mp", "HasMPExtension", "true", 142 "Supports Multiprocessing extension">; 143 144 // Virtualization extension - requires HW divide (ARMv7-AR ARMARM - 4.4.8). 145 def FeatureVirtualization : SubtargetFeature<"virtualization", 146 "HasVirtualization", "true", 147 "Supports Virtualization extension", 148 [FeatureHWDiv, FeatureHWDivARM]>; 149 150 // M-series ISA 151 def FeatureMClass : SubtargetFeature<"mclass", "ARMProcClass", "MClass", 152 "Is microcontroller profile ('M' series)">; 153 154 // R-series ISA 155 def FeatureRClass : SubtargetFeature<"rclass", "ARMProcClass", "RClass", 156 "Is realtime profile ('R' series)">; 157 158 // A-series ISA 159 def FeatureAClass : SubtargetFeature<"aclass", "ARMProcClass", "AClass", 160 "Is application profile ('A' series)">; 161 162 // Special TRAP encoding for NaCl, which looks like a TRAP in Thumb too. 163 // See ARMInstrInfo.td for details. 164 def FeatureNaClTrap : SubtargetFeature<"nacl-trap", "UseNaClTrap", "true", 165 "NaCl trap">; 166 167 // RenderScript-specific support for 64-bit long types on all targets 168 def FeatureLong64 : SubtargetFeature<"long64", "UseLong64", 169 "true", 170 "long type is forced to be 64-bit">; 171 172 def FeatureStrictAlign : SubtargetFeature<"strict-align", 173 "StrictAlign", "true", 174 "Disallow all unaligned memory " 175 "access">; 176 177 def FeatureLongCalls : SubtargetFeature<"long-calls", "GenLongCalls", "true", 178 "Generate calls via indirect call " 179 "instructions">; 180 181 def FeatureReserveR9 : SubtargetFeature<"reserve-r9", "ReserveR9", "true", 182 "Reserve R9, making it unavailable as " 183 "GPR">; 184 185 def FeatureNoMovt : SubtargetFeature<"no-movt", "NoMovt", "true", 186 "Don't use movt/movw pairs for 32-bit " 187 "imms">; 188 189 190 //===----------------------------------------------------------------------===// 191 // ARM ISAa. 192 // 193 194 def HasV4TOps : SubtargetFeature<"v4t", "HasV4TOps", "true", 195 "Support ARM v4T instructions">; 196 def HasV5TOps : SubtargetFeature<"v5t", "HasV5TOps", "true", 197 "Support ARM v5T instructions", 198 [HasV4TOps]>; 199 def HasV5TEOps : SubtargetFeature<"v5te", "HasV5TEOps", "true", 200 "Support ARM v5TE, v5TEj, and v5TExp instructions", 201 [HasV5TOps]>; 202 def HasV6Ops : SubtargetFeature<"v6", "HasV6Ops", "true", 203 "Support ARM v6 instructions", 204 [HasV5TEOps]>; 205 def HasV6MOps : SubtargetFeature<"v6m", "HasV6MOps", "true", 206 "Support ARM v6M instructions", 207 [HasV6Ops]>; 208 def HasV6KOps : SubtargetFeature<"v6k", "HasV6KOps", "true", 209 "Support ARM v6k instructions", 210 [HasV6Ops]>; 211 def HasV6T2Ops : SubtargetFeature<"v6t2", "HasV6T2Ops", "true", 212 "Support ARM v6t2 instructions", 213 [HasV6MOps, HasV6KOps, FeatureThumb2]>; 214 def HasV7Ops : SubtargetFeature<"v7", "HasV7Ops", "true", 215 "Support ARM v7 instructions", 216 [HasV6T2Ops, FeaturePerfMon]>; 217 def HasV8Ops : SubtargetFeature<"v8", "HasV8Ops", "true", 218 "Support ARM v8 instructions", 219 [HasV7Ops]>; 220 def HasV8_1aOps : SubtargetFeature<"v8.1a", "HasV8_1aOps", "true", 221 "Support ARM v8.1a instructions", 222 [HasV8Ops]>; 223 def HasV8_2aOps : SubtargetFeature<"v8.2a", "HasV8_2aOps", "true", 224 "Support ARM v8.2a instructions", 225 [HasV8_1aOps]>; 226 227 228 //===----------------------------------------------------------------------===// 229 // ARM Processor subtarget features. 230 // 231 232 def ProcA5 : SubtargetFeature<"a5", "ARMProcFamily", "CortexA5", 233 "Cortex-A5 ARM processors", []>; 234 def ProcA7 : SubtargetFeature<"a7", "ARMProcFamily", "CortexA7", 235 "Cortex-A7 ARM processors", []>; 236 def ProcA8 : SubtargetFeature<"a8", "ARMProcFamily", "CortexA8", 237 "Cortex-A8 ARM processors", []>; 238 def ProcA9 : SubtargetFeature<"a9", "ARMProcFamily", "CortexA9", 239 "Cortex-A9 ARM processors", []>; 240 def ProcA12 : SubtargetFeature<"a12", "ARMProcFamily", "CortexA12", 241 "Cortex-A12 ARM processors", []>; 242 def ProcA15 : SubtargetFeature<"a15", "ARMProcFamily", "CortexA15", 243 "Cortex-A15 ARM processors", []>; 244 def ProcA17 : SubtargetFeature<"a17", "ARMProcFamily", "CortexA17", 245 "Cortex-A17 ARM processors", []>; 246 def ProcA35 : SubtargetFeature<"a35", "ARMProcFamily", "CortexA35", 247 "Cortex-A35 ARM processors", []>; 248 def ProcA53 : SubtargetFeature<"a53", "ARMProcFamily", "CortexA53", 249 "Cortex-A53 ARM processors", []>; 250 def ProcA57 : SubtargetFeature<"a57", "ARMProcFamily", "CortexA57", 251 "Cortex-A57 ARM processors", []>; 252 def ProcA72 : SubtargetFeature<"a72", "ARMProcFamily", "CortexA72", 253 "Cortex-A72 ARM processors", []>; 254 255 def ProcKrait : SubtargetFeature<"krait", "ARMProcFamily", "Krait", 256 "Qualcomm ARM processors", []>; 257 def ProcSwift : SubtargetFeature<"swift", "ARMProcFamily", "Swift", 258 "Swift ARM processors", []>; 259 260 261 def ProcR4 : SubtargetFeature<"r4", "ARMProcFamily", "CortexR4", 262 "Cortex-R4 ARM processors", []>; 263 def ProcR5 : SubtargetFeature<"r5", "ARMProcFamily", "CortexR5", 264 "Cortex-R5 ARM processors", []>; 265 def ProcR7 : SubtargetFeature<"r7", "ARMProcFamily", "CortexR7", 266 "Cortex-R7 ARM processors", []>; 267 268 269 //===----------------------------------------------------------------------===// 270 // ARM schedules. 271 // 272 273 include "ARMSchedule.td" 274 275 276 //===----------------------------------------------------------------------===// 277 // ARM architectures 278 // 279 280 def ARMv2 : Architecture<"armv2", "ARMv2", []>; 281 282 def ARMv2a : Architecture<"armv2a", "ARMv2a", []>; 283 284 def ARMv3 : Architecture<"armv3", "ARMv3", []>; 285 286 def ARMv3m : Architecture<"armv3m", "ARMv3m", []>; 287 288 def ARMv4 : Architecture<"armv4", "ARMv4", []>; 289 290 def ARMv4t : Architecture<"armv4t", "ARMv4t", [HasV4TOps]>; 291 292 def ARMv5t : Architecture<"armv5t", "ARMv5t", [HasV5TOps]>; 293 294 def ARMv5te : Architecture<"armv5te", "ARMv5te", [HasV5TEOps]>; 295 296 def ARMv5tej : Architecture<"armv5tej", "ARMv5tej", [HasV5TEOps]>; 297 298 def ARMv6 : Architecture<"armv6", "ARMv6", [HasV6Ops]>; 299 300 def ARMv6t2 : Architecture<"armv6t2", "ARMv6t2", [HasV6T2Ops, 301 FeatureDSP]>; 302 303 def ARMv6k : Architecture<"armv6k", "ARMv6k", [HasV6KOps]>; 304 305 def ARMv6kz : Architecture<"armv6kz", "ARMv6kz", [HasV6KOps, 306 FeatureTrustZone]>; 307 308 def ARMv6m : Architecture<"armv6-m", "ARMv6m", [HasV6MOps, 309 FeatureNoARM, 310 FeatureDB, 311 FeatureMClass]>; 312 313 def ARMv6sm : Architecture<"armv6s-m", "ARMv6sm", [HasV6MOps, 314 FeatureNoARM, 315 FeatureDB, 316 FeatureMClass]>; 317 318 def ARMv7a : Architecture<"armv7-a", "ARMv7a", [HasV7Ops, 319 FeatureNEON, 320 FeatureDB, 321 FeatureDSP, 322 FeatureAClass]>; 323 324 def ARMv7r : Architecture<"armv7-r", "ARMv7r", [HasV7Ops, 325 FeatureDB, 326 FeatureDSP, 327 FeatureHWDiv, 328 FeatureRClass]>; 329 330 def ARMv7m : Architecture<"armv7-m", "ARMv7m", [HasV7Ops, 331 FeatureThumb2, 332 FeatureNoARM, 333 FeatureDB, 334 FeatureHWDiv, 335 FeatureMClass]>; 336 337 def ARMv7em : Architecture<"armv7e-m", "ARMv7em", [HasV7Ops, 338 FeatureThumb2, 339 FeatureNoARM, 340 FeatureDB, 341 FeatureHWDiv, 342 FeatureMClass, 343 FeatureDSP, 344 FeatureT2XtPk]>; 345 346 def ARMv8a : Architecture<"armv8-a", "ARMv8a", [HasV8Ops, 347 FeatureAClass, 348 FeatureDB, 349 FeatureFPARMv8, 350 FeatureNEON, 351 FeatureDSP, 352 FeatureTrustZone, 353 FeatureMP, 354 FeatureVirtualization, 355 FeatureCrypto, 356 FeatureCRC]>; 357 358 def ARMv81a : Architecture<"armv8.1-a", "ARMv81a", [HasV8_1aOps, 359 FeatureAClass, 360 FeatureDB, 361 FeatureFPARMv8, 362 FeatureNEON, 363 FeatureDSP, 364 FeatureTrustZone, 365 FeatureMP, 366 FeatureVirtualization, 367 FeatureCrypto, 368 FeatureCRC]>; 369 370 def ARMv82a : Architecture<"armv8.2-a", "ARMv82a", [HasV8_2aOps, 371 FeatureAClass, 372 FeatureDB, 373 FeatureFPARMv8, 374 FeatureNEON, 375 FeatureDSP, 376 FeatureTrustZone, 377 FeatureMP, 378 FeatureVirtualization, 379 FeatureCrypto, 380 FeatureCRC]>; 381 382 // Aliases 383 def IWMMXT : Architecture<"iwmmxt", "ARMv5te", [ARMv5te]>; 384 def IWMMXT2 : Architecture<"iwmmxt2", "ARMv5te", [ARMv5te]>; 385 def XScale : Architecture<"xscale", "ARMv5te", [ARMv5te]>; 386 def ARMv6j : Architecture<"armv6j", "ARMv7a", [ARMv6]>; 387 def ARMv7k : Architecture<"armv7k", "ARMv7a", [ARMv7a]>; 388 def ARMv7s : Architecture<"armv7s", "ARMv7a", [ARMv7a]>; 389 390 391 //===----------------------------------------------------------------------===// 392 // ARM processors 393 // 394 395 // Dummy CPU, used to target architectures 396 def : ProcNoItin<"generic", []>; 397 398 def : ProcNoItin<"arm8", [ARMv4]>; 399 def : ProcNoItin<"arm810", [ARMv4]>; 400 def : ProcNoItin<"strongarm", [ARMv4]>; 401 def : ProcNoItin<"strongarm110", [ARMv4]>; 402 def : ProcNoItin<"strongarm1100", [ARMv4]>; 403 def : ProcNoItin<"strongarm1110", [ARMv4]>; 404 405 def : ProcNoItin<"arm7tdmi", [ARMv4t]>; 406 def : ProcNoItin<"arm7tdmi-s", [ARMv4t]>; 407 def : ProcNoItin<"arm710t", [ARMv4t]>; 408 def : ProcNoItin<"arm720t", [ARMv4t]>; 409 def : ProcNoItin<"arm9", [ARMv4t]>; 410 def : ProcNoItin<"arm9tdmi", [ARMv4t]>; 411 def : ProcNoItin<"arm920", [ARMv4t]>; 412 def : ProcNoItin<"arm920t", [ARMv4t]>; 413 def : ProcNoItin<"arm922t", [ARMv4t]>; 414 def : ProcNoItin<"arm940t", [ARMv4t]>; 415 def : ProcNoItin<"ep9312", [ARMv4t]>; 416 417 def : ProcNoItin<"arm10tdmi", [ARMv5t]>; 418 def : ProcNoItin<"arm1020t", [ARMv5t]>; 419 420 def : ProcNoItin<"arm9e", [ARMv5te]>; 421 def : ProcNoItin<"arm926ej-s", [ARMv5te]>; 422 def : ProcNoItin<"arm946e-s", [ARMv5te]>; 423 def : ProcNoItin<"arm966e-s", [ARMv5te]>; 424 def : ProcNoItin<"arm968e-s", [ARMv5te]>; 425 def : ProcNoItin<"arm10e", [ARMv5te]>; 426 def : ProcNoItin<"arm1020e", [ARMv5te]>; 427 def : ProcNoItin<"arm1022e", [ARMv5te]>; 428 def : ProcNoItin<"xscale", [ARMv5te]>; 429 def : ProcNoItin<"iwmmxt", [ARMv5te]>; 430 431 def : Processor<"arm1136j-s", ARMV6Itineraries, [ARMv6]>; 432 def : Processor<"arm1136jf-s", ARMV6Itineraries, [ARMv6, 433 FeatureVFP2, 434 FeatureHasSlowFPVMLx]>; 435 436 def : Processor<"cortex-m0", ARMV6Itineraries, [ARMv6m]>; 437 def : Processor<"cortex-m0plus", ARMV6Itineraries, [ARMv6m]>; 438 def : Processor<"cortex-m1", ARMV6Itineraries, [ARMv6m]>; 439 def : Processor<"sc000", ARMV6Itineraries, [ARMv6m]>; 440 441 def : Processor<"arm1176jz-s", ARMV6Itineraries, [ARMv6kz]>; 442 def : Processor<"arm1176jzf-s", ARMV6Itineraries, [ARMv6kz, 443 FeatureVFP2, 444 FeatureHasSlowFPVMLx]>; 445 446 def : Processor<"mpcorenovfp", ARMV6Itineraries, [ARMv6k]>; 447 def : Processor<"mpcore", ARMV6Itineraries, [ARMv6k, 448 FeatureVFP2, 449 FeatureHasSlowFPVMLx]>; 450 451 def : Processor<"arm1156t2-s", ARMV6Itineraries, [ARMv6t2]>; 452 def : Processor<"arm1156t2f-s", ARMV6Itineraries, [ARMv6t2, 453 FeatureVFP2, 454 FeatureHasSlowFPVMLx]>; 455 456 // FIXME: A5 has currently the same Schedule model as A8 457 def : ProcessorModel<"cortex-a5", CortexA8Model, [ARMv7a, ProcA5, 458 FeatureHasRAS, 459 FeatureTrustZone, 460 FeatureSlowFPBrcc, 461 FeatureHasSlowFPVMLx, 462 FeatureVMLxForwarding, 463 FeatureT2XtPk, 464 FeatureMP, 465 FeatureVFP4]>; 466 467 def : ProcessorModel<"cortex-a7", CortexA8Model, [ARMv7a, ProcA7, 468 FeatureHasRAS, 469 FeatureTrustZone, 470 FeatureSlowFPBrcc, 471 FeatureHasSlowFPVMLx, 472 FeatureVMLxForwarding, 473 FeatureT2XtPk, 474 FeatureMP, 475 FeatureVFP4, 476 FeatureHWDiv, 477 FeatureHWDivARM, 478 FeatureVirtualization]>; 479 480 def : ProcessorModel<"cortex-a8", CortexA8Model, [ARMv7a, ProcA8, 481 FeatureHasRAS, 482 FeatureTrustZone, 483 FeatureSlowFPBrcc, 484 FeatureHasSlowFPVMLx, 485 FeatureVMLxForwarding, 486 FeatureT2XtPk]>; 487 488 def : ProcessorModel<"cortex-a9", CortexA9Model, [ARMv7a, ProcA9, 489 FeatureHasRAS, 490 FeatureTrustZone, 491 FeatureVMLxForwarding, 492 FeatureT2XtPk, 493 FeatureFP16, 494 FeatureAvoidPartialCPSR, 495 FeatureMP]>; 496 497 // FIXME: A12 has currently the same Schedule model as A9 498 def : ProcessorModel<"cortex-a12", CortexA9Model, [ARMv7a, ProcA12, 499 FeatureHasRAS, 500 FeatureTrustZone, 501 FeatureVMLxForwarding, 502 FeatureT2XtPk, 503 FeatureVFP4, 504 FeatureHWDiv, 505 FeatureHWDivARM, 506 FeatureAvoidPartialCPSR, 507 FeatureVirtualization, 508 FeatureMP]>; 509 510 // FIXME: A15 has currently the same Schedule model as A9. 511 def : ProcessorModel<"cortex-a15", CortexA9Model, [ARMv7a, ProcA15, 512 FeatureHasRAS, 513 FeatureTrustZone, 514 FeatureT2XtPk, 515 FeatureVFP4, 516 FeatureMP, 517 FeatureHWDiv, 518 FeatureHWDivARM, 519 FeatureAvoidPartialCPSR, 520 FeatureVirtualization]>; 521 522 // FIXME: A17 has currently the same Schedule model as A9 523 def : ProcessorModel<"cortex-a17", CortexA9Model, [ARMv7a, ProcA17, 524 FeatureHasRAS, 525 FeatureTrustZone, 526 FeatureMP, 527 FeatureVMLxForwarding, 528 FeatureT2XtPk, 529 FeatureVFP4, 530 FeatureHWDiv, 531 FeatureHWDivARM, 532 FeatureAvoidPartialCPSR, 533 FeatureVirtualization]>; 534 535 // FIXME: krait has currently the same Schedule model as A9 536 // FIXME: krait has currently the same features as A9 plus VFP4 and hardware 537 // division features. 538 def : ProcessorModel<"krait", CortexA9Model, [ARMv7a, ProcKrait, 539 FeatureHasRAS, 540 FeatureVMLxForwarding, 541 FeatureT2XtPk, 542 FeatureFP16, 543 FeatureAvoidPartialCPSR, 544 FeatureVFP4, 545 FeatureHWDiv, 546 FeatureHWDivARM]>; 547 548 def : ProcessorModel<"swift", SwiftModel, [ARMv7a, ProcSwift, 549 FeatureHasRAS, 550 FeatureNEONForFP, 551 FeatureT2XtPk, 552 FeatureVFP4, 553 FeatureMP, 554 FeatureHWDiv, 555 FeatureHWDivARM, 556 FeatureAvoidPartialCPSR, 557 FeatureAvoidMOVsShOp, 558 FeatureHasSlowFPVMLx]>; 559 560 // FIXME: R4 has currently the same ProcessorModel as A8. 561 def : ProcessorModel<"cortex-r4", CortexA8Model, [ARMv7r, ProcR4, 562 FeatureHasRAS, 563 FeatureAvoidPartialCPSR, 564 FeatureT2XtPk]>; 565 566 // FIXME: R4F has currently the same ProcessorModel as A8. 567 def : ProcessorModel<"cortex-r4f", CortexA8Model, [ARMv7r, ProcR4, 568 FeatureHasRAS, 569 FeatureSlowFPBrcc, 570 FeatureHasSlowFPVMLx, 571 FeatureVFP3, 572 FeatureD16, 573 FeatureAvoidPartialCPSR, 574 FeatureT2XtPk]>; 575 576 // FIXME: R5 has currently the same ProcessorModel as A8. 577 def : ProcessorModel<"cortex-r5", CortexA8Model, [ARMv7r, ProcR5, 578 FeatureHasRAS, 579 FeatureVFP3, 580 FeatureD16, 581 FeatureSlowFPBrcc, 582 FeatureHWDivARM, 583 FeatureHasSlowFPVMLx, 584 FeatureAvoidPartialCPSR, 585 FeatureT2XtPk]>; 586 587 // FIXME: R7 has currently the same ProcessorModel as A8 and is modelled as R5. 588 def : ProcessorModel<"cortex-r7", CortexA8Model, [ARMv7r, ProcR7, 589 FeatureHasRAS, 590 FeatureVFP3, 591 FeatureVFPOnlySP, 592 FeatureD16, 593 FeatureFP16, 594 FeatureMP, 595 FeatureSlowFPBrcc, 596 FeatureHWDivARM, 597 FeatureHasSlowFPVMLx, 598 FeatureAvoidPartialCPSR, 599 FeatureT2XtPk]>; 600 601 def : ProcNoItin<"cortex-m3", [ARMv7m]>; 602 def : ProcNoItin<"sc300", [ARMv7m]>; 603 604 def : ProcNoItin<"cortex-m4", [ARMv7em, 605 FeatureVFP4, 606 FeatureVFPOnlySP, 607 FeatureD16]>; 608 609 def : ProcNoItin<"cortex-m7", [ARMv7em, 610 FeatureFPARMv8, 611 FeatureD16]>; 612 613 614 def : ProcNoItin<"cortex-a35", [ARMv8a, ProcA35, 615 FeatureHWDiv, 616 FeatureHWDivARM, 617 FeatureT2XtPk, 618 FeatureCrypto, 619 FeatureCRC]>; 620 621 def : ProcNoItin<"cortex-a53", [ARMv8a, ProcA53, 622 FeatureHWDiv, 623 FeatureHWDivARM, 624 FeatureT2XtPk, 625 FeatureCrypto, 626 FeatureCRC]>; 627 628 def : ProcNoItin<"cortex-a57", [ARMv8a, ProcA57, 629 FeatureHWDiv, 630 FeatureHWDivARM, 631 FeatureT2XtPk, 632 FeatureCrypto, 633 FeatureCRC]>; 634 635 def : ProcNoItin<"cortex-a72", [ARMv8a, ProcA72, 636 FeatureHWDiv, 637 FeatureHWDivARM, 638 FeatureT2XtPk, 639 FeatureCrypto, 640 FeatureCRC]>; 641 642 // Cyclone is very similar to swift 643 def : ProcessorModel<"cyclone", SwiftModel, [ARMv8a, ProcSwift, 644 FeatureHasRAS, 645 FeatureNEONForFP, 646 FeatureT2XtPk, 647 FeatureVFP4, 648 FeatureMP, 649 FeatureHWDiv, 650 FeatureHWDivARM, 651 FeatureAvoidPartialCPSR, 652 FeatureAvoidMOVsShOp, 653 FeatureHasSlowFPVMLx, 654 FeatureCrypto, 655 FeatureZCZeroing]>; 656 657 658 //===----------------------------------------------------------------------===// 659 // Register File Description 660 //===----------------------------------------------------------------------===// 661 662 include "ARMRegisterInfo.td" 663 664 include "ARMCallingConv.td" 665 666 //===----------------------------------------------------------------------===// 667 // Instruction Descriptions 668 //===----------------------------------------------------------------------===// 669 670 include "ARMInstrInfo.td" 671 672 def ARMInstrInfo : InstrInfo; 673 674 //===----------------------------------------------------------------------===// 675 // Declare the target which we are implementing 676 //===----------------------------------------------------------------------===// 677 678 def ARMAsmWriter : AsmWriter { 679 string AsmWriterClassName = "InstPrinter"; 680 int PassSubtarget = 1; 681 int Variant = 0; 682 bit isMCAsmWriter = 1; 683 } 684 685 def ARMAsmParserVariant : AsmParserVariant { 686 int Variant = 0; 687 string Name = "ARM"; 688 string BreakCharacters = "."; 689 } 690 691 def ARM : Target { 692 // Pull in Instruction Info: 693 let InstructionSet = ARMInstrInfo; 694 let AssemblyWriters = [ARMAsmWriter]; 695 let AssemblyParserVariants = [ARMAsmParserVariant]; 696 } 697