Home | History | Annotate | Download | only in AArch64
      1 //=- AArch64.td - Describe the AArch64 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 // AArch64 Subtarget features.
     21 //
     22 
     23 def FeatureFPARMv8 : SubtargetFeature<"fp-armv8", "HasFPARMv8", "true",
     24                                        "Enable ARMv8 FP">;
     25 
     26 def FeatureNEON : SubtargetFeature<"neon", "HasNEON", "true",
     27   "Enable Advanced SIMD instructions", [FeatureFPARMv8]>;
     28 
     29 def FeatureSM4 : SubtargetFeature<
     30     "sm4", "HasSM4", "true",
     31     "Enable SM3 and SM4 support", [FeatureNEON]>;
     32 
     33 def FeatureSHA2 : SubtargetFeature<
     34     "sha2", "HasSHA2", "true",
     35     "Enable SHA1 and SHA256 support", [FeatureNEON]>;
     36 
     37 def FeatureSHA3 : SubtargetFeature<
     38     "sha3", "HasSHA3", "true",
     39     "Enable SHA512 and SHA3 support", [FeatureNEON, FeatureSHA2]>;
     40 
     41 def FeatureAES : SubtargetFeature<
     42     "aes", "HasAES", "true",
     43     "Enable AES support", [FeatureNEON]>;
     44 
     45 // Crypto has been split up and any combination is now valid (see the
     46 // crypto defintions above). Also, crypto is now context sensitive:
     47 // it has a different meaning for e.g. Armv8.4 than it has for Armv8.2.
     48 // Therefore, we rely on Clang, the user interacing tool, to pass on the
     49 // appropriate crypto options. But here in the backend, crypto has very little
     50 // meaning anymore. We kept the Crypto defintion here for backward
     51 // compatibility, and now imply features SHA2 and AES, which was the
     52 // "traditional" meaning of Crypto.
     53 def FeatureCrypto : SubtargetFeature<"crypto", "HasCrypto", "true",
     54   "Enable cryptographic instructions", [FeatureNEON, FeatureSHA2, FeatureAES]>;
     55 
     56 def FeatureCRC : SubtargetFeature<"crc", "HasCRC", "true",
     57   "Enable ARMv8 CRC-32 checksum instructions">;
     58 
     59 def FeatureRAS : SubtargetFeature<"ras", "HasRAS", "true",
     60   "Enable ARMv8 Reliability, Availability and Serviceability Extensions">;
     61 
     62 def FeatureLSE : SubtargetFeature<"lse", "HasLSE", "true",
     63   "Enable ARMv8.1 Large System Extension (LSE) atomic instructions">;
     64 
     65 def FeatureRDM : SubtargetFeature<"rdm", "HasRDM", "true",
     66   "Enable ARMv8.1 Rounding Double Multiply Add/Subtract instructions">;
     67 
     68 def FeaturePerfMon : SubtargetFeature<"perfmon", "HasPerfMon", "true",
     69   "Enable ARMv8 PMUv3 Performance Monitors extension">;
     70 
     71 def FeatureFullFP16 : SubtargetFeature<"fullfp16", "HasFullFP16", "true",
     72   "Full FP16", [FeatureFPARMv8]>;
     73 
     74 def FeatureSPE : SubtargetFeature<"spe", "HasSPE", "true",
     75   "Enable Statistical Profiling extension">;
     76 
     77 def FeatureSVE : SubtargetFeature<"sve", "HasSVE", "true",
     78   "Enable Scalable Vector Extension (SVE) instructions">;
     79 
     80 /// Cyclone has register move instructions which are "free".
     81 def FeatureZCRegMove : SubtargetFeature<"zcm", "HasZeroCycleRegMove", "true",
     82                                         "Has zero-cycle register moves">;
     83 
     84 /// Cyclone has instructions which zero registers for "free".
     85 def FeatureZCZeroing : SubtargetFeature<"zcz", "HasZeroCycleZeroing", "true",
     86                                         "Has zero-cycle zeroing instructions">;
     87 
     88 /// ... but the floating-point version doesn't quite work in rare cases on older
     89 /// CPUs.
     90 def FeatureZCZeroingFPWorkaround : SubtargetFeature<"zcz-fp-workaround",
     91     "HasZeroCycleZeroingFPWorkaround", "true",
     92     "The zero-cycle floating-point zeroing instruction has a bug">;
     93 
     94 def FeatureStrictAlign : SubtargetFeature<"strict-align",
     95                                           "StrictAlign", "true",
     96                                           "Disallow all unaligned memory "
     97                                           "access">;
     98 
     99 def FeatureReserveX18 : SubtargetFeature<"reserve-x18", "ReserveX18", "true",
    100                                          "Reserve X18, making it unavailable "
    101                                          "as a GPR">;
    102 
    103 def FeatureReserveX20 : SubtargetFeature<"reserve-x20", "ReserveX20", "true",
    104                                          "Reserve X20, making it unavailable "
    105                                          "as a GPR">;
    106 
    107 def FeatureUseAA : SubtargetFeature<"use-aa", "UseAA", "true",
    108                                     "Use alias analysis during codegen">;
    109 
    110 def FeatureBalanceFPOps : SubtargetFeature<"balance-fp-ops", "BalanceFPOps",
    111     "true",
    112     "balance mix of odd and even D-registers for fp multiply(-accumulate) ops">;
    113 
    114 def FeaturePredictableSelectIsExpensive : SubtargetFeature<
    115     "predictable-select-expensive", "PredictableSelectIsExpensive", "true",
    116     "Prefer likely predicted branches over selects">;
    117 
    118 def FeatureCustomCheapAsMoveHandling : SubtargetFeature<"custom-cheap-as-move",
    119     "CustomAsCheapAsMove", "true",
    120     "Use custom code for TargetInstrInfo::isAsCheapAsAMove()">;
    121 
    122 def FeatureExynosCheapAsMoveHandling : SubtargetFeature<"exynos-cheap-as-move",
    123     "ExynosAsCheapAsMove", "true",
    124     "Use Exynos specific code in TargetInstrInfo::isAsCheapAsAMove()",
    125     [FeatureCustomCheapAsMoveHandling]>;
    126 
    127 def FeaturePostRAScheduler : SubtargetFeature<"use-postra-scheduler",
    128     "UsePostRAScheduler", "true", "Schedule again after register allocation">;
    129 
    130 def FeatureSlowMisaligned128Store : SubtargetFeature<"slow-misaligned-128store",
    131     "Misaligned128StoreIsSlow", "true", "Misaligned 128 bit stores are slow">;
    132 
    133 def FeatureSlowPaired128 : SubtargetFeature<"slow-paired-128",
    134     "Paired128IsSlow", "true", "Paired 128 bit loads and stores are slow">;
    135 
    136 def FeatureSlowSTRQro : SubtargetFeature<"slow-strqro-store", "STRQroIsSlow",
    137     "true", "STR of Q register with register offset is slow">;
    138 
    139 def FeatureAlternateSExtLoadCVTF32Pattern : SubtargetFeature<
    140     "alternate-sextload-cvt-f32-pattern", "UseAlternateSExtLoadCVTF32Pattern",
    141     "true", "Use alternative pattern for sextload convert to f32">;
    142 
    143 def FeatureArithmeticBccFusion : SubtargetFeature<
    144     "arith-bcc-fusion", "HasArithmeticBccFusion", "true",
    145     "CPU fuses arithmetic+bcc operations">;
    146 
    147 def FeatureArithmeticCbzFusion : SubtargetFeature<
    148     "arith-cbz-fusion", "HasArithmeticCbzFusion", "true",
    149     "CPU fuses arithmetic + cbz/cbnz operations">;
    150 
    151 def FeatureFuseAddress : SubtargetFeature<
    152     "fuse-address", "HasFuseAddress", "true",
    153     "CPU fuses address generation and memory operations">;
    154 
    155 def FeatureFuseAES : SubtargetFeature<
    156     "fuse-aes", "HasFuseAES", "true",
    157     "CPU fuses AES crypto operations">;
    158 
    159 def FeatureFuseCCSelect : SubtargetFeature<
    160     "fuse-csel", "HasFuseCCSelect", "true",
    161     "CPU fuses conditional select operations">;
    162 
    163 def FeatureFuseLiterals : SubtargetFeature<
    164     "fuse-literals", "HasFuseLiterals", "true",
    165     "CPU fuses literal generation operations">;
    166 
    167 def FeatureDisableLatencySchedHeuristic : SubtargetFeature<
    168     "disable-latency-sched-heuristic", "DisableLatencySchedHeuristic", "true",
    169     "Disable latency scheduling heuristic">;
    170 
    171 def FeatureRCPC : SubtargetFeature<"rcpc", "HasRCPC", "true",
    172                                    "Enable support for RCPC extension">;
    173 
    174 def FeatureUseRSqrt : SubtargetFeature<
    175     "use-reciprocal-square-root", "UseRSqrt", "true",
    176     "Use the reciprocal square root approximation">;
    177 
    178 def FeatureDotProd : SubtargetFeature<
    179     "dotprod", "HasDotProd", "true",
    180     "Enable dot product support">;
    181 
    182 def FeatureNoNegativeImmediates : SubtargetFeature<"no-neg-immediates",
    183                                         "NegativeImmediates", "false",
    184                                         "Convert immediates and instructions "
    185                                         "to their negated or complemented "
    186                                         "equivalent when the immediate does "
    187                                         "not fit in the encoding.">;
    188 
    189 def FeatureLSLFast : SubtargetFeature<
    190     "lsl-fast", "HasLSLFast", "true",
    191     "CPU has a fastpath logical shift of up to 3 places">;
    192 
    193 def FeatureAggressiveFMA :
    194   SubtargetFeature<"aggressive-fma",
    195                    "HasAggressiveFMA",
    196                    "true",
    197                    "Enable Aggressive FMA for floating-point.">;
    198 
    199 //===----------------------------------------------------------------------===//
    200 // Architectures.
    201 //
    202 
    203 def HasV8_1aOps : SubtargetFeature<"v8.1a", "HasV8_1aOps", "true",
    204   "Support ARM v8.1a instructions", [FeatureCRC, FeatureLSE, FeatureRDM]>;
    205 
    206 def HasV8_2aOps : SubtargetFeature<"v8.2a", "HasV8_2aOps", "true",
    207   "Support ARM v8.2a instructions", [HasV8_1aOps, FeatureRAS]>;
    208 
    209 def HasV8_3aOps : SubtargetFeature<"v8.3a", "HasV8_3aOps", "true",
    210   "Support ARM v8.3a instructions", [HasV8_2aOps, FeatureRCPC]>;
    211 
    212 def HasV8_4aOps : SubtargetFeature<"v8.4a", "HasV8_4aOps", "true",
    213   "Support ARM v8.4a instructions", [HasV8_3aOps, FeatureDotProd]>;
    214 
    215 //===----------------------------------------------------------------------===//
    216 // Register File Description
    217 //===----------------------------------------------------------------------===//
    218 
    219 include "AArch64RegisterInfo.td"
    220 include "AArch64RegisterBanks.td"
    221 include "AArch64CallingConvention.td"
    222 
    223 //===----------------------------------------------------------------------===//
    224 // Instruction Descriptions
    225 //===----------------------------------------------------------------------===//
    226 
    227 include "AArch64Schedule.td"
    228 include "AArch64InstrInfo.td"
    229 
    230 def AArch64InstrInfo : InstrInfo;
    231 
    232 //===----------------------------------------------------------------------===//
    233 // Named operands for MRS/MSR/TLBI/...
    234 //===----------------------------------------------------------------------===//
    235 
    236 include "AArch64SystemOperands.td"
    237 
    238 //===----------------------------------------------------------------------===//
    239 // AArch64 Processors supported.
    240 //
    241 include "AArch64SchedA53.td"
    242 include "AArch64SchedA57.td"
    243 include "AArch64SchedCyclone.td"
    244 include "AArch64SchedFalkor.td"
    245 include "AArch64SchedKryo.td"
    246 include "AArch64SchedExynosM1.td"
    247 include "AArch64SchedExynosM3.td"
    248 include "AArch64SchedThunderX.td"
    249 include "AArch64SchedThunderX2T99.td"
    250 
    251 def ProcA35     : SubtargetFeature<"a35", "ARMProcFamily", "CortexA35",
    252                                    "Cortex-A35 ARM processors", [
    253                                    FeatureCRC,
    254                                    FeatureCrypto,
    255                                    FeatureFPARMv8,
    256                                    FeatureNEON,
    257                                    FeaturePerfMon
    258                                    ]>;
    259 
    260 def ProcA53     : SubtargetFeature<"a53", "ARMProcFamily", "CortexA53",
    261                                    "Cortex-A53 ARM processors", [
    262                                    FeatureBalanceFPOps,
    263                                    FeatureCRC,
    264                                    FeatureCrypto,
    265                                    FeatureCustomCheapAsMoveHandling,
    266                                    FeatureFPARMv8,
    267                                    FeatureFuseAES,
    268                                    FeatureNEON,
    269                                    FeaturePerfMon,
    270                                    FeaturePostRAScheduler,
    271                                    FeatureUseAA
    272                                    ]>;
    273 
    274 def ProcA55     : SubtargetFeature<"a55", "ARMProcFamily", "CortexA55",
    275                                    "Cortex-A55 ARM processors", [
    276                                    HasV8_2aOps,
    277                                    FeatureCrypto,
    278                                    FeatureFPARMv8,
    279                                    FeatureFuseAES,
    280                                    FeatureNEON,
    281                                    FeatureFullFP16,
    282                                    FeatureDotProd,
    283                                    FeatureRCPC,
    284                                    FeaturePerfMon
    285                                    ]>;
    286 
    287 def ProcA57     : SubtargetFeature<"a57", "ARMProcFamily", "CortexA57",
    288                                    "Cortex-A57 ARM processors", [
    289                                    FeatureBalanceFPOps,
    290                                    FeatureCRC,
    291                                    FeatureCrypto,
    292                                    FeatureCustomCheapAsMoveHandling,
    293                                    FeatureFPARMv8,
    294                                    FeatureFuseAES,
    295                                    FeatureFuseLiterals,
    296                                    FeatureNEON,
    297                                    FeaturePerfMon,
    298                                    FeaturePostRAScheduler,
    299                                    FeaturePredictableSelectIsExpensive
    300                                    ]>;
    301 
    302 def ProcA72     : SubtargetFeature<"a72", "ARMProcFamily", "CortexA72",
    303                                    "Cortex-A72 ARM processors", [
    304                                    FeatureCRC,
    305                                    FeatureCrypto,
    306                                    FeatureFPARMv8,
    307                                    FeatureFuseAES,
    308                                    FeatureNEON,
    309                                    FeaturePerfMon
    310                                    ]>;
    311 
    312 def ProcA73     : SubtargetFeature<"a73", "ARMProcFamily", "CortexA73",
    313                                    "Cortex-A73 ARM processors", [
    314                                    FeatureCRC,
    315                                    FeatureCrypto,
    316                                    FeatureFPARMv8,
    317                                    FeatureFuseAES,
    318                                    FeatureNEON,
    319                                    FeaturePerfMon
    320                                    ]>;
    321 
    322 def ProcA75     : SubtargetFeature<"a75", "ARMProcFamily", "CortexA75",
    323                                    "Cortex-A75 ARM processors", [
    324                                    HasV8_2aOps,
    325                                    FeatureCrypto,
    326                                    FeatureFPARMv8,
    327                                    FeatureFuseAES,
    328                                    FeatureNEON,
    329                                    FeatureFullFP16,
    330                                    FeatureDotProd,
    331                                    FeatureRCPC,
    332                                    FeaturePerfMon
    333                                    ]>;
    334 
    335 // Note that cyclone does not fuse AES instructions, but newer apple chips do
    336 // perform the fusion and cyclone is used by default when targetting apple OSes.
    337 def ProcCyclone : SubtargetFeature<"cyclone", "ARMProcFamily", "Cyclone",
    338                                    "Cyclone", [
    339                                    FeatureAlternateSExtLoadCVTF32Pattern,
    340                                    FeatureArithmeticBccFusion,
    341                                    FeatureArithmeticCbzFusion,
    342                                    FeatureCrypto,
    343                                    FeatureDisableLatencySchedHeuristic,
    344                                    FeatureFPARMv8,
    345                                    FeatureFuseAES,
    346                                    FeatureNEON,
    347                                    FeaturePerfMon,
    348                                    FeatureZCRegMove,
    349                                    FeatureZCZeroing,
    350                                    FeatureZCZeroingFPWorkaround
    351                                    ]>;
    352 
    353 def ProcExynosM1 : SubtargetFeature<"exynosm1", "ARMProcFamily", "ExynosM1",
    354                                     "Samsung Exynos-M1 processors",
    355                                     [FeatureSlowPaired128,
    356                                      FeatureCRC,
    357                                      FeatureCrypto,
    358                                      FeatureExynosCheapAsMoveHandling,
    359                                      FeatureFPARMv8,
    360                                      FeatureFuseAES,
    361                                      FeatureNEON,
    362                                      FeaturePerfMon,
    363                                      FeaturePostRAScheduler,
    364                                      FeatureSlowMisaligned128Store,
    365                                      FeatureUseRSqrt,
    366                                      FeatureZCZeroing]>;
    367 
    368 def ProcExynosM2 : SubtargetFeature<"exynosm2", "ARMProcFamily", "ExynosM1",
    369                                     "Samsung Exynos-M2 processors",
    370                                     [FeatureSlowPaired128,
    371                                      FeatureCRC,
    372                                      FeatureCrypto,
    373                                      FeatureExynosCheapAsMoveHandling,
    374                                      FeatureFPARMv8,
    375                                      FeatureFuseAES,
    376                                      FeatureNEON,
    377                                      FeaturePerfMon,
    378                                      FeaturePostRAScheduler,
    379                                      FeatureSlowMisaligned128Store,
    380                                      FeatureZCZeroing]>;
    381 
    382 def ProcExynosM3 : SubtargetFeature<"exynosm3", "ARMProcFamily", "ExynosM3",
    383                                     "Samsung Exynos-M3 processors",
    384                                     [FeatureCRC,
    385                                      FeatureCrypto,
    386                                      FeatureExynosCheapAsMoveHandling,
    387                                      FeatureFPARMv8,
    388                                      FeatureFuseAddress,
    389                                      FeatureFuseAES,
    390                                      FeatureFuseCCSelect,
    391                                      FeatureFuseLiterals,
    392                                      FeatureLSLFast,
    393                                      FeatureNEON,
    394                                      FeaturePerfMon,
    395                                      FeaturePostRAScheduler,
    396                                      FeaturePredictableSelectIsExpensive,
    397                                      FeatureZCZeroing]>;
    398 
    399 def ProcKryo    : SubtargetFeature<"kryo", "ARMProcFamily", "Kryo",
    400                                    "Qualcomm Kryo processors", [
    401                                    FeatureCRC,
    402                                    FeatureCrypto,
    403                                    FeatureCustomCheapAsMoveHandling,
    404                                    FeatureFPARMv8,
    405                                    FeatureNEON,
    406                                    FeaturePerfMon,
    407                                    FeaturePostRAScheduler,
    408                                    FeaturePredictableSelectIsExpensive,
    409                                    FeatureZCZeroing,
    410                                    FeatureLSLFast
    411                                    ]>;
    412 
    413 def ProcFalkor  : SubtargetFeature<"falkor", "ARMProcFamily", "Falkor",
    414                                    "Qualcomm Falkor processors", [
    415                                    FeatureCRC,
    416                                    FeatureCrypto,
    417                                    FeatureCustomCheapAsMoveHandling,
    418                                    FeatureFPARMv8,
    419                                    FeatureNEON,
    420                                    FeaturePerfMon,
    421                                    FeaturePostRAScheduler,
    422                                    FeaturePredictableSelectIsExpensive,
    423                                    FeatureRDM,
    424                                    FeatureZCZeroing,
    425                                    FeatureLSLFast,
    426                                    FeatureSlowSTRQro
    427                                    ]>;
    428 
    429 def ProcSaphira  : SubtargetFeature<"saphira", "ARMProcFamily", "Saphira",
    430                                    "Qualcomm Saphira processors", [
    431                                    FeatureCrypto,
    432                                    FeatureCustomCheapAsMoveHandling,
    433                                    FeatureFPARMv8,
    434                                    FeatureNEON,
    435                                    FeatureSPE,
    436                                    FeaturePerfMon,
    437                                    FeaturePostRAScheduler,
    438                                    FeaturePredictableSelectIsExpensive,
    439                                    FeatureZCZeroing,
    440                                    FeatureLSLFast,
    441                                    HasV8_3aOps]>;
    442 
    443 def ProcThunderX2T99  : SubtargetFeature<"thunderx2t99", "ARMProcFamily",
    444                                          "ThunderX2T99",
    445                                          "Cavium ThunderX2 processors", [
    446                                           FeatureAggressiveFMA,
    447                                           FeatureCRC,
    448                                           FeatureCrypto,
    449                                           FeatureFPARMv8,
    450                                           FeatureArithmeticBccFusion,
    451                                           FeatureNEON,
    452                                           FeaturePostRAScheduler,
    453                                           FeaturePredictableSelectIsExpensive,
    454                                           FeatureLSE,
    455                                           HasV8_1aOps]>;
    456 
    457 def ProcThunderX : SubtargetFeature<"thunderx", "ARMProcFamily", "ThunderX",
    458                                     "Cavium ThunderX processors", [
    459                                     FeatureCRC,
    460                                     FeatureCrypto,
    461                                     FeatureFPARMv8,
    462                                     FeaturePerfMon,
    463                                     FeaturePostRAScheduler,
    464                                     FeaturePredictableSelectIsExpensive,
    465                                     FeatureNEON]>;
    466 
    467 def ProcThunderXT88 : SubtargetFeature<"thunderxt88", "ARMProcFamily",
    468                                        "ThunderXT88",
    469                                        "Cavium ThunderX processors", [
    470                                        FeatureCRC,
    471                                        FeatureCrypto,
    472                                        FeatureFPARMv8,
    473                                        FeaturePerfMon,
    474                                        FeaturePostRAScheduler,
    475                                        FeaturePredictableSelectIsExpensive,
    476                                        FeatureNEON]>;
    477 
    478 def ProcThunderXT81 : SubtargetFeature<"thunderxt81", "ARMProcFamily",
    479                                        "ThunderXT81",
    480                                        "Cavium ThunderX processors", [
    481                                        FeatureCRC,
    482                                        FeatureCrypto,
    483                                        FeatureFPARMv8,
    484                                        FeaturePerfMon,
    485                                        FeaturePostRAScheduler,
    486                                        FeaturePredictableSelectIsExpensive,
    487                                        FeatureNEON]>;
    488 
    489 def ProcThunderXT83 : SubtargetFeature<"thunderxt83", "ARMProcFamily",
    490                                        "ThunderXT83",
    491                                        "Cavium ThunderX processors", [
    492                                        FeatureCRC,
    493                                        FeatureCrypto,
    494                                        FeatureFPARMv8,
    495                                        FeaturePerfMon,
    496                                        FeaturePostRAScheduler,
    497                                        FeaturePredictableSelectIsExpensive,
    498                                        FeatureNEON]>;
    499 
    500 def : ProcessorModel<"generic", NoSchedModel, [
    501                      FeatureFPARMv8,
    502                      FeatureFuseAES,
    503                      FeatureNEON,
    504                      FeaturePerfMon,
    505                      FeaturePostRAScheduler
    506                      ]>;
    507 
    508 // FIXME: Cortex-A35 and Cortex-A55 are currently modeled as a Cortex-A53.
    509 def : ProcessorModel<"cortex-a35", CortexA53Model, [ProcA35]>;
    510 def : ProcessorModel<"cortex-a53", CortexA53Model, [ProcA53]>;
    511 def : ProcessorModel<"cortex-a55", CortexA53Model, [ProcA55]>;
    512 def : ProcessorModel<"cortex-a57", CortexA57Model, [ProcA57]>;
    513 // FIXME: Cortex-A72, Cortex-A73 and Cortex-A75 are currently modeled as a Cortex-A57.
    514 def : ProcessorModel<"cortex-a72", CortexA57Model, [ProcA72]>;
    515 def : ProcessorModel<"cortex-a73", CortexA57Model, [ProcA73]>;
    516 def : ProcessorModel<"cortex-a75", CortexA57Model, [ProcA75]>;
    517 def : ProcessorModel<"cyclone", CycloneModel, [ProcCyclone]>;
    518 def : ProcessorModel<"exynos-m1", ExynosM1Model, [ProcExynosM1]>;
    519 def : ProcessorModel<"exynos-m2", ExynosM1Model, [ProcExynosM2]>;
    520 def : ProcessorModel<"exynos-m3", ExynosM3Model, [ProcExynosM3]>;
    521 def : ProcessorModel<"exynos-m4", ExynosM3Model, [ProcExynosM3]>;
    522 def : ProcessorModel<"falkor", FalkorModel, [ProcFalkor]>;
    523 def : ProcessorModel<"saphira", FalkorModel, [ProcSaphira]>;
    524 def : ProcessorModel<"kryo", KryoModel, [ProcKryo]>;
    525 // Cavium ThunderX/ThunderX T8X  Processors
    526 def : ProcessorModel<"thunderx", ThunderXT8XModel,  [ProcThunderX]>;
    527 def : ProcessorModel<"thunderxt88", ThunderXT8XModel,  [ProcThunderXT88]>;
    528 def : ProcessorModel<"thunderxt81", ThunderXT8XModel,  [ProcThunderXT81]>;
    529 def : ProcessorModel<"thunderxt83", ThunderXT8XModel,  [ProcThunderXT83]>;
    530 // Cavium ThunderX2T9X  Processors. Formerly Broadcom Vulcan.
    531 def : ProcessorModel<"thunderx2t99", ThunderX2T99Model, [ProcThunderX2T99]>;
    532 
    533 //===----------------------------------------------------------------------===//
    534 // Assembly parser
    535 //===----------------------------------------------------------------------===//
    536 
    537 def GenericAsmParserVariant : AsmParserVariant {
    538   int Variant = 0;
    539   string Name = "generic";
    540   string BreakCharacters = ".";
    541   string TokenizingCharacters = "[]*!/";
    542 }
    543 
    544 def AppleAsmParserVariant : AsmParserVariant {
    545   int Variant = 1;
    546   string Name = "apple-neon";
    547   string BreakCharacters = ".";
    548   string TokenizingCharacters = "[]*!/";
    549 }
    550 
    551 //===----------------------------------------------------------------------===//
    552 // Assembly printer
    553 //===----------------------------------------------------------------------===//
    554 // AArch64 Uses the MC printer for asm output, so make sure the TableGen
    555 // AsmWriter bits get associated with the correct class.
    556 def GenericAsmWriter : AsmWriter {
    557   string AsmWriterClassName  = "InstPrinter";
    558   int PassSubtarget = 1;
    559   int Variant = 0;
    560   bit isMCAsmWriter = 1;
    561 }
    562 
    563 def AppleAsmWriter : AsmWriter {
    564   let AsmWriterClassName = "AppleInstPrinter";
    565   int PassSubtarget = 1;
    566   int Variant = 1;
    567   int isMCAsmWriter = 1;
    568 }
    569 
    570 //===----------------------------------------------------------------------===//
    571 // Target Declaration
    572 //===----------------------------------------------------------------------===//
    573 
    574 def AArch64 : Target {
    575   let InstructionSet = AArch64InstrInfo;
    576   let AssemblyParserVariants = [GenericAsmParserVariant, AppleAsmParserVariant];
    577   let AssemblyWriters = [GenericAsmWriter, AppleAsmWriter];
    578   let AllowRegisterRenaming = 1;
    579 }
    580