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