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