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