xref: /freebsd/contrib/llvm-project/llvm/lib/Target/AMDGPU/R600InstrFormats.td (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
1*0b57cec5SDimitry Andric//===-- R600InstrFormats.td - R600 Instruction Encodings ------------------===//
2*0b57cec5SDimitry Andric//
3*0b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric//
7*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric//
9*0b57cec5SDimitry Andric// R600 Instruction format definitions.
10*0b57cec5SDimitry Andric//
11*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
12*0b57cec5SDimitry Andric
13*0b57cec5SDimitry Andricdef isR600 : Predicate<"Subtarget->getGeneration() <= AMDGPUSubtarget::R700">;
14*0b57cec5SDimitry Andric
15*0b57cec5SDimitry Andricdef isR600toCayman : Predicate<
16*0b57cec5SDimitry Andric    "Subtarget->getGeneration() <= AMDGPUSubtarget::NORTHERN_ISLANDS">;
17*0b57cec5SDimitry Andric
18*0b57cec5SDimitry Andricclass R600Pat<dag pattern, dag result> : AMDGPUPat<pattern, result> {
19*0b57cec5SDimitry Andric  let SubtargetPredicate = isR600toCayman;
20*0b57cec5SDimitry Andric}
21*0b57cec5SDimitry Andric
22*0b57cec5SDimitry Andricclass InstR600 <dag outs, dag ins, string asm, list<dag> pattern,
23*0b57cec5SDimitry Andric                InstrItinClass itin = NoItinerary>
24*0b57cec5SDimitry Andric    : AMDGPUInst <outs, ins, asm, pattern>, PredicateControl {
25*0b57cec5SDimitry Andric
26*0b57cec5SDimitry Andric  field bits<64> Inst;
27*0b57cec5SDimitry Andric  bit Trig = 0;
28*0b57cec5SDimitry Andric  bit Op3 = 0;
29*0b57cec5SDimitry Andric  bit isVector = 0;
30*0b57cec5SDimitry Andric  bits<2> FlagOperandIdx = 0;
31*0b57cec5SDimitry Andric  bit Op1 = 0;
32*0b57cec5SDimitry Andric  bit Op2 = 0;
33*0b57cec5SDimitry Andric  bit LDS_1A = 0;
34*0b57cec5SDimitry Andric  bit LDS_1A1D = 0;
35*0b57cec5SDimitry Andric  bit HasNativeOperands = 0;
36*0b57cec5SDimitry Andric  bit VTXInst = 0;
37*0b57cec5SDimitry Andric  bit TEXInst = 0;
38*0b57cec5SDimitry Andric  bit ALUInst = 0;
39*0b57cec5SDimitry Andric  bit IsExport = 0;
40*0b57cec5SDimitry Andric  bit LDS_1A2D = 0;
41*0b57cec5SDimitry Andric
42*0b57cec5SDimitry Andric  let SubtargetPredicate = isR600toCayman;
43*0b57cec5SDimitry Andric  let Namespace = "R600";
44*0b57cec5SDimitry Andric  let OutOperandList = outs;
45*0b57cec5SDimitry Andric  let InOperandList = ins;
46*0b57cec5SDimitry Andric  let AsmString = asm;
47*0b57cec5SDimitry Andric  let Pattern = pattern;
48*0b57cec5SDimitry Andric  let Itinerary = itin;
49*0b57cec5SDimitry Andric
50*0b57cec5SDimitry Andric  // No AsmMatcher support.
51*0b57cec5SDimitry Andric  let isCodeGenOnly = 1;
52*0b57cec5SDimitry Andric
53*0b57cec5SDimitry Andric  let TSFlags{4} = Trig;
54*0b57cec5SDimitry Andric  let TSFlags{5} = Op3;
55*0b57cec5SDimitry Andric
56*0b57cec5SDimitry Andric  // Vector instructions are instructions that must fill all slots in an
57*0b57cec5SDimitry Andric  // instruction group
58*0b57cec5SDimitry Andric  let TSFlags{6} = isVector;
59*0b57cec5SDimitry Andric  let TSFlags{8-7} = FlagOperandIdx;
60*0b57cec5SDimitry Andric  let TSFlags{9} = HasNativeOperands;
61*0b57cec5SDimitry Andric  let TSFlags{10} = Op1;
62*0b57cec5SDimitry Andric  let TSFlags{11} = Op2;
63*0b57cec5SDimitry Andric  let TSFlags{12} = VTXInst;
64*0b57cec5SDimitry Andric  let TSFlags{13} = TEXInst;
65*0b57cec5SDimitry Andric  let TSFlags{14} = ALUInst;
66*0b57cec5SDimitry Andric  let TSFlags{15} = LDS_1A;
67*0b57cec5SDimitry Andric  let TSFlags{16} = LDS_1A1D;
68*0b57cec5SDimitry Andric  let TSFlags{17} = IsExport;
69*0b57cec5SDimitry Andric  let TSFlags{18} = LDS_1A2D;
70*0b57cec5SDimitry Andric}
71*0b57cec5SDimitry Andric
72*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
73*0b57cec5SDimitry Andric// ALU instructions
74*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
75*0b57cec5SDimitry Andric
76*0b57cec5SDimitry Andricclass R600_ALU_LDS_Word0 {
77*0b57cec5SDimitry Andric  field bits<32> Word0;
78*0b57cec5SDimitry Andric
79*0b57cec5SDimitry Andric  bits<11> src0;
80*0b57cec5SDimitry Andric  bits<1>  src0_rel;
81*0b57cec5SDimitry Andric  bits<11> src1;
82*0b57cec5SDimitry Andric  bits<1>  src1_rel;
83*0b57cec5SDimitry Andric  bits<3>  index_mode = 0;
84*0b57cec5SDimitry Andric  bits<2>  pred_sel;
85*0b57cec5SDimitry Andric  bits<1>  last;
86*0b57cec5SDimitry Andric
87*0b57cec5SDimitry Andric  bits<9>  src0_sel  = src0{8-0};
88*0b57cec5SDimitry Andric  bits<2>  src0_chan = src0{10-9};
89*0b57cec5SDimitry Andric  bits<9>  src1_sel  = src1{8-0};
90*0b57cec5SDimitry Andric  bits<2>  src1_chan = src1{10-9};
91*0b57cec5SDimitry Andric
92*0b57cec5SDimitry Andric  let Word0{8-0}   = src0_sel;
93*0b57cec5SDimitry Andric  let Word0{9}     = src0_rel;
94*0b57cec5SDimitry Andric  let Word0{11-10} = src0_chan;
95*0b57cec5SDimitry Andric  let Word0{21-13} = src1_sel;
96*0b57cec5SDimitry Andric  let Word0{22}    = src1_rel;
97*0b57cec5SDimitry Andric  let Word0{24-23} = src1_chan;
98*0b57cec5SDimitry Andric  let Word0{28-26} = index_mode;
99*0b57cec5SDimitry Andric  let Word0{30-29} = pred_sel;
100*0b57cec5SDimitry Andric  let Word0{31}    = last;
101*0b57cec5SDimitry Andric}
102*0b57cec5SDimitry Andric
103*0b57cec5SDimitry Andricclass R600ALU_Word0 : R600_ALU_LDS_Word0 {
104*0b57cec5SDimitry Andric
105*0b57cec5SDimitry Andric  bits<1>  src0_neg;
106*0b57cec5SDimitry Andric  bits<1>  src1_neg;
107*0b57cec5SDimitry Andric
108*0b57cec5SDimitry Andric  let Word0{12}    = src0_neg;
109*0b57cec5SDimitry Andric  let Word0{25}    = src1_neg;
110*0b57cec5SDimitry Andric}
111*0b57cec5SDimitry Andric
112*0b57cec5SDimitry Andricclass R600ALU_Word1 {
113*0b57cec5SDimitry Andric  field bits<32> Word1;
114*0b57cec5SDimitry Andric
115*0b57cec5SDimitry Andric  bits<11> dst;
116*0b57cec5SDimitry Andric  bits<3>  bank_swizzle;
117*0b57cec5SDimitry Andric  bits<1>  dst_rel;
118*0b57cec5SDimitry Andric  bits<1>  clamp;
119*0b57cec5SDimitry Andric
120*0b57cec5SDimitry Andric  bits<7>  dst_sel  = dst{6-0};
121*0b57cec5SDimitry Andric  bits<2>  dst_chan = dst{10-9};
122*0b57cec5SDimitry Andric
123*0b57cec5SDimitry Andric  let Word1{20-18} = bank_swizzle;
124*0b57cec5SDimitry Andric  let Word1{27-21} = dst_sel;
125*0b57cec5SDimitry Andric  let Word1{28}    = dst_rel;
126*0b57cec5SDimitry Andric  let Word1{30-29} = dst_chan;
127*0b57cec5SDimitry Andric  let Word1{31}    = clamp;
128*0b57cec5SDimitry Andric}
129*0b57cec5SDimitry Andric
130*0b57cec5SDimitry Andricclass R600ALU_Word1_OP2 <bits<11> alu_inst> : R600ALU_Word1{
131*0b57cec5SDimitry Andric
132*0b57cec5SDimitry Andric  bits<1>  src0_abs;
133*0b57cec5SDimitry Andric  bits<1>  src1_abs;
134*0b57cec5SDimitry Andric  bits<1>  update_exec_mask;
135*0b57cec5SDimitry Andric  bits<1>  update_pred;
136*0b57cec5SDimitry Andric  bits<1>  write;
137*0b57cec5SDimitry Andric  bits<2>  omod;
138*0b57cec5SDimitry Andric
139*0b57cec5SDimitry Andric  let Word1{0}     = src0_abs;
140*0b57cec5SDimitry Andric  let Word1{1}     = src1_abs;
141*0b57cec5SDimitry Andric  let Word1{2}     = update_exec_mask;
142*0b57cec5SDimitry Andric  let Word1{3}     = update_pred;
143*0b57cec5SDimitry Andric  let Word1{4}     = write;
144*0b57cec5SDimitry Andric  let Word1{6-5}   = omod;
145*0b57cec5SDimitry Andric  let Word1{17-7}  = alu_inst;
146*0b57cec5SDimitry Andric}
147*0b57cec5SDimitry Andric
148*0b57cec5SDimitry Andricclass R600ALU_Word1_OP3 <bits<5> alu_inst> : R600ALU_Word1{
149*0b57cec5SDimitry Andric
150*0b57cec5SDimitry Andric  bits<11> src2;
151*0b57cec5SDimitry Andric  bits<1>  src2_rel;
152*0b57cec5SDimitry Andric  bits<1>  src2_neg;
153*0b57cec5SDimitry Andric
154*0b57cec5SDimitry Andric  bits<9>  src2_sel = src2{8-0};
155*0b57cec5SDimitry Andric  bits<2>  src2_chan = src2{10-9};
156*0b57cec5SDimitry Andric
157*0b57cec5SDimitry Andric  let Word1{8-0}   = src2_sel;
158*0b57cec5SDimitry Andric  let Word1{9}     = src2_rel;
159*0b57cec5SDimitry Andric  let Word1{11-10} = src2_chan;
160*0b57cec5SDimitry Andric  let Word1{12}    = src2_neg;
161*0b57cec5SDimitry Andric  let Word1{17-13} = alu_inst;
162*0b57cec5SDimitry Andric}
163*0b57cec5SDimitry Andric
164*0b57cec5SDimitry Andricclass R600LDS_Word1 {
165*0b57cec5SDimitry Andric  field bits<32> Word1;
166*0b57cec5SDimitry Andric
167*0b57cec5SDimitry Andric  bits<11> src2;
168*0b57cec5SDimitry Andric  bits<9>  src2_sel  = src2{8-0};
169*0b57cec5SDimitry Andric  bits<2>  src2_chan = src2{10-9};
170*0b57cec5SDimitry Andric  bits<1>  src2_rel;
171*0b57cec5SDimitry Andric  // offset specifies the stride offset to the second set of data to be read
172*0b57cec5SDimitry Andric  // from.  This is a dword offset.
173*0b57cec5SDimitry Andric  bits<5>  alu_inst = 17; // OP3_INST_LDS_IDX_OP
174*0b57cec5SDimitry Andric  bits<3>  bank_swizzle;
175*0b57cec5SDimitry Andric  bits<6>  lds_op;
176*0b57cec5SDimitry Andric  bits<2>  dst_chan = 0;
177*0b57cec5SDimitry Andric
178*0b57cec5SDimitry Andric  let Word1{8-0}   = src2_sel;
179*0b57cec5SDimitry Andric  let Word1{9}     = src2_rel;
180*0b57cec5SDimitry Andric  let Word1{11-10} = src2_chan;
181*0b57cec5SDimitry Andric  let Word1{17-13} = alu_inst;
182*0b57cec5SDimitry Andric  let Word1{20-18} = bank_swizzle;
183*0b57cec5SDimitry Andric  let Word1{26-21} = lds_op;
184*0b57cec5SDimitry Andric  let Word1{30-29} = dst_chan;
185*0b57cec5SDimitry Andric}
186*0b57cec5SDimitry Andric
187*0b57cec5SDimitry Andric
188*0b57cec5SDimitry Andric/*
189*0b57cec5SDimitry AndricXXX: R600 subtarget uses a slightly different encoding than the other
190*0b57cec5SDimitry Andricsubtargets.  We currently handle this in R600MCCodeEmitter, but we may
191*0b57cec5SDimitry Andricwant to use these instruction classes in the future.
192*0b57cec5SDimitry Andric
193*0b57cec5SDimitry Andricclass R600ALU_Word1_OP2_r600 : R600ALU_Word1_OP2 {
194*0b57cec5SDimitry Andric
195*0b57cec5SDimitry Andric  bits<1>  fog_merge;
196*0b57cec5SDimitry Andric  bits<10> alu_inst;
197*0b57cec5SDimitry Andric
198*0b57cec5SDimitry Andric  let Inst{37}    = fog_merge;
199*0b57cec5SDimitry Andric  let Inst{39-38} = omod;
200*0b57cec5SDimitry Andric  let Inst{49-40} = alu_inst;
201*0b57cec5SDimitry Andric}
202*0b57cec5SDimitry Andric
203*0b57cec5SDimitry Andricclass R600ALU_Word1_OP2_r700 : R600ALU_Word1_OP2 {
204*0b57cec5SDimitry Andric
205*0b57cec5SDimitry Andric  bits<11> alu_inst;
206*0b57cec5SDimitry Andric
207*0b57cec5SDimitry Andric  let Inst{38-37} = omod;
208*0b57cec5SDimitry Andric  let Inst{49-39} = alu_inst;
209*0b57cec5SDimitry Andric}
210*0b57cec5SDimitry Andric*/
211*0b57cec5SDimitry Andric
212*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
213*0b57cec5SDimitry Andric// Vertex Fetch instructions
214*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
215*0b57cec5SDimitry Andric
216*0b57cec5SDimitry Andricclass VTX_WORD0 {
217*0b57cec5SDimitry Andric  field bits<32> Word0;
218*0b57cec5SDimitry Andric  bits<7> src_gpr;
219*0b57cec5SDimitry Andric  bits<5> VC_INST;
220*0b57cec5SDimitry Andric  bits<2> FETCH_TYPE;
221*0b57cec5SDimitry Andric  bits<1> FETCH_WHOLE_QUAD;
222*0b57cec5SDimitry Andric  bits<8> buffer_id;
223*0b57cec5SDimitry Andric  bits<1> SRC_REL;
224*0b57cec5SDimitry Andric  bits<2> SRC_SEL_X;
225*0b57cec5SDimitry Andric
226*0b57cec5SDimitry Andric  let Word0{4-0}   = VC_INST;
227*0b57cec5SDimitry Andric  let Word0{6-5}   = FETCH_TYPE;
228*0b57cec5SDimitry Andric  let Word0{7}     = FETCH_WHOLE_QUAD;
229*0b57cec5SDimitry Andric  let Word0{15-8}  = buffer_id;
230*0b57cec5SDimitry Andric  let Word0{22-16} = src_gpr;
231*0b57cec5SDimitry Andric  let Word0{23}    = SRC_REL;
232*0b57cec5SDimitry Andric  let Word0{25-24} = SRC_SEL_X;
233*0b57cec5SDimitry Andric}
234*0b57cec5SDimitry Andric
235*0b57cec5SDimitry Andricclass VTX_WORD0_eg : VTX_WORD0 {
236*0b57cec5SDimitry Andric
237*0b57cec5SDimitry Andric  bits<6> MEGA_FETCH_COUNT;
238*0b57cec5SDimitry Andric
239*0b57cec5SDimitry Andric  let Word0{31-26} = MEGA_FETCH_COUNT;
240*0b57cec5SDimitry Andric}
241*0b57cec5SDimitry Andric
242*0b57cec5SDimitry Andricclass VTX_WORD0_cm : VTX_WORD0 {
243*0b57cec5SDimitry Andric
244*0b57cec5SDimitry Andric  bits<2> SRC_SEL_Y;
245*0b57cec5SDimitry Andric  bits<2> STRUCTURED_READ;
246*0b57cec5SDimitry Andric  bits<1> LDS_REQ;
247*0b57cec5SDimitry Andric  bits<1> COALESCED_READ;
248*0b57cec5SDimitry Andric
249*0b57cec5SDimitry Andric  let Word0{27-26} = SRC_SEL_Y;
250*0b57cec5SDimitry Andric  let Word0{29-28} = STRUCTURED_READ;
251*0b57cec5SDimitry Andric  let Word0{30}    = LDS_REQ;
252*0b57cec5SDimitry Andric  let Word0{31}    = COALESCED_READ;
253*0b57cec5SDimitry Andric}
254*0b57cec5SDimitry Andric
255*0b57cec5SDimitry Andricclass VTX_WORD1_GPR {
256*0b57cec5SDimitry Andric  field bits<32> Word1;
257*0b57cec5SDimitry Andric  bits<7> dst_gpr;
258*0b57cec5SDimitry Andric  bits<1> DST_REL;
259*0b57cec5SDimitry Andric  bits<3> DST_SEL_X;
260*0b57cec5SDimitry Andric  bits<3> DST_SEL_Y;
261*0b57cec5SDimitry Andric  bits<3> DST_SEL_Z;
262*0b57cec5SDimitry Andric  bits<3> DST_SEL_W;
263*0b57cec5SDimitry Andric  bits<1> USE_CONST_FIELDS;
264*0b57cec5SDimitry Andric  bits<6> DATA_FORMAT;
265*0b57cec5SDimitry Andric  bits<2> NUM_FORMAT_ALL;
266*0b57cec5SDimitry Andric  bits<1> FORMAT_COMP_ALL;
267*0b57cec5SDimitry Andric  bits<1> SRF_MODE_ALL;
268*0b57cec5SDimitry Andric
269*0b57cec5SDimitry Andric  let Word1{6-0} = dst_gpr;
270*0b57cec5SDimitry Andric  let Word1{7}    = DST_REL;
271*0b57cec5SDimitry Andric  let Word1{8}    = 0; // Reserved
272*0b57cec5SDimitry Andric  let Word1{11-9} = DST_SEL_X;
273*0b57cec5SDimitry Andric  let Word1{14-12} = DST_SEL_Y;
274*0b57cec5SDimitry Andric  let Word1{17-15} = DST_SEL_Z;
275*0b57cec5SDimitry Andric  let Word1{20-18} = DST_SEL_W;
276*0b57cec5SDimitry Andric  let Word1{21}    = USE_CONST_FIELDS;
277*0b57cec5SDimitry Andric  let Word1{27-22} = DATA_FORMAT;
278*0b57cec5SDimitry Andric  let Word1{29-28} = NUM_FORMAT_ALL;
279*0b57cec5SDimitry Andric  let Word1{30}    = FORMAT_COMP_ALL;
280*0b57cec5SDimitry Andric  let Word1{31}    = SRF_MODE_ALL;
281*0b57cec5SDimitry Andric}
282*0b57cec5SDimitry Andric
283*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
284*0b57cec5SDimitry Andric// Texture fetch instructions
285*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
286*0b57cec5SDimitry Andric
287*0b57cec5SDimitry Andricclass TEX_WORD0 {
288*0b57cec5SDimitry Andric  field bits<32> Word0;
289*0b57cec5SDimitry Andric
290*0b57cec5SDimitry Andric  bits<5> TEX_INST;
291*0b57cec5SDimitry Andric  bits<2> INST_MOD;
292*0b57cec5SDimitry Andric  bits<1> FETCH_WHOLE_QUAD;
293*0b57cec5SDimitry Andric  bits<8> RESOURCE_ID;
294*0b57cec5SDimitry Andric  bits<7> SRC_GPR;
295*0b57cec5SDimitry Andric  bits<1> SRC_REL;
296*0b57cec5SDimitry Andric  bits<1> ALT_CONST;
297*0b57cec5SDimitry Andric  bits<2> RESOURCE_INDEX_MODE;
298*0b57cec5SDimitry Andric  bits<2> SAMPLER_INDEX_MODE;
299*0b57cec5SDimitry Andric
300*0b57cec5SDimitry Andric  let Word0{4-0} = TEX_INST;
301*0b57cec5SDimitry Andric  let Word0{6-5} = INST_MOD;
302*0b57cec5SDimitry Andric  let Word0{7} = FETCH_WHOLE_QUAD;
303*0b57cec5SDimitry Andric  let Word0{15-8} = RESOURCE_ID;
304*0b57cec5SDimitry Andric  let Word0{22-16} = SRC_GPR;
305*0b57cec5SDimitry Andric  let Word0{23} = SRC_REL;
306*0b57cec5SDimitry Andric  let Word0{24} = ALT_CONST;
307*0b57cec5SDimitry Andric  let Word0{26-25} = RESOURCE_INDEX_MODE;
308*0b57cec5SDimitry Andric  let Word0{28-27} = SAMPLER_INDEX_MODE;
309*0b57cec5SDimitry Andric}
310*0b57cec5SDimitry Andric
311*0b57cec5SDimitry Andricclass TEX_WORD1 {
312*0b57cec5SDimitry Andric  field bits<32> Word1;
313*0b57cec5SDimitry Andric
314*0b57cec5SDimitry Andric  bits<7> DST_GPR;
315*0b57cec5SDimitry Andric  bits<1> DST_REL;
316*0b57cec5SDimitry Andric  bits<3> DST_SEL_X;
317*0b57cec5SDimitry Andric  bits<3> DST_SEL_Y;
318*0b57cec5SDimitry Andric  bits<3> DST_SEL_Z;
319*0b57cec5SDimitry Andric  bits<3> DST_SEL_W;
320*0b57cec5SDimitry Andric  bits<7> LOD_BIAS;
321*0b57cec5SDimitry Andric  bits<1> COORD_TYPE_X;
322*0b57cec5SDimitry Andric  bits<1> COORD_TYPE_Y;
323*0b57cec5SDimitry Andric  bits<1> COORD_TYPE_Z;
324*0b57cec5SDimitry Andric  bits<1> COORD_TYPE_W;
325*0b57cec5SDimitry Andric
326*0b57cec5SDimitry Andric  let Word1{6-0} = DST_GPR;
327*0b57cec5SDimitry Andric  let Word1{7} = DST_REL;
328*0b57cec5SDimitry Andric  let Word1{11-9} = DST_SEL_X;
329*0b57cec5SDimitry Andric  let Word1{14-12} = DST_SEL_Y;
330*0b57cec5SDimitry Andric  let Word1{17-15} = DST_SEL_Z;
331*0b57cec5SDimitry Andric  let Word1{20-18} = DST_SEL_W;
332*0b57cec5SDimitry Andric  let Word1{27-21} = LOD_BIAS;
333*0b57cec5SDimitry Andric  let Word1{28} = COORD_TYPE_X;
334*0b57cec5SDimitry Andric  let Word1{29} = COORD_TYPE_Y;
335*0b57cec5SDimitry Andric  let Word1{30} = COORD_TYPE_Z;
336*0b57cec5SDimitry Andric  let Word1{31} = COORD_TYPE_W;
337*0b57cec5SDimitry Andric}
338*0b57cec5SDimitry Andric
339*0b57cec5SDimitry Andricclass TEX_WORD2 {
340*0b57cec5SDimitry Andric  field bits<32> Word2;
341*0b57cec5SDimitry Andric
342*0b57cec5SDimitry Andric  bits<5> OFFSET_X;
343*0b57cec5SDimitry Andric  bits<5> OFFSET_Y;
344*0b57cec5SDimitry Andric  bits<5> OFFSET_Z;
345*0b57cec5SDimitry Andric  bits<5> SAMPLER_ID;
346*0b57cec5SDimitry Andric  bits<3> SRC_SEL_X;
347*0b57cec5SDimitry Andric  bits<3> SRC_SEL_Y;
348*0b57cec5SDimitry Andric  bits<3> SRC_SEL_Z;
349*0b57cec5SDimitry Andric  bits<3> SRC_SEL_W;
350*0b57cec5SDimitry Andric
351*0b57cec5SDimitry Andric  let Word2{4-0} = OFFSET_X;
352*0b57cec5SDimitry Andric  let Word2{9-5} = OFFSET_Y;
353*0b57cec5SDimitry Andric  let Word2{14-10} = OFFSET_Z;
354*0b57cec5SDimitry Andric  let Word2{19-15} = SAMPLER_ID;
355*0b57cec5SDimitry Andric  let Word2{22-20} = SRC_SEL_X;
356*0b57cec5SDimitry Andric  let Word2{25-23} = SRC_SEL_Y;
357*0b57cec5SDimitry Andric  let Word2{28-26} = SRC_SEL_Z;
358*0b57cec5SDimitry Andric  let Word2{31-29} = SRC_SEL_W;
359*0b57cec5SDimitry Andric}
360*0b57cec5SDimitry Andric
361*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
362*0b57cec5SDimitry Andric// Control Flow Instructions
363*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
364*0b57cec5SDimitry Andric
365*0b57cec5SDimitry Andricclass CF_WORD1_R600 {
366*0b57cec5SDimitry Andric  field bits<32> Word1;
367*0b57cec5SDimitry Andric
368*0b57cec5SDimitry Andric  bits<3> POP_COUNT;
369*0b57cec5SDimitry Andric  bits<5> CF_CONST;
370*0b57cec5SDimitry Andric  bits<2> COND;
371*0b57cec5SDimitry Andric  bits<3> COUNT;
372*0b57cec5SDimitry Andric  bits<6> CALL_COUNT;
373*0b57cec5SDimitry Andric  bits<1> COUNT_3;
374*0b57cec5SDimitry Andric  bits<1> END_OF_PROGRAM;
375*0b57cec5SDimitry Andric  bits<1> VALID_PIXEL_MODE;
376*0b57cec5SDimitry Andric  bits<7> CF_INST;
377*0b57cec5SDimitry Andric  bits<1> WHOLE_QUAD_MODE;
378*0b57cec5SDimitry Andric  bits<1> BARRIER;
379*0b57cec5SDimitry Andric
380*0b57cec5SDimitry Andric  let Word1{2-0} = POP_COUNT;
381*0b57cec5SDimitry Andric  let Word1{7-3} = CF_CONST;
382*0b57cec5SDimitry Andric  let Word1{9-8} = COND;
383*0b57cec5SDimitry Andric  let Word1{12-10} = COUNT;
384*0b57cec5SDimitry Andric  let Word1{18-13} = CALL_COUNT;
385*0b57cec5SDimitry Andric  let Word1{19} = COUNT_3;
386*0b57cec5SDimitry Andric  let Word1{21} = END_OF_PROGRAM;
387*0b57cec5SDimitry Andric  let Word1{22} = VALID_PIXEL_MODE;
388*0b57cec5SDimitry Andric  let Word1{29-23} = CF_INST;
389*0b57cec5SDimitry Andric  let Word1{30} = WHOLE_QUAD_MODE;
390*0b57cec5SDimitry Andric  let Word1{31} = BARRIER;
391*0b57cec5SDimitry Andric}
392*0b57cec5SDimitry Andric
393*0b57cec5SDimitry Andricclass CF_WORD0_EG {
394*0b57cec5SDimitry Andric  field bits<32> Word0;
395*0b57cec5SDimitry Andric
396*0b57cec5SDimitry Andric  bits<24> ADDR;
397*0b57cec5SDimitry Andric  bits<3> JUMPTABLE_SEL;
398*0b57cec5SDimitry Andric
399*0b57cec5SDimitry Andric  let Word0{23-0} = ADDR;
400*0b57cec5SDimitry Andric  let Word0{26-24} = JUMPTABLE_SEL;
401*0b57cec5SDimitry Andric}
402*0b57cec5SDimitry Andric
403*0b57cec5SDimitry Andricclass CF_WORD1_EG {
404*0b57cec5SDimitry Andric  field bits<32> Word1;
405*0b57cec5SDimitry Andric
406*0b57cec5SDimitry Andric  bits<3> POP_COUNT;
407*0b57cec5SDimitry Andric  bits<5> CF_CONST;
408*0b57cec5SDimitry Andric  bits<2> COND;
409*0b57cec5SDimitry Andric  bits<6> COUNT;
410*0b57cec5SDimitry Andric  bits<1> VALID_PIXEL_MODE;
411*0b57cec5SDimitry Andric  bits<1> END_OF_PROGRAM;
412*0b57cec5SDimitry Andric  bits<8> CF_INST;
413*0b57cec5SDimitry Andric  bits<1> BARRIER;
414*0b57cec5SDimitry Andric
415*0b57cec5SDimitry Andric  let Word1{2-0} = POP_COUNT;
416*0b57cec5SDimitry Andric  let Word1{7-3} = CF_CONST;
417*0b57cec5SDimitry Andric  let Word1{9-8} = COND;
418*0b57cec5SDimitry Andric  let Word1{15-10} = COUNT;
419*0b57cec5SDimitry Andric  let Word1{20} = VALID_PIXEL_MODE;
420*0b57cec5SDimitry Andric  let Word1{21} = END_OF_PROGRAM;
421*0b57cec5SDimitry Andric  let Word1{29-22} = CF_INST;
422*0b57cec5SDimitry Andric  let Word1{31} = BARRIER;
423*0b57cec5SDimitry Andric}
424*0b57cec5SDimitry Andric
425*0b57cec5SDimitry Andricclass CF_ALU_WORD0 {
426*0b57cec5SDimitry Andric  field bits<32> Word0;
427*0b57cec5SDimitry Andric
428*0b57cec5SDimitry Andric  bits<22> ADDR;
429*0b57cec5SDimitry Andric  bits<4> KCACHE_BANK0;
430*0b57cec5SDimitry Andric  bits<4> KCACHE_BANK1;
431*0b57cec5SDimitry Andric  bits<2> KCACHE_MODE0;
432*0b57cec5SDimitry Andric
433*0b57cec5SDimitry Andric  let Word0{21-0} = ADDR;
434*0b57cec5SDimitry Andric  let Word0{25-22} = KCACHE_BANK0;
435*0b57cec5SDimitry Andric  let Word0{29-26} = KCACHE_BANK1;
436*0b57cec5SDimitry Andric  let Word0{31-30} = KCACHE_MODE0;
437*0b57cec5SDimitry Andric}
438*0b57cec5SDimitry Andric
439*0b57cec5SDimitry Andricclass CF_ALU_WORD1 {
440*0b57cec5SDimitry Andric  field bits<32> Word1;
441*0b57cec5SDimitry Andric
442*0b57cec5SDimitry Andric  bits<2> KCACHE_MODE1;
443*0b57cec5SDimitry Andric  bits<8> KCACHE_ADDR0;
444*0b57cec5SDimitry Andric  bits<8> KCACHE_ADDR1;
445*0b57cec5SDimitry Andric  bits<7> COUNT;
446*0b57cec5SDimitry Andric  bits<1> ALT_CONST;
447*0b57cec5SDimitry Andric  bits<4> CF_INST;
448*0b57cec5SDimitry Andric  bits<1> WHOLE_QUAD_MODE;
449*0b57cec5SDimitry Andric  bits<1> BARRIER;
450*0b57cec5SDimitry Andric
451*0b57cec5SDimitry Andric  let Word1{1-0} = KCACHE_MODE1;
452*0b57cec5SDimitry Andric  let Word1{9-2} = KCACHE_ADDR0;
453*0b57cec5SDimitry Andric  let Word1{17-10} = KCACHE_ADDR1;
454*0b57cec5SDimitry Andric  let Word1{24-18} = COUNT;
455*0b57cec5SDimitry Andric  let Word1{25} = ALT_CONST;
456*0b57cec5SDimitry Andric  let Word1{29-26} = CF_INST;
457*0b57cec5SDimitry Andric  let Word1{30} = WHOLE_QUAD_MODE;
458*0b57cec5SDimitry Andric  let Word1{31} = BARRIER;
459*0b57cec5SDimitry Andric}
460*0b57cec5SDimitry Andric
461*0b57cec5SDimitry Andricclass CF_ALLOC_EXPORT_WORD0_RAT {
462*0b57cec5SDimitry Andric  field bits<32> Word0;
463*0b57cec5SDimitry Andric
464*0b57cec5SDimitry Andric  bits<4> rat_id;
465*0b57cec5SDimitry Andric  bits<6> rat_inst;
466*0b57cec5SDimitry Andric  bits<2> rim;
467*0b57cec5SDimitry Andric  bits<2> type;
468*0b57cec5SDimitry Andric  bits<7> rw_gpr;
469*0b57cec5SDimitry Andric  bits<1> rw_rel;
470*0b57cec5SDimitry Andric  bits<7> index_gpr;
471*0b57cec5SDimitry Andric  bits<2> elem_size;
472*0b57cec5SDimitry Andric
473*0b57cec5SDimitry Andric  let Word0{3-0}   = rat_id;
474*0b57cec5SDimitry Andric  let Word0{9-4}   = rat_inst;
475*0b57cec5SDimitry Andric  let Word0{10}    = 0; // Reserved
476*0b57cec5SDimitry Andric  let Word0{12-11} = rim;
477*0b57cec5SDimitry Andric  let Word0{14-13} = type;
478*0b57cec5SDimitry Andric  let Word0{21-15} = rw_gpr;
479*0b57cec5SDimitry Andric  let Word0{22}    = rw_rel;
480*0b57cec5SDimitry Andric  let Word0{29-23} = index_gpr;
481*0b57cec5SDimitry Andric  let Word0{31-30} = elem_size;
482*0b57cec5SDimitry Andric}
483*0b57cec5SDimitry Andric
484*0b57cec5SDimitry Andricclass CF_ALLOC_EXPORT_WORD1_BUF {
485*0b57cec5SDimitry Andric  field bits<32> Word1;
486*0b57cec5SDimitry Andric
487*0b57cec5SDimitry Andric  bits<12> array_size;
488*0b57cec5SDimitry Andric  bits<4>  comp_mask;
489*0b57cec5SDimitry Andric  bits<4>  burst_count;
490*0b57cec5SDimitry Andric  bits<1>  vpm;
491*0b57cec5SDimitry Andric  bits<1>  eop;
492*0b57cec5SDimitry Andric  bits<8>  cf_inst;
493*0b57cec5SDimitry Andric  bits<1>  mark;
494*0b57cec5SDimitry Andric  bits<1>  barrier;
495*0b57cec5SDimitry Andric
496*0b57cec5SDimitry Andric  let Word1{11-0} = array_size;
497*0b57cec5SDimitry Andric  let Word1{15-12} = comp_mask;
498*0b57cec5SDimitry Andric  let Word1{19-16} = burst_count;
499*0b57cec5SDimitry Andric  let Word1{20}    = vpm;
500*0b57cec5SDimitry Andric  let Word1{21}    = eop;
501*0b57cec5SDimitry Andric  let Word1{29-22} = cf_inst;
502*0b57cec5SDimitry Andric  let Word1{30}    = mark;
503*0b57cec5SDimitry Andric  let Word1{31}    = barrier;
504*0b57cec5SDimitry Andric}
505