Pattern-match return. Includes gross hack!
[oota-llvm.git] / lib / Target / PowerPC / PPCInstrFormats.td
1 //===- PowerPCInstrFormats.td - PowerPC Instruction Formats --*- tablegen -*-=//
2 // 
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
7 // 
8 //===----------------------------------------------------------------------===//
9 //
10 //
11 //===----------------------------------------------------------------------===//
12
13 //===----------------------------------------------------------------------===//
14 //
15 // PowerPC instruction formats
16
17 class I<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin>
18         : Instruction {
19   field bits<32> Inst;
20
21   bit PPC64 = 0;  // Default value, override with isPPC64
22   bit VMX = 0;    // Default value, override with isVMX
23
24   let Name = "";
25   let Namespace = "PPC";
26   let Inst{0-5} = opcode;
27   let OperandList = OL;
28   let AsmString = asmstr;
29   let Itinerary = itin;
30 }
31
32 // 1.7.1 I-Form
33 class IForm<bits<6> opcode, bit aa, bit lk, dag OL, string asmstr,
34             InstrItinClass itin, list<dag> pattern>
35          : I<opcode, OL, asmstr, itin> {
36   let Pattern = pattern;
37   bits<24> LI;
38
39   let Inst{6-29}  = LI;
40   let Inst{30}    = aa;
41   let Inst{31}    = lk;
42 }
43
44 // 1.7.2 B-Form
45 class BForm<bits<6> opcode, bit aa, bit lk, bits<5> bo, bits<2> bicode, dag OL, 
46             string asmstr, InstrItinClass itin>
47   : I<opcode, OL, asmstr, itin> {
48   bits<3>  CR;
49   bits<14> BD;
50
51   let Inst{6-10}  = bo;
52   let Inst{11-13} = CR;
53   let Inst{14-15} = bicode;
54   let Inst{16-29} = BD;
55   let Inst{30}    = aa;
56   let Inst{31}    = lk;
57 }
58
59 // 1.7.4 D-Form
60 class DForm_base<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
61                  list<dag> pattern> 
62   : I<opcode, OL, asmstr, itin> {
63   bits<5>  A;
64   bits<5>  B;
65   bits<16> C;
66
67   let Pattern = pattern;
68   
69   let Inst{6-10}  = A;
70   let Inst{11-15} = B;
71   let Inst{16-31} = C;
72 }
73
74 class DForm_1<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
75               list<dag> pattern>
76   : I<opcode, OL, asmstr, itin> {
77   bits<5>  A;
78   bits<16> C;
79   bits<5>  B;
80
81   let Pattern = pattern;
82   
83   let Inst{6-10}  = A;
84   let Inst{11-15} = B;
85   let Inst{16-31} = C;
86 }
87
88 class DForm_2<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
89               list<dag> pattern>
90   : DForm_base<opcode, OL, asmstr, itin, pattern>;
91
92 class DForm_2_r0<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
93                  list<dag> pattern>
94   : I<opcode, OL, asmstr, itin> {
95   bits<5>  A;
96   bits<16> B;
97   
98   let Pattern = pattern;
99   
100   let Inst{6-10}  = A;
101   let Inst{11-15} = 0;
102   let Inst{16-31} = B;
103 }
104
105 // Currently we make the use/def reg distinction in ISel, not tablegen
106 class DForm_3<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
107               list<dag> pattern>
108   : DForm_1<opcode, OL, asmstr, itin, pattern>;
109
110 class DForm_4<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
111               list<dag> pattern>
112   : I<opcode, OL, asmstr, itin> {
113   bits<5>  B;
114   bits<5>  A;
115   bits<16> C;
116   
117   let Pattern = pattern;
118   
119   let Inst{6-10}  = A;
120   let Inst{11-15} = B;
121   let Inst{16-31} = C;
122 }
123               
124 class DForm_4_zero<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
125                    list<dag> pattern>
126   : DForm_1<opcode, OL, asmstr, itin, pattern> {
127   let A = 0;
128   let B = 0;
129   let C = 0;
130 }
131
132 class DForm_5<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin>
133   : I<opcode, OL, asmstr, itin> {
134   bits<3>  BF;
135   bits<1>  L;
136   bits<5>  RA;
137   bits<16> I;
138
139   let Inst{6-8}   = BF;
140   let Inst{9}     = 0;
141   let Inst{10}    = L;
142   let Inst{11-15} = RA;
143   let Inst{16-31} = I;
144 }
145
146 class DForm_5_ext<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin>
147   : DForm_5<opcode, OL, asmstr, itin> {
148   let L = PPC64;
149 }
150
151 class DForm_6<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin> 
152   : DForm_5<opcode, OL, asmstr, itin>;
153
154 class DForm_6_ext<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin>
155   : DForm_6<opcode, OL, asmstr, itin> {
156   let L = PPC64;
157 }
158
159 class DForm_8<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
160               list<dag> pattern>
161   : DForm_1<opcode, OL, asmstr, itin, pattern> {
162 }
163
164 class DForm_9<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
165               list<dag> pattern>
166   : DForm_1<opcode, OL, asmstr, itin, pattern> {
167 }
168
169 // 1.7.5 DS-Form
170 class DSForm_1<bits<6> opcode, bits<2> xo, dag OL, string asmstr,
171                InstrItinClass itin, list<dag> pattern>
172          : I<opcode, OL, asmstr, itin> {
173   bits<5>  RST;
174   bits<14> DS;
175   bits<5>  RA;
176
177   let Pattern = pattern;
178   
179   let Inst{6-10}  = RST;
180   let Inst{11-15} = RA;
181   let Inst{16-29} = DS;
182   let Inst{30-31} = xo;
183 }
184
185 class DSForm_2<bits<6> opcode, bits<2> xo, dag OL, string asmstr,
186                InstrItinClass itin, list<dag> pattern>
187   : DSForm_1<opcode, xo, OL, asmstr, itin, pattern>;
188
189 // 1.7.6 X-Form
190 class XForm_base_r3xo<bits<6> opcode, bits<10> xo, dag OL, string asmstr, 
191                       InstrItinClass itin, list<dag> pattern>
192   : I<opcode, OL, asmstr, itin> {
193   bits<5> RST;
194   bits<5> A;
195   bits<5> B;
196
197   let Pattern = pattern;
198
199   bit RC = 0;    // set by isDOT
200
201   let Inst{6-10}  = RST;
202   let Inst{11-15} = A;
203   let Inst{16-20} = B;
204   let Inst{21-30} = xo;
205   let Inst{31}    = RC;
206 }
207
208 // This is the same as XForm_base_r3xo, but the first two operands are swapped
209 // when code is emitted.
210 class XForm_base_r3xo_swapped
211         <bits<6> opcode, bits<10> xo, dag OL, string asmstr,
212         InstrItinClass itin> 
213   : I<opcode, OL, asmstr, itin> {
214   bits<5> A;
215   bits<5> RST;
216   bits<5> B;
217
218   bit RC = 0;    // set by isDOT
219
220   let Inst{6-10}  = RST;
221   let Inst{11-15} = A;
222   let Inst{16-20} = B;
223   let Inst{21-30} = xo;
224   let Inst{31}    = RC;
225 }
226
227
228 class XForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
229               InstrItinClass itin, list<dag> pattern> 
230   : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern>;
231
232 class XForm_6<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
233               InstrItinClass itin, list<dag> pattern> 
234   : XForm_base_r3xo_swapped<opcode, xo, OL, asmstr, itin> {
235   let Pattern = pattern;
236 }
237
238 class XForm_8<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
239               InstrItinClass itin, list<dag> pattern> 
240   : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern>;
241
242 class XForm_10<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
243                InstrItinClass itin, list<dag> pattern> 
244   : XForm_base_r3xo_swapped<opcode, xo, OL, asmstr, itin> {
245     let Pattern = pattern;
246 }
247
248 class XForm_11<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
249                InstrItinClass itin, list<dag> pattern> 
250   : XForm_base_r3xo_swapped<opcode, xo, OL, asmstr, itin> {
251   let B = 0;
252   let Pattern = pattern;
253 }
254
255 class XForm_16<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
256                InstrItinClass itin>
257          : I<opcode, OL, asmstr, itin> {
258   bits<3> BF;
259   bits<1> L; 
260   bits<5> RA;
261   bits<5> RB;
262   
263   let Inst{6-8}   = BF;
264   let Inst{9}     = 0;
265   let Inst{10}    = L;
266   let Inst{11-15} = RA;
267   let Inst{16-20} = RB;
268   let Inst{21-30} = xo;
269   let Inst{31}    = 0;
270 }
271
272 class XForm_16_ext<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
273                    InstrItinClass itin>
274   : XForm_16<opcode, xo, OL, asmstr, itin> {
275   let L = PPC64;
276 }
277
278 class XForm_17<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
279                InstrItinClass itin>
280          : I<opcode, OL, asmstr, itin> {
281   bits<3> BF;
282   bits<5> FRA;
283   bits<5> FRB;
284   
285   let Inst{6-8}   = BF;
286   let Inst{9-10}  = 0;
287   let Inst{11-15} = FRA;
288   let Inst{16-20} = FRB;
289   let Inst{21-30} = xo;
290   let Inst{31}    = 0;
291 }
292
293 class XForm_25<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
294                InstrItinClass itin, list<dag> pattern> 
295   : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern> {
296 }
297
298 class XForm_26<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
299                InstrItinClass itin, list<dag> pattern>
300   : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern> {
301   let A = 0;
302 }
303
304 class XForm_28<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
305                InstrItinClass itin, list<dag> pattern> 
306   : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern> {
307 }
308
309 // 1.7.7 XL-Form
310 class XLForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
311                InstrItinClass itin>
312     : I<opcode, OL, asmstr, itin> {
313   bits<3> CRD;
314   bits<2> CRDb;
315   bits<3> CRA;
316   bits<2> CRAb;
317   bits<3> CRB;
318   bits<2> CRBb;
319   
320   let Inst{6-8}   = CRD;
321   let Inst{9-10}  = CRDb;
322   let Inst{11-13} = CRA;
323   let Inst{14-15} = CRAb;
324   let Inst{16-18} = CRB;
325   let Inst{19-20} = CRBb;
326   let Inst{21-30} = xo;
327   let Inst{31}    = 0;
328 }
329
330 class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, dag OL, string asmstr, 
331                InstrItinClass itin, list<dag> pattern>
332     : I<opcode, OL, asmstr, itin> {
333   bits<5> BO;
334   bits<5> BI;
335   bits<2> BH;
336   
337   let Pattern = pattern;
338   
339   let Inst{6-10}  = BO;
340   let Inst{11-15} = BI;
341   let Inst{16-18} = 0;
342   let Inst{19-20} = BH;
343   let Inst{21-30} = xo;
344   let Inst{31}    = lk;
345 }
346
347 class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo,  bits<5> bi, bit lk,
348                   dag OL, string asmstr, InstrItinClass itin, list<dag> pattern>
349   : XLForm_2<opcode, xo, lk, OL, asmstr, itin, pattern> {
350   let BO = bo;
351   let BI = bi;
352   let BH = 0;
353 }
354
355 class XLForm_3<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
356                InstrItinClass itin>
357          : I<opcode, OL, asmstr, itin> {
358   bits<3> BF;
359   bits<3> BFA;
360   
361   let Inst{6-8}   = BF;
362   let Inst{9-10}  = 0;
363   let Inst{11-13} = BFA;
364   let Inst{14-15} = 0;
365   let Inst{16-20} = 0;
366   let Inst{21-30} = xo;
367   let Inst{31}    = 0;
368 }
369
370 // 1.7.8 XFX-Form
371 class XFXForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
372                 InstrItinClass itin>
373          : I<opcode, OL, asmstr, itin> {
374   bits<5>  RT;
375   bits<10> SPR;
376
377   let Inst{6-10}  = RT;
378   let Inst{11}    = SPR{4};
379   let Inst{12}    = SPR{3};
380   let Inst{13}    = SPR{2};
381   let Inst{14}    = SPR{1};
382   let Inst{15}    = SPR{0};
383   let Inst{16}    = SPR{9};
384   let Inst{17}    = SPR{8};
385   let Inst{18}    = SPR{7};
386   let Inst{19}    = SPR{6};
387   let Inst{20}    = SPR{5};
388   let Inst{21-30} = xo;
389   let Inst{31}    = 0;
390 }
391
392 class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr, 
393                    dag OL, string asmstr, InstrItinClass itin> 
394   : XFXForm_1<opcode, xo, OL, asmstr, itin> {
395   let SPR = spr;
396 }
397
398 class XFXForm_3<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
399                 InstrItinClass itin>
400          : I<opcode, OL, asmstr, itin> {
401   bits<5>  RT;
402    
403   let Inst{6-10}  = RT;
404   let Inst{11-20} = 0;
405   let Inst{21-30} = xo;
406   let Inst{31}    = 0;
407 }
408
409 class XFXForm_5<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
410                 InstrItinClass itin> 
411   : I<opcode, OL, asmstr, itin> {
412   bits<8>  FXM;
413   bits<5>  ST;
414    
415   let Inst{6-10}  = ST;
416   let Inst{11}    = 0;
417   let Inst{12-19} = FXM;
418   let Inst{20}    = 0;
419   let Inst{21-30} = xo;
420   let Inst{31}    = 0;
421 }
422
423 class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
424                  InstrItinClass itin> 
425   : I<opcode, OL, asmstr, itin> {
426   bits<5>  ST;
427   bits<8>  FXM;
428    
429   let Inst{6-10}  = ST;
430   let Inst{11}    = 1;
431   let Inst{12-19} = FXM;
432   let Inst{20}    = 0;
433   let Inst{21-30} = xo;
434   let Inst{31}    = 0;
435 }
436
437 class XFXForm_7<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
438                 InstrItinClass itin>
439   : XFXForm_1<opcode, xo, OL, asmstr, itin>;
440
441 class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr, 
442                     dag OL, string asmstr, InstrItinClass itin> 
443   : XFXForm_7<opcode, xo, OL, asmstr, itin> {
444   let SPR = spr;
445 }
446
447 // 1.7.10 XS-Form
448 class XSForm_1<bits<6> opcode, bits<9> xo, dag OL, string asmstr,
449                InstrItinClass itin>
450          : I<opcode, OL, asmstr, itin> {
451   bits<5> RS;
452   bits<5> A;
453   bits<6> SH;
454
455   bit RC = 0;    // set by isDOT
456
457   let Inst{6-10}  = RS;
458   let Inst{11-15} = A;
459   let Inst{16-20} = SH{1-5};
460   let Inst{21-29} = xo;
461   let Inst{30}    = SH{0};
462   let Inst{31}    = RC;
463 }
464
465 // 1.7.11 XO-Form
466 class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OL, string asmstr,
467                InstrItinClass itin, list<dag> pattern>
468          : I<opcode, OL, asmstr, itin> {
469   bits<5> RT;
470   bits<5> RA;
471   bits<5> RB;
472
473   let Pattern = pattern;
474
475   bit RC = 0;    // set by isDOT
476
477   let Inst{6-10}  = RT;
478   let Inst{11-15} = RA;
479   let Inst{16-20} = RB;
480   let Inst{21}    = oe;
481   let Inst{22-30} = xo;
482   let Inst{31}    = RC;  
483 }
484
485 class XOForm_3<bits<6> opcode, bits<9> xo, bit oe, 
486                dag OL, string asmstr, InstrItinClass itin, list<dag> pattern>
487   : XOForm_1<opcode, xo, oe, OL, asmstr, itin, pattern> {
488   let RB = 0;
489 }
490
491 // 1.7.12 A-Form
492 class AForm_1<bits<6> opcode, bits<5> xo, dag OL, string asmstr, 
493               InstrItinClass itin, list<dag> pattern>
494          : I<opcode, OL, asmstr, itin> {
495   bits<5> FRT;
496   bits<5> FRA;
497   bits<5> FRC;
498   bits<5> FRB;
499
500   let Pattern = pattern;
501
502   bit RC = 0;    // set by isDOT
503
504   let Inst{6-10}  = FRT;
505   let Inst{11-15} = FRA;
506   let Inst{16-20} = FRB;
507   let Inst{21-25} = FRC;
508   let Inst{26-30} = xo;
509   let Inst{31}    = RC;
510 }
511
512 class AForm_2<bits<6> opcode, bits<5> xo, dag OL, string asmstr,
513               InstrItinClass itin, list<dag> pattern>
514   : AForm_1<opcode, xo, OL, asmstr, itin, pattern> {
515   let FRC = 0;
516 }
517
518 class AForm_3<bits<6> opcode, bits<5> xo, dag OL, string asmstr,
519               InstrItinClass itin, list<dag> pattern> 
520   : AForm_1<opcode, xo, OL, asmstr, itin, pattern> {
521   let FRB = 0;
522 }
523
524 // 1.7.13 M-Form
525 class MForm_1<bits<6> opcode, dag OL, string asmstr,
526               InstrItinClass itin, list<dag> pattern>
527     : I<opcode, OL, asmstr, itin> {
528   bits<5> RA;
529   bits<5> RS;
530   bits<5> RB;
531   bits<5> MB;
532   bits<5> ME;
533
534   let Pattern = pattern;
535
536   bit RC = 0;    // set by isDOT
537
538   let Inst{6-10}  = RS;
539   let Inst{11-15} = RA;
540   let Inst{16-20} = RB;
541   let Inst{21-25} = MB;
542   let Inst{26-30} = ME;
543   let Inst{31}    = RC;
544 }
545
546 class MForm_2<bits<6> opcode, dag OL, string asmstr,
547               InstrItinClass itin, list<dag> pattern>
548   : MForm_1<opcode, OL, asmstr, itin, pattern> {
549 }
550
551 // 1.7.14 MD-Form
552 class MDForm_1<bits<6> opcode, bits<3> xo, dag OL, string asmstr,
553                InstrItinClass itin, list<dag> pattern>
554     : I<opcode, OL, asmstr, itin> {
555   bits<5> RS;
556   bits<5> RA;
557   bits<6> SH;
558   bits<6> MBE;
559
560   let Pattern = pattern;
561
562   bit RC = 0;    // set by isDOT
563
564   let Inst{6-10}  = RS;
565   let Inst{11-15} = RA;
566   let Inst{16-20} = SH{1-5};
567   let Inst{21-26} = MBE;
568   let Inst{27-29} = xo;
569   let Inst{30}    = SH{0};
570   let Inst{31}    = RC;
571 }
572
573 // E-1 VA-Form
574 class VAForm_1<bits<6> xo, dag OL, string asmstr,
575                InstrItinClass itin, list<dag> pattern>
576     : I<4, OL, asmstr, itin> {
577   bits<5> VD;
578   bits<5> VA;
579   bits<5> VB;
580   bits<5> VC;
581
582   let Pattern = pattern;
583   
584   let Inst{6-10}  = VD;
585   let Inst{11-15} = VA;
586   let Inst{16-20} = VB;
587   let Inst{21-25} = VC;
588   let Inst{26-31} = xo;
589 }
590
591 // E-2 VX-Form
592 class VXForm_1<bits<11> xo, dag OL, string asmstr,
593                InstrItinClass itin, list<dag> pattern>
594     : I<4, OL, asmstr, itin> {
595   bits<5> VD;
596   bits<5> VA;
597   bits<5> VB;
598   
599   let Pattern = pattern;
600   
601   let Inst{6-10}  = VD;
602   let Inst{11-15} = VA;
603   let Inst{16-20} = VB;
604   let Inst{21-31} = xo;
605 }
606
607 class VXForm_setzero<bits<11> xo, dag OL, string asmstr,
608                InstrItinClass itin, list<dag> pattern>
609     : VXForm_1<xo, OL, asmstr, itin, pattern> {
610   let VA = VD;
611   let VB = VD;
612 }
613
614
615 class VXForm_2<bits<11> xo, dag OL, string asmstr,
616                InstrItinClass itin, list<dag> pattern>
617     : I<4, OL, asmstr, itin> {
618   bits<5> VD;
619   bits<5> VB;
620   
621   let Pattern = pattern;
622   
623   let Inst{6-10}  = VD;
624   let Inst{11-15} = 0;
625   let Inst{16-20} = VB;
626   let Inst{21-31} = xo;
627 }
628
629 // E-4 VXR-Form
630 class VXRForm_1<bits<10> xo, bit rc, dag OL, string asmstr,
631                InstrItinClass itin, list<dag> pattern>
632     : I<4, OL, asmstr, itin> {
633   bits<5> VD;
634   bits<5> VA;
635   bits<5> VB;
636   
637   let Pattern = pattern;
638   
639   let Inst{6-10}  = VD;
640   let Inst{11-15} = VA;
641   let Inst{16-20} = VB;
642   let Inst{21}    = rc;
643   let Inst{22-31} = xo;
644 }
645
646 //===----------------------------------------------------------------------===//
647 def NoItin : InstrItinClass;
648 class Pseudo<dag OL, string asmstr, list<dag> pattern>
649     : I<0, OL, asmstr, NoItin> {
650   let PPC64 = 0;
651   let VMX = 0;
652   let Pattern = pattern;
653   let Inst{31-0} = 0;
654 }