Home | History | Annotate | Download | only in X86
      1 //===- X86InstrFormats.td - X86 Instruction Formats --------*- 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 // X86 Instruction Format Definitions.
     12 //
     13 
     14 // Format specifies the encoding used by the instruction.  This is part of the
     15 // ad-hoc solution used to emit machine instruction encodings by our machine
     16 // code emitter.
     17 class Format<bits<6> val> {
     18   bits<6> Value = val;
     19 }
     20 
     21 def Pseudo     : Format<0>; def RawFrm     : Format<1>;
     22 def AddRegFrm  : Format<2>; def MRMDestReg : Format<3>;
     23 def MRMDestMem : Format<4>; def MRMSrcReg  : Format<5>;
     24 def MRMSrcMem  : Format<6>;
     25 def MRM0r  : Format<16>; def MRM1r  : Format<17>; def MRM2r  : Format<18>;
     26 def MRM3r  : Format<19>; def MRM4r  : Format<20>; def MRM5r  : Format<21>;
     27 def MRM6r  : Format<22>; def MRM7r  : Format<23>;
     28 def MRM0m  : Format<24>; def MRM1m  : Format<25>; def MRM2m  : Format<26>;
     29 def MRM3m  : Format<27>; def MRM4m  : Format<28>; def MRM5m  : Format<29>;
     30 def MRM6m  : Format<30>; def MRM7m  : Format<31>;
     31 def MRMInitReg : Format<32>;
     32 def MRM_C1 : Format<33>;
     33 def MRM_C2 : Format<34>;
     34 def MRM_C3 : Format<35>;
     35 def MRM_C4 : Format<36>;
     36 def MRM_C8 : Format<37>;
     37 def MRM_C9 : Format<38>;
     38 def MRM_E8 : Format<39>;
     39 def MRM_F0 : Format<40>;
     40 def MRM_F8 : Format<41>;
     41 def MRM_F9 : Format<42>;
     42 def RawFrmImm8 : Format<43>;
     43 def RawFrmImm16 : Format<44>;
     44 def MRM_D0 : Format<45>;
     45 def MRM_D1 : Format<46>;
     46 
     47 // ImmType - This specifies the immediate type used by an instruction. This is
     48 // part of the ad-hoc solution used to emit machine instruction encodings by our
     49 // machine code emitter.
     50 class ImmType<bits<3> val> {
     51   bits<3> Value = val;
     52 }
     53 def NoImm      : ImmType<0>;
     54 def Imm8       : ImmType<1>;
     55 def Imm8PCRel  : ImmType<2>;
     56 def Imm16      : ImmType<3>;
     57 def Imm16PCRel : ImmType<4>;
     58 def Imm32      : ImmType<5>;
     59 def Imm32PCRel : ImmType<6>;
     60 def Imm64      : ImmType<7>;
     61 
     62 // FPFormat - This specifies what form this FP instruction has.  This is used by
     63 // the Floating-Point stackifier pass.
     64 class FPFormat<bits<3> val> {
     65   bits<3> Value = val;
     66 }
     67 def NotFP      : FPFormat<0>;
     68 def ZeroArgFP  : FPFormat<1>;
     69 def OneArgFP   : FPFormat<2>;
     70 def OneArgFPRW : FPFormat<3>;
     71 def TwoArgFP   : FPFormat<4>;
     72 def CompareFP  : FPFormat<5>;
     73 def CondMovFP  : FPFormat<6>;
     74 def SpecialFP  : FPFormat<7>;
     75 
     76 // Class specifying the SSE execution domain, used by the SSEDomainFix pass.
     77 // Keep in sync with tables in X86InstrInfo.cpp.
     78 class Domain<bits<2> val> {
     79   bits<2> Value = val;
     80 }
     81 def GenericDomain   : Domain<0>;
     82 def SSEPackedSingle : Domain<1>;
     83 def SSEPackedDouble : Domain<2>;
     84 def SSEPackedInt    : Domain<3>;
     85 
     86 // Prefix byte classes which are used to indicate to the ad-hoc machine code
     87 // emitter that various prefix bytes are required.
     88 class OpSize { bit hasOpSizePrefix = 1; }
     89 class AdSize { bit hasAdSizePrefix = 1; }
     90 class REX_W  { bit hasREX_WPrefix = 1; }
     91 class LOCK   { bit hasLockPrefix = 1; }
     92 class SegFS  { bits<2> SegOvrBits = 1; }
     93 class SegGS  { bits<2> SegOvrBits = 2; }
     94 class TB     { bits<5> Prefix = 1; }
     95 class REP    { bits<5> Prefix = 2; }
     96 class D8     { bits<5> Prefix = 3; }
     97 class D9     { bits<5> Prefix = 4; }
     98 class DA     { bits<5> Prefix = 5; }
     99 class DB     { bits<5> Prefix = 6; }
    100 class DC     { bits<5> Prefix = 7; }
    101 class DD     { bits<5> Prefix = 8; }
    102 class DE     { bits<5> Prefix = 9; }
    103 class DF     { bits<5> Prefix = 10; }
    104 class XD     { bits<5> Prefix = 11; }
    105 class XS     { bits<5> Prefix = 12; }
    106 class T8     { bits<5> Prefix = 13; }
    107 class TA     { bits<5> Prefix = 14; }
    108 class A6     { bits<5> Prefix = 15; }
    109 class A7     { bits<5> Prefix = 16; }
    110 class TF     { bits<5> Prefix = 17; }
    111 class VEX    { bit hasVEXPrefix = 1; }
    112 class VEX_W  { bit hasVEX_WPrefix = 1; }
    113 class VEX_4V : VEX { bit hasVEX_4VPrefix = 1; }
    114 class VEX_I8IMM { bit hasVEX_i8ImmReg = 1; }
    115 class VEX_L  { bit hasVEX_L = 1; }
    116 class VEX_LIG { bit ignoresVEX_L = 1; }
    117 class Has3DNow0F0FOpcode  { bit has3DNow0F0FOpcode = 1; }
    118 
    119 class X86Inst<bits<8> opcod, Format f, ImmType i, dag outs, dag ins,
    120               string AsmStr, Domain d = GenericDomain>
    121   : Instruction {
    122   let Namespace = "X86";
    123 
    124   bits<8> Opcode = opcod;
    125   Format Form = f;
    126   bits<6> FormBits = Form.Value;
    127   ImmType ImmT = i;
    128 
    129   dag OutOperandList = outs;
    130   dag InOperandList = ins;
    131   string AsmString = AsmStr;
    132 
    133   // If this is a pseudo instruction, mark it isCodeGenOnly.
    134   let isCodeGenOnly = !eq(!cast<string>(f), "Pseudo");
    135 
    136   //
    137   // Attributes specific to X86 instructions...
    138   //
    139   bit hasOpSizePrefix = 0;  // Does this inst have a 0x66 prefix?
    140   bit hasAdSizePrefix = 0;  // Does this inst have a 0x67 prefix?
    141 
    142   bits<5> Prefix = 0;       // Which prefix byte does this inst have?
    143   bit hasREX_WPrefix  = 0;  // Does this inst require the REX.W prefix?
    144   FPFormat FPForm = NotFP;  // What flavor of FP instruction is this?
    145   bit hasLockPrefix = 0;    // Does this inst have a 0xF0 prefix?
    146   bits<2> SegOvrBits = 0;   // Segment override prefix.
    147   Domain ExeDomain = d;
    148   bit hasVEXPrefix = 0;     // Does this inst require a VEX prefix?
    149   bit hasVEX_WPrefix = 0;   // Does this inst set the VEX_W field?
    150   bit hasVEX_4VPrefix = 0;  // Does this inst require the VEX.VVVV field?
    151   bit hasVEX_i8ImmReg = 0;  // Does this inst require the last source register
    152                             // to be encoded in a immediate field?
    153   bit hasVEX_L = 0;         // Does this inst use large (256-bit) registers?
    154   bit ignoresVEX_L = 0;     // Does this instruction ignore the L-bit
    155   bit has3DNow0F0FOpcode =0;// Wacky 3dNow! encoding?
    156 
    157   // TSFlags layout should be kept in sync with X86InstrInfo.h.
    158   let TSFlags{5-0}   = FormBits;
    159   let TSFlags{6}     = hasOpSizePrefix;
    160   let TSFlags{7}     = hasAdSizePrefix;
    161   let TSFlags{12-8}  = Prefix;
    162   let TSFlags{13}    = hasREX_WPrefix;
    163   let TSFlags{16-14} = ImmT.Value;
    164   let TSFlags{19-17} = FPForm.Value;
    165   let TSFlags{20}    = hasLockPrefix;
    166   let TSFlags{22-21} = SegOvrBits;
    167   let TSFlags{24-23} = ExeDomain.Value;
    168   let TSFlags{32-25} = Opcode;
    169   let TSFlags{33}    = hasVEXPrefix;
    170   let TSFlags{34}    = hasVEX_WPrefix;
    171   let TSFlags{35}    = hasVEX_4VPrefix;
    172   let TSFlags{36}    = hasVEX_i8ImmReg;
    173   let TSFlags{37}    = hasVEX_L;
    174   let TSFlags{38}    = ignoresVEX_L;
    175   let TSFlags{39}    = has3DNow0F0FOpcode;
    176 }
    177 
    178 class PseudoI<dag oops, dag iops, list<dag> pattern>
    179   : X86Inst<0, Pseudo, NoImm, oops, iops, ""> {
    180   let Pattern = pattern;
    181 }
    182 
    183 class I<bits<8> o, Format f, dag outs, dag ins, string asm,
    184         list<dag> pattern, Domain d = GenericDomain>
    185   : X86Inst<o, f, NoImm, outs, ins, asm, d> {
    186   let Pattern = pattern;
    187   let CodeSize = 3;
    188 }
    189 class Ii8 <bits<8> o, Format f, dag outs, dag ins, string asm, 
    190            list<dag> pattern, Domain d = GenericDomain>
    191   : X86Inst<o, f, Imm8, outs, ins, asm, d> {
    192   let Pattern = pattern;
    193   let CodeSize = 3;
    194 }
    195 class Ii8PCRel<bits<8> o, Format f, dag outs, dag ins, string asm, 
    196                list<dag> pattern>
    197   : X86Inst<o, f, Imm8PCRel, outs, ins, asm> {
    198   let Pattern = pattern;
    199   let CodeSize = 3;
    200 }
    201 class Ii16<bits<8> o, Format f, dag outs, dag ins, string asm, 
    202            list<dag> pattern>
    203   : X86Inst<o, f, Imm16, outs, ins, asm> {
    204   let Pattern = pattern;
    205   let CodeSize = 3;
    206 }
    207 class Ii32<bits<8> o, Format f, dag outs, dag ins, string asm, 
    208            list<dag> pattern>
    209   : X86Inst<o, f, Imm32, outs, ins, asm> {
    210   let Pattern = pattern;
    211   let CodeSize = 3;
    212 }
    213 
    214 class Ii16PCRel<bits<8> o, Format f, dag outs, dag ins, string asm, 
    215            list<dag> pattern>
    216   : X86Inst<o, f, Imm16PCRel, outs, ins, asm> {
    217   let Pattern = pattern;
    218   let CodeSize = 3;
    219 }
    220 
    221 class Ii32PCRel<bits<8> o, Format f, dag outs, dag ins, string asm, 
    222            list<dag> pattern>
    223   : X86Inst<o, f, Imm32PCRel, outs, ins, asm> {
    224   let Pattern = pattern;
    225   let CodeSize = 3;
    226 }
    227 
    228 // FPStack Instruction Templates:
    229 // FPI - Floating Point Instruction template.
    230 class FPI<bits<8> o, Format F, dag outs, dag ins, string asm>
    231   : I<o, F, outs, ins, asm, []> {}
    232 
    233 // FpI_ - Floating Point Pseudo Instruction template. Not Predicated.
    234 class FpI_<dag outs, dag ins, FPFormat fp, list<dag> pattern>
    235   : X86Inst<0, Pseudo, NoImm, outs, ins, ""> {
    236   let FPForm = fp;
    237   let Pattern = pattern;
    238 }
    239 
    240 // Templates for instructions that use a 16- or 32-bit segmented address as
    241 //  their only operand: lcall (FAR CALL) and ljmp (FAR JMP)
    242 //
    243 //   Iseg16 - 16-bit segment selector, 16-bit offset
    244 //   Iseg32 - 16-bit segment selector, 32-bit offset
    245 
    246 class Iseg16 <bits<8> o, Format f, dag outs, dag ins, string asm, 
    247               list<dag> pattern> : X86Inst<o, f, Imm16, outs, ins, asm> {
    248   let Pattern = pattern;
    249   let CodeSize = 3;
    250 }
    251 
    252 class Iseg32 <bits<8> o, Format f, dag outs, dag ins, string asm, 
    253               list<dag> pattern> : X86Inst<o, f, Imm32, outs, ins, asm> {
    254   let Pattern = pattern;
    255   let CodeSize = 3;
    256 }
    257 
    258 // SI - SSE 1 & 2 scalar instructions
    259 class SI<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern>
    260       : I<o, F, outs, ins, asm, pattern> {
    261   let Predicates = !if(hasVEXPrefix /* VEX */, [HasAVX],
    262             !if(!eq(Prefix, 12 /* XS */), [HasSSE1], [HasSSE2]));
    263 
    264   // AVX instructions have a 'v' prefix in the mnemonic
    265   let AsmString = !if(hasVEXPrefix, !strconcat("v", asm), asm);
    266 }
    267 
    268 // SIi8 - SSE 1 & 2 scalar instructions
    269 class SIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
    270            list<dag> pattern>
    271       : Ii8<o, F, outs, ins, asm, pattern> {
    272   let Predicates = !if(hasVEXPrefix /* VEX */, [HasAVX],
    273             !if(!eq(Prefix, 12 /* XS */), [HasSSE1], [HasSSE2]));
    274 
    275   // AVX instructions have a 'v' prefix in the mnemonic
    276   let AsmString = !if(hasVEXPrefix, !strconcat("v", asm), asm);
    277 }
    278 
    279 // PI - SSE 1 & 2 packed instructions
    280 class PI<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern,
    281          Domain d>
    282       : I<o, F, outs, ins, asm, pattern, d> {
    283   let Predicates = !if(hasVEXPrefix /* VEX */, [HasAVX],
    284         !if(hasOpSizePrefix /* OpSize */, [HasSSE2], [HasSSE1]));
    285 
    286   // AVX instructions have a 'v' prefix in the mnemonic
    287   let AsmString = !if(hasVEXPrefix, !strconcat("v", asm), asm);
    288 }
    289 
    290 // PIi8 - SSE 1 & 2 packed instructions with immediate
    291 class PIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
    292            list<dag> pattern, Domain d>
    293       : Ii8<o, F, outs, ins, asm, pattern, d> {
    294   let Predicates = !if(hasVEX_4VPrefix /* VEX */, [HasAVX],
    295         !if(hasOpSizePrefix /* OpSize */, [HasSSE2], [HasSSE1]));
    296 
    297   // AVX instructions have a 'v' prefix in the mnemonic
    298   let AsmString = !if(hasVEX_4VPrefix, !strconcat("v", asm), asm);
    299 }
    300 
    301 // SSE1 Instruction Templates:
    302 // 
    303 //   SSI   - SSE1 instructions with XS prefix.
    304 //   PSI   - SSE1 instructions with TB prefix.
    305 //   PSIi8 - SSE1 instructions with ImmT == Imm8 and TB prefix.
    306 //   VSSI  - SSE1 instructions with XS prefix in AVX form.
    307 //   VPSI  - SSE1 instructions with TB prefix in AVX form.
    308 
    309 class SSI<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern>
    310       : I<o, F, outs, ins, asm, pattern>, XS, Requires<[HasSSE1]>;
    311 class SSIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
    312             list<dag> pattern>
    313       : Ii8<o, F, outs, ins, asm, pattern>, XS, Requires<[HasSSE1]>;
    314 class PSI<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern>
    315       : I<o, F, outs, ins, asm, pattern, SSEPackedSingle>, TB,
    316         Requires<[HasSSE1]>;
    317 class PSIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
    318             list<dag> pattern>
    319       : Ii8<o, F, outs, ins, asm, pattern, SSEPackedSingle>, TB,
    320         Requires<[HasSSE1]>;
    321 class VSSI<bits<8> o, Format F, dag outs, dag ins, string asm,
    322            list<dag> pattern>
    323       : I<o, F, outs, ins, !strconcat("v", asm), pattern>, XS,
    324         Requires<[HasAVX]>;
    325 class VPSI<bits<8> o, Format F, dag outs, dag ins, string asm,
    326            list<dag> pattern>
    327       : I<o, F, outs, ins, !strconcat("v", asm), pattern, SSEPackedSingle>, TB,
    328         Requires<[HasAVX]>;
    329 
    330 // SSE2 Instruction Templates:
    331 // 
    332 //   SDI    - SSE2 instructions with XD prefix.
    333 //   SDIi8  - SSE2 instructions with ImmT == Imm8 and XD prefix.
    334 //   SSDIi8 - SSE2 instructions with ImmT == Imm8 and XS prefix.
    335 //   PDI    - SSE2 instructions with TB and OpSize prefixes.
    336 //   PDIi8  - SSE2 instructions with ImmT == Imm8 and TB and OpSize prefixes.
    337 //   VSDI   - SSE2 instructions with XD prefix in AVX form.
    338 //   VPDI   - SSE2 instructions with TB and OpSize prefixes in AVX form.
    339 
    340 class SDI<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern>
    341       : I<o, F, outs, ins, asm, pattern>, XD, Requires<[HasSSE2]>;
    342 class SDIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
    343             list<dag> pattern>
    344       : Ii8<o, F, outs, ins, asm, pattern>, XD, Requires<[HasSSE2]>;
    345 class SSDIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
    346              list<dag> pattern>
    347       : Ii8<o, F, outs, ins, asm, pattern>, XS, Requires<[HasSSE2]>;
    348 class PDI<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern>
    349       : I<o, F, outs, ins, asm, pattern, SSEPackedDouble>, TB, OpSize,
    350         Requires<[HasSSE2]>;
    351 class PDIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
    352             list<dag> pattern>
    353       : Ii8<o, F, outs, ins, asm, pattern, SSEPackedDouble>, TB, OpSize,
    354         Requires<[HasSSE2]>;
    355 class VSDI<bits<8> o, Format F, dag outs, dag ins, string asm,
    356            list<dag> pattern>
    357       : I<o, F, outs, ins, !strconcat("v", asm), pattern>, XD,
    358         Requires<[HasAVX]>;
    359 class VPDI<bits<8> o, Format F, dag outs, dag ins, string asm,
    360            list<dag> pattern>
    361       : I<o, F, outs, ins, !strconcat("v", asm), pattern, SSEPackedDouble>, TB,
    362         OpSize, Requires<[HasAVX]>;
    363 
    364 // SSE3 Instruction Templates:
    365 // 
    366 //   S3I   - SSE3 instructions with TB and OpSize prefixes.
    367 //   S3SI  - SSE3 instructions with XS prefix.
    368 //   S3DI  - SSE3 instructions with XD prefix.
    369 
    370 class S3SI<bits<8> o, Format F, dag outs, dag ins, string asm, 
    371            list<dag> pattern>
    372       : I<o, F, outs, ins, asm, pattern, SSEPackedSingle>, XS,
    373         Requires<[HasSSE3]>;
    374 class S3DI<bits<8> o, Format F, dag outs, dag ins, string asm, 
    375            list<dag> pattern>
    376       : I<o, F, outs, ins, asm, pattern, SSEPackedDouble>, XD,
    377         Requires<[HasSSE3]>;
    378 class S3I<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern>
    379       : I<o, F, outs, ins, asm, pattern, SSEPackedDouble>, TB, OpSize,
    380         Requires<[HasSSE3]>;
    381 
    382 
    383 // SSSE3 Instruction Templates:
    384 // 
    385 //   SS38I - SSSE3 instructions with T8 prefix.
    386 //   SS3AI - SSSE3 instructions with TA prefix.
    387 //
    388 // Note: SSSE3 instructions have 64-bit and 128-bit versions. The 64-bit version
    389 // uses the MMX registers. We put those instructions here because they better
    390 // fit into the SSSE3 instruction category rather than the MMX category.
    391 
    392 class SS38I<bits<8> o, Format F, dag outs, dag ins, string asm,
    393             list<dag> pattern>
    394       : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8,
    395         Requires<[HasSSSE3]>;
    396 class SS3AI<bits<8> o, Format F, dag outs, dag ins, string asm,
    397             list<dag> pattern>
    398       : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TA,
    399         Requires<[HasSSSE3]>;
    400 
    401 // SSE4.1 Instruction Templates:
    402 // 
    403 //   SS48I - SSE 4.1 instructions with T8 prefix.
    404 //   SS41AIi8 - SSE 4.1 instructions with TA prefix and ImmT == Imm8.
    405 //
    406 class SS48I<bits<8> o, Format F, dag outs, dag ins, string asm,
    407             list<dag> pattern>
    408       : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8,
    409         Requires<[HasSSE41]>;
    410 class SS4AIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
    411             list<dag> pattern>
    412       : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TA,
    413         Requires<[HasSSE41]>;
    414 
    415 // SSE4.2 Instruction Templates:
    416 // 
    417 //   SS428I - SSE 4.2 instructions with T8 prefix.
    418 class SS428I<bits<8> o, Format F, dag outs, dag ins, string asm,
    419              list<dag> pattern>
    420       : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8,
    421         Requires<[HasSSE42]>;
    422 
    423 //   SS42FI - SSE 4.2 instructions with TF prefix.
    424 class SS42FI<bits<8> o, Format F, dag outs, dag ins, string asm,
    425               list<dag> pattern>
    426       : I<o, F, outs, ins, asm, pattern>, TF, Requires<[HasSSE42]>;
    427       
    428 //   SS42AI = SSE 4.2 instructions with TA prefix
    429 class SS42AI<bits<8> o, Format F, dag outs, dag ins, string asm,
    430              list<dag> pattern>
    431       : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TA,
    432         Requires<[HasSSE42]>;
    433 
    434 // AVX Instruction Templates:
    435 //   Instructions introduced in AVX (no SSE equivalent forms)
    436 //
    437 //   AVX8I - AVX instructions with T8 and OpSize prefix.
    438 //   AVXAIi8 - AVX instructions with TA, OpSize prefix and ImmT = Imm8.
    439 class AVX8I<bits<8> o, Format F, dag outs, dag ins, string asm,
    440             list<dag> pattern>
    441       : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8, OpSize,
    442         Requires<[HasAVX]>;
    443 class AVXAIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
    444               list<dag> pattern>
    445       : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TA, OpSize,
    446         Requires<[HasAVX]>;
    447 
    448 // AES Instruction Templates:
    449 //
    450 // AES8I
    451 // These use the same encoding as the SSE4.2 T8 and TA encodings.
    452 class AES8I<bits<8> o, Format F, dag outs, dag ins, string asm,
    453             list<dag>pattern>
    454       : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8,
    455         Requires<[HasAES]>;
    456 
    457 class AESAI<bits<8> o, Format F, dag outs, dag ins, string asm,
    458             list<dag> pattern>
    459       : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TA,
    460         Requires<[HasAES]>;
    461 
    462 // CLMUL Instruction Templates
    463 class CLMULIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
    464                list<dag>pattern>
    465       : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TA,
    466         OpSize, Requires<[HasCLMUL]>;
    467 
    468 class AVXCLMULIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
    469                   list<dag>pattern>
    470       : Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, TA,
    471         OpSize, VEX_4V, Requires<[HasAVX, HasCLMUL]>;
    472 
    473 // FMA3 Instruction Templates
    474 class FMA3<bits<8> o, Format F, dag outs, dag ins, string asm,
    475            list<dag>pattern>
    476       : I<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8,
    477         OpSize, VEX_4V, Requires<[HasFMA3]>;
    478 
    479 // X86-64 Instruction templates...
    480 //
    481 
    482 class RI<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern>
    483       : I<o, F, outs, ins, asm, pattern>, REX_W;
    484 class RIi8 <bits<8> o, Format F, dag outs, dag ins, string asm,
    485             list<dag> pattern>
    486       : Ii8<o, F, outs, ins, asm, pattern>, REX_W;
    487 class RIi32 <bits<8> o, Format F, dag outs, dag ins, string asm,
    488              list<dag> pattern>
    489       : Ii32<o, F, outs, ins, asm, pattern>, REX_W;
    490 
    491 class RIi64<bits<8> o, Format f, dag outs, dag ins, string asm,
    492             list<dag> pattern>
    493   : X86Inst<o, f, Imm64, outs, ins, asm>, REX_W {
    494   let Pattern = pattern;
    495   let CodeSize = 3;
    496 }
    497 
    498 class RSSI<bits<8> o, Format F, dag outs, dag ins, string asm,
    499            list<dag> pattern>
    500       : SSI<o, F, outs, ins, asm, pattern>, REX_W;
    501 class RSDI<bits<8> o, Format F, dag outs, dag ins, string asm,
    502            list<dag> pattern>
    503       : SDI<o, F, outs, ins, asm, pattern>, REX_W;
    504 class RPDI<bits<8> o, Format F, dag outs, dag ins, string asm,
    505            list<dag> pattern>
    506       : PDI<o, F, outs, ins, asm, pattern>, REX_W;
    507 class VRPDI<bits<8> o, Format F, dag outs, dag ins, string asm,
    508            list<dag> pattern>
    509       : VPDI<o, F, outs, ins, asm, pattern>, VEX_W;
    510 
    511 // MMX Instruction templates
    512 //
    513 
    514 // MMXI   - MMX instructions with TB prefix.
    515 // MMXI64 - MMX instructions with TB prefix valid only in 64 bit mode.
    516 // MMX2I  - MMX / SSE2 instructions with TB and OpSize prefixes.
    517 // MMXIi8 - MMX instructions with ImmT == Imm8 and TB prefix.
    518 // MMXIi8 - MMX instructions with ImmT == Imm8 and TB prefix.
    519 // MMXID  - MMX instructions with XD prefix.
    520 // MMXIS  - MMX instructions with XS prefix.
    521 class MMXI<bits<8> o, Format F, dag outs, dag ins, string asm, 
    522            list<dag> pattern>
    523       : I<o, F, outs, ins, asm, pattern>, TB, Requires<[HasMMX]>;
    524 class MMXI64<bits<8> o, Format F, dag outs, dag ins, string asm, 
    525              list<dag> pattern>
    526       : I<o, F, outs, ins, asm, pattern>, TB, Requires<[HasMMX,In64BitMode]>;
    527 class MMXRI<bits<8> o, Format F, dag outs, dag ins, string asm, 
    528             list<dag> pattern>
    529       : I<o, F, outs, ins, asm, pattern>, TB, REX_W, Requires<[HasMMX]>;
    530 class MMX2I<bits<8> o, Format F, dag outs, dag ins, string asm, 
    531             list<dag> pattern>
    532       : I<o, F, outs, ins, asm, pattern>, TB, OpSize, Requires<[HasMMX]>;
    533 class MMXIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 
    534              list<dag> pattern>
    535       : Ii8<o, F, outs, ins, asm, pattern>, TB, Requires<[HasMMX]>;
    536 class MMXID<bits<8> o, Format F, dag outs, dag ins, string asm, 
    537             list<dag> pattern>
    538       : Ii8<o, F, outs, ins, asm, pattern>, XD, Requires<[HasMMX]>;
    539 class MMXIS<bits<8> o, Format F, dag outs, dag ins, string asm, 
    540             list<dag> pattern>
    541       : Ii8<o, F, outs, ins, asm, pattern>, XS, Requires<[HasMMX]>;
    542