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