Home | History | Annotate | Download | only in X86
      1 //===-- X86.td - Target definition file for the Intel X86 --*- 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 // This is a target description file for the Intel i386 architecture, referred
     11 // to here as the "X86" architecture.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 // Get the target-independent interfaces which we are implementing...
     16 //
     17 include "llvm/Target/Target.td"
     18 
     19 //===----------------------------------------------------------------------===//
     20 // X86 Subtarget state
     21 //
     22 
     23 def Mode64Bit : SubtargetFeature<"64bit-mode", "In64BitMode", "true",
     24                                   "64-bit mode (x86_64)">;
     25 def Mode32Bit : SubtargetFeature<"32bit-mode", "In32BitMode", "true",
     26                                   "32-bit mode (80386)">;
     27 def Mode16Bit : SubtargetFeature<"16bit-mode", "In16BitMode", "true",
     28                                   "16-bit mode (i8086)">;
     29 
     30 //===----------------------------------------------------------------------===//
     31 // X86 Subtarget features
     32 //===----------------------------------------------------------------------===//
     33 
     34 def FeatureX87     : SubtargetFeature<"x87","HasX87", "true",
     35                                       "Enable X87 float instructions">;
     36 
     37 def FeatureCMOV    : SubtargetFeature<"cmov","HasCMov", "true",
     38                                       "Enable conditional move instructions">;
     39 
     40 def FeaturePOPCNT   : SubtargetFeature<"popcnt", "HasPOPCNT", "true",
     41                                        "Support POPCNT instruction">;
     42 
     43 def FeatureFXSR    : SubtargetFeature<"fxsr", "HasFXSR", "true",
     44                                       "Support fxsave/fxrestore instructions">;
     45 
     46 def FeatureXSAVE   : SubtargetFeature<"xsave", "HasXSAVE", "true",
     47                                        "Support xsave instructions">;
     48 
     49 def FeatureXSAVEOPT: SubtargetFeature<"xsaveopt", "HasXSAVEOPT", "true",
     50                                        "Support xsaveopt instructions">;
     51 
     52 def FeatureXSAVEC  : SubtargetFeature<"xsavec", "HasXSAVEC", "true",
     53                                        "Support xsavec instructions">;
     54 
     55 def FeatureXSAVES  : SubtargetFeature<"xsaves", "HasXSAVES", "true",
     56                                        "Support xsaves instructions">;
     57 
     58 def FeatureSSE1    : SubtargetFeature<"sse", "X86SSELevel", "SSE1",
     59                                       "Enable SSE instructions",
     60                                       // SSE codegen depends on cmovs, and all
     61                                       // SSE1+ processors support them.
     62                                       [FeatureCMOV]>;
     63 def FeatureSSE2    : SubtargetFeature<"sse2", "X86SSELevel", "SSE2",
     64                                       "Enable SSE2 instructions",
     65                                       [FeatureSSE1]>;
     66 def FeatureSSE3    : SubtargetFeature<"sse3", "X86SSELevel", "SSE3",
     67                                       "Enable SSE3 instructions",
     68                                       [FeatureSSE2]>;
     69 def FeatureSSSE3   : SubtargetFeature<"ssse3", "X86SSELevel", "SSSE3",
     70                                       "Enable SSSE3 instructions",
     71                                       [FeatureSSE3]>;
     72 def FeatureSSE41   : SubtargetFeature<"sse4.1", "X86SSELevel", "SSE41",
     73                                       "Enable SSE 4.1 instructions",
     74                                       [FeatureSSSE3]>;
     75 def FeatureSSE42   : SubtargetFeature<"sse4.2", "X86SSELevel", "SSE42",
     76                                       "Enable SSE 4.2 instructions",
     77                                       [FeatureSSE41]>;
     78 // The MMX subtarget feature is separate from the rest of the SSE features
     79 // because it's important (for odd compatibility reasons) to be able to
     80 // turn it off explicitly while allowing SSE+ to be on.
     81 def FeatureMMX     : SubtargetFeature<"mmx","X863DNowLevel", "MMX",
     82                                       "Enable MMX instructions">;
     83 def Feature3DNow   : SubtargetFeature<"3dnow", "X863DNowLevel", "ThreeDNow",
     84                                       "Enable 3DNow! instructions",
     85                                       [FeatureMMX]>;
     86 def Feature3DNowA  : SubtargetFeature<"3dnowa", "X863DNowLevel", "ThreeDNowA",
     87                                       "Enable 3DNow! Athlon instructions",
     88                                       [Feature3DNow]>;
     89 // All x86-64 hardware has SSE2, but we don't mark SSE2 as an implied
     90 // feature, because SSE2 can be disabled (e.g. for compiling OS kernels)
     91 // without disabling 64-bit mode.
     92 def Feature64Bit   : SubtargetFeature<"64bit", "HasX86_64", "true",
     93                                       "Support 64-bit instructions",
     94                                       [FeatureCMOV]>;
     95 def FeatureCMPXCHG16B : SubtargetFeature<"cx16", "HasCmpxchg16b", "true",
     96                                       "64-bit with cmpxchg16b",
     97                                       [Feature64Bit]>;
     98 def FeatureSlowBTMem : SubtargetFeature<"slow-bt-mem", "IsBTMemSlow", "true",
     99                                        "Bit testing of memory is slow">;
    100 def FeatureSlowSHLD : SubtargetFeature<"slow-shld", "IsSHLDSlow", "true",
    101                                        "SHLD instruction is slow">;
    102 // FIXME: This should not apply to CPUs that do not have SSE.
    103 def FeatureSlowUAMem16 : SubtargetFeature<"slow-unaligned-mem-16",
    104                                 "IsUAMem16Slow", "true",
    105                                 "Slow unaligned 16-byte memory access">;
    106 def FeatureSlowUAMem32 : SubtargetFeature<"slow-unaligned-mem-32",
    107                                 "IsUAMem32Slow", "true",
    108                                 "Slow unaligned 32-byte memory access">;
    109 def FeatureSSE4A   : SubtargetFeature<"sse4a", "HasSSE4A", "true",
    110                                       "Support SSE 4a instructions",
    111                                       [FeatureSSE3]>;
    112 
    113 def FeatureAVX     : SubtargetFeature<"avx", "X86SSELevel", "AVX",
    114                                       "Enable AVX instructions",
    115                                       [FeatureSSE42]>;
    116 def FeatureAVX2    : SubtargetFeature<"avx2", "X86SSELevel", "AVX2",
    117                                       "Enable AVX2 instructions",
    118                                       [FeatureAVX]>;
    119 def FeatureAVX512   : SubtargetFeature<"avx512f", "X86SSELevel", "AVX512F",
    120                                       "Enable AVX-512 instructions",
    121                                       [FeatureAVX2]>;
    122 def FeatureERI      : SubtargetFeature<"avx512er", "HasERI", "true",
    123                       "Enable AVX-512 Exponential and Reciprocal Instructions",
    124                                       [FeatureAVX512]>;
    125 def FeatureCDI      : SubtargetFeature<"avx512cd", "HasCDI", "true",
    126                       "Enable AVX-512 Conflict Detection Instructions",
    127                                       [FeatureAVX512]>;
    128 def FeaturePFI      : SubtargetFeature<"avx512pf", "HasPFI", "true",
    129                       "Enable AVX-512 PreFetch Instructions",
    130                                       [FeatureAVX512]>;
    131 def FeaturePREFETCHWT1  : SubtargetFeature<"prefetchwt1", "HasPFPREFETCHWT1",
    132                                    "true",
    133                                    "Prefetch with Intent to Write and T1 Hint">;
    134 def FeatureDQI     : SubtargetFeature<"avx512dq", "HasDQI", "true",
    135                       "Enable AVX-512 Doubleword and Quadword Instructions",
    136                                       [FeatureAVX512]>;
    137 def FeatureBWI     : SubtargetFeature<"avx512bw", "HasBWI", "true",
    138                       "Enable AVX-512 Byte and Word Instructions",
    139                                       [FeatureAVX512]>;
    140 def FeatureVLX     : SubtargetFeature<"avx512vl", "HasVLX", "true",
    141                       "Enable AVX-512 Vector Length eXtensions",
    142                                       [FeatureAVX512]>;
    143 def FeatureVBMI     : SubtargetFeature<"avx512vbmi", "HasVBMI", "true",
    144                       "Enable AVX-512 Vector Bit Manipulation Instructions",
    145                                       [FeatureAVX512]>;
    146 def FeatureIFMA     : SubtargetFeature<"avx512ifma", "HasIFMA", "true",
    147                       "Enable AVX-512 Integer Fused Multiple-Add",
    148                                       [FeatureAVX512]>;
    149 def FeaturePKU   : SubtargetFeature<"pku", "HasPKU", "true",
    150                       "Enable protection keys">;
    151 def FeaturePCLMUL  : SubtargetFeature<"pclmul", "HasPCLMUL", "true",
    152                          "Enable packed carry-less multiplication instructions",
    153                                [FeatureSSE2]>;
    154 def FeatureFMA     : SubtargetFeature<"fma", "HasFMA", "true",
    155                                       "Enable three-operand fused multiple-add",
    156                                       [FeatureAVX]>;
    157 def FeatureFMA4    : SubtargetFeature<"fma4", "HasFMA4", "true",
    158                                       "Enable four-operand fused multiple-add",
    159                                       [FeatureAVX, FeatureSSE4A]>;
    160 def FeatureXOP     : SubtargetFeature<"xop", "HasXOP", "true",
    161                                       "Enable XOP instructions",
    162                                       [FeatureFMA4]>;
    163 def FeatureSSEUnalignedMem : SubtargetFeature<"sse-unaligned-mem",
    164                                           "HasSSEUnalignedMem", "true",
    165                       "Allow unaligned memory operands with SSE instructions">;
    166 def FeatureAES     : SubtargetFeature<"aes", "HasAES", "true",
    167                                       "Enable AES instructions",
    168                                       [FeatureSSE2]>;
    169 def FeatureTBM     : SubtargetFeature<"tbm", "HasTBM", "true",
    170                                       "Enable TBM instructions">;
    171 def FeatureMOVBE   : SubtargetFeature<"movbe", "HasMOVBE", "true",
    172                                       "Support MOVBE instruction">;
    173 def FeatureRDRAND  : SubtargetFeature<"rdrnd", "HasRDRAND", "true",
    174                                       "Support RDRAND instruction">;
    175 def FeatureF16C    : SubtargetFeature<"f16c", "HasF16C", "true",
    176                        "Support 16-bit floating point conversion instructions",
    177                        [FeatureAVX]>;
    178 def FeatureFSGSBase : SubtargetFeature<"fsgsbase", "HasFSGSBase", "true",
    179                                        "Support FS/GS Base instructions">;
    180 def FeatureLZCNT   : SubtargetFeature<"lzcnt", "HasLZCNT", "true",
    181                                       "Support LZCNT instruction">;
    182 def FeatureBMI     : SubtargetFeature<"bmi", "HasBMI", "true",
    183                                       "Support BMI instructions">;
    184 def FeatureBMI2    : SubtargetFeature<"bmi2", "HasBMI2", "true",
    185                                       "Support BMI2 instructions">;
    186 def FeatureRTM     : SubtargetFeature<"rtm", "HasRTM", "true",
    187                                       "Support RTM instructions">;
    188 def FeatureHLE     : SubtargetFeature<"hle", "HasHLE", "true",
    189                                       "Support HLE">;
    190 def FeatureADX     : SubtargetFeature<"adx", "HasADX", "true",
    191                                       "Support ADX instructions">;
    192 def FeatureSHA     : SubtargetFeature<"sha", "HasSHA", "true",
    193                                       "Enable SHA instructions",
    194                                       [FeatureSSE2]>;
    195 def FeaturePRFCHW  : SubtargetFeature<"prfchw", "HasPRFCHW", "true",
    196                                       "Support PRFCHW instructions">;
    197 def FeatureRDSEED  : SubtargetFeature<"rdseed", "HasRDSEED", "true",
    198                                       "Support RDSEED instruction">;
    199 def FeatureLAHFSAHF : SubtargetFeature<"sahf", "HasLAHFSAHF", "true",
    200                                        "Support LAHF and SAHF instructions">;
    201 def FeatureMWAITX  : SubtargetFeature<"mwaitx", "HasMWAITX", "true",
    202                                       "Enable MONITORX/MWAITX timer functionality">;
    203 def FeatureMPX     : SubtargetFeature<"mpx", "HasMPX", "true",
    204                                       "Support MPX instructions">;
    205 def FeatureLEAForSP : SubtargetFeature<"lea-sp", "UseLeaForSP", "true",
    206                                      "Use LEA for adjusting the stack pointer">;
    207 def FeatureSlowDivide32 : SubtargetFeature<"idivl-to-divb",
    208                                      "HasSlowDivide32", "true",
    209                                      "Use 8-bit divide for positive values less than 256">;
    210 def FeatureSlowDivide64 : SubtargetFeature<"idivq-to-divw",
    211                                      "HasSlowDivide64", "true",
    212                                      "Use 16-bit divide for positive values less than 65536">;
    213 def FeaturePadShortFunctions : SubtargetFeature<"pad-short-functions",
    214                                      "PadShortFunctions", "true",
    215                                      "Pad short functions">;
    216 def FeatureINVPCID : SubtargetFeature<"invpcid", "HasInvPCId", "true",
    217                                       "Invalidate Process-Context Identifier">;
    218 def FeatureVMFUNC  : SubtargetFeature<"vmfunc", "HasVMFUNC", "true",
    219                                       "VM Functions">;
    220 def FeatureSMAP    : SubtargetFeature<"smap", "HasSMAP", "true",
    221                                       "Supervisor Mode Access Protection">;
    222 def FeatureSGX     : SubtargetFeature<"sgx", "HasSGX", "true",
    223                                       "Enable Software Guard Extensions">;
    224 def FeatureCLFLUSHOPT : SubtargetFeature<"clflushopt", "HasCLFLUSHOPT", "true",
    225                                       "Flush A Cache Line Optimized">;
    226 def FeaturePCOMMIT : SubtargetFeature<"pcommit", "HasPCOMMIT", "true",
    227                                       "Enable Persistent Commit">;
    228 def FeatureCLWB    : SubtargetFeature<"clwb", "HasCLWB", "true",
    229                                       "Cache Line Write Back">;
    230 // TODO: This feature ought to be renamed.
    231 // What it really refers to are CPUs for which certain instructions
    232 // (which ones besides the example below?) are microcoded.
    233 // The best examples of this are the memory forms of CALL and PUSH
    234 // instructions, which should be avoided in favor of a MOV + register CALL/PUSH.
    235 def FeatureCallRegIndirect : SubtargetFeature<"call-reg-indirect",
    236                                      "CallRegIndirect", "true",
    237                                      "Call register indirect">;
    238 def FeatureLEAUsesAG : SubtargetFeature<"lea-uses-ag", "LEAUsesAG", "true",
    239                                    "LEA instruction needs inputs at AG stage">;
    240 def FeatureSlowLEA : SubtargetFeature<"slow-lea", "SlowLEA", "true",
    241                                    "LEA instruction with certain arguments is slow">;
    242 def FeatureSlowIncDec : SubtargetFeature<"slow-incdec", "SlowIncDec", "true",
    243                                    "INC and DEC instructions are slower than ADD and SUB">;
    244 def FeatureSoftFloat
    245     : SubtargetFeature<"soft-float", "UseSoftFloat", "true",
    246                        "Use software floating point features.">;
    247 // On at least some AMD processors, there is no performance hazard to writing
    248 // only the lower parts of a YMM register without clearing the upper part.
    249 def FeatureFastPartialYMMWrite
    250     : SubtargetFeature<"fast-partial-ymm-write", "HasFastPartialYMMWrite",
    251                        "true", "Partial writes to YMM registers are fast">;
    252 
    253 //===----------------------------------------------------------------------===//
    254 // X86 processors supported.
    255 //===----------------------------------------------------------------------===//
    256 
    257 include "X86Schedule.td"
    258 
    259 def ProcIntelAtom : SubtargetFeature<"atom", "X86ProcFamily", "IntelAtom",
    260                     "Intel Atom processors">;
    261 def ProcIntelSLM  : SubtargetFeature<"slm", "X86ProcFamily", "IntelSLM",
    262                     "Intel Silvermont processors">;
    263 
    264 class Proc<string Name, list<SubtargetFeature> Features>
    265  : ProcessorModel<Name, GenericModel, Features>;
    266 
    267 def : Proc<"generic",         [FeatureX87, FeatureSlowUAMem16]>;
    268 def : Proc<"i386",            [FeatureX87, FeatureSlowUAMem16]>;
    269 def : Proc<"i486",            [FeatureX87, FeatureSlowUAMem16]>;
    270 def : Proc<"i586",            [FeatureX87, FeatureSlowUAMem16]>;
    271 def : Proc<"pentium",         [FeatureX87, FeatureSlowUAMem16]>;
    272 def : Proc<"pentium-mmx",     [FeatureX87, FeatureSlowUAMem16, FeatureMMX]>;
    273 def : Proc<"i686",            [FeatureX87, FeatureSlowUAMem16]>;
    274 def : Proc<"pentiumpro",      [FeatureX87, FeatureSlowUAMem16, FeatureCMOV]>;
    275 def : Proc<"pentium2",        [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
    276                                FeatureCMOV, FeatureFXSR]>;
    277 def : Proc<"pentium3",        [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
    278                                FeatureSSE1, FeatureFXSR]>;
    279 def : Proc<"pentium3m",       [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
    280                                FeatureSSE1, FeatureFXSR, FeatureSlowBTMem]>;
    281 
    282 // Enable the PostRAScheduler for SSE2 and SSE3 class cpus.
    283 // The intent is to enable it for pentium4 which is the current default
    284 // processor in a vanilla 32-bit clang compilation when no specific
    285 // architecture is specified.  This generally gives a nice performance
    286 // increase on silvermont, with largely neutral behavior on other
    287 // contemporary large core processors.
    288 // pentium-m, pentium4m, prescott and nocona are included as a preventative
    289 // measure to avoid performance surprises, in case clang's default cpu
    290 // changes slightly.
    291 
    292 def : ProcessorModel<"pentium-m", GenericPostRAModel,
    293                      [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
    294                       FeatureSSE2, FeatureFXSR, FeatureSlowBTMem]>;
    295 
    296 def : ProcessorModel<"pentium4", GenericPostRAModel,
    297                      [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
    298                       FeatureSSE2, FeatureFXSR]>;
    299 
    300 def : ProcessorModel<"pentium4m", GenericPostRAModel,
    301                      [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
    302                       FeatureSSE2, FeatureFXSR, FeatureSlowBTMem]>;
    303 
    304 // Intel Quark.
    305 def : Proc<"lakemont",        []>;
    306 
    307 // Intel Core Duo.
    308 def : ProcessorModel<"yonah", SandyBridgeModel,
    309                      [FeatureX87, FeatureSlowUAMem16, FeatureMMX, FeatureSSE3,
    310                       FeatureFXSR, FeatureSlowBTMem]>;
    311 
    312 // NetBurst.
    313 def : ProcessorModel<"prescott", GenericPostRAModel,
    314                      [FeatureX87, FeatureSlowUAMem16, FeatureMMX, FeatureSSE3,
    315                       FeatureFXSR, FeatureSlowBTMem]>;
    316 def : ProcessorModel<"nocona", GenericPostRAModel, [
    317   FeatureX87,
    318   FeatureSlowUAMem16,
    319   FeatureMMX,
    320   FeatureSSE3,
    321   FeatureFXSR,
    322   FeatureCMPXCHG16B,
    323   FeatureSlowBTMem
    324 ]>;
    325 
    326 // Intel Core 2 Solo/Duo.
    327 def : ProcessorModel<"core2", SandyBridgeModel, [
    328   FeatureX87,
    329   FeatureSlowUAMem16,
    330   FeatureMMX,
    331   FeatureSSSE3,
    332   FeatureFXSR,
    333   FeatureCMPXCHG16B,
    334   FeatureSlowBTMem,
    335   FeatureLAHFSAHF
    336 ]>;
    337 def : ProcessorModel<"penryn", SandyBridgeModel, [
    338   FeatureX87,
    339   FeatureSlowUAMem16,
    340   FeatureMMX,
    341   FeatureSSE41,
    342   FeatureFXSR,
    343   FeatureCMPXCHG16B,
    344   FeatureSlowBTMem,
    345   FeatureLAHFSAHF
    346 ]>;
    347 
    348 // Atom CPUs.
    349 class BonnellProc<string Name> : ProcessorModel<Name, AtomModel, [
    350   ProcIntelAtom,
    351   FeatureX87,
    352   FeatureSlowUAMem16,
    353   FeatureMMX,
    354   FeatureSSSE3,
    355   FeatureFXSR,
    356   FeatureCMPXCHG16B,
    357   FeatureMOVBE,
    358   FeatureSlowBTMem,
    359   FeatureLEAForSP,
    360   FeatureSlowDivide32,
    361   FeatureSlowDivide64,
    362   FeatureCallRegIndirect,
    363   FeatureLEAUsesAG,
    364   FeaturePadShortFunctions,
    365   FeatureLAHFSAHF
    366 ]>;
    367 def : BonnellProc<"bonnell">;
    368 def : BonnellProc<"atom">; // Pin the generic name to the baseline.
    369 
    370 class SilvermontProc<string Name> : ProcessorModel<Name, SLMModel, [
    371   ProcIntelSLM,
    372   FeatureX87,
    373   FeatureMMX,
    374   FeatureSSE42,
    375   FeatureFXSR,
    376   FeatureCMPXCHG16B,
    377   FeatureMOVBE,
    378   FeaturePOPCNT,
    379   FeaturePCLMUL,
    380   FeatureAES,
    381   FeatureSlowDivide64,
    382   FeatureCallRegIndirect,
    383   FeaturePRFCHW,
    384   FeatureSlowLEA,
    385   FeatureSlowIncDec,
    386   FeatureSlowBTMem,
    387   FeatureLAHFSAHF
    388 ]>;
    389 def : SilvermontProc<"silvermont">;
    390 def : SilvermontProc<"slm">; // Legacy alias.
    391 
    392 // "Arrandale" along with corei3 and corei5
    393 class NehalemProc<string Name> : ProcessorModel<Name, SandyBridgeModel, [
    394   FeatureX87,
    395   FeatureMMX,
    396   FeatureSSE42,
    397   FeatureFXSR,
    398   FeatureCMPXCHG16B,
    399   FeatureSlowBTMem,
    400   FeaturePOPCNT,
    401   FeatureLAHFSAHF
    402 ]>;
    403 def : NehalemProc<"nehalem">;
    404 def : NehalemProc<"corei7">;
    405 
    406 // Westmere is a similar machine to nehalem with some additional features.
    407 // Westmere is the corei3/i5/i7 path from nehalem to sandybridge
    408 class WestmereProc<string Name> : ProcessorModel<Name, SandyBridgeModel, [
    409   FeatureX87,
    410   FeatureMMX,
    411   FeatureSSE42,
    412   FeatureFXSR,
    413   FeatureCMPXCHG16B,
    414   FeatureSlowBTMem,
    415   FeaturePOPCNT,
    416   FeatureAES,
    417   FeaturePCLMUL,
    418   FeatureLAHFSAHF
    419 ]>;
    420 def : WestmereProc<"westmere">;
    421 
    422 class ProcessorFeatures<list<SubtargetFeature> Inherited,
    423                         list<SubtargetFeature> NewFeatures> {
    424   list<SubtargetFeature> Value = !listconcat(Inherited, NewFeatures);
    425 }
    426 
    427 class ProcModel<string Name, SchedMachineModel Model,
    428                 list<SubtargetFeature> ProcFeatures,
    429                 list<SubtargetFeature> OtherFeatures> :
    430   ProcessorModel<Name, Model, !listconcat(ProcFeatures, OtherFeatures)>;
    431 
    432 // SSE is not listed here since llvm treats AVX as a reimplementation of SSE,
    433 // rather than a superset.
    434 def SNBFeatures : ProcessorFeatures<[], [
    435   FeatureX87,
    436   FeatureMMX,
    437   FeatureAVX,
    438   FeatureFXSR,
    439   FeatureCMPXCHG16B,
    440   FeaturePOPCNT,
    441   FeatureAES,
    442   FeaturePCLMUL,
    443   FeatureXSAVE,
    444   FeatureXSAVEOPT,
    445   FeatureLAHFSAHF
    446 ]>;
    447 
    448 class SandyBridgeProc<string Name> : ProcModel<Name, SandyBridgeModel,
    449                                                SNBFeatures.Value, [
    450   FeatureSlowBTMem,
    451   FeatureSlowUAMem32
    452 ]>;
    453 def : SandyBridgeProc<"sandybridge">;
    454 def : SandyBridgeProc<"corei7-avx">; // Legacy alias.
    455 
    456 def IVBFeatures : ProcessorFeatures<SNBFeatures.Value, [
    457   FeatureRDRAND,
    458   FeatureF16C,
    459   FeatureFSGSBase
    460 ]>;
    461 
    462 class IvyBridgeProc<string Name> : ProcModel<Name, SandyBridgeModel,
    463                                              IVBFeatures.Value, [
    464   FeatureSlowBTMem,
    465   FeatureSlowUAMem32
    466 ]>;
    467 def : IvyBridgeProc<"ivybridge">;
    468 def : IvyBridgeProc<"core-avx-i">; // Legacy alias.
    469 
    470 def HSWFeatures : ProcessorFeatures<IVBFeatures.Value, [
    471   FeatureAVX2,
    472   FeatureBMI,
    473   FeatureBMI2,
    474   FeatureFMA,
    475   FeatureLZCNT,
    476   FeatureMOVBE,
    477   FeatureINVPCID,
    478   FeatureVMFUNC,
    479   FeatureRTM,
    480   FeatureHLE,
    481   FeatureSlowIncDec
    482 ]>;
    483 
    484 class HaswellProc<string Name> : ProcModel<Name, HaswellModel,
    485                                            HSWFeatures.Value, []>;
    486 def : HaswellProc<"haswell">;
    487 def : HaswellProc<"core-avx2">; // Legacy alias.
    488 
    489 def BDWFeatures : ProcessorFeatures<HSWFeatures.Value, [
    490   FeatureADX,
    491   FeatureRDSEED,
    492   FeatureSMAP
    493 ]>;
    494 class BroadwellProc<string Name> : ProcModel<Name, HaswellModel,
    495                                              BDWFeatures.Value, []>;
    496 def : BroadwellProc<"broadwell">;
    497 
    498 def SKLFeatures : ProcessorFeatures<BDWFeatures.Value, [
    499   FeatureMPX,
    500   FeatureXSAVEC,
    501   FeatureXSAVES,
    502   FeatureSGX,
    503   FeatureCLFLUSHOPT
    504 ]>;
    505 
    506 // FIXME: define SKL model
    507 class SkylakeClientProc<string Name> : ProcModel<Name, HaswellModel,
    508                                                  SKLFeatures.Value, []>;
    509 def : SkylakeClientProc<"skylake">;
    510 
    511 // FIXME: define KNL model
    512 class KnightsLandingProc<string Name> : ProcModel<Name, HaswellModel,
    513                                                   IVBFeatures.Value, [
    514   FeatureAVX512,
    515   FeatureERI,
    516   FeatureCDI,
    517   FeaturePFI,
    518   FeaturePREFETCHWT1,
    519   FeatureADX,
    520   FeatureRDSEED,
    521   FeatureMOVBE,
    522   FeatureLZCNT,
    523   FeatureBMI,
    524   FeatureBMI2,
    525   FeatureFMA
    526 ]>;
    527 def : KnightsLandingProc<"knl">;
    528 
    529 def SKXFeatures : ProcessorFeatures<SKLFeatures.Value, [
    530   FeatureAVX512,
    531   FeatureCDI,
    532   FeatureDQI,
    533   FeatureBWI,
    534   FeatureVLX,
    535   FeaturePKU,
    536   FeaturePCOMMIT,
    537   FeatureCLWB
    538 ]>;
    539 
    540 // FIXME: define SKX model
    541 class SkylakeServerProc<string Name> : ProcModel<Name, HaswellModel,
    542                                                  SKXFeatures.Value, []>;
    543 def : SkylakeServerProc<"skylake-avx512">;
    544 def : SkylakeServerProc<"skx">; // Legacy alias.
    545 
    546 def CNLFeatures : ProcessorFeatures<SKXFeatures.Value, [
    547   FeatureVBMI,
    548   FeatureIFMA,
    549   FeatureSHA
    550 ]>;
    551 
    552 class CannonlakeProc<string Name> : ProcModel<Name, HaswellModel,
    553                                               CNLFeatures.Value, []>;
    554 def : CannonlakeProc<"cannonlake">;
    555 
    556 // AMD CPUs.
    557 
    558 def : Proc<"k6",              [FeatureX87, FeatureSlowUAMem16, FeatureMMX]>;
    559 def : Proc<"k6-2",            [FeatureX87, FeatureSlowUAMem16, Feature3DNow]>;
    560 def : Proc<"k6-3",            [FeatureX87, FeatureSlowUAMem16, Feature3DNow]>;
    561 def : Proc<"athlon",          [FeatureX87, FeatureSlowUAMem16, Feature3DNowA,
    562                                FeatureSlowBTMem, FeatureSlowSHLD]>;
    563 def : Proc<"athlon-tbird",    [FeatureX87, FeatureSlowUAMem16, Feature3DNowA,
    564                                FeatureSlowBTMem, FeatureSlowSHLD]>;
    565 def : Proc<"athlon-4",        [FeatureX87, FeatureSlowUAMem16, FeatureSSE1,
    566                                Feature3DNowA, FeatureFXSR, FeatureSlowBTMem,
    567                                FeatureSlowSHLD]>;
    568 def : Proc<"athlon-xp",       [FeatureX87, FeatureSlowUAMem16, FeatureSSE1,
    569                                Feature3DNowA, FeatureFXSR, FeatureSlowBTMem,
    570                                FeatureSlowSHLD]>;
    571 def : Proc<"athlon-mp",       [FeatureX87, FeatureSlowUAMem16, FeatureSSE1,
    572                                Feature3DNowA, FeatureFXSR, FeatureSlowBTMem,
    573                                FeatureSlowSHLD]>;
    574 def : Proc<"k8",              [FeatureX87, FeatureSlowUAMem16, FeatureSSE2,
    575                                Feature3DNowA, FeatureFXSR, Feature64Bit,
    576                                FeatureSlowBTMem, FeatureSlowSHLD]>;
    577 def : Proc<"opteron",         [FeatureX87, FeatureSlowUAMem16, FeatureSSE2,
    578                                Feature3DNowA, FeatureFXSR, Feature64Bit,
    579                                FeatureSlowBTMem, FeatureSlowSHLD]>;
    580 def : Proc<"athlon64",        [FeatureX87, FeatureSlowUAMem16, FeatureSSE2,
    581                                Feature3DNowA, FeatureFXSR, Feature64Bit,
    582                                FeatureSlowBTMem, FeatureSlowSHLD]>;
    583 def : Proc<"athlon-fx",       [FeatureX87, FeatureSlowUAMem16, FeatureSSE2,
    584                                Feature3DNowA, FeatureFXSR, Feature64Bit,
    585                                FeatureSlowBTMem, FeatureSlowSHLD]>;
    586 def : Proc<"k8-sse3",         [FeatureX87, FeatureSlowUAMem16, FeatureSSE3,
    587                                Feature3DNowA, FeatureFXSR, FeatureCMPXCHG16B,
    588                                FeatureSlowBTMem, FeatureSlowSHLD]>;
    589 def : Proc<"opteron-sse3",    [FeatureX87, FeatureSlowUAMem16, FeatureSSE3,
    590                                Feature3DNowA, FeatureFXSR, FeatureCMPXCHG16B,
    591                                FeatureSlowBTMem, FeatureSlowSHLD]>;
    592 def : Proc<"athlon64-sse3",   [FeatureX87, FeatureSlowUAMem16, FeatureSSE3,
    593                                Feature3DNowA, FeatureFXSR, FeatureCMPXCHG16B,
    594                                FeatureSlowBTMem, FeatureSlowSHLD]>;
    595 def : Proc<"amdfam10",        [FeatureX87, FeatureSSE4A, Feature3DNowA,
    596                                FeatureFXSR, FeatureCMPXCHG16B, FeatureLZCNT,
    597                                FeaturePOPCNT, FeatureSlowBTMem, FeatureSlowSHLD,
    598                                FeatureLAHFSAHF]>;
    599 def : Proc<"barcelona",       [FeatureX87, FeatureSSE4A, Feature3DNowA,
    600                                FeatureFXSR, FeatureCMPXCHG16B, FeatureLZCNT,
    601                                FeaturePOPCNT, FeatureSlowBTMem, FeatureSlowSHLD,
    602                                FeatureLAHFSAHF]>;
    603 
    604 // Bobcat
    605 def : Proc<"btver1", [
    606   FeatureX87,
    607   FeatureMMX,
    608   FeatureSSSE3,
    609   FeatureSSE4A,
    610   FeatureFXSR,
    611   FeatureCMPXCHG16B,
    612   FeaturePRFCHW,
    613   FeatureLZCNT,
    614   FeaturePOPCNT,
    615   FeatureSlowSHLD,
    616   FeatureLAHFSAHF
    617 ]>;
    618 
    619 // Jaguar
    620 def : ProcessorModel<"btver2", BtVer2Model, [
    621   FeatureX87,
    622   FeatureMMX,
    623   FeatureAVX,
    624   FeatureFXSR,
    625   FeatureSSE4A,
    626   FeatureCMPXCHG16B,
    627   FeaturePRFCHW,
    628   FeatureAES,
    629   FeaturePCLMUL,
    630   FeatureBMI,
    631   FeatureF16C,
    632   FeatureMOVBE,
    633   FeatureLZCNT,
    634   FeaturePOPCNT,
    635   FeatureXSAVE,
    636   FeatureXSAVEOPT,
    637   FeatureSlowSHLD,
    638   FeatureLAHFSAHF,
    639   FeatureFastPartialYMMWrite
    640 ]>;
    641 
    642 // Bulldozer
    643 def : Proc<"bdver1", [
    644   FeatureX87,
    645   FeatureXOP,
    646   FeatureFMA4,
    647   FeatureCMPXCHG16B,
    648   FeatureAES,
    649   FeaturePRFCHW,
    650   FeaturePCLMUL,
    651   FeatureMMX,
    652   FeatureAVX,
    653   FeatureFXSR,
    654   FeatureSSE4A,
    655   FeatureLZCNT,
    656   FeaturePOPCNT,
    657   FeatureXSAVE,
    658   FeatureSlowSHLD,
    659   FeatureLAHFSAHF
    660 ]>;
    661 // Piledriver
    662 def : Proc<"bdver2", [
    663   FeatureX87,
    664   FeatureXOP,
    665   FeatureFMA4,
    666   FeatureCMPXCHG16B,
    667   FeatureAES,
    668   FeaturePRFCHW,
    669   FeaturePCLMUL,
    670   FeatureMMX,
    671   FeatureAVX,
    672   FeatureFXSR,
    673   FeatureSSE4A,
    674   FeatureF16C,
    675   FeatureLZCNT,
    676   FeaturePOPCNT,
    677   FeatureXSAVE,
    678   FeatureBMI,
    679   FeatureTBM,
    680   FeatureFMA,
    681   FeatureSlowSHLD,
    682   FeatureLAHFSAHF
    683 ]>;
    684 
    685 // Steamroller
    686 def : Proc<"bdver3", [
    687   FeatureX87,
    688   FeatureXOP,
    689   FeatureFMA4,
    690   FeatureCMPXCHG16B,
    691   FeatureAES,
    692   FeaturePRFCHW,
    693   FeaturePCLMUL,
    694   FeatureMMX,
    695   FeatureAVX,
    696   FeatureFXSR,
    697   FeatureSSE4A,
    698   FeatureF16C,
    699   FeatureLZCNT,
    700   FeaturePOPCNT,
    701   FeatureXSAVE,
    702   FeatureBMI,
    703   FeatureTBM,
    704   FeatureFMA,
    705   FeatureXSAVEOPT,
    706   FeatureSlowSHLD,
    707   FeatureFSGSBase,
    708   FeatureLAHFSAHF
    709 ]>;
    710 
    711 // Excavator
    712 def : Proc<"bdver4", [
    713   FeatureX87,
    714   FeatureMMX,
    715   FeatureAVX2,
    716   FeatureFXSR,
    717   FeatureXOP,
    718   FeatureFMA4,
    719   FeatureCMPXCHG16B,
    720   FeatureAES,
    721   FeaturePRFCHW,
    722   FeaturePCLMUL,
    723   FeatureF16C,
    724   FeatureLZCNT,
    725   FeaturePOPCNT,
    726   FeatureXSAVE,
    727   FeatureBMI,
    728   FeatureBMI2,
    729   FeatureTBM,
    730   FeatureFMA,
    731   FeatureXSAVEOPT,
    732   FeatureFSGSBase,
    733   FeatureLAHFSAHF,
    734   FeatureMWAITX
    735 ]>;
    736 
    737 def : Proc<"geode",           [FeatureX87, FeatureSlowUAMem16, Feature3DNowA]>;
    738 
    739 def : Proc<"winchip-c6",      [FeatureX87, FeatureSlowUAMem16, FeatureMMX]>;
    740 def : Proc<"winchip2",        [FeatureX87, FeatureSlowUAMem16, Feature3DNow]>;
    741 def : Proc<"c3",              [FeatureX87, FeatureSlowUAMem16, Feature3DNow]>;
    742 def : Proc<"c3-2",            [FeatureX87, FeatureSlowUAMem16, FeatureMMX,
    743                                FeatureSSE1, FeatureFXSR]>;
    744 
    745 // We also provide a generic 64-bit specific x86 processor model which tries to
    746 // be good for modern chips without enabling instruction set encodings past the
    747 // basic SSE2 and 64-bit ones. It disables slow things from any mainstream and
    748 // modern 64-bit x86 chip, and enables features that are generally beneficial.
    749 //
    750 // We currently use the Sandy Bridge model as the default scheduling model as
    751 // we use it across Nehalem, Westmere, Sandy Bridge, and Ivy Bridge which
    752 // covers a huge swath of x86 processors. If there are specific scheduling
    753 // knobs which need to be tuned differently for AMD chips, we might consider
    754 // forming a common base for them.
    755 def : ProcessorModel<"x86-64", SandyBridgeModel,
    756                      [FeatureX87, FeatureMMX, FeatureSSE2, FeatureFXSR,
    757                       Feature64Bit, FeatureSlowBTMem ]>;
    758 
    759 //===----------------------------------------------------------------------===//
    760 // Register File Description
    761 //===----------------------------------------------------------------------===//
    762 
    763 include "X86RegisterInfo.td"
    764 
    765 //===----------------------------------------------------------------------===//
    766 // Instruction Descriptions
    767 //===----------------------------------------------------------------------===//
    768 
    769 include "X86InstrInfo.td"
    770 
    771 def X86InstrInfo : InstrInfo;
    772 
    773 //===----------------------------------------------------------------------===//
    774 // Calling Conventions
    775 //===----------------------------------------------------------------------===//
    776 
    777 include "X86CallingConv.td"
    778 
    779 
    780 //===----------------------------------------------------------------------===//
    781 // Assembly Parser
    782 //===----------------------------------------------------------------------===//
    783 
    784 def ATTAsmParserVariant : AsmParserVariant {
    785   int Variant = 0;
    786 
    787   // Variant name.
    788   string Name = "att";
    789 
    790   // Discard comments in assembly strings.
    791   string CommentDelimiter = "#";
    792 
    793   // Recognize hard coded registers.
    794   string RegisterPrefix = "%";
    795 }
    796 
    797 def IntelAsmParserVariant : AsmParserVariant {
    798   int Variant = 1;
    799 
    800   // Variant name.
    801   string Name = "intel";
    802 
    803   // Discard comments in assembly strings.
    804   string CommentDelimiter = ";";
    805 
    806   // Recognize hard coded registers.
    807   string RegisterPrefix = "";
    808 }
    809 
    810 //===----------------------------------------------------------------------===//
    811 // Assembly Printers
    812 //===----------------------------------------------------------------------===//
    813 
    814 // The X86 target supports two different syntaxes for emitting machine code.
    815 // This is controlled by the -x86-asm-syntax={att|intel}
    816 def ATTAsmWriter : AsmWriter {
    817   string AsmWriterClassName  = "ATTInstPrinter";
    818   int Variant = 0;
    819 }
    820 def IntelAsmWriter : AsmWriter {
    821   string AsmWriterClassName  = "IntelInstPrinter";
    822   int Variant = 1;
    823 }
    824 
    825 def X86 : Target {
    826   // Information about the instructions...
    827   let InstructionSet = X86InstrInfo;
    828   let AssemblyParserVariants = [ATTAsmParserVariant, IntelAsmParserVariant];
    829   let AssemblyWriters = [ATTAsmWriter, IntelAsmWriter];
    830 }
    831