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 FeatureCrypto : SubtargetFeature<"crypto", "HasCrypto", "true",
     30   "Enable cryptographic instructions">;
     31 
     32 def FeatureCRC : SubtargetFeature<"crc", "HasCRC", "true",
     33   "Enable ARMv8 CRC-32 checksum instructions">;
     34 
     35 def FeatureRAS : SubtargetFeature<"ras", "HasRAS", "true",
     36   "Enable ARMv8 Reliability, Availability and Serviceability Extensions">;
     37 
     38 def FeaturePerfMon : SubtargetFeature<"perfmon", "HasPerfMon", "true",
     39   "Enable ARMv8 PMUv3 Performance Monitors extension">;
     40 
     41 def FeatureFullFP16 : SubtargetFeature<"fullfp16", "HasFullFP16", "true",
     42   "Full FP16", [FeatureFPARMv8]>;
     43 
     44 def FeatureSPE : SubtargetFeature<"spe", "HasSPE", "true",
     45   "Enable Statistical Profiling extension">;
     46 
     47 /// Cyclone has register move instructions which are "free".
     48 def FeatureZCRegMove : SubtargetFeature<"zcm", "HasZeroCycleRegMove", "true",
     49                                         "Has zero-cycle register moves">;
     50 
     51 /// Cyclone has instructions which zero registers for "free".
     52 def FeatureZCZeroing : SubtargetFeature<"zcz", "HasZeroCycleZeroing", "true",
     53                                         "Has zero-cycle zeroing instructions">;
     54 
     55 def FeatureStrictAlign : SubtargetFeature<"strict-align",
     56                                           "StrictAlign", "true",
     57                                           "Disallow all unaligned memory "
     58                                           "access">;
     59 
     60 def FeatureReserveX18 : SubtargetFeature<"reserve-x18", "ReserveX18", "true",
     61                                          "Reserve X18, making it unavailable "
     62                                          "as a GPR">;
     63 
     64 def FeatureMergeNarrowLd : SubtargetFeature<"merge-narrow-ld",
     65                                             "MergeNarrowLoads", "true",
     66                                             "Merge narrow load instructions">;
     67 
     68 def FeatureUseAA : SubtargetFeature<"use-aa", "UseAA", "true",
     69                                     "Use alias analysis during codegen">;
     70 
     71 def FeatureBalanceFPOps : SubtargetFeature<"balance-fp-ops", "BalanceFPOps",
     72     "true",
     73     "balance mix of odd and even D-registers for fp multiply(-accumulate) ops">;
     74 
     75 def FeaturePredictableSelectIsExpensive : SubtargetFeature<
     76     "predictable-select-expensive", "PredictableSelectIsExpensive", "true",
     77     "Prefer likely predicted branches over selects">;
     78 
     79 def FeatureCustomCheapAsMoveHandling : SubtargetFeature<"custom-cheap-as-move",
     80     "CustomAsCheapAsMove", "true",
     81     "Use custom code for TargetInstrInfo::isAsCheapAsAMove()">;
     82 
     83 def FeaturePostRAScheduler : SubtargetFeature<"use-postra-scheduler",
     84     "UsePostRAScheduler", "true", "Schedule again after register allocation">;
     85 
     86 def FeatureSlowMisaligned128Store : SubtargetFeature<"slow-misaligned-128store",
     87     "Misaligned128StoreIsSlow", "true", "Misaligned 128 bit stores are slow">;
     88 
     89 def FeatureAvoidQuadLdStPairs : SubtargetFeature<"no-quad-ldst-pairs",
     90     "AvoidQuadLdStPairs", "true",
     91     "Do not form quad load/store pair operations">;
     92 
     93 def FeatureAlternateSExtLoadCVTF32Pattern : SubtargetFeature<
     94     "alternate-sextload-cvt-f32-pattern", "UseAlternateSExtLoadCVTF32Pattern",
     95     "true", "Use alternative pattern for sextload convert to f32">;
     96 
     97 def FeatureMacroOpFusion : SubtargetFeature<
     98     "macroop-fusion", "HasMacroOpFusion", "true",
     99     "CPU supports macro op fusion">;
    100 
    101 def FeatureDisableLatencySchedHeuristic : SubtargetFeature<
    102     "disable-latency-sched-heuristic", "DisableLatencySchedHeuristic", "true",
    103     "Disable latency scheduling heuristic">;
    104 
    105 def FeatureUseRSqrt : SubtargetFeature<
    106     "use-reverse-square-root", "UseRSqrt", "true", "Use reverse square root">;
    107 
    108 //===----------------------------------------------------------------------===//
    109 // Architectures.
    110 //
    111 
    112 def HasV8_1aOps : SubtargetFeature<"v8.1a", "HasV8_1aOps", "true",
    113   "Support ARM v8.1a instructions", [FeatureCRC]>;
    114 
    115 def HasV8_2aOps : SubtargetFeature<"v8.2a", "HasV8_2aOps", "true",
    116   "Support ARM v8.2a instructions", [HasV8_1aOps, FeatureRAS]>;
    117 
    118 //===----------------------------------------------------------------------===//
    119 // Register File Description
    120 //===----------------------------------------------------------------------===//
    121 
    122 include "AArch64RegisterInfo.td"
    123 include "AArch64CallingConvention.td"
    124 
    125 //===----------------------------------------------------------------------===//
    126 // Instruction Descriptions
    127 //===----------------------------------------------------------------------===//
    128 
    129 include "AArch64Schedule.td"
    130 include "AArch64InstrInfo.td"
    131 
    132 def AArch64InstrInfo : InstrInfo;
    133 
    134 //===----------------------------------------------------------------------===//
    135 // Named operands for MRS/MSR/TLBI/...
    136 //===----------------------------------------------------------------------===//
    137 
    138 include "AArch64SystemOperands.td"
    139 
    140 //===----------------------------------------------------------------------===//
    141 // AArch64 Processors supported.
    142 //
    143 include "AArch64SchedA53.td"
    144 include "AArch64SchedA57.td"
    145 include "AArch64SchedCyclone.td"
    146 include "AArch64SchedM1.td"
    147 include "AArch64SchedKryo.td"
    148 include "AArch64SchedVulcan.td"
    149 
    150 def ProcA35     : SubtargetFeature<"a35", "ARMProcFamily", "CortexA35",
    151                                    "Cortex-A35 ARM processors", [
    152                                    FeatureCRC,
    153                                    FeatureCrypto,
    154                                    FeatureFPARMv8,
    155                                    FeatureNEON,
    156                                    FeaturePerfMon
    157                                    ]>;
    158 
    159 def ProcA53     : SubtargetFeature<"a53", "ARMProcFamily", "CortexA53",
    160                                    "Cortex-A53 ARM processors", [
    161                                    FeatureBalanceFPOps,
    162                                    FeatureCRC,
    163                                    FeatureCrypto,
    164                                    FeatureCustomCheapAsMoveHandling,
    165                                    FeatureFPARMv8,
    166                                    FeatureNEON,
    167                                    FeaturePerfMon,
    168                                    FeaturePostRAScheduler,
    169                                    FeatureUseAA
    170                                    ]>;
    171 
    172 def ProcA57     : SubtargetFeature<"a57", "ARMProcFamily", "CortexA57",
    173                                    "Cortex-A57 ARM processors", [
    174                                    FeatureBalanceFPOps,
    175                                    FeatureCRC,
    176                                    FeatureCrypto,
    177                                    FeatureCustomCheapAsMoveHandling,
    178                                    FeatureFPARMv8,
    179                                    FeatureMergeNarrowLd,
    180                                    FeatureNEON,
    181                                    FeaturePerfMon,
    182                                    FeaturePostRAScheduler,
    183                                    FeaturePredictableSelectIsExpensive
    184                                    ]>;
    185 
    186 def ProcA72     : SubtargetFeature<"a72", "ARMProcFamily", "CortexA72",
    187                                    "Cortex-A72 ARM processors", [
    188                                    FeatureCRC,
    189                                    FeatureCrypto,
    190                                    FeatureFPARMv8,
    191                                    FeatureNEON,
    192                                    FeaturePerfMon
    193                                    ]>;
    194 
    195 def ProcA73     : SubtargetFeature<"a73", "ARMProcFamily", "CortexA73",
    196                                    "Cortex-A73 ARM processors", [
    197                                    FeatureCRC,
    198                                    FeatureCrypto,
    199                                    FeatureFPARMv8,
    200                                    FeatureNEON,
    201                                    FeaturePerfMon
    202                                    ]>;
    203 
    204 def ProcCyclone : SubtargetFeature<"cyclone", "ARMProcFamily", "Cyclone",
    205                                    "Cyclone", [
    206                                    FeatureAlternateSExtLoadCVTF32Pattern,
    207                                    FeatureCrypto,
    208                                    FeatureDisableLatencySchedHeuristic,
    209                                    FeatureFPARMv8,
    210                                    FeatureMacroOpFusion,
    211                                    FeatureNEON,
    212                                    FeaturePerfMon,
    213                                    FeatureSlowMisaligned128Store,
    214                                    FeatureZCRegMove,
    215                                    FeatureZCZeroing
    216                                    ]>;
    217 
    218 def ProcExynosM1 : SubtargetFeature<"exynosm1", "ARMProcFamily", "ExynosM1",
    219                                     "Samsung Exynos-M1 processors", [
    220                                     FeatureAvoidQuadLdStPairs,
    221                                     FeatureCRC,
    222                                     FeatureCrypto,
    223                                     FeatureCustomCheapAsMoveHandling,
    224                                     FeatureFPARMv8,
    225                                     FeatureNEON,
    226                                     FeaturePerfMon,
    227                                     FeaturePostRAScheduler,
    228                                     FeatureUseRSqrt
    229                                     ]>;
    230 
    231 def ProcKryo    : SubtargetFeature<"kryo", "ARMProcFamily", "Kryo",
    232                                    "Qualcomm Kryo processors", [
    233                                    FeatureCRC,
    234                                    FeatureCrypto,
    235                                    FeatureCustomCheapAsMoveHandling,
    236                                    FeatureFPARMv8,
    237                                    FeatureMergeNarrowLd,
    238                                    FeatureNEON,
    239                                    FeaturePerfMon,
    240                                    FeaturePostRAScheduler,
    241                                    FeaturePredictableSelectIsExpensive,
    242                                    FeatureZCZeroing
    243                                    ]>;
    244 
    245 def ProcVulcan  : SubtargetFeature<"vulcan", "ARMProcFamily", "Vulcan",
    246                                    "Broadcom Vulcan processors", [
    247                                    FeatureCRC,
    248                                    FeatureCrypto,
    249                                    FeatureFPARMv8,
    250                                    FeatureMacroOpFusion,
    251                                    FeatureNEON,
    252                                    FeaturePostRAScheduler,
    253                                    HasV8_1aOps]>;
    254 
    255 def : ProcessorModel<"generic", NoSchedModel, [
    256                      FeatureCRC,
    257                      FeatureFPARMv8,
    258                      FeatureNEON,
    259                      FeaturePerfMon,
    260                      FeaturePostRAScheduler
    261                      ]>;
    262 
    263 // FIXME: Cortex-A35 is currently modelled as a Cortex-A53
    264 def : ProcessorModel<"cortex-a35", CortexA53Model, [ProcA35]>;
    265 def : ProcessorModel<"cortex-a53", CortexA53Model, [ProcA53]>;
    266 def : ProcessorModel<"cortex-a57", CortexA57Model, [ProcA57]>;
    267 // FIXME: Cortex-A72 and Cortex-A73 are currently modelled as an Cortex-A57.
    268 def : ProcessorModel<"cortex-a72", CortexA57Model, [ProcA72]>;
    269 def : ProcessorModel<"cortex-a73", CortexA57Model, [ProcA73]>;
    270 def : ProcessorModel<"cyclone", CycloneModel, [ProcCyclone]>;
    271 def : ProcessorModel<"exynos-m1", ExynosM1Model, [ProcExynosM1]>;
    272 def : ProcessorModel<"kryo", KryoModel, [ProcKryo]>;
    273 def : ProcessorModel<"vulcan", VulcanModel, [ProcVulcan]>;
    274 
    275 //===----------------------------------------------------------------------===//
    276 // Assembly parser
    277 //===----------------------------------------------------------------------===//
    278 
    279 def GenericAsmParserVariant : AsmParserVariant {
    280   int Variant = 0;
    281   string Name = "generic";
    282   string BreakCharacters = ".";
    283 }
    284 
    285 def AppleAsmParserVariant : AsmParserVariant {
    286   int Variant = 1;
    287   string Name = "apple-neon";
    288   string BreakCharacters = ".";
    289 }
    290 
    291 //===----------------------------------------------------------------------===//
    292 // Assembly printer
    293 //===----------------------------------------------------------------------===//
    294 // AArch64 Uses the MC printer for asm output, so make sure the TableGen
    295 // AsmWriter bits get associated with the correct class.
    296 def GenericAsmWriter : AsmWriter {
    297   string AsmWriterClassName  = "InstPrinter";
    298   int PassSubtarget = 1;
    299   int Variant = 0;
    300   bit isMCAsmWriter = 1;
    301 }
    302 
    303 def AppleAsmWriter : AsmWriter {
    304   let AsmWriterClassName = "AppleInstPrinter";
    305   int PassSubtarget = 1;
    306   int Variant = 1;
    307   int isMCAsmWriter = 1;
    308 }
    309 
    310 //===----------------------------------------------------------------------===//
    311 // Target Declaration
    312 //===----------------------------------------------------------------------===//
    313 
    314 def AArch64 : Target {
    315   let InstructionSet = AArch64InstrInfo;
    316   let AssemblyParserVariants = [GenericAsmParserVariant, AppleAsmParserVariant];
    317   let AssemblyWriters = [GenericAsmWriter, AppleAsmWriter];
    318 }
    319