[X86] AVX512: Use the TD version of CD8_Scale in the assembler
[oota-llvm.git] / lib / Target / X86 / X86InstrFormats.td
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<7> val> {
18   bits<7> 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>; def RawFrmMemOffs : Format<7>;
25 def RawFrmSrc  : Format<8>; def RawFrmDst     : Format<9>;
26 def RawFrmDstSrc: Format<10>;
27 def RawFrmImm8 : Format<11>;
28 def RawFrmImm16 : Format<12>;
29 def MRMXr  : Format<14>; def MRMXm  : Format<15>;
30 def MRM0r  : Format<16>; def MRM1r  : Format<17>; def MRM2r  : Format<18>;
31 def MRM3r  : Format<19>; def MRM4r  : Format<20>; def MRM5r  : Format<21>;
32 def MRM6r  : Format<22>; def MRM7r  : Format<23>;
33 def MRM0m  : Format<24>; def MRM1m  : Format<25>; def MRM2m  : Format<26>;
34 def MRM3m  : Format<27>; def MRM4m  : Format<28>; def MRM5m  : Format<29>;
35 def MRM6m  : Format<30>; def MRM7m  : Format<31>;
36 def MRM_C0 : Format<32>; def MRM_C1 : Format<33>; def MRM_C2 : Format<34>;
37 def MRM_C3 : Format<35>; def MRM_C4 : Format<36>; def MRM_C8 : Format<37>;
38 def MRM_C9 : Format<38>; def MRM_CA : Format<39>; def MRM_CB : Format<40>;
39 def MRM_D0 : Format<41>; def MRM_D1 : Format<42>; def MRM_D4 : Format<43>;
40 def MRM_D5 : Format<44>; def MRM_D6 : Format<45>; def MRM_D8 : Format<46>;
41 def MRM_D9 : Format<47>; def MRM_DA : Format<48>; def MRM_DB : Format<49>;
42 def MRM_DC : Format<50>; def MRM_DD : Format<51>; def MRM_DE : Format<52>;
43 def MRM_DF : Format<53>; def MRM_E0 : Format<54>; def MRM_E1 : Format<55>;
44 def MRM_E2 : Format<56>; def MRM_E3 : Format<57>; def MRM_E4 : Format<58>;
45 def MRM_E5 : Format<59>; def MRM_E8 : Format<60>; def MRM_E9 : Format<61>;
46 def MRM_EA : Format<62>; def MRM_EB : Format<63>; def MRM_EC : Format<64>;
47 def MRM_ED : Format<65>; def MRM_EE : Format<66>; def MRM_F0 : Format<67>;
48 def MRM_F1 : Format<68>; def MRM_F2 : Format<69>; def MRM_F3 : Format<70>;
49 def MRM_F4 : Format<71>; def MRM_F5 : Format<72>; def MRM_F6 : Format<73>;
50 def MRM_F7 : Format<74>; def MRM_F8 : Format<75>; def MRM_F9 : Format<76>;
51 def MRM_FA : Format<77>; def MRM_FB : Format<78>; def MRM_FC : Format<79>;
52 def MRM_FD : Format<80>; def MRM_FE : Format<81>; def MRM_FF : Format<82>;
53
54 // ImmType - This specifies the immediate type used by an instruction. This is
55 // part of the ad-hoc solution used to emit machine instruction encodings by our
56 // machine code emitter.
57 class ImmType<bits<4> val> {
58   bits<4> Value = val;
59 }
60 def NoImm      : ImmType<0>;
61 def Imm8       : ImmType<1>;
62 def Imm8PCRel  : ImmType<2>;
63 def Imm16      : ImmType<3>;
64 def Imm16PCRel : ImmType<4>;
65 def Imm32      : ImmType<5>;
66 def Imm32PCRel : ImmType<6>;
67 def Imm32S     : ImmType<7>;
68 def Imm64      : ImmType<8>;
69
70 // FPFormat - This specifies what form this FP instruction has.  This is used by
71 // the Floating-Point stackifier pass.
72 class FPFormat<bits<3> val> {
73   bits<3> Value = val;
74 }
75 def NotFP      : FPFormat<0>;
76 def ZeroArgFP  : FPFormat<1>;
77 def OneArgFP   : FPFormat<2>;
78 def OneArgFPRW : FPFormat<3>;
79 def TwoArgFP   : FPFormat<4>;
80 def CompareFP  : FPFormat<5>;
81 def CondMovFP  : FPFormat<6>;
82 def SpecialFP  : FPFormat<7>;
83
84 // Class specifying the SSE execution domain, used by the SSEDomainFix pass.
85 // Keep in sync with tables in X86InstrInfo.cpp.
86 class Domain<bits<2> val> {
87   bits<2> Value = val;
88 }
89 def GenericDomain   : Domain<0>;
90 def SSEPackedSingle : Domain<1>;
91 def SSEPackedDouble : Domain<2>;
92 def SSEPackedInt    : Domain<3>;
93
94 // Class specifying the vector form of the decompressed
95 // displacement of 8-bit.
96 class CD8VForm<bits<3> val> {
97   bits<3> Value = val;
98 }
99 def CD8VF  : CD8VForm<0>;  // v := VL
100 def CD8VH  : CD8VForm<1>;  // v := VL/2
101 def CD8VQ  : CD8VForm<2>;  // v := VL/4
102 def CD8VO  : CD8VForm<3>;  // v := VL/8
103 def CD8VT1 : CD8VForm<4>;  // v := 1
104 def CD8VT2 : CD8VForm<5>;  // v := 2
105 def CD8VT4 : CD8VForm<6>;  // v := 4
106 def CD8VT8 : CD8VForm<7>;  // v := 8
107
108 // Class specifying the prefix used an opcode extension.
109 class Prefix<bits<3> val> {
110   bits<3> Value = val;
111 }
112 def NoPrfx : Prefix<0>;
113 def PS     : Prefix<1>;
114 def PD     : Prefix<2>;
115 def XS     : Prefix<3>;
116 def XD     : Prefix<4>;
117
118 // Class specifying the opcode map.
119 class Map<bits<3> val> {
120   bits<3> Value = val;
121 }
122 def OB   : Map<0>;
123 def TB   : Map<1>;
124 def T8   : Map<2>;
125 def TA   : Map<3>;
126 def XOP8 : Map<4>;
127 def XOP9 : Map<5>;
128 def XOPA : Map<6>;
129
130 // Class specifying the encoding
131 class Encoding<bits<2> val> {
132   bits<2> Value = val;
133 }
134 def EncNormal : Encoding<0>;
135 def EncVEX    : Encoding<1>;
136 def EncXOP    : Encoding<2>;
137 def EncEVEX   : Encoding<3>;
138
139 // Operand size for encodings that change based on mode.
140 class OperandSize<bits<2> val> {
141   bits<2> Value = val;
142 }
143 def OpSizeFixed : OperandSize<0>; // Never needs a 0x66 prefix.
144 def OpSize16    : OperandSize<1>; // Needs 0x66 prefix in 32-bit mode.
145 def OpSize32    : OperandSize<2>; // Needs 0x66 prefix in 16-bit mode.
146
147 // Prefix byte classes which are used to indicate to the ad-hoc machine code
148 // emitter that various prefix bytes are required.
149 class OpSize16 { OperandSize OpSize = OpSize16; }
150 class OpSize32 { OperandSize OpSize = OpSize32; }
151 class AdSize { bit hasAdSizePrefix = 1; }
152 class REX_W  { bit hasREX_WPrefix = 1; }
153 class LOCK   { bit hasLockPrefix = 1; }
154 class REP    { bit hasREPPrefix = 1; }
155 class TB     { Map OpMap = TB; }
156 class T8     { Map OpMap = T8; }
157 class TA     { Map OpMap = TA; }
158 class XOP8   { Map OpMap = XOP8; Prefix OpPrefix = PS; }
159 class XOP9   { Map OpMap = XOP9; Prefix OpPrefix = PS; }
160 class XOPA   { Map OpMap = XOPA; Prefix OpPrefix = PS; }
161 class OBXS   { Prefix OpPrefix = XS; }
162 class PS   : TB { Prefix OpPrefix = PS; }
163 class PD   : TB { Prefix OpPrefix = PD; }
164 class XD   : TB { Prefix OpPrefix = XD; }
165 class XS   : TB { Prefix OpPrefix = XS; }
166 class T8PS : T8 { Prefix OpPrefix = PS; }
167 class T8PD : T8 { Prefix OpPrefix = PD; }
168 class T8XD : T8 { Prefix OpPrefix = XD; }
169 class T8XS : T8 { Prefix OpPrefix = XS; }
170 class TAPS : TA { Prefix OpPrefix = PS; }
171 class TAPD : TA { Prefix OpPrefix = PD; }
172 class TAXD : TA { Prefix OpPrefix = XD; }
173 class VEX    { Encoding OpEnc = EncVEX; }
174 class VEX_W  { bit hasVEX_WPrefix = 1; }
175 class VEX_4V : VEX { bit hasVEX_4V = 1; }
176 class VEX_4VOp3 : VEX { bit hasVEX_4VOp3 = 1; }
177 class VEX_I8IMM { bit hasVEX_i8ImmReg = 1; }
178 class VEX_L  { bit hasVEX_L = 1; }
179 class VEX_LIG { bit ignoresVEX_L = 1; }
180 class EVEX : VEX { Encoding OpEnc = EncEVEX; }
181 class EVEX_4V : VEX_4V { Encoding OpEnc = EncEVEX; }
182 class EVEX_K { bit hasEVEX_K = 1; }
183 class EVEX_KZ : EVEX_K { bit hasEVEX_Z = 1; }
184 class EVEX_B { bit hasEVEX_B = 1; }
185 class EVEX_RC { bit hasEVEX_RC = 1; }
186 class EVEX_V512 { bit hasEVEX_L2 = 1; bit hasVEX_L = 0; }
187
188 // Specify AVX512 8-bit compressed displacement encoding based on the vector
189 // element size in bits (8, 16, 32, 64) and the CDisp8 form.
190 class EVEX_CD8<int esize, CD8VForm form> {
191   int CD8_EltSize = !srl(esize, 3);
192   bits<3> EVEX_CD8V = form.Value;
193 }
194
195 class Has3DNow0F0FOpcode  { bit has3DNow0F0FOpcode = 1; }
196 class MemOp4 { bit hasMemOp4Prefix = 1; }
197 class XOP { Encoding OpEnc = EncXOP; }
198 class XOP_4V : XOP { bit hasVEX_4V = 1; }
199 class XOP_4VOp3 : XOP { bit hasVEX_4VOp3 = 1; }
200
201 class X86Inst<bits<8> opcod, Format f, ImmType i, dag outs, dag ins,
202               string AsmStr,
203               InstrItinClass itin,
204               Domain d = GenericDomain>
205   : Instruction {
206   let Namespace = "X86";
207
208   bits<8> Opcode = opcod;
209   Format Form = f;
210   bits<7> FormBits = Form.Value;
211   ImmType ImmT = i;
212
213   dag OutOperandList = outs;
214   dag InOperandList = ins;
215   string AsmString = AsmStr;
216
217   // If this is a pseudo instruction, mark it isCodeGenOnly.
218   let isCodeGenOnly = !eq(!cast<string>(f), "Pseudo");
219
220   let Itinerary = itin;
221
222   //
223   // Attributes specific to X86 instructions...
224   //
225   bit ForceDisassemble = 0; // Force instruction to disassemble even though it's
226                             // isCodeGenonly. Needed to hide an ambiguous
227                             // AsmString from the parser, but still disassemble.
228
229   OperandSize OpSize = OpSizeFixed; // Does this instruction's encoding change
230                                     // based on operand size of the mode
231   bits<2> OpSizeBits = OpSize.Value;
232   bit hasAdSizePrefix = 0;  // Does this inst have a 0x67 prefix?
233
234   Prefix OpPrefix = NoPrfx; // Which prefix byte does this inst have?
235   bits<3> OpPrefixBits = OpPrefix.Value;
236   Map OpMap = OB;           // Which opcode map does this inst have?
237   bits<3> OpMapBits = OpMap.Value;
238   bit hasREX_WPrefix  = 0;  // Does this inst require the REX.W prefix?
239   FPFormat FPForm = NotFP;  // What flavor of FP instruction is this?
240   bit hasLockPrefix = 0;    // Does this inst have a 0xF0 prefix?
241   Domain ExeDomain = d;
242   bit hasREPPrefix = 0;     // Does this inst have a REP prefix?
243   Encoding OpEnc = EncNormal; // Encoding used by this instruction
244   bits<2> OpEncBits = OpEnc.Value;
245   bit hasVEX_WPrefix = 0;   // Does this inst set the VEX_W field?
246   bit hasVEX_4V = 0;        // Does this inst require the VEX.VVVV field?
247   bit hasVEX_4VOp3 = 0;     // Does this inst require the VEX.VVVV field to
248                             // encode the third operand?
249   bit hasVEX_i8ImmReg = 0;  // Does this inst require the last source register
250                             // to be encoded in a immediate field?
251   bit hasVEX_L = 0;         // Does this inst use large (256-bit) registers?
252   bit ignoresVEX_L = 0;     // Does this instruction ignore the L-bit
253   bit hasEVEX_K = 0;        // Does this inst require masking?
254   bit hasEVEX_Z = 0;        // Does this inst set the EVEX_Z field?
255   bit hasEVEX_L2 = 0;       // Does this inst set the EVEX_L2 field?
256   bit hasEVEX_B = 0;        // Does this inst set the EVEX_B field?
257   bits<3> EVEX_CD8V = 0;    // Compressed disp8 form - vector-width.
258   // Declare it int rather than bits<4> so that all bits are defined when
259   // assigning to bits<7>.
260   int CD8_EltSize = 0;      // Compressed disp8 form - element-size in bytes.
261   bit has3DNow0F0FOpcode =0;// Wacky 3dNow! encoding?
262   bit hasMemOp4Prefix = 0;  // Same bit as VEX_W, but used for swapping operands
263   bit hasEVEX_RC = 0;       // Explicitly specified rounding control in FP instruction.
264
265   bits<2> EVEX_LL;
266   let EVEX_LL{0} = hasVEX_L;
267   let EVEX_LL{1} = hasEVEX_L2;
268   // Vector size in bytes.
269   bits<7> VectSize = !shl(16, EVEX_LL);
270
271   // The scaling factor for AVX512's compressed displacement is either
272   //   - the size of a  power-of-two number of elements or
273   //   - the size of a single element for broadcasts or
274   //   - the total vector size divided by a power-of-two number.
275   // Possible values are: 0 (non-AVX512 inst), 1, 2, 4, 8, 16, 32 and 64.
276   bits<7> CD8_Scale = !if (!eq (OpEnc.Value, EncEVEX.Value),
277                            !if (EVEX_CD8V{2},
278                                 !shl(CD8_EltSize, EVEX_CD8V{1-0}),
279                                 !if (hasEVEX_B,
280                                      CD8_EltSize,
281                                      !srl(VectSize, EVEX_CD8V{1-0}))), 0);
282
283   // TSFlags layout should be kept in sync with X86InstrInfo.h.
284   let TSFlags{6-0}   = FormBits;
285   let TSFlags{8-7}   = OpSizeBits;
286   let TSFlags{9}     = hasAdSizePrefix;
287   let TSFlags{12-10} = OpPrefixBits;
288   let TSFlags{15-13} = OpMapBits;
289   let TSFlags{16}    = hasREX_WPrefix;
290   let TSFlags{20-17} = ImmT.Value;
291   let TSFlags{23-21} = FPForm.Value;
292   let TSFlags{24}    = hasLockPrefix;
293   let TSFlags{25}    = hasREPPrefix;
294   let TSFlags{27-26} = ExeDomain.Value;
295   let TSFlags{29-28} = OpEncBits;
296   let TSFlags{37-30} = Opcode;
297   let TSFlags{38}    = hasVEX_WPrefix;
298   let TSFlags{39}    = hasVEX_4V;
299   let TSFlags{40}    = hasVEX_4VOp3;
300   let TSFlags{41}    = hasVEX_i8ImmReg;
301   let TSFlags{42}    = hasVEX_L;
302   let TSFlags{43}    = ignoresVEX_L;
303   let TSFlags{44}    = hasEVEX_K;
304   let TSFlags{45}    = hasEVEX_Z;
305   let TSFlags{46}    = hasEVEX_L2;
306   let TSFlags{47}    = hasEVEX_B;
307   // If we run out of TSFlags bits, it's possible to encode this in 3 bits.
308   let TSFlags{54-48} = CD8_Scale;
309   let TSFlags{55}    = has3DNow0F0FOpcode;
310   let TSFlags{56}    = hasMemOp4Prefix;
311   let TSFlags{57}    = hasEVEX_RC;
312 }
313
314 class PseudoI<dag oops, dag iops, list<dag> pattern>
315   : X86Inst<0, Pseudo, NoImm, oops, iops, "", NoItinerary> {
316   let Pattern = pattern;
317 }
318
319 class I<bits<8> o, Format f, dag outs, dag ins, string asm,
320         list<dag> pattern, InstrItinClass itin = NoItinerary,
321         Domain d = GenericDomain>
322   : X86Inst<o, f, NoImm, outs, ins, asm, itin, d> {
323   let Pattern = pattern;
324   let CodeSize = 3;
325 }
326 class Ii8 <bits<8> o, Format f, dag outs, dag ins, string asm, 
327            list<dag> pattern, InstrItinClass itin = NoItinerary,
328            Domain d = GenericDomain>
329   : X86Inst<o, f, Imm8, outs, ins, asm, itin, d> {
330   let Pattern = pattern;
331   let CodeSize = 3;
332 }
333 class Ii8PCRel<bits<8> o, Format f, dag outs, dag ins, string asm, 
334                list<dag> pattern, InstrItinClass itin = NoItinerary>
335   : X86Inst<o, f, Imm8PCRel, outs, ins, asm, itin> {
336   let Pattern = pattern;
337   let CodeSize = 3;
338 }
339 class Ii16<bits<8> o, Format f, dag outs, dag ins, string asm, 
340            list<dag> pattern, InstrItinClass itin = NoItinerary>
341   : X86Inst<o, f, Imm16, outs, ins, asm, itin> {
342   let Pattern = pattern;
343   let CodeSize = 3;
344 }
345 class Ii32<bits<8> o, Format f, dag outs, dag ins, string asm, 
346            list<dag> pattern, InstrItinClass itin = NoItinerary>
347   : X86Inst<o, f, Imm32, outs, ins, asm, itin> {
348   let Pattern = pattern;
349   let CodeSize = 3;
350 }
351 class Ii32S<bits<8> o, Format f, dag outs, dag ins, string asm,
352             list<dag> pattern, InstrItinClass itin = NoItinerary>
353   : X86Inst<o, f, Imm32S, outs, ins, asm, itin> {
354   let Pattern = pattern;
355   let CodeSize = 3;
356 }
357
358 class Ii16PCRel<bits<8> o, Format f, dag outs, dag ins, string asm, 
359            list<dag> pattern, InstrItinClass itin = NoItinerary>
360            : X86Inst<o, f, Imm16PCRel, outs, ins, asm, itin> {
361   let Pattern = pattern;
362   let CodeSize = 3;
363 }
364
365 class Ii32PCRel<bits<8> o, Format f, dag outs, dag ins, string asm, 
366            list<dag> pattern, InstrItinClass itin = NoItinerary>
367   : X86Inst<o, f, Imm32PCRel, outs, ins, asm, itin> {
368   let Pattern = pattern;
369   let CodeSize = 3;
370 }
371
372 // FPStack Instruction Templates:
373 // FPI - Floating Point Instruction template.
374 class FPI<bits<8> o, Format F, dag outs, dag ins, string asm,
375           InstrItinClass itin = NoItinerary>
376   : I<o, F, outs, ins, asm, [], itin> {}
377
378 // FpI_ - Floating Point Pseudo Instruction template. Not Predicated.
379 class FpI_<dag outs, dag ins, FPFormat fp, list<dag> pattern,
380            InstrItinClass itin = NoItinerary>
381   : X86Inst<0, Pseudo, NoImm, outs, ins, "", itin> {
382   let FPForm = fp;
383   let Pattern = pattern;
384 }
385
386 // Templates for instructions that use a 16- or 32-bit segmented address as
387 //  their only operand: lcall (FAR CALL) and ljmp (FAR JMP)
388 //
389 //   Iseg16 - 16-bit segment selector, 16-bit offset
390 //   Iseg32 - 16-bit segment selector, 32-bit offset
391
392 class Iseg16 <bits<8> o, Format f, dag outs, dag ins, string asm, 
393               list<dag> pattern, InstrItinClass itin = NoItinerary>
394       : X86Inst<o, f, Imm16, outs, ins, asm, itin> {
395   let Pattern = pattern;
396   let CodeSize = 3;
397 }
398
399 class Iseg32 <bits<8> o, Format f, dag outs, dag ins, string asm, 
400               list<dag> pattern, InstrItinClass itin = NoItinerary>
401       : X86Inst<o, f, Imm32, outs, ins, asm, itin> {
402   let Pattern = pattern;
403   let CodeSize = 3;
404 }
405
406 // SI - SSE 1 & 2 scalar instructions
407 class SI<bits<8> o, Format F, dag outs, dag ins, string asm,
408          list<dag> pattern, InstrItinClass itin = NoItinerary>
409       : I<o, F, outs, ins, asm, pattern, itin> {
410   let Predicates = !if(!eq(OpEnc.Value, EncEVEX.Value), [HasAVX512],
411                    !if(!eq(OpEnc.Value, EncVEX.Value), [UseAVX],
412                    !if(!eq(OpPrefix.Value, XS.Value), [UseSSE1],
413                    !if(!eq(OpPrefix.Value, XD.Value), [UseSSE2],
414                    !if(!eq(OpPrefix.Value, PD.Value), [UseSSE2],
415                    [UseSSE1])))));
416
417   // AVX instructions have a 'v' prefix in the mnemonic
418   let AsmString = !if(!eq(OpEnc.Value, EncEVEX.Value), !strconcat("v", asm),
419                   !if(!eq(OpEnc.Value, EncVEX.Value), !strconcat("v", asm),
420                   asm));
421 }
422
423 // SIi8 - SSE 1 & 2 scalar instructions
424 class SIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
425            list<dag> pattern, InstrItinClass itin = NoItinerary>
426       : Ii8<o, F, outs, ins, asm, pattern, itin> {
427   let Predicates = !if(!eq(OpEnc.Value, EncEVEX.Value), [HasAVX512],
428                    !if(!eq(OpEnc.Value, EncVEX.Value), [UseAVX],
429                    !if(!eq(OpPrefix.Value, XS.Value), [UseSSE1],
430                    [UseSSE2])));
431
432   // AVX instructions have a 'v' prefix in the mnemonic
433   let AsmString = !if(!eq(OpEnc.Value, EncEVEX.Value), !strconcat("v", asm),
434                   !if(!eq(OpEnc.Value, EncVEX.Value), !strconcat("v", asm),
435                   asm));
436 }
437
438 // PI - SSE 1 & 2 packed instructions
439 class PI<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern,
440          InstrItinClass itin, Domain d>
441       : I<o, F, outs, ins, asm, pattern, itin, d> {
442   let Predicates = !if(!eq(OpEnc.Value, EncEVEX.Value), [HasAVX512],
443                    !if(!eq(OpEnc.Value, EncVEX.Value), [HasAVX],
444                    !if(!eq(OpPrefix.Value, PD.Value), [UseSSE2],
445                    [UseSSE1])));
446
447   // AVX instructions have a 'v' prefix in the mnemonic
448   let AsmString = !if(!eq(OpEnc.Value, EncEVEX.Value), !strconcat("v", asm),
449                   !if(!eq(OpEnc.Value, EncVEX.Value), !strconcat("v", asm),
450                   asm));
451 }
452
453 // MMXPI - SSE 1 & 2 packed instructions with MMX operands
454 class MMXPI<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern,
455             InstrItinClass itin, Domain d>
456       : I<o, F, outs, ins, asm, pattern, itin, d> {
457   let Predicates = !if(!eq(OpPrefix.Value, PD.Value), [HasSSE2],
458                        [HasSSE1]);
459 }
460
461 // PIi8 - SSE 1 & 2 packed instructions with immediate
462 class PIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
463            list<dag> pattern, InstrItinClass itin, Domain d>
464       : Ii8<o, F, outs, ins, asm, pattern, itin, d> {
465   let Predicates = !if(!eq(OpEnc.Value, EncEVEX.Value), [HasAVX512],
466                    !if(!eq(OpEnc.Value, EncVEX.Value), [HasAVX],
467                    !if(!eq(OpPrefix.Value, PD.Value), [UseSSE2],
468                    [UseSSE1])));
469
470   // AVX instructions have a 'v' prefix in the mnemonic
471   let AsmString = !if(!eq(OpEnc.Value, EncEVEX.Value), !strconcat("v", asm),
472                   !if(!eq(OpEnc.Value, EncVEX.Value), !strconcat("v", asm),
473                   asm));
474 }
475
476 // SSE1 Instruction Templates:
477 // 
478 //   SSI   - SSE1 instructions with XS prefix.
479 //   PSI   - SSE1 instructions with PS prefix.
480 //   PSIi8 - SSE1 instructions with ImmT == Imm8 and PS prefix.
481 //   VSSI  - SSE1 instructions with XS prefix in AVX form.
482 //   VPSI  - SSE1 instructions with PS prefix in AVX form, packed single.
483
484 class SSI<bits<8> o, Format F, dag outs, dag ins, string asm,
485           list<dag> pattern, InstrItinClass itin = NoItinerary>
486       : I<o, F, outs, ins, asm, pattern, itin>, XS, Requires<[UseSSE1]>;
487 class SSIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
488             list<dag> pattern, InstrItinClass itin = NoItinerary>
489       : Ii8<o, F, outs, ins, asm, pattern, itin>, XS, Requires<[UseSSE1]>;
490 class PSI<bits<8> o, Format F, dag outs, dag ins, string asm,
491           list<dag> pattern, InstrItinClass itin = NoItinerary>
492       : I<o, F, outs, ins, asm, pattern, itin, SSEPackedSingle>, PS,
493         Requires<[UseSSE1]>;
494 class PSIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
495             list<dag> pattern, InstrItinClass itin = NoItinerary>
496       : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedSingle>, PS,
497         Requires<[UseSSE1]>;
498 class VSSI<bits<8> o, Format F, dag outs, dag ins, string asm,
499            list<dag> pattern, InstrItinClass itin = NoItinerary>
500       : I<o, F, outs, ins, !strconcat("v", asm), pattern, itin>, XS,
501         Requires<[HasAVX]>;
502 class VPSI<bits<8> o, Format F, dag outs, dag ins, string asm,
503            list<dag> pattern, InstrItinClass itin = NoItinerary>
504       : I<o, F, outs, ins, !strconcat("v", asm), pattern, itin, SSEPackedSingle>, PS,
505         Requires<[HasAVX]>;
506
507 // SSE2 Instruction Templates:
508 // 
509 //   SDI    - SSE2 instructions with XD prefix.
510 //   SDIi8  - SSE2 instructions with ImmT == Imm8 and XD prefix.
511 //   S2SI   - SSE2 instructions with XS prefix.
512 //   SSDIi8 - SSE2 instructions with ImmT == Imm8 and XS prefix.
513 //   PDI    - SSE2 instructions with PD prefix, packed double domain.
514 //   PDIi8  - SSE2 instructions with ImmT == Imm8 and PD prefix.
515 //   VSDI   - SSE2 scalar instructions with XD prefix in AVX form.
516 //   VPDI   - SSE2 vector instructions with PD prefix in AVX form,
517 //                 packed double domain.
518 //   VS2I   - SSE2 scalar instructions with PD prefix in AVX form.
519 //   S2I    - SSE2 scalar instructions with PD prefix.
520 //   MMXSDIi8  - SSE2 instructions with ImmT == Imm8 and XD prefix as well as
521 //               MMX operands.
522 //   MMXSSDIi8 - SSE2 instructions with ImmT == Imm8 and XS prefix as well as
523 //               MMX operands.
524
525 class SDI<bits<8> o, Format F, dag outs, dag ins, string asm,
526           list<dag> pattern, InstrItinClass itin = NoItinerary>
527       : I<o, F, outs, ins, asm, pattern, itin>, XD, Requires<[UseSSE2]>;
528 class SDIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
529             list<dag> pattern, InstrItinClass itin = NoItinerary>
530       : Ii8<o, F, outs, ins, asm, pattern, itin>, XD, Requires<[UseSSE2]>;
531 class S2SI<bits<8> o, Format F, dag outs, dag ins, string asm,
532            list<dag> pattern, InstrItinClass itin = NoItinerary>
533       : I<o, F, outs, ins, asm, pattern, itin>, XS, Requires<[UseSSE2]>;
534 class S2SIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
535              list<dag> pattern, InstrItinClass itin = NoItinerary>
536       : Ii8<o, F, outs, ins, asm, pattern>, XS, Requires<[UseSSE2]>;
537 class PDI<bits<8> o, Format F, dag outs, dag ins, string asm,
538           list<dag> pattern, InstrItinClass itin = NoItinerary>
539       : I<o, F, outs, ins, asm, pattern, itin, SSEPackedDouble>, PD,
540         Requires<[UseSSE2]>;
541 class PDIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
542             list<dag> pattern, InstrItinClass itin = NoItinerary>
543       : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedDouble>, PD,
544         Requires<[UseSSE2]>;
545 class VSDI<bits<8> o, Format F, dag outs, dag ins, string asm,
546            list<dag> pattern, InstrItinClass itin = NoItinerary>
547       : I<o, F, outs, ins, !strconcat("v", asm), pattern, itin>, XD,
548         Requires<[UseAVX]>;
549 class VS2SI<bits<8> o, Format F, dag outs, dag ins, string asm,
550             list<dag> pattern, InstrItinClass itin = NoItinerary>
551       : I<o, F, outs, ins, !strconcat("v", asm), pattern, itin>, XS,
552         Requires<[HasAVX]>;
553 class VPDI<bits<8> o, Format F, dag outs, dag ins, string asm,
554            list<dag> pattern, InstrItinClass itin = NoItinerary>
555       : I<o, F, outs, ins, !strconcat("v", asm), pattern, itin, SSEPackedDouble>,
556         PD, Requires<[HasAVX]>;
557 class VS2I<bits<8> o, Format F, dag outs, dag ins, string asm,
558            list<dag> pattern, InstrItinClass itin = NoItinerary>
559       : I<o, F, outs, ins, !strconcat("v", asm), pattern, itin>, PD,
560         Requires<[UseAVX]>;
561 class S2I<bits<8> o, Format F, dag outs, dag ins, string asm,
562            list<dag> pattern, InstrItinClass itin = NoItinerary>
563       : I<o, F, outs, ins, asm, pattern, itin>, PD, Requires<[UseSSE2]>;
564 class MMXSDIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
565                list<dag> pattern, InstrItinClass itin = NoItinerary>
566       : Ii8<o, F, outs, ins, asm, pattern, itin>, XD, Requires<[HasSSE2]>;
567 class MMXS2SIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
568                 list<dag> pattern, InstrItinClass itin = NoItinerary>
569       : Ii8<o, F, outs, ins, asm, pattern>, XS, Requires<[HasSSE2]>;
570
571 // SSE3 Instruction Templates:
572 // 
573 //   S3I   - SSE3 instructions with PD prefixes.
574 //   S3SI  - SSE3 instructions with XS prefix.
575 //   S3DI  - SSE3 instructions with XD prefix.
576
577 class S3SI<bits<8> o, Format F, dag outs, dag ins, string asm, 
578            list<dag> pattern, InstrItinClass itin = NoItinerary>
579       : I<o, F, outs, ins, asm, pattern, itin, SSEPackedSingle>, XS,
580         Requires<[UseSSE3]>;
581 class S3DI<bits<8> o, Format F, dag outs, dag ins, string asm, 
582            list<dag> pattern, InstrItinClass itin = NoItinerary>
583       : I<o, F, outs, ins, asm, pattern, itin, SSEPackedDouble>, XD,
584         Requires<[UseSSE3]>;
585 class S3I<bits<8> o, Format F, dag outs, dag ins, string asm,
586           list<dag> pattern, InstrItinClass itin = NoItinerary>
587       : I<o, F, outs, ins, asm, pattern, itin, SSEPackedDouble>, PD,
588         Requires<[UseSSE3]>;
589
590
591 // SSSE3 Instruction Templates:
592 // 
593 //   SS38I - SSSE3 instructions with T8 prefix.
594 //   SS3AI - SSSE3 instructions with TA prefix.
595 //   MMXSS38I - SSSE3 instructions with T8 prefix and MMX operands.
596 //   MMXSS3AI - SSSE3 instructions with TA prefix and MMX operands.
597 //
598 // Note: SSSE3 instructions have 64-bit and 128-bit versions. The 64-bit version
599 // uses the MMX registers. The 64-bit versions are grouped with the MMX
600 // classes. They need to be enabled even if AVX is enabled.
601
602 class SS38I<bits<8> o, Format F, dag outs, dag ins, string asm,
603             list<dag> pattern, InstrItinClass itin = NoItinerary>
604       : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, T8PD,
605         Requires<[UseSSSE3]>;
606 class SS3AI<bits<8> o, Format F, dag outs, dag ins, string asm,
607             list<dag> pattern, InstrItinClass itin = NoItinerary>
608       : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TAPD,
609         Requires<[UseSSSE3]>;
610 class MMXSS38I<bits<8> o, Format F, dag outs, dag ins, string asm,
611                list<dag> pattern, InstrItinClass itin = NoItinerary>
612       : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, T8PS,
613         Requires<[HasSSSE3]>;
614 class MMXSS3AI<bits<8> o, Format F, dag outs, dag ins, string asm,
615                list<dag> pattern, InstrItinClass itin = NoItinerary>
616       : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TAPS,
617         Requires<[HasSSSE3]>;
618
619 // SSE4.1 Instruction Templates:
620 // 
621 //   SS48I - SSE 4.1 instructions with T8 prefix.
622 //   SS41AIi8 - SSE 4.1 instructions with TA prefix and ImmT == Imm8.
623 //
624 class SS48I<bits<8> o, Format F, dag outs, dag ins, string asm,
625             list<dag> pattern, InstrItinClass itin = NoItinerary>
626       : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, T8PD,
627         Requires<[UseSSE41]>;
628 class SS4AIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
629             list<dag> pattern, InstrItinClass itin = NoItinerary>
630       : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TAPD,
631         Requires<[UseSSE41]>;
632
633 // SSE4.2 Instruction Templates:
634 // 
635 //   SS428I - SSE 4.2 instructions with T8 prefix.
636 class SS428I<bits<8> o, Format F, dag outs, dag ins, string asm,
637              list<dag> pattern, InstrItinClass itin = NoItinerary>
638       : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, T8PD,
639         Requires<[UseSSE42]>;
640
641 //   SS42FI - SSE 4.2 instructions with T8XD prefix.
642 // NOTE: 'HasSSE42' is used as SS42FI is only used for CRC32 insns.
643 class SS42FI<bits<8> o, Format F, dag outs, dag ins, string asm,
644              list<dag> pattern, InstrItinClass itin = NoItinerary>
645       : I<o, F, outs, ins, asm, pattern, itin>, T8XD, Requires<[HasSSE42]>;
646
647 //   SS42AI = SSE 4.2 instructions with TA prefix
648 class SS42AI<bits<8> o, Format F, dag outs, dag ins, string asm,
649              list<dag> pattern, InstrItinClass itin = NoItinerary>
650       : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TAPD,
651         Requires<[UseSSE42]>;
652
653 // AVX Instruction Templates:
654 //   Instructions introduced in AVX (no SSE equivalent forms)
655 //
656 //   AVX8I - AVX instructions with T8PD prefix.
657 //   AVXAIi8 - AVX instructions with TAPD prefix and ImmT = Imm8.
658 class AVX8I<bits<8> o, Format F, dag outs, dag ins, string asm,
659             list<dag> pattern, InstrItinClass itin = NoItinerary>
660       : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, T8PD,
661         Requires<[HasAVX]>;
662 class AVXAIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
663               list<dag> pattern, InstrItinClass itin = NoItinerary>
664       : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TAPD,
665         Requires<[HasAVX]>;
666
667 // AVX2 Instruction Templates:
668 //   Instructions introduced in AVX2 (no SSE equivalent forms)
669 //
670 //   AVX28I - AVX2 instructions with T8PD prefix.
671 //   AVX2AIi8 - AVX2 instructions with TAPD prefix and ImmT = Imm8.
672 class AVX28I<bits<8> o, Format F, dag outs, dag ins, string asm,
673             list<dag> pattern, InstrItinClass itin = NoItinerary>
674       : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, T8PD,
675         Requires<[HasAVX2]>;
676 class AVX2AIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
677               list<dag> pattern, InstrItinClass itin = NoItinerary>
678       : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TAPD,
679         Requires<[HasAVX2]>;
680
681
682 // AVX-512 Instruction Templates:
683 //   Instructions introduced in AVX-512 (no SSE equivalent forms)
684 //
685 //   AVX5128I - AVX-512 instructions with T8PD prefix.
686 //   AVX512AIi8 - AVX-512 instructions with TAPD prefix and ImmT = Imm8.
687 //   AVX512PDI  - AVX-512 instructions with PD, double packed.
688 //   AVX512PSI  - AVX-512 instructions with PS, single packed.
689 //   AVX512XS8I - AVX-512 instructions with T8 and XS prefixes.
690 //   AVX512XSI  - AVX-512 instructions with XS prefix, generic domain.
691 //   AVX512BI   - AVX-512 instructions with PD, int packed domain.
692 //   AVX512SI   - AVX-512 scalar instructions with PD prefix.
693
694 class AVX5128I<bits<8> o, Format F, dag outs, dag ins, string asm,
695             list<dag> pattern, InstrItinClass itin = NoItinerary>
696       : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, T8PD,
697         Requires<[HasAVX512]>;
698 class AVX512XS8I<bits<8> o, Format F, dag outs, dag ins, string asm,
699             list<dag> pattern, InstrItinClass itin = NoItinerary>
700       : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, T8XS,
701         Requires<[HasAVX512]>;
702 class AVX512XSI<bits<8> o, Format F, dag outs, dag ins, string asm,
703             list<dag> pattern, InstrItinClass itin = NoItinerary>
704       : I<o, F, outs, ins, asm, pattern, itin>, XS,
705         Requires<[HasAVX512]>;
706 class AVX512XDI<bits<8> o, Format F, dag outs, dag ins, string asm,
707             list<dag> pattern, InstrItinClass itin = NoItinerary>
708       : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, XD,
709         Requires<[HasAVX512]>;
710 class AVX512BI<bits<8> o, Format F, dag outs, dag ins, string asm,
711             list<dag> pattern, InstrItinClass itin = NoItinerary>
712       : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, PD,
713         Requires<[HasAVX512]>;
714 class AVX512BIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
715               list<dag> pattern, InstrItinClass itin = NoItinerary>
716       : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, PD,
717         Requires<[HasAVX512]>;
718 class AVX512AIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
719               list<dag> pattern, InstrItinClass itin = NoItinerary>
720       : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TAPD,
721         Requires<[HasAVX512]>;
722 class AVX512Ii8<bits<8> o, Format F, dag outs, dag ins, string asm,
723               list<dag> pattern, InstrItinClass itin = NoItinerary>
724       : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>,
725         Requires<[HasAVX512]>;
726 class AVX512PDI<bits<8> o, Format F, dag outs, dag ins, string asm,
727            list<dag> pattern, InstrItinClass itin = NoItinerary>
728       : I<o, F, outs, ins, asm, pattern, itin, SSEPackedDouble>, PD,
729         Requires<[HasAVX512]>;
730 class AVX512PSI<bits<8> o, Format F, dag outs, dag ins, string asm,
731            list<dag> pattern, InstrItinClass itin = NoItinerary>
732       : I<o, F, outs, ins, asm, pattern, itin, SSEPackedSingle>, PS,
733         Requires<[HasAVX512]>;
734 class AVX512PIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
735               list<dag> pattern, Domain d, InstrItinClass itin = NoItinerary>
736       : Ii8<o, F, outs, ins, asm, pattern, itin, d>, Requires<[HasAVX512]>;
737 class AVX512PI<bits<8> o, Format F, dag outs, dag ins, string asm,
738               list<dag> pattern, Domain d, InstrItinClass itin = NoItinerary>
739       : I<o, F, outs, ins, asm, pattern, itin, d>, Requires<[HasAVX512]>;
740 class AVX512FMA3<bits<8> o, Format F, dag outs, dag ins, string asm,
741            list<dag>pattern, InstrItinClass itin = NoItinerary>
742       : I<o, F, outs, ins, asm, pattern, itin>, T8PD,
743         EVEX_4V, Requires<[HasAVX512]>;
744
745 // AES Instruction Templates:
746 //
747 // AES8I
748 // These use the same encoding as the SSE4.2 T8 and TA encodings.
749 class AES8I<bits<8> o, Format F, dag outs, dag ins, string asm,
750             list<dag>pattern, InstrItinClass itin = IIC_AES>
751       : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, T8PD,
752         Requires<[HasAES]>;
753
754 class AESAI<bits<8> o, Format F, dag outs, dag ins, string asm,
755             list<dag> pattern, InstrItinClass itin = NoItinerary>
756       : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TAPD,
757         Requires<[HasAES]>;
758
759 // PCLMUL Instruction Templates
760 class PCLMULIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
761                list<dag>pattern, InstrItinClass itin = NoItinerary>
762       : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TAPD,
763         Requires<[HasPCLMUL]>;
764
765 class AVXPCLMULIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
766                   list<dag>pattern, InstrItinClass itin = NoItinerary>
767       : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TAPD,
768         VEX_4V, Requires<[HasAVX, HasPCLMUL]>;
769
770 // FMA3 Instruction Templates
771 class FMA3<bits<8> o, Format F, dag outs, dag ins, string asm,
772            list<dag>pattern, InstrItinClass itin = NoItinerary>
773       : I<o, F, outs, ins, asm, pattern, itin>, T8PD,
774         VEX_4V, FMASC, Requires<[HasFMA]>;
775
776 // FMA4 Instruction Templates
777 class FMA4<bits<8> o, Format F, dag outs, dag ins, string asm,
778            list<dag>pattern, InstrItinClass itin = NoItinerary>
779       : Ii8<o, F, outs, ins, asm, pattern, itin>, TAPD,
780         VEX_4V, VEX_I8IMM, FMASC, Requires<[HasFMA4]>;
781
782 // XOP 2, 3 and 4 Operand Instruction Template
783 class IXOP<bits<8> o, Format F, dag outs, dag ins, string asm,
784            list<dag> pattern, InstrItinClass itin = NoItinerary>
785       : I<o, F, outs, ins, asm, pattern, itin, SSEPackedDouble>,
786          XOP9, Requires<[HasXOP]>;
787
788 // XOP 2, 3 and 4 Operand Instruction Templates with imm byte
789 class IXOPi8<bits<8> o, Format F, dag outs, dag ins, string asm,
790            list<dag> pattern, InstrItinClass itin = NoItinerary>
791       : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedDouble>,
792          XOP8, Requires<[HasXOP]>;
793
794 //  XOP 5 operand instruction (VEX encoding!)
795 class IXOP5<bits<8> o, Format F, dag outs, dag ins, string asm,
796            list<dag>pattern, InstrItinClass itin = NoItinerary>
797       : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TAPD,
798         VEX_4V, VEX_I8IMM, Requires<[HasXOP]>;
799
800 // X86-64 Instruction templates...
801 //
802
803 class RI<bits<8> o, Format F, dag outs, dag ins, string asm,
804          list<dag> pattern, InstrItinClass itin = NoItinerary>
805       : I<o, F, outs, ins, asm, pattern, itin>, REX_W;
806 class RIi8 <bits<8> o, Format F, dag outs, dag ins, string asm,
807             list<dag> pattern, InstrItinClass itin = NoItinerary>
808       : Ii8<o, F, outs, ins, asm, pattern, itin>, REX_W;
809 class RIi16 <bits<8> o, Format F, dag outs, dag ins, string asm,
810             list<dag> pattern, InstrItinClass itin = NoItinerary>
811       : Ii16<o, F, outs, ins, asm, pattern, itin>, REX_W;
812 class RIi32 <bits<8> o, Format F, dag outs, dag ins, string asm,
813              list<dag> pattern, InstrItinClass itin = NoItinerary>
814       : Ii32<o, F, outs, ins, asm, pattern, itin>, REX_W;
815 class RIi32S <bits<8> o, Format F, dag outs, dag ins, string asm,
816               list<dag> pattern, InstrItinClass itin = NoItinerary>
817       : Ii32S<o, F, outs, ins, asm, pattern, itin>, REX_W;
818
819 class RIi64<bits<8> o, Format f, dag outs, dag ins, string asm,
820             list<dag> pattern, InstrItinClass itin = NoItinerary>
821   : X86Inst<o, f, Imm64, outs, ins, asm, itin>, REX_W {
822   let Pattern = pattern;
823   let CodeSize = 3;
824 }
825
826 class RIi64_NOREX<bits<8> o, Format f, dag outs, dag ins, string asm,
827             list<dag> pattern, InstrItinClass itin = NoItinerary>
828   : X86Inst<o, f, Imm64, outs, ins, asm, itin> {
829   let Pattern = pattern;
830   let CodeSize = 3;
831 }
832
833 class RS2I<bits<8> o, Format F, dag outs, dag ins, string asm,
834            list<dag> pattern, InstrItinClass itin = NoItinerary>
835       : S2I<o, F, outs, ins, asm, pattern, itin>, REX_W;
836 class VRS2I<bits<8> o, Format F, dag outs, dag ins, string asm,
837            list<dag> pattern, InstrItinClass itin = NoItinerary>
838       : VS2I<o, F, outs, ins, asm, pattern, itin>, VEX_W;
839
840 // MMX Instruction templates
841 //
842
843 // MMXI   - MMX instructions with TB prefix.
844 // MMXI32 - MMX instructions with TB prefix valid only in 32 bit mode.
845 // MMXI64 - MMX instructions with TB prefix valid only in 64 bit mode.
846 // MMX2I  - MMX / SSE2 instructions with PD prefix.
847 // MMXIi8 - MMX instructions with ImmT == Imm8 and PS prefix.
848 // MMXIi8 - MMX instructions with ImmT == Imm8 and PS prefix.
849 // MMXID  - MMX instructions with XD prefix.
850 // MMXIS  - MMX instructions with XS prefix.
851 class MMXI<bits<8> o, Format F, dag outs, dag ins, string asm, 
852            list<dag> pattern, InstrItinClass itin = NoItinerary>
853       : I<o, F, outs, ins, asm, pattern, itin>, PS, Requires<[HasMMX]>;
854 class MMXI32<bits<8> o, Format F, dag outs, dag ins, string asm, 
855              list<dag> pattern, InstrItinClass itin = NoItinerary>
856       : I<o, F, outs, ins, asm, pattern, itin>, PS, Requires<[HasMMX,Not64BitMode]>;
857 class MMXI64<bits<8> o, Format F, dag outs, dag ins, string asm, 
858              list<dag> pattern, InstrItinClass itin = NoItinerary>
859       : I<o, F, outs, ins, asm, pattern, itin>, PS, Requires<[HasMMX,In64BitMode]>;
860 class MMXRI<bits<8> o, Format F, dag outs, dag ins, string asm, 
861             list<dag> pattern, InstrItinClass itin = NoItinerary>
862       : I<o, F, outs, ins, asm, pattern, itin>, PS, REX_W, Requires<[HasMMX]>;
863 class MMX2I<bits<8> o, Format F, dag outs, dag ins, string asm, 
864             list<dag> pattern, InstrItinClass itin = NoItinerary>
865       : I<o, F, outs, ins, asm, pattern, itin>, PD, Requires<[HasMMX]>;
866 class MMXIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 
867              list<dag> pattern, InstrItinClass itin = NoItinerary>
868       : Ii8<o, F, outs, ins, asm, pattern, itin>, PS, Requires<[HasMMX]>;
869 class MMXID<bits<8> o, Format F, dag outs, dag ins, string asm, 
870             list<dag> pattern, InstrItinClass itin = NoItinerary>
871       : Ii8<o, F, outs, ins, asm, pattern, itin>, XD, Requires<[HasMMX]>;
872 class MMXIS<bits<8> o, Format F, dag outs, dag ins, string asm, 
873             list<dag> pattern, InstrItinClass itin = NoItinerary>
874       : Ii8<o, F, outs, ins, asm, pattern, itin>, XS, Requires<[HasMMX]>;