Now that the ppc64 and vmx operands of I are always 0, forward substitute
[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, dag OL, string asmstr>
70          : I<opcode, OL, asmstr> {
71   bits<5>  BO;
72   bits<3>  CRNum;
73   bits<2>  BICode;
74   bits<14> BD;
75
76   let Inst{6-10}  = BO;
77   let Inst{11-13} = CRNum;
78   let Inst{14-15} = BICode;
79   let Inst{16-29} = BD;
80   let Inst{30}    = aa;
81   let Inst{31}    = lk;
82 }
83
84 class BForm_ext<bits<6> opcode, bit aa, bit lk, bits<5> bo, bits<2> bicode, 
85                 dag OL, string asmstr>
86   : BForm<opcode, aa, lk, OL, asmstr> {
87   let BO = bo;
88   let BICode = bicode;
89 }
90
91 // 1.7.4 D-Form
92 class DForm_base<bits<6> opcode, dag OL, string asmstr> : I<opcode, OL, asmstr>{
93   bits<5>  A;
94   bits<5>  B;
95   bits<16> C;
96   
97   let Inst{6-10}  = A;
98   let Inst{11-15} = B;
99   let Inst{16-31} = C;
100 }
101
102 class DForm_1<bits<6> opcode, dag OL, string asmstr> : I<opcode, OL, asmstr> {
103   bits<5>  A;
104   bits<16> C;
105   bits<5>  B;
106   
107   let Inst{6-10}  = A;
108   let Inst{11-15} = B;
109   let Inst{16-31} = C;
110 }
111
112 class DForm_2<bits<6> opcode, dag OL, string asmstr>
113   : DForm_base<opcode, OL, asmstr>;
114
115 class DForm_2_r0<bits<6> opcode, dag OL, string asmstr>
116   : I<opcode, OL, asmstr> {
117   bits<5>  A;
118   bits<16> B;
119   
120   let Inst{6-10}  = A;
121   let Inst{11-15} = 0;
122   let Inst{16-31} = B;
123 }
124
125 // Currently we make the use/def reg distinction in ISel, not tablegen
126 class DForm_3<bits<6> opcode, dag OL, string asmstr>
127   : DForm_1<opcode, OL, asmstr>;
128
129 class DForm_4<bits<6> opcode, dag OL, string asmstr> : I<opcode, OL, asmstr> {
130   bits<5>  B;
131   bits<5>  A;
132   bits<16> C;
133   
134   let Inst{6-10}  = A;
135   let Inst{11-15} = B;
136   let Inst{16-31} = C;
137 }
138               
139 class DForm_4_zero<bits<6> opcode, dag OL, string asmstr>
140   : DForm_1<opcode, OL, asmstr> {
141   let A = 0;
142   let B = 0;
143   let C = 0;
144 }
145
146 class DForm_5<bits<6> opcode, dag OL, string asmstr> : I<opcode, OL, asmstr> {
147   bits<3>  BF;
148   bits<1>  L;
149   bits<5>  RA;
150   bits<16> I;
151
152   let Inst{6-8}   = BF;
153   let Inst{9}     = 0;
154   let Inst{10}    = L;
155   let Inst{11-15} = RA;
156   let Inst{16-31} = I;
157 }
158
159 class DForm_5_ext<bits<6> opcode, dag OL, string asmstr>
160   : DForm_5<opcode, OL, asmstr> {
161   let L = PPC64;
162 }
163
164 class DForm_6<bits<6> opcode, dag OL, string asmstr> 
165   : DForm_5<opcode, OL, asmstr>;
166
167 class DForm_6_ext<bits<6> opcode, dag OL, string asmstr>
168   : DForm_6<opcode, OL, asmstr> {
169   let L = PPC64;
170 }
171
172 class DForm_8<bits<6> opcode, dag OL, string asmstr>
173   : DForm_1<opcode, OL, asmstr> {
174 }
175
176 class DForm_9<bits<6> opcode, dag OL, string asmstr>
177   : DForm_1<opcode, OL, asmstr> {
178 }
179
180 // 1.7.5 DS-Form
181 class DSForm_1<bits<6> opcode, bits<2> xo, dag OL, string asmstr>
182          : I<opcode, OL, asmstr> {
183   bits<5>  RST;
184   bits<14> DS;
185   bits<5>  RA;
186
187   let Inst{6-10}  = RST;
188   let Inst{11-15} = RA;
189   let Inst{16-29} = DS;
190   let Inst{30-31} = xo;
191 }
192
193 class DSForm_2<bits<6> opcode, bits<2> xo, dag OL, string asmstr>
194   : DSForm_1<opcode, xo, OL, asmstr>;
195
196 // 1.7.6 X-Form
197 class XForm_base_r3xo<bits<6> opcode, bits<10> xo, bit rc,
198                       dag OL, string asmstr> : I<opcode, OL, asmstr> {
199   bits<5> RST;
200   bits<5> A;
201   bits<5> B;
202
203   let Inst{6-10}  = RST;
204   let Inst{11-15} = A;
205   let Inst{16-20} = B;
206   let Inst{21-30} = xo;
207   let Inst{31}    = rc;
208 }
209
210 // This is the same as XForm_base_r3xo, but the first two operands are swapped
211 // when code is emitted.
212 class XForm_base_r3xo_swapped
213         <bits<6> opcode, bits<10> xo, bit rc, dag OL, string asmstr> 
214   : I<opcode, OL, asmstr> {
215   bits<5> A;
216   bits<5> RST;
217   bits<5> B;
218
219   let Inst{6-10}  = RST;
220   let Inst{11-15} = A;
221   let Inst{16-20} = B;
222   let Inst{21-30} = xo;
223   let Inst{31}    = rc;
224 }
225
226
227 class XForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr> 
228   : XForm_base_r3xo<opcode, xo, 0, OL, asmstr>;
229
230 class XForm_6<bits<6> opcode, bits<10> xo, bit rc, dag OL, string asmstr> 
231   : XForm_base_r3xo_swapped<opcode, xo, rc, OL, asmstr>;
232
233 class XForm_8<bits<6> opcode, bits<10> xo, dag OL, string asmstr> 
234   : XForm_base_r3xo<opcode, xo, 0, OL, asmstr>;
235
236 class XForm_10<bits<6> opcode, bits<10> xo, bit rc, dag OL, string asmstr> 
237   : XForm_base_r3xo_swapped<opcode, xo, rc, OL, asmstr> {
238 }
239
240 class XForm_11<bits<6> opcode, bits<10> xo, bit rc, dag OL, string asmstr> 
241   : XForm_base_r3xo_swapped<opcode, xo, rc, OL, asmstr> {
242   let B = 0;
243 }
244
245 class XForm_16<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
246          : I<opcode, OL, asmstr> {
247   bits<3> BF;
248   bits<1> L; 
249   bits<5> RA;
250   bits<5> RB;
251   
252   let Inst{6-8}   = BF;
253   let Inst{9}     = 0;
254   let Inst{10}    = L;
255   let Inst{11-15} = RA;
256   let Inst{16-20} = RB;
257   let Inst{21-30} = xo;
258   let Inst{31}    = 0;
259 }
260
261 class XForm_16_ext<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
262   : XForm_16<opcode, xo, OL, asmstr> {
263   let L = PPC64;
264 }
265
266 class XForm_17<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
267          : I<opcode, OL, asmstr> {
268   bits<3> BF;
269   bits<5> FRA;
270   bits<5> FRB;
271   
272   let Inst{6-8}   = BF;
273   let Inst{9-10}  = 0;
274   let Inst{11-15} = FRA;
275   let Inst{16-20} = FRB;
276   let Inst{21-30} = xo;
277   let Inst{31}    = 0;
278 }
279
280 class XForm_25<bits<6> opcode, bits<10> xo, dag OL, string asmstr> 
281   : XForm_base_r3xo<opcode, xo, 0, OL, asmstr> {
282 }
283
284 class XForm_26<bits<6> opcode, bits<10> xo, bit rc, dag OL, string asmstr> 
285   : XForm_base_r3xo<opcode, xo, rc, OL, asmstr> {
286   let A = 0;
287 }
288
289 class XForm_28<bits<6> opcode, bits<10> xo, dag OL, string asmstr> 
290   : XForm_base_r3xo<opcode, xo, 0, OL, asmstr> {
291 }
292
293 // 1.7.7 XL-Form
294 class XLForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
295          : I<opcode, OL, asmstr> {
296   bits<3> CRD;
297   bits<2> CRDb;
298   bits<3> CRA;
299   bits<2> CRAb;
300   bits<3> CRB;
301   bits<2> CRBb;
302   
303   let Inst{6-8}   = CRD;
304   let Inst{9-10}  = CRDb;
305   let Inst{11-13} = CRA;
306   let Inst{14-15} = CRAb;
307   let Inst{16-18} = CRB;
308   let Inst{19-20} = CRBb;
309   let Inst{21-30} = xo;
310   let Inst{31}    = 0;
311 }
312
313 class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, 
314                dag OL, string asmstr> : I<opcode, OL, asmstr> {
315   bits<5> BO;
316   bits<5> BI;
317   bits<2> BH;
318   
319   let Inst{6-10}  = BO;
320   let Inst{11-15} = BI;
321   let Inst{16-18} = 0;
322   let Inst{19-20} = BH;
323   let Inst{21-30} = xo;
324   let Inst{31}    = lk;
325 }
326
327 class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo, 
328                    bits<5> bi, bit lk, dag OL, string asmstr>
329   : XLForm_2<opcode, xo, lk, OL, asmstr> {
330   let BO = bo;
331   let BI = bi;
332   let BH = 0;
333 }
334
335 class XLForm_3<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
336          : I<opcode, OL, asmstr> {
337   bits<3> BF;
338   bits<3> BFA;
339   
340   let Inst{6-8}   = BF;
341   let Inst{9-10}  = 0;
342   let Inst{11-13} = BFA;
343   let Inst{14-15} = 0;
344   let Inst{16-20} = 0;
345   let Inst{21-30} = xo;
346   let Inst{31}    = 0;
347 }
348
349 // 1.7.8 XFX-Form
350 class XFXForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
351          : I<opcode, OL, asmstr> {
352   bits<5>  RT;
353   bits<10> SPR;
354
355   let Inst{6-10}  = RT;
356   let Inst{11-20} = SPR;
357   let Inst{21-30} = xo;
358   let Inst{31}    = 0;
359 }
360
361 class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr, 
362                    dag OL, string asmstr> 
363   : XFXForm_1<opcode, xo, OL, asmstr> {
364   let SPR = spr;
365 }
366
367 class XFXForm_3<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
368          : I<opcode, OL, asmstr> {
369   bits<5>  RT;
370    
371   let Inst{6-10}  = RT;
372   let Inst{11-20} = 0;
373   let Inst{21-30} = xo;
374   let Inst{31}    = 0;
375 }
376
377 class XFXForm_5<bits<6> opcode, bit mfcrf, bits<10> xo, 
378                 dag OL, string asmstr> : I<opcode, OL, asmstr> {
379   bits<8>  FXM;
380   bits<5>  ST;
381    
382   let Inst{6-10}  = ST;
383   let Inst{11}    = mfcrf;
384   let Inst{12-19} = FXM;
385   let Inst{20}    = 0;
386   let Inst{21-30} = xo;
387   let Inst{31}    = 0;
388 }
389
390 class XFXForm_7<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
391   : XFXForm_1<opcode, xo, OL, asmstr>;
392
393 class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr, 
394                     dag OL, string asmstr> 
395   : XFXForm_7<opcode, xo, OL, asmstr> {
396   let SPR = spr;
397 }
398
399 // 1.7.10 XS-Form
400 class XSForm_1<bits<6> opcode, bits<9> xo, bit rc, dag OL, string asmstr>
401          : I<opcode, OL, asmstr> {
402   bits<5> RS;
403   bits<5> A;
404   bits<6> SH;
405
406   let Inst{6-10}  = RS;
407   let Inst{11-15} = A;
408   let Inst{16-20} = SH{1-5};
409   let Inst{21-29} = xo;
410   let Inst{30}    = SH{0};
411   let Inst{31}    = rc;
412 }
413
414 // 1.7.11 XO-Form
415 class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, bit rc, 
416                dag OL, string asmstr> : I<opcode, OL, asmstr> {
417   bits<5> RT;
418   bits<5> RA;
419   bits<5> RB;
420
421   let Inst{6-10}  = RT;
422   let Inst{11-15} = RA;
423   let Inst{16-20} = RB;
424   let Inst{21}    = oe;
425   let Inst{22-30} = xo;
426   let Inst{31}    = rc;  
427 }
428
429 class XOForm_1r<bits<6> opcode, bits<9> xo, bit oe, bit rc,
430                dag OL, string asmstr>
431   : XOForm_1<opcode, xo, oe, rc, OL, asmstr> {
432   let Inst{11-15} = RB;
433   let Inst{16-20} = RA;
434 }
435
436 class XOForm_3<bits<6> opcode, bits<9> xo, bit oe, bit rc, 
437                dag OL, string asmstr>
438   : XOForm_1<opcode, xo, oe, rc, OL, asmstr> {
439   let RB = 0;
440 }
441
442 // 1.7.12 A-Form
443 class AForm_1<bits<6> opcode, bits<5> xo, bit rc, dag OL, string asmstr>
444          : I<opcode, OL, asmstr> {
445   bits<5> FRT;
446   bits<5> FRA;
447   bits<5> FRC;
448   bits<5> FRB;
449
450   let Inst{6-10}  = FRT;
451   let Inst{11-15} = FRA;
452   let Inst{16-20} = FRB;
453   let Inst{21-25} = FRC;
454   let Inst{26-30} = xo;
455   let Inst{31}    = rc;
456 }
457
458 class AForm_2<bits<6> opcode, bits<5> xo, bit rc, dag OL, string asmstr> 
459   : AForm_1<opcode, xo, rc, OL, asmstr> {
460   let FRC = 0;
461 }
462
463 class AForm_3<bits<6> opcode, bits<5> xo, bit rc, dag OL,
464               string asmstr> 
465   : AForm_1<opcode, xo, rc, OL, asmstr> {
466   let FRB = 0;
467 }
468
469 // 1.7.13 M-Form
470 class MForm_1<bits<6> opcode, bit rc, dag OL, string asmstr>
471          : I<opcode, OL, asmstr> {
472   bits<5> RA;
473   bits<5> RS;
474   bits<5> RB;
475   bits<5> MB;
476   bits<5> ME;
477
478   let Inst{6-10}  = RS;
479   let Inst{11-15} = RA;
480   let Inst{16-20} = RB;
481   let Inst{21-25} = MB;
482   let Inst{26-30} = ME;
483   let Inst{31}    = rc;
484 }
485
486 class MForm_2<bits<6> opcode, bit rc, dag OL, string asmstr>
487   : MForm_1<opcode, rc, OL, asmstr> {
488 }
489
490 // 1.7.14 MD-Form
491 class MDForm_1<bits<6> opcode, bits<3> xo, bit rc,
492                dag OL, string asmstr> : I<opcode, OL, asmstr> {
493   bits<5> RS;
494   bits<5> RA;
495   bits<6> SH;
496   bits<6> MBE;
497
498   let Inst{6-10}  = RS;
499   let Inst{11-15} = RA;
500   let Inst{16-20} = SH{1-5};
501   let Inst{21-26} = MBE;
502   let Inst{27-29} = xo;
503   let Inst{30}    = SH{0};
504   let Inst{31}    = rc;
505 }
506
507 //===----------------------------------------------------------------------===//
508
509 class Pseudo<dag OL, string asmstr> : I<0, OL, asmstr> {
510   let PPC64 = 0;
511   let VMX = 0;
512
513   let Inst{31-0} = 0;
514 }