R600: Move instruction encoding definitions into a separate .td file
[oota-llvm.git] / lib / Target / R600 / R600InstrFormats.td
1 //===-- R600InstrFormats.td - R600 Instruction Encodings ------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // R600 Instruction format definitions.
11 //
12 //===----------------------------------------------------------------------===//
13
14 class InstR600 <dag outs, dag ins, string asm, list<dag> pattern,
15                 InstrItinClass itin>
16     : AMDGPUInst <outs, ins, asm, pattern> {
17
18   field bits<64> Inst;
19   bit TransOnly = 0;
20   bit Trig = 0;
21   bit Op3 = 0;
22   bit isVector = 0;
23   bits<2> FlagOperandIdx = 0;
24   bit Op1 = 0;
25   bit Op2 = 0;
26   bit HasNativeOperands = 0;
27   bit VTXInst = 0;
28   bit TEXInst = 0;
29
30   let Namespace = "AMDGPU";
31   let OutOperandList = outs;
32   let InOperandList = ins;
33   let AsmString = asm;
34   let Pattern = pattern;
35   let Itinerary = itin;
36
37   let TSFlags{0} = TransOnly;
38   let TSFlags{4} = Trig;
39   let TSFlags{5} = Op3;
40
41   // Vector instructions are instructions that must fill all slots in an
42   // instruction group
43   let TSFlags{6} = isVector;
44   let TSFlags{8-7} = FlagOperandIdx;
45   let TSFlags{9} = HasNativeOperands;
46   let TSFlags{10} = Op1;
47   let TSFlags{11} = Op2;
48   let TSFlags{12} = VTXInst;
49   let TSFlags{13} = TEXInst;
50 }
51
52 //===----------------------------------------------------------------------===//
53 // ALU instructions
54 //===----------------------------------------------------------------------===//
55
56 class R600ALU_Word0 {
57   field bits<32> Word0;
58
59   bits<11> src0;
60   bits<1>  src0_neg;
61   bits<1>  src0_rel;
62   bits<11> src1;
63   bits<1>  src1_rel;
64   bits<1>  src1_neg;
65   bits<3>  index_mode = 0;
66   bits<2>  pred_sel;
67   bits<1>  last;
68
69   bits<9>  src0_sel  = src0{8-0};
70   bits<2>  src0_chan = src0{10-9};
71   bits<9>  src1_sel  = src1{8-0};
72   bits<2>  src1_chan = src1{10-9};
73
74   let Word0{8-0}   = src0_sel;
75   let Word0{9}     = src0_rel;
76   let Word0{11-10} = src0_chan;
77   let Word0{12}    = src0_neg;
78   let Word0{21-13} = src1_sel;
79   let Word0{22}    = src1_rel;
80   let Word0{24-23} = src1_chan;
81   let Word0{25}    = src1_neg;
82   let Word0{28-26} = index_mode;
83   let Word0{30-29} = pred_sel;
84   let Word0{31}    = last;
85 }
86
87 class R600ALU_Word1 {
88   field bits<32> Word1;
89
90   bits<11> dst;
91   bits<3>  bank_swizzle;
92   bits<1>  dst_rel;
93   bits<1>  clamp;
94
95   bits<7>  dst_sel  = dst{6-0};
96   bits<2>  dst_chan = dst{10-9};
97
98   let Word1{20-18} = bank_swizzle;
99   let Word1{27-21} = dst_sel;
100   let Word1{28}    = dst_rel;
101   let Word1{30-29} = dst_chan;
102   let Word1{31}    = clamp;
103 }
104
105 class R600ALU_Word1_OP2 <bits<11> alu_inst> : R600ALU_Word1{
106
107   bits<1>  src0_abs;
108   bits<1>  src1_abs;
109   bits<1>  update_exec_mask;
110   bits<1>  update_pred;
111   bits<1>  write;
112   bits<2>  omod;
113
114   let Word1{0}     = src0_abs;
115   let Word1{1}     = src1_abs;
116   let Word1{2}     = update_exec_mask;
117   let Word1{3}     = update_pred;
118   let Word1{4}     = write;
119   let Word1{6-5}   = omod;
120   let Word1{17-7}  = alu_inst;
121 }
122
123 class R600ALU_Word1_OP3 <bits<5> alu_inst> : R600ALU_Word1{
124
125   bits<11> src2;
126   bits<1>  src2_rel;
127   bits<1>  src2_neg;
128
129   bits<9>  src2_sel = src2{8-0};
130   bits<2>  src2_chan = src2{10-9};
131
132   let Word1{8-0}   = src2_sel;
133   let Word1{9}     = src2_rel;
134   let Word1{11-10} = src2_chan;
135   let Word1{12}    = src2_neg;
136   let Word1{17-13} = alu_inst;
137 }
138
139 /*
140 XXX: R600 subtarget uses a slightly different encoding than the other
141 subtargets.  We currently handle this in R600MCCodeEmitter, but we may
142 want to use these instruction classes in the future.
143
144 class R600ALU_Word1_OP2_r600 : R600ALU_Word1_OP2 {
145
146   bits<1>  fog_merge;
147   bits<10> alu_inst;
148
149   let Inst{37}    = fog_merge;
150   let Inst{39-38} = omod;
151   let Inst{49-40} = alu_inst;
152 }
153
154 class R600ALU_Word1_OP2_r700 : R600ALU_Word1_OP2 {
155
156   bits<11> alu_inst;
157
158   let Inst{38-37} = omod;
159   let Inst{49-39} = alu_inst;
160 }
161 */
162
163 //===----------------------------------------------------------------------===//
164 // Vertex Fetch instructions
165 //===----------------------------------------------------------------------===//
166
167 class VTX_WORD0 {
168   field bits<32> Word0;
169   bits<7> SRC_GPR;
170   bits<5> VC_INST;
171   bits<2> FETCH_TYPE;
172   bits<1> FETCH_WHOLE_QUAD;
173   bits<8> BUFFER_ID;
174   bits<1> SRC_REL;
175   bits<2> SRC_SEL_X;
176   bits<6> MEGA_FETCH_COUNT;
177
178   let Word0{4-0}   = VC_INST;
179   let Word0{6-5}   = FETCH_TYPE;
180   let Word0{7}     = FETCH_WHOLE_QUAD;
181   let Word0{15-8}  = BUFFER_ID;
182   let Word0{22-16} = SRC_GPR;
183   let Word0{23}    = SRC_REL;
184   let Word0{25-24} = SRC_SEL_X;
185   let Word0{31-26} = MEGA_FETCH_COUNT;
186 }
187
188 class VTX_WORD1_GPR {
189   field bits<32> Word1;
190   bits<7> DST_GPR;
191   bits<1> DST_REL;
192   bits<3> DST_SEL_X;
193   bits<3> DST_SEL_Y;
194   bits<3> DST_SEL_Z;
195   bits<3> DST_SEL_W;
196   bits<1> USE_CONST_FIELDS;
197   bits<6> DATA_FORMAT;
198   bits<2> NUM_FORMAT_ALL;
199   bits<1> FORMAT_COMP_ALL;
200   bits<1> SRF_MODE_ALL;
201
202   let Word1{6-0} = DST_GPR;
203   let Word1{7}    = DST_REL;
204   let Word1{8}    = 0; // Reserved
205   let Word1{11-9} = DST_SEL_X;
206   let Word1{14-12} = DST_SEL_Y;
207   let Word1{17-15} = DST_SEL_Z;
208   let Word1{20-18} = DST_SEL_W;
209   let Word1{21}    = USE_CONST_FIELDS;
210   let Word1{27-22} = DATA_FORMAT;
211   let Word1{29-28} = NUM_FORMAT_ALL;
212   let Word1{30}    = FORMAT_COMP_ALL;
213   let Word1{31}    = SRF_MODE_ALL;
214 }
215
216 //===----------------------------------------------------------------------===//
217 // Texture fetch instructions
218 //===----------------------------------------------------------------------===//
219
220 class TEX_WORD0 {
221   field bits<32> Word0;
222
223   bits<5> TEX_INST;
224   bits<2> INST_MOD;
225   bits<1> FETCH_WHOLE_QUAD;
226   bits<8> RESOURCE_ID;
227   bits<7> SRC_GPR;
228   bits<1> SRC_REL;
229   bits<1> ALT_CONST;
230   bits<2> RESOURCE_INDEX_MODE;
231   bits<2> SAMPLER_INDEX_MODE;
232
233   let Word0{4-0} = TEX_INST;
234   let Word0{6-5} = INST_MOD;
235   let Word0{7} = FETCH_WHOLE_QUAD;
236   let Word0{15-8} = RESOURCE_ID;
237   let Word0{22-16} = SRC_GPR;
238   let Word0{23} = SRC_REL;
239   let Word0{24} = ALT_CONST;
240   let Word0{26-25} = RESOURCE_INDEX_MODE;
241   let Word0{28-27} = SAMPLER_INDEX_MODE;
242 }
243
244 class TEX_WORD1 {
245   field bits<32> Word1;
246
247   bits<7> DST_GPR;
248   bits<1> DST_REL;
249   bits<3> DST_SEL_X;
250   bits<3> DST_SEL_Y;
251   bits<3> DST_SEL_Z;
252   bits<3> DST_SEL_W;
253   bits<7> LOD_BIAS;
254   bits<1> COORD_TYPE_X;
255   bits<1> COORD_TYPE_Y;
256   bits<1> COORD_TYPE_Z;
257   bits<1> COORD_TYPE_W;
258
259   let Word1{6-0} = DST_GPR;
260   let Word1{7} = DST_REL;
261   let Word1{11-9} = DST_SEL_X;
262   let Word1{14-12} = DST_SEL_Y;
263   let Word1{17-15} = DST_SEL_Z;
264   let Word1{20-18} = DST_SEL_W;
265   let Word1{27-21} = LOD_BIAS;
266   let Word1{28} = COORD_TYPE_X;
267   let Word1{29} = COORD_TYPE_Y;
268   let Word1{30} = COORD_TYPE_Z;
269   let Word1{31} = COORD_TYPE_W;
270 }
271
272 class TEX_WORD2 {
273   field bits<32> Word2;
274
275   bits<5> OFFSET_X;
276   bits<5> OFFSET_Y;
277   bits<5> OFFSET_Z;
278   bits<5> SAMPLER_ID;
279   bits<3> SRC_SEL_X;
280   bits<3> SRC_SEL_Y;
281   bits<3> SRC_SEL_Z;
282   bits<3> SRC_SEL_W;
283
284   let Word2{4-0} = OFFSET_X;
285   let Word2{9-5} = OFFSET_Y;
286   let Word2{14-10} = OFFSET_Z;
287   let Word2{19-15} = SAMPLER_ID;
288   let Word2{22-20} = SRC_SEL_X;
289   let Word2{25-23} = SRC_SEL_Y;
290   let Word2{28-26} = SRC_SEL_Z;
291   let Word2{31-29} = SRC_SEL_W;
292 }
293
294 //===----------------------------------------------------------------------===//
295 // Control Flow Instructions
296 //===----------------------------------------------------------------------===//
297
298 class CF_WORD1_R600 {
299   field bits<32> Word1;
300
301   bits<3> POP_COUNT;
302   bits<5> CF_CONST;
303   bits<2> COND;
304   bits<3> COUNT;
305   bits<6> CALL_COUNT;
306   bits<1> COUNT_3;
307   bits<1> END_OF_PROGRAM;
308   bits<1> VALID_PIXEL_MODE;
309   bits<7> CF_INST;
310   bits<1> WHOLE_QUAD_MODE;
311   bits<1> BARRIER;
312
313   let Word1{2-0} = POP_COUNT;
314   let Word1{7-3} = CF_CONST;
315   let Word1{9-8} = COND;
316   let Word1{12-10} = COUNT;
317   let Word1{18-13} = CALL_COUNT;
318   let Word1{19} = COUNT_3;
319   let Word1{21} = END_OF_PROGRAM;
320   let Word1{22} = VALID_PIXEL_MODE;
321   let Word1{29-23} = CF_INST;
322   let Word1{30} = WHOLE_QUAD_MODE;
323   let Word1{31} = BARRIER;
324 }
325
326 class CF_WORD0_EG {
327   field bits<32> Word0;
328
329   bits<24> ADDR;
330   bits<3> JUMPTABLE_SEL;
331
332   let Word0{23-0} = ADDR;
333   let Word0{26-24} = JUMPTABLE_SEL;
334 }
335
336 class CF_WORD1_EG {
337   field bits<32> Word1;
338
339   bits<3> POP_COUNT;
340   bits<5> CF_CONST;
341   bits<2> COND;
342   bits<6> COUNT;
343   bits<1> VALID_PIXEL_MODE;
344   bits<1> END_OF_PROGRAM;
345   bits<8> CF_INST;
346   bits<1> BARRIER;
347
348   let Word1{2-0} = POP_COUNT;
349   let Word1{7-3} = CF_CONST;
350   let Word1{9-8} = COND;
351   let Word1{15-10} = COUNT;
352   let Word1{20} = VALID_PIXEL_MODE;
353   let Word1{21} = END_OF_PROGRAM;
354   let Word1{29-22} = CF_INST;
355   let Word1{31} = BARRIER;
356 }
357
358 class CF_ALU_WORD0 {
359   field bits<32> Word0;
360
361   bits<22> ADDR;
362   bits<4> KCACHE_BANK0;
363   bits<4> KCACHE_BANK1;
364   bits<2> KCACHE_MODE0;
365
366   let Word0{21-0} = ADDR;
367   let Word0{25-22} = KCACHE_BANK0;
368   let Word0{29-26} = KCACHE_BANK1;
369   let Word0{31-30} = KCACHE_MODE0;
370 }
371
372 class CF_ALU_WORD1 {
373   field bits<32> Word1;
374
375   bits<2> KCACHE_MODE1;
376   bits<8> KCACHE_ADDR0;
377   bits<8> KCACHE_ADDR1;
378   bits<7> COUNT;
379   bits<1> ALT_CONST;
380   bits<4> CF_INST;
381   bits<1> WHOLE_QUAD_MODE;
382   bits<1> BARRIER;
383
384   let Word1{1-0} = KCACHE_MODE1;
385   let Word1{9-2} = KCACHE_ADDR0;
386   let Word1{17-10} = KCACHE_ADDR1;
387   let Word1{24-18} = COUNT;
388   let Word1{25} = ALT_CONST;
389   let Word1{29-26} = CF_INST;
390   let Word1{30} = WHOLE_QUAD_MODE;
391   let Word1{31} = BARRIER;
392 }