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