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