R600/SI: Separate encoding and operand definitions into their own classes
[oota-llvm.git] / lib / Target / R600 / SIInstrFormats.td
1 //===-- SIInstrFormats.td - SI 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 // SI Instruction format definitions.
11 //
12 //===----------------------------------------------------------------------===//
13
14 class InstSI <dag outs, dag ins, string asm, list<dag> pattern> :
15     AMDGPUInst<outs, ins, asm, pattern>, PredicateControl {
16
17   field bits<1> VM_CNT = 0;
18   field bits<1> EXP_CNT = 0;
19   field bits<1> LGKM_CNT = 0;
20   field bits<1> MIMG = 0;
21   field bits<1> SMRD = 0;
22   field bits<1> VOP1 = 0;
23   field bits<1> VOP2 = 0;
24   field bits<1> VOP3 = 0;
25   field bits<1> VOPC = 0;
26   field bits<1> SALU = 0;
27
28   let TSFlags{0} = VM_CNT;
29   let TSFlags{1} = EXP_CNT;
30   let TSFlags{2} = LGKM_CNT;
31   let TSFlags{3} = MIMG;
32   let TSFlags{4} = SMRD;
33   let TSFlags{5} = VOP1;
34   let TSFlags{6} = VOP2;
35   let TSFlags{7} = VOP3;
36   let TSFlags{8} = VOPC;
37   let TSFlags{9} = SALU;
38 }
39
40 class Enc32 {
41
42   field bits<32> Inst;
43   int Size = 4;
44 }
45
46 class Enc64 {
47
48   field bits<64> Inst;
49   int Size = 8;
50 }
51
52 class VOP3Common <dag outs, dag ins, string asm, list<dag> pattern> :
53     InstSI <outs, ins, asm, pattern> {
54
55   let mayLoad = 0;
56   let mayStore = 0;
57   let hasSideEffects = 0;
58   let UseNamedOperandTable = 1;
59   let VOP3 = 1;
60 }
61
62 //===----------------------------------------------------------------------===//
63 // Scalar operations
64 //===----------------------------------------------------------------------===//
65
66 class SOP1e <bits<8> op> : Enc32 {
67
68   bits<7> SDST;
69   bits<8> SSRC0;
70
71   let Inst{7-0} = SSRC0;
72   let Inst{15-8} = op;
73   let Inst{22-16} = SDST;
74   let Inst{31-23} = 0x17d; //encoding;
75 }
76
77 class SOP2e <bits<7> op> : Enc32 {
78
79   bits<7> SDST;
80   bits<8> SSRC0;
81   bits<8> SSRC1;
82
83   let Inst{7-0} = SSRC0;
84   let Inst{15-8} = SSRC1;
85   let Inst{22-16} = SDST;
86   let Inst{29-23} = op;
87   let Inst{31-30} = 0x2; // encoding
88 }
89
90 class SOPCe <bits<7> op> : Enc32 {
91
92   bits<8> SSRC0;
93   bits<8> SSRC1;
94
95   let Inst{7-0} = SSRC0;
96   let Inst{15-8} = SSRC1;
97   let Inst{22-16} = op;
98   let Inst{31-23} = 0x17e;
99 }
100
101 class SOPKe <bits<5> op> : Enc32 {
102
103   bits <7> SDST;
104   bits <16> SIMM16;
105
106   let Inst{15-0} = SIMM16;
107   let Inst{22-16} = SDST;
108   let Inst{27-23} = op;
109   let Inst{31-28} = 0xb; //encoding
110 }
111
112 class SOPPe <bits<7> op> : Enc32 {
113
114   bits <16> simm16;
115
116   let Inst{15-0} = simm16;
117   let Inst{22-16} = op;
118   let Inst{31-23} = 0x17f; // encoding
119 }
120
121 class SMRDe <bits<5> op, bits<1> imm> : Enc32 {
122
123   bits<7> SDST;
124   bits<7> SBASE;
125   bits<8> OFFSET;
126
127   let Inst{7-0} = OFFSET;
128   let Inst{8} = imm;
129   let Inst{14-9} = SBASE{6-1};
130   let Inst{21-15} = SDST;
131   let Inst{26-22} = op;
132   let Inst{31-27} = 0x18; //encoding
133 }
134
135 class SOP1 <bits<8> op, dag outs, dag ins, string asm, list<dag> pattern> :
136     InstSI<outs, ins, asm, pattern>, SOP1e <op> {
137
138   let mayLoad = 0;
139   let mayStore = 0;
140   let hasSideEffects = 0;
141   let SALU = 1;
142 }
143
144 class SOP2 <bits<7> op, dag outs, dag ins, string asm, list<dag> pattern> :
145     InstSI <outs, ins, asm, pattern>, SOP2e<op> {
146
147   let mayLoad = 0;
148   let mayStore = 0;
149   let hasSideEffects = 0;
150   let SALU = 1;
151 }
152
153 class SOPC <bits<7> op, dag outs, dag ins, string asm, list<dag> pattern> :
154   InstSI<outs, ins, asm, pattern>, SOPCe <op> {
155
156   let DisableEncoding = "$dst";
157   let mayLoad = 0;
158   let mayStore = 0;
159   let hasSideEffects = 0;
160   let SALU = 1;
161 }
162
163 class SOPK <bits<5> op, dag outs, dag ins, string asm, list<dag> pattern> :
164    InstSI <outs, ins , asm, pattern>, SOPKe<op> {
165
166   let mayLoad = 0;
167   let mayStore = 0;
168   let hasSideEffects = 0;
169   let SALU = 1;
170 }
171
172 class SOPP <bits<7> op, dag ins, string asm, list<dag> pattern> :
173                 InstSI <(outs), ins, asm, pattern >, SOPPe <op> {
174
175   let mayLoad = 0;
176   let mayStore = 0;
177   let hasSideEffects = 0;
178   let SALU = 1;
179 }
180
181 class SMRD <bits<5> op, bits<1> imm, dag outs, dag ins, string asm,
182             list<dag> pattern> : InstSI<outs, ins, asm, pattern>, SMRDe<op, imm> {
183
184   let LGKM_CNT = 1;
185   let SMRD = 1;
186 }
187
188 //===----------------------------------------------------------------------===//
189 // Vector ALU operations
190 //===----------------------------------------------------------------------===//
191
192 class VOP1e <bits<8> op> : Enc32 {
193
194   bits<8> VDST;
195   bits<9> SRC0;
196
197   let Inst{8-0} = SRC0;
198   let Inst{16-9} = op;
199   let Inst{24-17} = VDST;
200   let Inst{31-25} = 0x3f; //encoding
201 }
202
203 class VOP2e <bits<6> op> : Enc32 {
204
205   bits<8> VDST;
206   bits<9> SRC0;
207   bits<8> VSRC1;
208
209   let Inst{8-0} = SRC0;
210   let Inst{16-9} = VSRC1;
211   let Inst{24-17} = VDST;
212   let Inst{30-25} = op;
213   let Inst{31} = 0x0; //encoding
214 }
215
216 class VOP3e <bits<9> op> : Enc64 {
217
218   bits<8> dst;
219   bits<2> src0_modifiers;
220   bits<9> src0;
221   bits<2> src1_modifiers;
222   bits<9> src1;
223   bits<2> src2_modifiers;
224   bits<9> src2;
225   bits<1> clamp;
226   bits<2> omod;
227
228   let Inst{7-0} = dst;
229   let Inst{8} = src0_modifiers{1};
230   let Inst{9} = src1_modifiers{1};
231   let Inst{10} = src2_modifiers{1};
232   let Inst{11} = clamp;
233   let Inst{25-17} = op;
234   let Inst{31-26} = 0x34; //encoding
235   let Inst{40-32} = src0;
236   let Inst{49-41} = src1;
237   let Inst{58-50} = src2;
238   let Inst{60-59} = omod;
239   let Inst{61} = src0_modifiers{0};
240   let Inst{62} = src1_modifiers{0};
241   let Inst{63} = src2_modifiers{0};
242 }
243
244 class VOP3be <bits<9> op> : Enc64 {
245
246   bits<8> dst;
247   bits<2> src0_modifiers;
248   bits<9> src0;
249   bits<2> src1_modifiers;
250   bits<9> src1;
251   bits<2> src2_modifiers;
252   bits<9> src2;
253   bits<7> sdst;
254   bits<2> omod;
255
256   let Inst{7-0} = dst;
257   let Inst{14-8} = sdst;
258   let Inst{25-17} = op;
259   let Inst{31-26} = 0x34; //encoding
260   let Inst{40-32} = src0;
261   let Inst{49-41} = src1;
262   let Inst{58-50} = src2;
263   let Inst{60-59} = omod;
264   let Inst{61} = src0_modifiers{0};
265   let Inst{62} = src1_modifiers{0};
266   let Inst{63} = src2_modifiers{0};
267 }
268
269 class VOPCe <bits<8> op> : Enc32 {
270
271   bits<9> SRC0;
272   bits<8> VSRC1;
273
274   let Inst{8-0} = SRC0;
275   let Inst{16-9} = VSRC1;
276   let Inst{24-17} = op;
277   let Inst{31-25} = 0x3e;
278 }
279
280 class VINTRPe <bits<2> op> : Enc32 {
281
282   bits<8> VDST;
283   bits<8> VSRC;
284   bits<2> ATTRCHAN;
285   bits<6> ATTR;
286
287   let Inst{7-0} = VSRC;
288   let Inst{9-8} = ATTRCHAN;
289   let Inst{15-10} = ATTR;
290   let Inst{17-16} = op;
291   let Inst{25-18} = VDST;
292   let Inst{31-26} = 0x32; // encoding
293 }
294
295 class DSe <bits<8> op> : Enc64 {
296
297   bits<8> vdst;
298   bits<1> gds;
299   bits<8> addr;
300   bits<8> data0;
301   bits<8> data1;
302   bits<8> offset0;
303   bits<8> offset1;
304
305   let Inst{7-0} = offset0;
306   let Inst{15-8} = offset1;
307   let Inst{17} = gds;
308   let Inst{25-18} = op;
309   let Inst{31-26} = 0x36; //encoding
310   let Inst{39-32} = addr;
311   let Inst{47-40} = data0;
312   let Inst{55-48} = data1;
313   let Inst{63-56} = vdst;
314 }
315
316 class MUBUFe <bits<7> op> : Enc64 {
317
318   bits<12> offset;
319   bits<1> offen;
320   bits<1> idxen;
321   bits<1> glc;
322   bits<1> addr64;
323   bits<1> lds;
324   bits<8> vaddr;
325   bits<8> vdata;
326   bits<7> srsrc;
327   bits<1> slc;
328   bits<1> tfe;
329   bits<8> soffset;
330
331   let Inst{11-0} = offset;
332   let Inst{12} = offen;
333   let Inst{13} = idxen;
334   let Inst{14} = glc;
335   let Inst{15} = addr64;
336   let Inst{16} = lds;
337   let Inst{24-18} = op;
338   let Inst{31-26} = 0x38; //encoding
339   let Inst{39-32} = vaddr;
340   let Inst{47-40} = vdata;
341   let Inst{52-48} = srsrc{6-2};
342   let Inst{54} = slc;
343   let Inst{55} = tfe;
344   let Inst{63-56} = soffset;
345 }
346
347 class MTBUFe <bits<3> op> : Enc64 {
348
349   bits<8> VDATA;
350   bits<12> OFFSET;
351   bits<1> OFFEN;
352   bits<1> IDXEN;
353   bits<1> GLC;
354   bits<1> ADDR64;
355   bits<4> DFMT;
356   bits<3> NFMT;
357   bits<8> VADDR;
358   bits<7> SRSRC;
359   bits<1> SLC;
360   bits<1> TFE;
361   bits<8> SOFFSET;
362
363   let Inst{11-0} = OFFSET;
364   let Inst{12} = OFFEN;
365   let Inst{13} = IDXEN;
366   let Inst{14} = GLC;
367   let Inst{15} = ADDR64;
368   let Inst{18-16} = op;
369   let Inst{22-19} = DFMT;
370   let Inst{25-23} = NFMT;
371   let Inst{31-26} = 0x3a; //encoding
372   let Inst{39-32} = VADDR;
373   let Inst{47-40} = VDATA;
374   let Inst{52-48} = SRSRC{6-2};
375   let Inst{54} = SLC;
376   let Inst{55} = TFE;
377   let Inst{63-56} = SOFFSET;
378 }
379
380 class MIMGe <bits<7> op> : Enc64 {
381
382   bits<8> VDATA;
383   bits<4> DMASK;
384   bits<1> UNORM;
385   bits<1> GLC;
386   bits<1> DA;
387   bits<1> R128;
388   bits<1> TFE;
389   bits<1> LWE;
390   bits<1> SLC;
391   bits<8> VADDR;
392   bits<7> SRSRC;
393   bits<7> SSAMP;
394
395   let Inst{11-8} = DMASK;
396   let Inst{12} = UNORM;
397   let Inst{13} = GLC;
398   let Inst{14} = DA;
399   let Inst{15} = R128;
400   let Inst{16} = TFE;
401   let Inst{17} = LWE;
402   let Inst{24-18} = op;
403   let Inst{25} = SLC;
404   let Inst{31-26} = 0x3c;
405   let Inst{39-32} = VADDR;
406   let Inst{47-40} = VDATA;
407   let Inst{52-48} = SRSRC{6-2};
408   let Inst{57-53} = SSAMP{6-2};
409 }
410
411 class EXPe : Enc64 {
412
413   bits<4> EN;
414   bits<6> TGT;
415   bits<1> COMPR;
416   bits<1> DONE;
417   bits<1> VM;
418   bits<8> VSRC0;
419   bits<8> VSRC1;
420   bits<8> VSRC2;
421   bits<8> VSRC3;
422
423   let Inst{3-0} = EN;
424   let Inst{9-4} = TGT;
425   let Inst{10} = COMPR;
426   let Inst{11} = DONE;
427   let Inst{12} = VM;
428   let Inst{31-26} = 0x3e;
429   let Inst{39-32} = VSRC0;
430   let Inst{47-40} = VSRC1;
431   let Inst{55-48} = VSRC2;
432   let Inst{63-56} = VSRC3;
433 }
434
435 let Uses = [EXEC] in {
436
437 class VOP1 <bits<8> op, dag outs, dag ins, string asm, list<dag> pattern> :
438     InstSI <outs, ins, asm, pattern>, VOP1e<op> {
439
440   let mayLoad = 0;
441   let mayStore = 0;
442   let hasSideEffects = 0;
443   let UseNamedOperandTable = 1;
444   let VOP1 = 1;
445 }
446
447 class VOP2 <bits<6> op, dag outs, dag ins, string asm, list<dag> pattern> :
448     InstSI <outs, ins, asm, pattern>, VOP2e<op> {
449
450   let mayLoad = 0;
451   let mayStore = 0;
452   let hasSideEffects = 0;
453   let UseNamedOperandTable = 1;
454   let VOP2 = 1;
455 }
456
457 class VOP3 <bits<9> op, dag outs, dag ins, string asm, list<dag> pattern> :
458     VOP3Common <outs, ins, asm, pattern>, VOP3e<op>;
459
460 class VOP3b <bits<9> op, dag outs, dag ins, string asm, list<dag> pattern> :
461     VOP3Common <outs, ins, asm, pattern>, VOP3be<op>;
462
463 class VOPC <bits<8> op, dag ins, string asm, list<dag> pattern> :
464     InstSI <(outs VCCReg:$dst), ins, asm, pattern>, VOPCe <op> {
465
466   let DisableEncoding = "$dst";
467   let mayLoad = 0;
468   let mayStore = 0;
469   let hasSideEffects = 0;
470   let UseNamedOperandTable = 1;
471   let VOPC = 1;
472 }
473
474 class VINTRP <bits <2> op, dag outs, dag ins, string asm, list<dag> pattern> :
475     InstSI <outs, ins, asm, pattern>, VINTRPe<op> {
476
477   let neverHasSideEffects = 1;
478   let mayLoad = 1;
479   let mayStore = 0;
480 }
481
482 } // End Uses = [EXEC]
483
484 //===----------------------------------------------------------------------===//
485 // Vector I/O operations
486 //===----------------------------------------------------------------------===//
487
488 let Uses = [EXEC] in {
489
490 class DS <bits<8> op, dag outs, dag ins, string asm, list<dag> pattern> :
491     InstSI <outs, ins, asm, pattern> , DSe<op> {
492
493   let LGKM_CNT = 1;
494 }
495
496 class MUBUF <bits<7> op, dag outs, dag ins, string asm, list<dag> pattern> :
497     InstSI<outs, ins, asm, pattern>, MUBUFe <op> {
498
499   let VM_CNT = 1;
500   let EXP_CNT = 1;
501
502   let neverHasSideEffects = 1;
503   let UseNamedOperandTable = 1;
504 }
505
506 class MTBUF <bits<3> op, dag outs, dag ins, string asm, list<dag> pattern> :
507     InstSI<outs, ins, asm, pattern>, MTBUFe <op> {
508
509   let VM_CNT = 1;
510   let EXP_CNT = 1;
511
512   let neverHasSideEffects = 1;
513 }
514
515 class MIMG <bits<7> op, dag outs, dag ins, string asm, list<dag> pattern> :
516     InstSI <outs, ins, asm, pattern>, MIMGe <op> {
517
518   let VM_CNT = 1;
519   let EXP_CNT = 1;
520   let MIMG = 1;
521 }
522
523 def EXP : InstSI<
524   (outs),
525   (ins i32imm:$en, i32imm:$tgt, i32imm:$compr, i32imm:$done, i32imm:$vm,
526        VReg_32:$src0, VReg_32:$src1, VReg_32:$src2, VReg_32:$src3),
527   "EXP $en, $tgt, $compr, $done, $vm, $src0, $src1, $src2, $src3",
528   [] >, EXPe {
529
530   let EXP_CNT = 1;
531 }
532
533 } // End Uses = [EXEC]