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