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