xref: /aosp_15_r20/external/llvm/lib/Target/AMDGPU/SIInstrFormats.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//===-- SIInstrFormats.td - SI Instruction Encodings ----------------------===//
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// SI Instruction format definitions.
11*9880d681SAndroid Build Coastguard Worker//
12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerclass InstSI <dag outs, dag ins, string asm = "",
15*9880d681SAndroid Build Coastguard Worker              list<dag> pattern = []> :
16*9880d681SAndroid Build Coastguard Worker  AMDGPUInst<outs, ins, asm, pattern>, PredicateControl {
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker  field bits<1> VM_CNT = 0;
19*9880d681SAndroid Build Coastguard Worker  field bits<1> EXP_CNT = 0;
20*9880d681SAndroid Build Coastguard Worker  field bits<1> LGKM_CNT = 0;
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker  field bits<1> SALU = 0;
23*9880d681SAndroid Build Coastguard Worker  field bits<1> VALU = 0;
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker  field bits<1> SOP1 = 0;
26*9880d681SAndroid Build Coastguard Worker  field bits<1> SOP2 = 0;
27*9880d681SAndroid Build Coastguard Worker  field bits<1> SOPC = 0;
28*9880d681SAndroid Build Coastguard Worker  field bits<1> SOPK = 0;
29*9880d681SAndroid Build Coastguard Worker  field bits<1> SOPP = 0;
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker  field bits<1> VOP1 = 0;
32*9880d681SAndroid Build Coastguard Worker  field bits<1> VOP2 = 0;
33*9880d681SAndroid Build Coastguard Worker  field bits<1> VOP3 = 0;
34*9880d681SAndroid Build Coastguard Worker  field bits<1> VOPC = 0;
35*9880d681SAndroid Build Coastguard Worker  field bits<1> SDWA = 0;
36*9880d681SAndroid Build Coastguard Worker  field bits<1> DPP = 0;
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker  field bits<1> MUBUF = 0;
39*9880d681SAndroid Build Coastguard Worker  field bits<1> MTBUF = 0;
40*9880d681SAndroid Build Coastguard Worker  field bits<1> SMRD = 0;
41*9880d681SAndroid Build Coastguard Worker  field bits<1> DS = 0;
42*9880d681SAndroid Build Coastguard Worker  field bits<1> MIMG = 0;
43*9880d681SAndroid Build Coastguard Worker  field bits<1> FLAT = 0;
44*9880d681SAndroid Build Coastguard Worker  field bits<1> WQM = 0;
45*9880d681SAndroid Build Coastguard Worker  field bits<1> VGPRSpill = 0;
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker  // This bit tells the assembler to use the 32-bit encoding in case it
48*9880d681SAndroid Build Coastguard Worker  // is unable to infer the encoding from the operands.
49*9880d681SAndroid Build Coastguard Worker  field bits<1> VOPAsmPrefer32Bit = 0;
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker  field bits<1> Gather4 = 0;
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker  // These need to be kept in sync with the enum in SIInstrFlags.
54*9880d681SAndroid Build Coastguard Worker  let TSFlags{0} = VM_CNT;
55*9880d681SAndroid Build Coastguard Worker  let TSFlags{1} = EXP_CNT;
56*9880d681SAndroid Build Coastguard Worker  let TSFlags{2} = LGKM_CNT;
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker  let TSFlags{3} = SALU;
59*9880d681SAndroid Build Coastguard Worker  let TSFlags{4} = VALU;
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Worker  let TSFlags{5} = SOP1;
62*9880d681SAndroid Build Coastguard Worker  let TSFlags{6} = SOP2;
63*9880d681SAndroid Build Coastguard Worker  let TSFlags{7} = SOPC;
64*9880d681SAndroid Build Coastguard Worker  let TSFlags{8} = SOPK;
65*9880d681SAndroid Build Coastguard Worker  let TSFlags{9} = SOPP;
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Worker  let TSFlags{10} = VOP1;
68*9880d681SAndroid Build Coastguard Worker  let TSFlags{11} = VOP2;
69*9880d681SAndroid Build Coastguard Worker  let TSFlags{12} = VOP3;
70*9880d681SAndroid Build Coastguard Worker  let TSFlags{13} = VOPC;
71*9880d681SAndroid Build Coastguard Worker  let TSFlags{14} = SDWA;
72*9880d681SAndroid Build Coastguard Worker  let TSFlags{15} = DPP;
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Worker  let TSFlags{16} = MUBUF;
75*9880d681SAndroid Build Coastguard Worker  let TSFlags{17} = MTBUF;
76*9880d681SAndroid Build Coastguard Worker  let TSFlags{18} = SMRD;
77*9880d681SAndroid Build Coastguard Worker  let TSFlags{19} = DS;
78*9880d681SAndroid Build Coastguard Worker  let TSFlags{20} = MIMG;
79*9880d681SAndroid Build Coastguard Worker  let TSFlags{21} = FLAT;
80*9880d681SAndroid Build Coastguard Worker  let TSFlags{22} = WQM;
81*9880d681SAndroid Build Coastguard Worker  let TSFlags{23} = VGPRSpill;
82*9880d681SAndroid Build Coastguard Worker  let TSFlags{24} = VOPAsmPrefer32Bit;
83*9880d681SAndroid Build Coastguard Worker  let TSFlags{25} = Gather4;
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker  let SchedRW = [Write32Bit];
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker  field bits<1> DisableSIDecoder = 0;
88*9880d681SAndroid Build Coastguard Worker  field bits<1> DisableVIDecoder = 0;
89*9880d681SAndroid Build Coastguard Worker  field bits<1> DisableDecoder = 0;
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Worker  let isAsmParserOnly = !if(!eq(DisableDecoder{0}, {0}), 0, 1);
92*9880d681SAndroid Build Coastguard Worker}
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Workerclass PseudoInstSI<dag outs, dag ins, list<dag> pattern = []>
95*9880d681SAndroid Build Coastguard Worker  : InstSI<outs, ins, "", pattern> {
96*9880d681SAndroid Build Coastguard Worker  let isPseudo = 1;
97*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1;
98*9880d681SAndroid Build Coastguard Worker}
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Workerclass Enc32 {
101*9880d681SAndroid Build Coastguard Worker  field bits<32> Inst;
102*9880d681SAndroid Build Coastguard Worker  int Size = 4;
103*9880d681SAndroid Build Coastguard Worker}
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerclass Enc64 {
106*9880d681SAndroid Build Coastguard Worker  field bits<64> Inst;
107*9880d681SAndroid Build Coastguard Worker  int Size = 8;
108*9880d681SAndroid Build Coastguard Worker}
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Workerclass VOPDstOperand <RegisterClass rc> : RegisterOperand <rc, "printVOPDst">;
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Workerlet Uses = [EXEC] in {
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Workerclass VOPAnyCommon <dag outs, dag ins, string asm, list<dag> pattern> :
115*9880d681SAndroid Build Coastguard Worker    InstSI <outs, ins, asm, pattern> {
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Worker  let mayLoad = 0;
118*9880d681SAndroid Build Coastguard Worker  let mayStore = 0;
119*9880d681SAndroid Build Coastguard Worker  let hasSideEffects = 0;
120*9880d681SAndroid Build Coastguard Worker  let UseNamedOperandTable = 1;
121*9880d681SAndroid Build Coastguard Worker  let VALU = 1;
122*9880d681SAndroid Build Coastguard Worker}
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Workerclass VOPCCommon <dag ins, string asm, list<dag> pattern> :
125*9880d681SAndroid Build Coastguard Worker    VOPAnyCommon <(outs), ins, asm, pattern> {
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Worker  let VOPC = 1;
128*9880d681SAndroid Build Coastguard Worker  let Size = 4;
129*9880d681SAndroid Build Coastguard Worker  let Defs = [VCC];
130*9880d681SAndroid Build Coastguard Worker}
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Workerclass VOP1Common <dag outs, dag ins, string asm, list<dag> pattern> :
133*9880d681SAndroid Build Coastguard Worker    VOPAnyCommon <outs, ins, asm, pattern> {
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker  let VOP1 = 1;
136*9880d681SAndroid Build Coastguard Worker  let Size = 4;
137*9880d681SAndroid Build Coastguard Worker}
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Workerclass VOP2Common <dag outs, dag ins, string asm, list<dag> pattern> :
140*9880d681SAndroid Build Coastguard Worker    VOPAnyCommon <outs, ins, asm, pattern> {
141*9880d681SAndroid Build Coastguard Worker
142*9880d681SAndroid Build Coastguard Worker  let VOP2 = 1;
143*9880d681SAndroid Build Coastguard Worker  let Size = 4;
144*9880d681SAndroid Build Coastguard Worker}
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Workerclass VOP3Common <dag outs, dag ins, string asm = "",
147*9880d681SAndroid Build Coastguard Worker                  list<dag> pattern = [], bit HasMods = 0,
148*9880d681SAndroid Build Coastguard Worker                  bit VOP3Only = 0> :
149*9880d681SAndroid Build Coastguard Worker  VOPAnyCommon <outs, ins, asm, pattern> {
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Worker  // Using complex patterns gives VOP3 patterns a very high complexity rating,
152*9880d681SAndroid Build Coastguard Worker  // but standalone patterns are almost always prefered, so we need to adjust the
153*9880d681SAndroid Build Coastguard Worker  // priority lower.  The goal is to use a high number to reduce complexity to
154*9880d681SAndroid Build Coastguard Worker  // zero (or less than zero).
155*9880d681SAndroid Build Coastguard Worker  let AddedComplexity = -1000;
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Worker  let VOP3 = 1;
158*9880d681SAndroid Build Coastguard Worker  let VALU = 1;
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard Worker  let AsmMatchConverter =
161*9880d681SAndroid Build Coastguard Worker    !if(!eq(VOP3Only,1),
162*9880d681SAndroid Build Coastguard Worker        "cvtVOP3",
163*9880d681SAndroid Build Coastguard Worker        !if(!eq(HasMods,1), "cvtVOP3_2_mod", ""));
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 0;
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Worker  int Size = 8;
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Worker  // Because SGPRs may be allowed if there are multiple operands, we
170*9880d681SAndroid Build Coastguard Worker  // need a post-isel hook to insert copies in order to avoid
171*9880d681SAndroid Build Coastguard Worker  // violating constant bus requirements.
172*9880d681SAndroid Build Coastguard Worker  let hasPostISelHook = 1;
173*9880d681SAndroid Build Coastguard Worker}
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Worker} // End Uses = [EXEC]
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
178*9880d681SAndroid Build Coastguard Worker// Scalar operations
179*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
180*9880d681SAndroid Build Coastguard Worker
181*9880d681SAndroid Build Coastguard Workerclass SOP1e <bits<8> op> : Enc32 {
182*9880d681SAndroid Build Coastguard Worker  bits<7> sdst;
183*9880d681SAndroid Build Coastguard Worker  bits<8> src0;
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Worker  let Inst{7-0} = src0;
186*9880d681SAndroid Build Coastguard Worker  let Inst{15-8} = op;
187*9880d681SAndroid Build Coastguard Worker  let Inst{22-16} = sdst;
188*9880d681SAndroid Build Coastguard Worker  let Inst{31-23} = 0x17d; //encoding;
189*9880d681SAndroid Build Coastguard Worker}
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Workerclass SOP2e <bits<7> op> : Enc32 {
192*9880d681SAndroid Build Coastguard Worker  bits<7> sdst;
193*9880d681SAndroid Build Coastguard Worker  bits<8> src0;
194*9880d681SAndroid Build Coastguard Worker  bits<8> src1;
195*9880d681SAndroid Build Coastguard Worker
196*9880d681SAndroid Build Coastguard Worker  let Inst{7-0} = src0;
197*9880d681SAndroid Build Coastguard Worker  let Inst{15-8} = src1;
198*9880d681SAndroid Build Coastguard Worker  let Inst{22-16} = sdst;
199*9880d681SAndroid Build Coastguard Worker  let Inst{29-23} = op;
200*9880d681SAndroid Build Coastguard Worker  let Inst{31-30} = 0x2; // encoding
201*9880d681SAndroid Build Coastguard Worker}
202*9880d681SAndroid Build Coastguard Worker
203*9880d681SAndroid Build Coastguard Workerclass SOPCe <bits<7> op> : Enc32 {
204*9880d681SAndroid Build Coastguard Worker  bits<8> src0;
205*9880d681SAndroid Build Coastguard Worker  bits<8> src1;
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Worker  let Inst{7-0} = src0;
208*9880d681SAndroid Build Coastguard Worker  let Inst{15-8} = src1;
209*9880d681SAndroid Build Coastguard Worker  let Inst{22-16} = op;
210*9880d681SAndroid Build Coastguard Worker  let Inst{31-23} = 0x17e;
211*9880d681SAndroid Build Coastguard Worker}
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Workerclass SOPKe <bits<5> op> : Enc32 {
214*9880d681SAndroid Build Coastguard Worker  bits <7> sdst;
215*9880d681SAndroid Build Coastguard Worker  bits <16> simm16;
216*9880d681SAndroid Build Coastguard Worker
217*9880d681SAndroid Build Coastguard Worker  let Inst{15-0} = simm16;
218*9880d681SAndroid Build Coastguard Worker  let Inst{22-16} = sdst;
219*9880d681SAndroid Build Coastguard Worker  let Inst{27-23} = op;
220*9880d681SAndroid Build Coastguard Worker  let Inst{31-28} = 0xb; //encoding
221*9880d681SAndroid Build Coastguard Worker}
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Workerclass SOPK64e <bits<5> op> : Enc64 {
224*9880d681SAndroid Build Coastguard Worker  bits <7> sdst = 0;
225*9880d681SAndroid Build Coastguard Worker  bits <16> simm16;
226*9880d681SAndroid Build Coastguard Worker  bits <32> imm;
227*9880d681SAndroid Build Coastguard Worker
228*9880d681SAndroid Build Coastguard Worker  let Inst{15-0} = simm16;
229*9880d681SAndroid Build Coastguard Worker  let Inst{22-16} = sdst;
230*9880d681SAndroid Build Coastguard Worker  let Inst{27-23} = op;
231*9880d681SAndroid Build Coastguard Worker  let Inst{31-28} = 0xb;
232*9880d681SAndroid Build Coastguard Worker
233*9880d681SAndroid Build Coastguard Worker  let Inst{63-32} = imm;
234*9880d681SAndroid Build Coastguard Worker}
235*9880d681SAndroid Build Coastguard Worker
236*9880d681SAndroid Build Coastguard Workerclass SOPPe <bits<7> op> : Enc32 {
237*9880d681SAndroid Build Coastguard Worker  bits <16> simm16;
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Worker  let Inst{15-0} = simm16;
240*9880d681SAndroid Build Coastguard Worker  let Inst{22-16} = op;
241*9880d681SAndroid Build Coastguard Worker  let Inst{31-23} = 0x17f; // encoding
242*9880d681SAndroid Build Coastguard Worker}
243*9880d681SAndroid Build Coastguard Worker
244*9880d681SAndroid Build Coastguard Workerclass SMRDe <bits<5> op, bits<1> imm> : Enc32 {
245*9880d681SAndroid Build Coastguard Worker  bits<7> sdst;
246*9880d681SAndroid Build Coastguard Worker  bits<7> sbase;
247*9880d681SAndroid Build Coastguard Worker
248*9880d681SAndroid Build Coastguard Worker  let Inst{8} = imm;
249*9880d681SAndroid Build Coastguard Worker  let Inst{14-9} = sbase{6-1};
250*9880d681SAndroid Build Coastguard Worker  let Inst{21-15} = sdst;
251*9880d681SAndroid Build Coastguard Worker  let Inst{26-22} = op;
252*9880d681SAndroid Build Coastguard Worker  let Inst{31-27} = 0x18; //encoding
253*9880d681SAndroid Build Coastguard Worker}
254*9880d681SAndroid Build Coastguard Worker
255*9880d681SAndroid Build Coastguard Workerclass SMRD_IMMe <bits<5> op> : SMRDe<op, 1> {
256*9880d681SAndroid Build Coastguard Worker  bits<8> offset;
257*9880d681SAndroid Build Coastguard Worker  let Inst{7-0} = offset;
258*9880d681SAndroid Build Coastguard Worker}
259*9880d681SAndroid Build Coastguard Worker
260*9880d681SAndroid Build Coastguard Workerclass SMRD_SOFFe <bits<5> op> : SMRDe<op, 0> {
261*9880d681SAndroid Build Coastguard Worker  bits<8> soff;
262*9880d681SAndroid Build Coastguard Worker  let Inst{7-0} = soff;
263*9880d681SAndroid Build Coastguard Worker}
264*9880d681SAndroid Build Coastguard Worker
265*9880d681SAndroid Build Coastguard Worker
266*9880d681SAndroid Build Coastguard Worker
267*9880d681SAndroid Build Coastguard Workerclass SMRD_IMMe_ci <bits<5> op> : Enc64 {
268*9880d681SAndroid Build Coastguard Worker  bits<7> sdst;
269*9880d681SAndroid Build Coastguard Worker  bits<7> sbase;
270*9880d681SAndroid Build Coastguard Worker  bits<32> offset;
271*9880d681SAndroid Build Coastguard Worker
272*9880d681SAndroid Build Coastguard Worker  let Inst{7-0}   = 0xff;
273*9880d681SAndroid Build Coastguard Worker  let Inst{8}     = 0;
274*9880d681SAndroid Build Coastguard Worker  let Inst{14-9}  = sbase{6-1};
275*9880d681SAndroid Build Coastguard Worker  let Inst{21-15} = sdst;
276*9880d681SAndroid Build Coastguard Worker  let Inst{26-22} = op;
277*9880d681SAndroid Build Coastguard Worker  let Inst{31-27} = 0x18; //encoding
278*9880d681SAndroid Build Coastguard Worker  let Inst{63-32} = offset;
279*9880d681SAndroid Build Coastguard Worker}
280*9880d681SAndroid Build Coastguard Worker
281*9880d681SAndroid Build Coastguard Workerlet SchedRW = [WriteSALU] in {
282*9880d681SAndroid Build Coastguard Workerclass SOP1 <dag outs, dag ins, string asm, list<dag> pattern> :
283*9880d681SAndroid Build Coastguard Worker    InstSI<outs, ins, asm, pattern> {
284*9880d681SAndroid Build Coastguard Worker  let mayLoad = 0;
285*9880d681SAndroid Build Coastguard Worker  let mayStore = 0;
286*9880d681SAndroid Build Coastguard Worker  let hasSideEffects = 0;
287*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 0;
288*9880d681SAndroid Build Coastguard Worker  let SALU = 1;
289*9880d681SAndroid Build Coastguard Worker  let SOP1 = 1;
290*9880d681SAndroid Build Coastguard Worker}
291*9880d681SAndroid Build Coastguard Worker
292*9880d681SAndroid Build Coastguard Workerclass SOP2 <dag outs, dag ins, string asm, list<dag> pattern> :
293*9880d681SAndroid Build Coastguard Worker    InstSI <outs, ins, asm, pattern> {
294*9880d681SAndroid Build Coastguard Worker
295*9880d681SAndroid Build Coastguard Worker  let mayLoad = 0;
296*9880d681SAndroid Build Coastguard Worker  let mayStore = 0;
297*9880d681SAndroid Build Coastguard Worker  let hasSideEffects = 0;
298*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 0;
299*9880d681SAndroid Build Coastguard Worker  let SALU = 1;
300*9880d681SAndroid Build Coastguard Worker  let SOP2 = 1;
301*9880d681SAndroid Build Coastguard Worker
302*9880d681SAndroid Build Coastguard Worker  let UseNamedOperandTable = 1;
303*9880d681SAndroid Build Coastguard Worker}
304*9880d681SAndroid Build Coastguard Worker
305*9880d681SAndroid Build Coastguard Workerclass SOPC <bits<7> op, dag outs, dag ins, string asm, list<dag> pattern> :
306*9880d681SAndroid Build Coastguard Worker  InstSI<outs, ins, asm, pattern>, SOPCe <op> {
307*9880d681SAndroid Build Coastguard Worker
308*9880d681SAndroid Build Coastguard Worker  let mayLoad = 0;
309*9880d681SAndroid Build Coastguard Worker  let mayStore = 0;
310*9880d681SAndroid Build Coastguard Worker  let hasSideEffects = 0;
311*9880d681SAndroid Build Coastguard Worker  let SALU = 1;
312*9880d681SAndroid Build Coastguard Worker  let SOPC = 1;
313*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 0;
314*9880d681SAndroid Build Coastguard Worker  let Defs = [SCC];
315*9880d681SAndroid Build Coastguard Worker
316*9880d681SAndroid Build Coastguard Worker  let UseNamedOperandTable = 1;
317*9880d681SAndroid Build Coastguard Worker}
318*9880d681SAndroid Build Coastguard Worker
319*9880d681SAndroid Build Coastguard Workerclass SOPK <dag outs, dag ins, string asm, list<dag> pattern> :
320*9880d681SAndroid Build Coastguard Worker   InstSI <outs, ins , asm, pattern> {
321*9880d681SAndroid Build Coastguard Worker
322*9880d681SAndroid Build Coastguard Worker  let mayLoad = 0;
323*9880d681SAndroid Build Coastguard Worker  let mayStore = 0;
324*9880d681SAndroid Build Coastguard Worker  let hasSideEffects = 0;
325*9880d681SAndroid Build Coastguard Worker  let SALU = 1;
326*9880d681SAndroid Build Coastguard Worker  let SOPK = 1;
327*9880d681SAndroid Build Coastguard Worker
328*9880d681SAndroid Build Coastguard Worker  let UseNamedOperandTable = 1;
329*9880d681SAndroid Build Coastguard Worker}
330*9880d681SAndroid Build Coastguard Worker
331*9880d681SAndroid Build Coastguard Workerclass SOPP <bits<7> op, dag ins, string asm, list<dag> pattern = []> :
332*9880d681SAndroid Build Coastguard Worker		InstSI <(outs), ins, asm, pattern >, SOPPe <op> {
333*9880d681SAndroid Build Coastguard Worker
334*9880d681SAndroid Build Coastguard Worker  let mayLoad = 0;
335*9880d681SAndroid Build Coastguard Worker  let mayStore = 0;
336*9880d681SAndroid Build Coastguard Worker  let hasSideEffects = 0;
337*9880d681SAndroid Build Coastguard Worker  let SALU = 1;
338*9880d681SAndroid Build Coastguard Worker  let SOPP = 1;
339*9880d681SAndroid Build Coastguard Worker
340*9880d681SAndroid Build Coastguard Worker  let UseNamedOperandTable = 1;
341*9880d681SAndroid Build Coastguard Worker}
342*9880d681SAndroid Build Coastguard Worker
343*9880d681SAndroid Build Coastguard Worker} // let SchedRW = [WriteSALU]
344*9880d681SAndroid Build Coastguard Worker
345*9880d681SAndroid Build Coastguard Workerclass SMRD <dag outs, dag ins, string asm, list<dag> pattern> :
346*9880d681SAndroid Build Coastguard Worker    InstSI<outs, ins, asm, pattern> {
347*9880d681SAndroid Build Coastguard Worker
348*9880d681SAndroid Build Coastguard Worker  let LGKM_CNT = 1;
349*9880d681SAndroid Build Coastguard Worker  let SMRD = 1;
350*9880d681SAndroid Build Coastguard Worker  let mayStore = 0;
351*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
352*9880d681SAndroid Build Coastguard Worker  let hasSideEffects = 0;
353*9880d681SAndroid Build Coastguard Worker  let UseNamedOperandTable = 1;
354*9880d681SAndroid Build Coastguard Worker  let SchedRW = [WriteSMEM];
355*9880d681SAndroid Build Coastguard Worker}
356*9880d681SAndroid Build Coastguard Worker
357*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
358*9880d681SAndroid Build Coastguard Worker// Vector ALU operations
359*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
360*9880d681SAndroid Build Coastguard Worker
361*9880d681SAndroid Build Coastguard Workerclass VOP1e <bits<8> op> : Enc32 {
362*9880d681SAndroid Build Coastguard Worker  bits<8> vdst;
363*9880d681SAndroid Build Coastguard Worker  bits<9> src0;
364*9880d681SAndroid Build Coastguard Worker
365*9880d681SAndroid Build Coastguard Worker  let Inst{8-0} = src0;
366*9880d681SAndroid Build Coastguard Worker  let Inst{16-9} = op;
367*9880d681SAndroid Build Coastguard Worker  let Inst{24-17} = vdst;
368*9880d681SAndroid Build Coastguard Worker  let Inst{31-25} = 0x3f; //encoding
369*9880d681SAndroid Build Coastguard Worker}
370*9880d681SAndroid Build Coastguard Worker
371*9880d681SAndroid Build Coastguard Workerclass VOP2e <bits<6> op> : Enc32 {
372*9880d681SAndroid Build Coastguard Worker  bits<8> vdst;
373*9880d681SAndroid Build Coastguard Worker  bits<9> src0;
374*9880d681SAndroid Build Coastguard Worker  bits<8> src1;
375*9880d681SAndroid Build Coastguard Worker
376*9880d681SAndroid Build Coastguard Worker  let Inst{8-0} = src0;
377*9880d681SAndroid Build Coastguard Worker  let Inst{16-9} = src1;
378*9880d681SAndroid Build Coastguard Worker  let Inst{24-17} = vdst;
379*9880d681SAndroid Build Coastguard Worker  let Inst{30-25} = op;
380*9880d681SAndroid Build Coastguard Worker  let Inst{31} = 0x0; //encoding
381*9880d681SAndroid Build Coastguard Worker}
382*9880d681SAndroid Build Coastguard Worker
383*9880d681SAndroid Build Coastguard Workerclass VOP2_MADKe <bits<6> op> : Enc64 {
384*9880d681SAndroid Build Coastguard Worker
385*9880d681SAndroid Build Coastguard Worker  bits<8>  vdst;
386*9880d681SAndroid Build Coastguard Worker  bits<9>  src0;
387*9880d681SAndroid Build Coastguard Worker  bits<8>  src1;
388*9880d681SAndroid Build Coastguard Worker  bits<32> imm;
389*9880d681SAndroid Build Coastguard Worker
390*9880d681SAndroid Build Coastguard Worker  let Inst{8-0} = src0;
391*9880d681SAndroid Build Coastguard Worker  let Inst{16-9} = src1;
392*9880d681SAndroid Build Coastguard Worker  let Inst{24-17} = vdst;
393*9880d681SAndroid Build Coastguard Worker  let Inst{30-25} = op;
394*9880d681SAndroid Build Coastguard Worker  let Inst{31} = 0x0; // encoding
395*9880d681SAndroid Build Coastguard Worker  let Inst{63-32} = imm;
396*9880d681SAndroid Build Coastguard Worker}
397*9880d681SAndroid Build Coastguard Worker
398*9880d681SAndroid Build Coastguard Workerclass VOP3a <bits<9> op> : Enc64 {
399*9880d681SAndroid Build Coastguard Worker  bits<2> src0_modifiers;
400*9880d681SAndroid Build Coastguard Worker  bits<9> src0;
401*9880d681SAndroid Build Coastguard Worker  bits<2> src1_modifiers;
402*9880d681SAndroid Build Coastguard Worker  bits<9> src1;
403*9880d681SAndroid Build Coastguard Worker  bits<2> src2_modifiers;
404*9880d681SAndroid Build Coastguard Worker  bits<9> src2;
405*9880d681SAndroid Build Coastguard Worker  bits<1> clamp;
406*9880d681SAndroid Build Coastguard Worker  bits<2> omod;
407*9880d681SAndroid Build Coastguard Worker
408*9880d681SAndroid Build Coastguard Worker  let Inst{8} = src0_modifiers{1};
409*9880d681SAndroid Build Coastguard Worker  let Inst{9} = src1_modifiers{1};
410*9880d681SAndroid Build Coastguard Worker  let Inst{10} = src2_modifiers{1};
411*9880d681SAndroid Build Coastguard Worker  let Inst{11} = clamp;
412*9880d681SAndroid Build Coastguard Worker  let Inst{25-17} = op;
413*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = 0x34; //encoding
414*9880d681SAndroid Build Coastguard Worker  let Inst{40-32} = src0;
415*9880d681SAndroid Build Coastguard Worker  let Inst{49-41} = src1;
416*9880d681SAndroid Build Coastguard Worker  let Inst{58-50} = src2;
417*9880d681SAndroid Build Coastguard Worker  let Inst{60-59} = omod;
418*9880d681SAndroid Build Coastguard Worker  let Inst{61} = src0_modifiers{0};
419*9880d681SAndroid Build Coastguard Worker  let Inst{62} = src1_modifiers{0};
420*9880d681SAndroid Build Coastguard Worker  let Inst{63} = src2_modifiers{0};
421*9880d681SAndroid Build Coastguard Worker}
422*9880d681SAndroid Build Coastguard Worker
423*9880d681SAndroid Build Coastguard Workerclass VOP3e <bits<9> op> : VOP3a <op> {
424*9880d681SAndroid Build Coastguard Worker  bits<8> vdst;
425*9880d681SAndroid Build Coastguard Worker
426*9880d681SAndroid Build Coastguard Worker  let Inst{7-0} = vdst;
427*9880d681SAndroid Build Coastguard Worker}
428*9880d681SAndroid Build Coastguard Worker
429*9880d681SAndroid Build Coastguard Worker// Encoding used for VOPC instructions encoded as VOP3
430*9880d681SAndroid Build Coastguard Worker// Differs from VOP3e by destination name (sdst) as VOPC doesn't have vector dst
431*9880d681SAndroid Build Coastguard Workerclass VOP3ce <bits<9> op> : VOP3a <op> {
432*9880d681SAndroid Build Coastguard Worker  bits<8> sdst;
433*9880d681SAndroid Build Coastguard Worker
434*9880d681SAndroid Build Coastguard Worker  let Inst{7-0} = sdst;
435*9880d681SAndroid Build Coastguard Worker}
436*9880d681SAndroid Build Coastguard Worker
437*9880d681SAndroid Build Coastguard Workerclass VOP3be <bits<9> op> : Enc64 {
438*9880d681SAndroid Build Coastguard Worker  bits<8> vdst;
439*9880d681SAndroid Build Coastguard Worker  bits<2> src0_modifiers;
440*9880d681SAndroid Build Coastguard Worker  bits<9> src0;
441*9880d681SAndroid Build Coastguard Worker  bits<2> src1_modifiers;
442*9880d681SAndroid Build Coastguard Worker  bits<9> src1;
443*9880d681SAndroid Build Coastguard Worker  bits<2> src2_modifiers;
444*9880d681SAndroid Build Coastguard Worker  bits<9> src2;
445*9880d681SAndroid Build Coastguard Worker  bits<7> sdst;
446*9880d681SAndroid Build Coastguard Worker  bits<2> omod;
447*9880d681SAndroid Build Coastguard Worker
448*9880d681SAndroid Build Coastguard Worker  let Inst{7-0} = vdst;
449*9880d681SAndroid Build Coastguard Worker  let Inst{14-8} = sdst;
450*9880d681SAndroid Build Coastguard Worker  let Inst{25-17} = op;
451*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = 0x34; //encoding
452*9880d681SAndroid Build Coastguard Worker  let Inst{40-32} = src0;
453*9880d681SAndroid Build Coastguard Worker  let Inst{49-41} = src1;
454*9880d681SAndroid Build Coastguard Worker  let Inst{58-50} = src2;
455*9880d681SAndroid Build Coastguard Worker  let Inst{60-59} = omod;
456*9880d681SAndroid Build Coastguard Worker  let Inst{61} = src0_modifiers{0};
457*9880d681SAndroid Build Coastguard Worker  let Inst{62} = src1_modifiers{0};
458*9880d681SAndroid Build Coastguard Worker  let Inst{63} = src2_modifiers{0};
459*9880d681SAndroid Build Coastguard Worker}
460*9880d681SAndroid Build Coastguard Worker
461*9880d681SAndroid Build Coastguard Workerclass VOPCe <bits<8> op> : Enc32 {
462*9880d681SAndroid Build Coastguard Worker  bits<9> src0;
463*9880d681SAndroid Build Coastguard Worker  bits<8> src1;
464*9880d681SAndroid Build Coastguard Worker
465*9880d681SAndroid Build Coastguard Worker  let Inst{8-0} = src0;
466*9880d681SAndroid Build Coastguard Worker  let Inst{16-9} = src1;
467*9880d681SAndroid Build Coastguard Worker  let Inst{24-17} = op;
468*9880d681SAndroid Build Coastguard Worker  let Inst{31-25} = 0x3e;
469*9880d681SAndroid Build Coastguard Worker}
470*9880d681SAndroid Build Coastguard Worker
471*9880d681SAndroid Build Coastguard Workerclass VINTRPe <bits<2> op> : Enc32 {
472*9880d681SAndroid Build Coastguard Worker  bits<8> vdst;
473*9880d681SAndroid Build Coastguard Worker  bits<8> vsrc;
474*9880d681SAndroid Build Coastguard Worker  bits<2> attrchan;
475*9880d681SAndroid Build Coastguard Worker  bits<6> attr;
476*9880d681SAndroid Build Coastguard Worker
477*9880d681SAndroid Build Coastguard Worker  let Inst{7-0} = vsrc;
478*9880d681SAndroid Build Coastguard Worker  let Inst{9-8} = attrchan;
479*9880d681SAndroid Build Coastguard Worker  let Inst{15-10} = attr;
480*9880d681SAndroid Build Coastguard Worker  let Inst{17-16} = op;
481*9880d681SAndroid Build Coastguard Worker  let Inst{25-18} = vdst;
482*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = 0x32; // encoding
483*9880d681SAndroid Build Coastguard Worker}
484*9880d681SAndroid Build Coastguard Worker
485*9880d681SAndroid Build Coastguard Workerclass DSe <bits<8> op> : Enc64 {
486*9880d681SAndroid Build Coastguard Worker  bits<8> vdst;
487*9880d681SAndroid Build Coastguard Worker  bits<1> gds;
488*9880d681SAndroid Build Coastguard Worker  bits<8> addr;
489*9880d681SAndroid Build Coastguard Worker  bits<8> data0;
490*9880d681SAndroid Build Coastguard Worker  bits<8> data1;
491*9880d681SAndroid Build Coastguard Worker  bits<8> offset0;
492*9880d681SAndroid Build Coastguard Worker  bits<8> offset1;
493*9880d681SAndroid Build Coastguard Worker
494*9880d681SAndroid Build Coastguard Worker  let Inst{7-0} = offset0;
495*9880d681SAndroid Build Coastguard Worker  let Inst{15-8} = offset1;
496*9880d681SAndroid Build Coastguard Worker  let Inst{17} = gds;
497*9880d681SAndroid Build Coastguard Worker  let Inst{25-18} = op;
498*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = 0x36; //encoding
499*9880d681SAndroid Build Coastguard Worker  let Inst{39-32} = addr;
500*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = data0;
501*9880d681SAndroid Build Coastguard Worker  let Inst{55-48} = data1;
502*9880d681SAndroid Build Coastguard Worker  let Inst{63-56} = vdst;
503*9880d681SAndroid Build Coastguard Worker}
504*9880d681SAndroid Build Coastguard Worker
505*9880d681SAndroid Build Coastguard Workerclass MUBUFe <bits<7> op> : Enc64 {
506*9880d681SAndroid Build Coastguard Worker  bits<12> offset;
507*9880d681SAndroid Build Coastguard Worker  bits<1> offen;
508*9880d681SAndroid Build Coastguard Worker  bits<1> idxen;
509*9880d681SAndroid Build Coastguard Worker  bits<1> glc;
510*9880d681SAndroid Build Coastguard Worker  bits<1> addr64;
511*9880d681SAndroid Build Coastguard Worker  bits<1> lds;
512*9880d681SAndroid Build Coastguard Worker  bits<8> vaddr;
513*9880d681SAndroid Build Coastguard Worker  bits<8> vdata;
514*9880d681SAndroid Build Coastguard Worker  bits<7> srsrc;
515*9880d681SAndroid Build Coastguard Worker  bits<1> slc;
516*9880d681SAndroid Build Coastguard Worker  bits<1> tfe;
517*9880d681SAndroid Build Coastguard Worker  bits<8> soffset;
518*9880d681SAndroid Build Coastguard Worker
519*9880d681SAndroid Build Coastguard Worker  let Inst{11-0} = offset;
520*9880d681SAndroid Build Coastguard Worker  let Inst{12} = offen;
521*9880d681SAndroid Build Coastguard Worker  let Inst{13} = idxen;
522*9880d681SAndroid Build Coastguard Worker  let Inst{14} = glc;
523*9880d681SAndroid Build Coastguard Worker  let Inst{15} = addr64;
524*9880d681SAndroid Build Coastguard Worker  let Inst{16} = lds;
525*9880d681SAndroid Build Coastguard Worker  let Inst{24-18} = op;
526*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = 0x38; //encoding
527*9880d681SAndroid Build Coastguard Worker  let Inst{39-32} = vaddr;
528*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = vdata;
529*9880d681SAndroid Build Coastguard Worker  let Inst{52-48} = srsrc{6-2};
530*9880d681SAndroid Build Coastguard Worker  let Inst{54} = slc;
531*9880d681SAndroid Build Coastguard Worker  let Inst{55} = tfe;
532*9880d681SAndroid Build Coastguard Worker  let Inst{63-56} = soffset;
533*9880d681SAndroid Build Coastguard Worker}
534*9880d681SAndroid Build Coastguard Worker
535*9880d681SAndroid Build Coastguard Workerclass MTBUFe <bits<3> op> : Enc64 {
536*9880d681SAndroid Build Coastguard Worker  bits<8> vdata;
537*9880d681SAndroid Build Coastguard Worker  bits<12> offset;
538*9880d681SAndroid Build Coastguard Worker  bits<1> offen;
539*9880d681SAndroid Build Coastguard Worker  bits<1> idxen;
540*9880d681SAndroid Build Coastguard Worker  bits<1> glc;
541*9880d681SAndroid Build Coastguard Worker  bits<1> addr64;
542*9880d681SAndroid Build Coastguard Worker  bits<4> dfmt;
543*9880d681SAndroid Build Coastguard Worker  bits<3> nfmt;
544*9880d681SAndroid Build Coastguard Worker  bits<8> vaddr;
545*9880d681SAndroid Build Coastguard Worker  bits<7> srsrc;
546*9880d681SAndroid Build Coastguard Worker  bits<1> slc;
547*9880d681SAndroid Build Coastguard Worker  bits<1> tfe;
548*9880d681SAndroid Build Coastguard Worker  bits<8> soffset;
549*9880d681SAndroid Build Coastguard Worker
550*9880d681SAndroid Build Coastguard Worker  let Inst{11-0} = offset;
551*9880d681SAndroid Build Coastguard Worker  let Inst{12} = offen;
552*9880d681SAndroid Build Coastguard Worker  let Inst{13} = idxen;
553*9880d681SAndroid Build Coastguard Worker  let Inst{14} = glc;
554*9880d681SAndroid Build Coastguard Worker  let Inst{15} = addr64;
555*9880d681SAndroid Build Coastguard Worker  let Inst{18-16} = op;
556*9880d681SAndroid Build Coastguard Worker  let Inst{22-19} = dfmt;
557*9880d681SAndroid Build Coastguard Worker  let Inst{25-23} = nfmt;
558*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = 0x3a; //encoding
559*9880d681SAndroid Build Coastguard Worker  let Inst{39-32} = vaddr;
560*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = vdata;
561*9880d681SAndroid Build Coastguard Worker  let Inst{52-48} = srsrc{6-2};
562*9880d681SAndroid Build Coastguard Worker  let Inst{54} = slc;
563*9880d681SAndroid Build Coastguard Worker  let Inst{55} = tfe;
564*9880d681SAndroid Build Coastguard Worker  let Inst{63-56} = soffset;
565*9880d681SAndroid Build Coastguard Worker}
566*9880d681SAndroid Build Coastguard Worker
567*9880d681SAndroid Build Coastguard Workerclass MIMGe <bits<7> op> : Enc64 {
568*9880d681SAndroid Build Coastguard Worker  bits<8> vdata;
569*9880d681SAndroid Build Coastguard Worker  bits<4> dmask;
570*9880d681SAndroid Build Coastguard Worker  bits<1> unorm;
571*9880d681SAndroid Build Coastguard Worker  bits<1> glc;
572*9880d681SAndroid Build Coastguard Worker  bits<1> da;
573*9880d681SAndroid Build Coastguard Worker  bits<1> r128;
574*9880d681SAndroid Build Coastguard Worker  bits<1> tfe;
575*9880d681SAndroid Build Coastguard Worker  bits<1> lwe;
576*9880d681SAndroid Build Coastguard Worker  bits<1> slc;
577*9880d681SAndroid Build Coastguard Worker  bits<8> vaddr;
578*9880d681SAndroid Build Coastguard Worker  bits<7> srsrc;
579*9880d681SAndroid Build Coastguard Worker  bits<7> ssamp;
580*9880d681SAndroid Build Coastguard Worker
581*9880d681SAndroid Build Coastguard Worker  let Inst{11-8} = dmask;
582*9880d681SAndroid Build Coastguard Worker  let Inst{12} = unorm;
583*9880d681SAndroid Build Coastguard Worker  let Inst{13} = glc;
584*9880d681SAndroid Build Coastguard Worker  let Inst{14} = da;
585*9880d681SAndroid Build Coastguard Worker  let Inst{15} = r128;
586*9880d681SAndroid Build Coastguard Worker  let Inst{16} = tfe;
587*9880d681SAndroid Build Coastguard Worker  let Inst{17} = lwe;
588*9880d681SAndroid Build Coastguard Worker  let Inst{24-18} = op;
589*9880d681SAndroid Build Coastguard Worker  let Inst{25} = slc;
590*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = 0x3c;
591*9880d681SAndroid Build Coastguard Worker  let Inst{39-32} = vaddr;
592*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = vdata;
593*9880d681SAndroid Build Coastguard Worker  let Inst{52-48} = srsrc{6-2};
594*9880d681SAndroid Build Coastguard Worker  let Inst{57-53} = ssamp{6-2};
595*9880d681SAndroid Build Coastguard Worker}
596*9880d681SAndroid Build Coastguard Worker
597*9880d681SAndroid Build Coastguard Workerclass FLATe<bits<7> op> : Enc64 {
598*9880d681SAndroid Build Coastguard Worker  bits<8> addr;
599*9880d681SAndroid Build Coastguard Worker  bits<8> data;
600*9880d681SAndroid Build Coastguard Worker  bits<8> vdst;
601*9880d681SAndroid Build Coastguard Worker  bits<1> slc;
602*9880d681SAndroid Build Coastguard Worker  bits<1> glc;
603*9880d681SAndroid Build Coastguard Worker  bits<1> tfe;
604*9880d681SAndroid Build Coastguard Worker
605*9880d681SAndroid Build Coastguard Worker  // 15-0 is reserved.
606*9880d681SAndroid Build Coastguard Worker  let Inst{16} = glc;
607*9880d681SAndroid Build Coastguard Worker  let Inst{17} = slc;
608*9880d681SAndroid Build Coastguard Worker  let Inst{24-18} = op;
609*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = 0x37; // Encoding.
610*9880d681SAndroid Build Coastguard Worker  let Inst{39-32} = addr;
611*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = data;
612*9880d681SAndroid Build Coastguard Worker  // 54-48 is reserved.
613*9880d681SAndroid Build Coastguard Worker  let Inst{55} = tfe;
614*9880d681SAndroid Build Coastguard Worker  let Inst{63-56} = vdst;
615*9880d681SAndroid Build Coastguard Worker}
616*9880d681SAndroid Build Coastguard Worker
617*9880d681SAndroid Build Coastguard Workerclass EXPe : Enc64 {
618*9880d681SAndroid Build Coastguard Worker  bits<4> en;
619*9880d681SAndroid Build Coastguard Worker  bits<6> tgt;
620*9880d681SAndroid Build Coastguard Worker  bits<1> compr;
621*9880d681SAndroid Build Coastguard Worker  bits<1> done;
622*9880d681SAndroid Build Coastguard Worker  bits<1> vm;
623*9880d681SAndroid Build Coastguard Worker  bits<8> vsrc0;
624*9880d681SAndroid Build Coastguard Worker  bits<8> vsrc1;
625*9880d681SAndroid Build Coastguard Worker  bits<8> vsrc2;
626*9880d681SAndroid Build Coastguard Worker  bits<8> vsrc3;
627*9880d681SAndroid Build Coastguard Worker
628*9880d681SAndroid Build Coastguard Worker  let Inst{3-0} = en;
629*9880d681SAndroid Build Coastguard Worker  let Inst{9-4} = tgt;
630*9880d681SAndroid Build Coastguard Worker  let Inst{10} = compr;
631*9880d681SAndroid Build Coastguard Worker  let Inst{11} = done;
632*9880d681SAndroid Build Coastguard Worker  let Inst{12} = vm;
633*9880d681SAndroid Build Coastguard Worker  let Inst{31-26} = 0x3e;
634*9880d681SAndroid Build Coastguard Worker  let Inst{39-32} = vsrc0;
635*9880d681SAndroid Build Coastguard Worker  let Inst{47-40} = vsrc1;
636*9880d681SAndroid Build Coastguard Worker  let Inst{55-48} = vsrc2;
637*9880d681SAndroid Build Coastguard Worker  let Inst{63-56} = vsrc3;
638*9880d681SAndroid Build Coastguard Worker}
639*9880d681SAndroid Build Coastguard Worker
640*9880d681SAndroid Build Coastguard Workerlet Uses = [EXEC] in {
641*9880d681SAndroid Build Coastguard Worker
642*9880d681SAndroid Build Coastguard Workerclass VOP1 <bits<8> op, dag outs, dag ins, string asm, list<dag> pattern> :
643*9880d681SAndroid Build Coastguard Worker    VOP1Common <outs, ins, asm, pattern>,
644*9880d681SAndroid Build Coastguard Worker    VOP1e<op> {
645*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 0;
646*9880d681SAndroid Build Coastguard Worker}
647*9880d681SAndroid Build Coastguard Worker
648*9880d681SAndroid Build Coastguard Workerclass VOP2 <bits<6> op, dag outs, dag ins, string asm, list<dag> pattern> :
649*9880d681SAndroid Build Coastguard Worker    VOP2Common <outs, ins, asm, pattern>, VOP2e<op> {
650*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 0;
651*9880d681SAndroid Build Coastguard Worker}
652*9880d681SAndroid Build Coastguard Worker
653*9880d681SAndroid Build Coastguard Workerclass VOPC <bits<8> op, dag ins, string asm, list<dag> pattern> :
654*9880d681SAndroid Build Coastguard Worker    VOPCCommon <ins, asm, pattern>, VOPCe <op>;
655*9880d681SAndroid Build Coastguard Worker
656*9880d681SAndroid Build Coastguard Workerclass VINTRPCommon <dag outs, dag ins, string asm, list<dag> pattern> :
657*9880d681SAndroid Build Coastguard Worker    InstSI <outs, ins, asm, pattern> {
658*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
659*9880d681SAndroid Build Coastguard Worker  let mayStore = 0;
660*9880d681SAndroid Build Coastguard Worker  let hasSideEffects = 0;
661*9880d681SAndroid Build Coastguard Worker}
662*9880d681SAndroid Build Coastguard Worker
663*9880d681SAndroid Build Coastguard Worker} // End Uses = [EXEC]
664*9880d681SAndroid Build Coastguard Worker
665*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
666*9880d681SAndroid Build Coastguard Worker// Vector I/O operations
667*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
668*9880d681SAndroid Build Coastguard Worker
669*9880d681SAndroid Build Coastguard Workerclass DS <dag outs, dag ins, string asm, list<dag> pattern> :
670*9880d681SAndroid Build Coastguard Worker    InstSI <outs, ins, asm, pattern> {
671*9880d681SAndroid Build Coastguard Worker
672*9880d681SAndroid Build Coastguard Worker  let LGKM_CNT = 1;
673*9880d681SAndroid Build Coastguard Worker  let DS = 1;
674*9880d681SAndroid Build Coastguard Worker  let UseNamedOperandTable = 1;
675*9880d681SAndroid Build Coastguard Worker  let Uses = [M0, EXEC];
676*9880d681SAndroid Build Coastguard Worker
677*9880d681SAndroid Build Coastguard Worker  // Most instruction load and store data, so set this as the default.
678*9880d681SAndroid Build Coastguard Worker  let mayLoad = 1;
679*9880d681SAndroid Build Coastguard Worker  let mayStore = 1;
680*9880d681SAndroid Build Coastguard Worker
681*9880d681SAndroid Build Coastguard Worker  let hasSideEffects = 0;
682*9880d681SAndroid Build Coastguard Worker  let AsmMatchConverter = "cvtDS";
683*9880d681SAndroid Build Coastguard Worker  let SchedRW = [WriteLDS];
684*9880d681SAndroid Build Coastguard Worker}
685*9880d681SAndroid Build Coastguard Worker
686*9880d681SAndroid Build Coastguard Workerclass MUBUF <dag outs, dag ins, string asm, list<dag> pattern> :
687*9880d681SAndroid Build Coastguard Worker    InstSI<outs, ins, asm, pattern> {
688*9880d681SAndroid Build Coastguard Worker
689*9880d681SAndroid Build Coastguard Worker  let VM_CNT = 1;
690*9880d681SAndroid Build Coastguard Worker  let EXP_CNT = 1;
691*9880d681SAndroid Build Coastguard Worker  let MUBUF = 1;
692*9880d681SAndroid Build Coastguard Worker  let Uses = [EXEC];
693*9880d681SAndroid Build Coastguard Worker
694*9880d681SAndroid Build Coastguard Worker  let hasSideEffects = 0;
695*9880d681SAndroid Build Coastguard Worker  let UseNamedOperandTable = 1;
696*9880d681SAndroid Build Coastguard Worker  let AsmMatchConverter = "cvtMubuf";
697*9880d681SAndroid Build Coastguard Worker  let SchedRW = [WriteVMEM];
698*9880d681SAndroid Build Coastguard Worker}
699*9880d681SAndroid Build Coastguard Worker
700*9880d681SAndroid Build Coastguard Workerclass MTBUF <dag outs, dag ins, string asm, list<dag> pattern> :
701*9880d681SAndroid Build Coastguard Worker    InstSI<outs, ins, asm, pattern> {
702*9880d681SAndroid Build Coastguard Worker
703*9880d681SAndroid Build Coastguard Worker  let VM_CNT = 1;
704*9880d681SAndroid Build Coastguard Worker  let EXP_CNT = 1;
705*9880d681SAndroid Build Coastguard Worker  let MTBUF = 1;
706*9880d681SAndroid Build Coastguard Worker  let Uses = [EXEC];
707*9880d681SAndroid Build Coastguard Worker
708*9880d681SAndroid Build Coastguard Worker  let hasSideEffects = 0;
709*9880d681SAndroid Build Coastguard Worker  let UseNamedOperandTable = 1;
710*9880d681SAndroid Build Coastguard Worker  let SchedRW = [WriteVMEM];
711*9880d681SAndroid Build Coastguard Worker}
712*9880d681SAndroid Build Coastguard Worker
713*9880d681SAndroid Build Coastguard Workerclass FLAT <bits<7> op, dag outs, dag ins, string asm, list<dag> pattern> :
714*9880d681SAndroid Build Coastguard Worker    InstSI<outs, ins, asm, pattern>, FLATe <op> {
715*9880d681SAndroid Build Coastguard Worker  let FLAT = 1;
716*9880d681SAndroid Build Coastguard Worker  // Internally, FLAT instruction are executed as both an LDS and a
717*9880d681SAndroid Build Coastguard Worker  // Buffer instruction; so, they increment both VM_CNT and LGKM_CNT
718*9880d681SAndroid Build Coastguard Worker  // and are not considered done until both have been decremented.
719*9880d681SAndroid Build Coastguard Worker  let VM_CNT = 1;
720*9880d681SAndroid Build Coastguard Worker  let LGKM_CNT = 1;
721*9880d681SAndroid Build Coastguard Worker
722*9880d681SAndroid Build Coastguard Worker  let Uses = [EXEC, FLAT_SCR]; // M0
723*9880d681SAndroid Build Coastguard Worker
724*9880d681SAndroid Build Coastguard Worker  let UseNamedOperandTable = 1;
725*9880d681SAndroid Build Coastguard Worker  let hasSideEffects = 0;
726*9880d681SAndroid Build Coastguard Worker  let SchedRW = [WriteVMEM];
727*9880d681SAndroid Build Coastguard Worker}
728*9880d681SAndroid Build Coastguard Worker
729*9880d681SAndroid Build Coastguard Workerclass MIMG <dag outs, dag ins, string asm, list<dag> pattern> :
730*9880d681SAndroid Build Coastguard Worker    InstSI <outs, ins, asm, pattern> {
731*9880d681SAndroid Build Coastguard Worker
732*9880d681SAndroid Build Coastguard Worker  let VM_CNT = 1;
733*9880d681SAndroid Build Coastguard Worker  let EXP_CNT = 1;
734*9880d681SAndroid Build Coastguard Worker  let MIMG = 1;
735*9880d681SAndroid Build Coastguard Worker  let Uses = [EXEC];
736*9880d681SAndroid Build Coastguard Worker
737*9880d681SAndroid Build Coastguard Worker  let UseNamedOperandTable = 1;
738*9880d681SAndroid Build Coastguard Worker  let hasSideEffects = 0; // XXX ????
739*9880d681SAndroid Build Coastguard Worker}
740