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