add patterns to the addi/addis/mulli etc instructions. Define predicates
[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 class Format<bits<5> val> {
14   bits<5> Value = val;
15 }
16
17 def Pseudo: Format<0>;
18 def Gpr : Format<1>;
19 def Gpr0 : Format<2>;
20 def Simm16 : Format<3>;
21 def PCRelimm24 : Format<5>;
22 def Imm24 : Format<6>;
23 def Imm5 : Format<7>;
24 def PCRelimm14 : Format<8>;
25 def Imm14 : Format<9>;
26 def Imm2 : Format<10>;
27 def Crf : Format<11>;
28 def Imm3 : Format<12>;
29 def Imm1 : Format<13>;
30 def Fpr : Format<14>;
31 def Imm4 : Format<15>;
32 def Imm8 : Format<16>;
33 def Disimm16 : Format<17>;
34 def Disimm14 : Format<18>;
35 def Spr : Format<19>;
36 def Sgr : Format<20>;
37 def Imm15 : Format<21>;
38 def Vpr : Format<22>;
39 def Imm6 : Format<23>;
40
41 //===----------------------------------------------------------------------===//
42 //
43 // PowerPC instruction formats
44
45 class I<bits<6> opcode, dag OL, string asmstr> : Instruction {
46   field bits<32> Inst;
47
48   bit PPC64 = 0;  // Default value, override with isPPC64
49   bit VMX = 0;    // Default value, override with isVMX
50
51   let Name = "";
52   let Namespace = "PPC";
53   let Inst{0-5} = opcode;
54   let OperandList = OL;
55   let AsmString = asmstr;
56 }
57
58 // 1.7.1 I-Form
59 class IForm<bits<6> opcode, bit aa, bit lk, dag OL, string asmstr>
60          : I<opcode, OL, asmstr> {
61   bits<24> LI;
62
63   let Inst{6-29}  = LI;
64   let Inst{30}    = aa;
65   let Inst{31}    = lk;
66 }
67
68 // 1.7.2 B-Form
69 class BForm<bits<6> opcode, bit aa, bit lk, bits<5> bo, bits<2> bicode, dag OL, 
70             string asmstr>
71   : I<opcode, OL, asmstr> {
72   bits<3>  CR;
73   bits<14> BD;
74
75   let Inst{6-10}  = bo;
76   let Inst{11-13} = CR;
77   let Inst{14-15} = bicode;
78   let Inst{16-29} = BD;
79   let Inst{30}    = aa;
80   let Inst{31}    = lk;
81 }
82
83 // 1.7.4 D-Form
84 class DForm_base<bits<6> opcode, dag OL, string asmstr, list<dag> pattern>
85    : I<opcode, OL, asmstr> {
86   let Pattern = pattern;
87   bits<5>  A;
88   bits<5>  B;
89   bits<16> C;
90   
91   let Inst{6-10}  = A;
92   let Inst{11-15} = B;
93   let Inst{16-31} = C;
94 }
95
96 class DForm_1<bits<6> opcode, dag OL, string asmstr>
97    : I<opcode, OL, asmstr> {
98   bits<5>  A;
99   bits<16> C;
100   bits<5>  B;
101   
102   let Inst{6-10}  = A;
103   let Inst{11-15} = B;
104   let Inst{16-31} = C;
105 }
106
107 class DForm_2<bits<6> opcode, dag OL, string asmstr, list<dag> pattern>
108   : DForm_base<opcode, OL, asmstr, pattern>;
109
110 class DForm_2_r0<bits<6> opcode, dag OL, string asmstr, list<dag> pattern>
111   : I<opcode, OL, asmstr> {
112   bits<5>  A;
113   bits<16> B;
114   
115   let Pattern = pattern;
116   
117   let Inst{6-10}  = A;
118   let Inst{11-15} = 0;
119   let Inst{16-31} = B;
120 }
121
122 // Currently we make the use/def reg distinction in ISel, not tablegen
123 class DForm_3<bits<6> opcode, dag OL, string asmstr>
124   : DForm_1<opcode, OL, asmstr>;
125
126 class DForm_4<bits<6> opcode, dag OL, string asmstr> : I<opcode, OL, asmstr> {
127   bits<5>  B;
128   bits<5>  A;
129   bits<16> C;
130   
131   let Inst{6-10}  = A;
132   let Inst{11-15} = B;
133   let Inst{16-31} = C;
134 }
135               
136 class DForm_4_zero<bits<6> opcode, dag OL, string asmstr>
137   : DForm_1<opcode, OL, asmstr> {
138   let A = 0;
139   let B = 0;
140   let C = 0;
141 }
142
143 class DForm_5<bits<6> opcode, dag OL, string asmstr> : I<opcode, OL, asmstr> {
144   bits<3>  BF;
145   bits<1>  L;
146   bits<5>  RA;
147   bits<16> I;
148
149   let Inst{6-8}   = BF;
150   let Inst{9}     = 0;
151   let Inst{10}    = L;
152   let Inst{11-15} = RA;
153   let Inst{16-31} = I;
154 }
155
156 class DForm_5_ext<bits<6> opcode, dag OL, string asmstr>
157   : DForm_5<opcode, OL, asmstr> {
158   let L = PPC64;
159 }
160
161 class DForm_6<bits<6> opcode, dag OL, string asmstr> 
162   : DForm_5<opcode, OL, asmstr>;
163
164 class DForm_6_ext<bits<6> opcode, dag OL, string asmstr>
165   : DForm_6<opcode, OL, asmstr> {
166   let L = PPC64;
167 }
168
169 class DForm_8<bits<6> opcode, dag OL, string asmstr>
170   : DForm_1<opcode, OL, asmstr> {
171 }
172
173 class DForm_9<bits<6> opcode, dag OL, string asmstr>
174   : DForm_1<opcode, OL, asmstr> {
175 }
176
177 // 1.7.5 DS-Form
178 class DSForm_1<bits<6> opcode, bits<2> xo, dag OL, string asmstr>
179          : I<opcode, OL, asmstr> {
180   bits<5>  RST;
181   bits<14> DS;
182   bits<5>  RA;
183
184   let Inst{6-10}  = RST;
185   let Inst{11-15} = RA;
186   let Inst{16-29} = DS;
187   let Inst{30-31} = xo;
188 }
189
190 class DSForm_2<bits<6> opcode, bits<2> xo, dag OL, string asmstr>
191   : DSForm_1<opcode, xo, OL, asmstr>;
192
193 // 1.7.6 X-Form
194 class XForm_base_r3xo<bits<6> opcode, bits<10> xo, 
195                       dag OL, string asmstr> : I<opcode, OL, asmstr> {
196   bits<5> RST;
197   bits<5> A;
198   bits<5> B;
199
200   bit RC = 0;    // set by isDOT
201
202   let Inst{6-10}  = RST;
203   let Inst{11-15} = A;
204   let Inst{16-20} = B;
205   let Inst{21-30} = xo;
206   let Inst{31}    = RC;
207 }
208
209 // This is the same as XForm_base_r3xo, but the first two operands are swapped
210 // when code is emitted.
211 class XForm_base_r3xo_swapped
212         <bits<6> opcode, bits<10> xo, dag OL, string asmstr> 
213   : I<opcode, OL, asmstr> {
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   : XForm_base_r3xo<opcode, xo, OL, asmstr>;
230
231 class XForm_6<bits<6> opcode, bits<10> xo, dag OL, string asmstr, 
232               list<dag> pattern> 
233   : XForm_base_r3xo_swapped<opcode, xo, OL, asmstr> {
234   let Pattern = pattern;
235 }
236
237 class XForm_8<bits<6> opcode, bits<10> xo, dag OL, string asmstr> 
238   : XForm_base_r3xo<opcode, xo, OL, asmstr>;
239
240 class XForm_10<bits<6> opcode, bits<10> xo, dag OL, string asmstr> 
241   : XForm_base_r3xo_swapped<opcode, xo, OL, asmstr> {
242 }
243
244 class XForm_11<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
245                list<dag> pattern> 
246   : XForm_base_r3xo_swapped<opcode, xo, OL, asmstr> {
247   let B = 0;
248   let Pattern = pattern;
249 }
250
251 class XForm_16<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
252          : I<opcode, OL, asmstr> {
253   bits<3> BF;
254   bits<1> L; 
255   bits<5> RA;
256   bits<5> RB;
257   
258   let Inst{6-8}   = BF;
259   let Inst{9}     = 0;
260   let Inst{10}    = L;
261   let Inst{11-15} = RA;
262   let Inst{16-20} = RB;
263   let Inst{21-30} = xo;
264   let Inst{31}    = 0;
265 }
266
267 class XForm_16_ext<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
268   : XForm_16<opcode, xo, OL, asmstr> {
269   let L = PPC64;
270 }
271
272 class XForm_17<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
273          : I<opcode, OL, asmstr> {
274   bits<3> BF;
275   bits<5> FRA;
276   bits<5> FRB;
277   
278   let Inst{6-8}   = BF;
279   let Inst{9-10}  = 0;
280   let Inst{11-15} = FRA;
281   let Inst{16-20} = FRB;
282   let Inst{21-30} = xo;
283   let Inst{31}    = 0;
284 }
285
286 class XForm_25<bits<6> opcode, bits<10> xo, dag OL, string asmstr> 
287   : XForm_base_r3xo<opcode, xo, OL, asmstr> {
288 }
289
290 class XForm_26<bits<6> opcode, bits<10> xo, dag OL, string asmstr> 
291   : XForm_base_r3xo<opcode, xo, OL, asmstr> {
292   let A = 0;
293 }
294
295 class XForm_28<bits<6> opcode, bits<10> xo, dag OL, string asmstr> 
296   : XForm_base_r3xo<opcode, xo, OL, asmstr> {
297 }
298
299 // 1.7.7 XL-Form
300 class XLForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
301          : I<opcode, OL, asmstr> {
302   bits<3> CRD;
303   bits<2> CRDb;
304   bits<3> CRA;
305   bits<2> CRAb;
306   bits<3> CRB;
307   bits<2> CRBb;
308   
309   let Inst{6-8}   = CRD;
310   let Inst{9-10}  = CRDb;
311   let Inst{11-13} = CRA;
312   let Inst{14-15} = CRAb;
313   let Inst{16-18} = CRB;
314   let Inst{19-20} = CRBb;
315   let Inst{21-30} = xo;
316   let Inst{31}    = 0;
317 }
318
319 class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, 
320                dag OL, string asmstr> : I<opcode, OL, asmstr> {
321   bits<5> BO;
322   bits<5> BI;
323   bits<2> BH;
324   
325   let Inst{6-10}  = BO;
326   let Inst{11-15} = BI;
327   let Inst{16-18} = 0;
328   let Inst{19-20} = BH;
329   let Inst{21-30} = xo;
330   let Inst{31}    = lk;
331 }
332
333 class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo, 
334                    bits<5> bi, bit lk, dag OL, string asmstr>
335   : XLForm_2<opcode, xo, lk, OL, asmstr> {
336   let BO = bo;
337   let BI = bi;
338   let BH = 0;
339 }
340
341 class XLForm_3<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
342          : I<opcode, OL, asmstr> {
343   bits<3> BF;
344   bits<3> BFA;
345   
346   let Inst{6-8}   = BF;
347   let Inst{9-10}  = 0;
348   let Inst{11-13} = BFA;
349   let Inst{14-15} = 0;
350   let Inst{16-20} = 0;
351   let Inst{21-30} = xo;
352   let Inst{31}    = 0;
353 }
354
355 // 1.7.8 XFX-Form
356 class XFXForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
357          : I<opcode, OL, asmstr> {
358   bits<5>  RT;
359   bits<10> SPR;
360
361   let Inst{6-10}  = RT;
362   let Inst{11-20} = SPR;
363   let Inst{21-30} = xo;
364   let Inst{31}    = 0;
365 }
366
367 class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr, 
368                    dag OL, string asmstr> 
369   : XFXForm_1<opcode, xo, OL, asmstr> {
370   let SPR = spr;
371 }
372
373 class XFXForm_3<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
374          : I<opcode, OL, asmstr> {
375   bits<5>  RT;
376    
377   let Inst{6-10}  = RT;
378   let Inst{11-20} = 0;
379   let Inst{21-30} = xo;
380   let Inst{31}    = 0;
381 }
382
383 class XFXForm_5<bits<6> opcode, bits<10> xo, dag OL, string asmstr> 
384   : I<opcode, OL, asmstr> {
385   bits<8>  FXM;
386   bits<5>  ST;
387    
388   let Inst{6-10}  = ST;
389   let Inst{11}    = 0;
390   let Inst{12-19} = FXM;
391   let Inst{20}    = 0;
392   let Inst{21-30} = xo;
393   let Inst{31}    = 0;
394 }
395
396 class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OL, string asmstr> 
397   : I<opcode, OL, asmstr> {
398   bits<5>  ST;
399   bits<8>  FXM;
400    
401   let Inst{6-10}  = ST;
402   let Inst{11}    = 1;
403   let Inst{12-19} = FXM;
404   let Inst{20}    = 0;
405   let Inst{21-30} = xo;
406   let Inst{31}    = 0;
407 }
408
409
410 class XFXForm_7<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
411   : XFXForm_1<opcode, xo, OL, asmstr>;
412
413 class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr, 
414                     dag OL, string asmstr> 
415   : XFXForm_7<opcode, xo, OL, asmstr> {
416   let SPR = spr;
417 }
418
419 // 1.7.10 XS-Form
420 class XSForm_1<bits<6> opcode, bits<9> xo, dag OL, string asmstr>
421          : I<opcode, OL, asmstr> {
422   bits<5> RS;
423   bits<5> A;
424   bits<6> SH;
425
426   bit RC = 0;    // set by isDOT
427
428   let Inst{6-10}  = RS;
429   let Inst{11-15} = A;
430   let Inst{16-20} = SH{1-5};
431   let Inst{21-29} = xo;
432   let Inst{30}    = SH{0};
433   let Inst{31}    = RC;
434 }
435
436 // 1.7.11 XO-Form
437 class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OL, string asmstr,
438                list<dag> pattern>
439          : I<opcode, OL, asmstr> {
440   bits<5> RT;
441   bits<5> RA;
442   bits<5> RB;
443
444   let Pattern = pattern;
445
446   bit RC = 0;    // set by isDOT
447
448   let Inst{6-10}  = RT;
449   let Inst{11-15} = RA;
450   let Inst{16-20} = RB;
451   let Inst{21}    = oe;
452   let Inst{22-30} = xo;
453   let Inst{31}    = RC;  
454 }
455
456 class XOForm_3<bits<6> opcode, bits<9> xo, bit oe, 
457                dag OL, string asmstr, list<dag> pattern>
458   : XOForm_1<opcode, xo, oe, OL, asmstr, pattern> {
459   let RB = 0;
460 }
461
462 // 1.7.12 A-Form
463 class AForm_1<bits<6> opcode, bits<5> xo, dag OL, string asmstr>
464          : I<opcode, OL, asmstr> {
465   bits<5> FRT;
466   bits<5> FRA;
467   bits<5> FRC;
468   bits<5> FRB;
469
470   bit RC = 0;    // set by isDOT
471
472   let Inst{6-10}  = FRT;
473   let Inst{11-15} = FRA;
474   let Inst{16-20} = FRB;
475   let Inst{21-25} = FRC;
476   let Inst{26-30} = xo;
477   let Inst{31}    = RC;
478 }
479
480 class AForm_2<bits<6> opcode, bits<5> xo, dag OL, string asmstr> 
481   : AForm_1<opcode, xo, OL, asmstr> {
482   let FRC = 0;
483 }
484
485 class AForm_3<bits<6> opcode, bits<5> xo, dag OL, string asmstr> 
486   : AForm_1<opcode, xo, OL, asmstr> {
487   let FRB = 0;
488 }
489
490 // 1.7.13 M-Form
491 class MForm_1<bits<6> opcode, dag OL, string asmstr> : I<opcode, OL, asmstr> {
492   bits<5> RA;
493   bits<5> RS;
494   bits<5> RB;
495   bits<5> MB;
496   bits<5> ME;
497
498   bit RC = 0;    // set by isDOT
499
500   let Inst{6-10}  = RS;
501   let Inst{11-15} = RA;
502   let Inst{16-20} = RB;
503   let Inst{21-25} = MB;
504   let Inst{26-30} = ME;
505   let Inst{31}    = RC;
506 }
507
508 class MForm_2<bits<6> opcode, dag OL, string asmstr>
509   : MForm_1<opcode, OL, asmstr> {
510 }
511
512 // 1.7.14 MD-Form
513 class MDForm_1<bits<6> opcode, bits<3> xo, dag OL, string asmstr>
514          : I<opcode, OL, asmstr> {
515   bits<5> RS;
516   bits<5> RA;
517   bits<6> SH;
518   bits<6> MBE;
519
520   bit RC = 0;    // set by isDOT
521
522   let Inst{6-10}  = RS;
523   let Inst{11-15} = RA;
524   let Inst{16-20} = SH{1-5};
525   let Inst{21-26} = MBE;
526   let Inst{27-29} = xo;
527   let Inst{30}    = SH{0};
528   let Inst{31}    = RC;
529 }
530
531 //===----------------------------------------------------------------------===//
532
533 class Pseudo<dag OL, string asmstr> : I<0, OL, asmstr> {
534   let PPC64 = 0;
535   let VMX = 0;
536
537   let Inst{31-0} = 0;
538 }