no need to explicitly clear these fields.
[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 is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 // 
8 //===----------------------------------------------------------------------===//
9
10 //===----------------------------------------------------------------------===//
11 //
12 // PowerPC instruction formats
13
14 class I<bits<6> opcode, dag OOL, dag IOL, string asmstr, InstrItinClass itin>
15         : Instruction {
16   field bits<32> Inst;
17
18   bit PPC64 = 0;  // Default value, override with isPPC64
19
20   let Namespace = "PPC";
21   let Inst{0-5} = opcode;
22   let OutOperandList = OOL;
23   let InOperandList = IOL;
24   let AsmString = asmstr;
25   let Itinerary = itin;
26   
27   /// These fields correspond to the fields in PPCInstrInfo.h.  Any changes to
28   /// these must be reflected there!  See comments there for what these are.
29   bits<1> PPC970_First = 0;
30   bits<1> PPC970_Single = 0;
31   bits<1> PPC970_Cracked = 0;
32   bits<3> PPC970_Unit = 0;
33 }
34
35 class PPC970_DGroup_First   { bits<1> PPC970_First = 1;  }
36 class PPC970_DGroup_Single  { bits<1> PPC970_Single = 1; }
37 class PPC970_DGroup_Cracked { bits<1> PPC970_Cracked = 1; }
38 class PPC970_MicroCode;
39
40 class PPC970_Unit_Pseudo   { bits<3> PPC970_Unit = 0;   }
41 class PPC970_Unit_FXU      { bits<3> PPC970_Unit = 1;   }
42 class PPC970_Unit_LSU      { bits<3> PPC970_Unit = 2;   }
43 class PPC970_Unit_FPU      { bits<3> PPC970_Unit = 3;   }
44 class PPC970_Unit_CRU      { bits<3> PPC970_Unit = 4;   }
45 class PPC970_Unit_VALU     { bits<3> PPC970_Unit = 5;   }
46 class PPC970_Unit_VPERM    { bits<3> PPC970_Unit = 6;   }
47 class PPC970_Unit_BRU      { bits<3> PPC970_Unit = 7;   }
48
49
50 // 1.7.1 I-Form
51 class IForm<bits<6> opcode, bit aa, bit lk, dag OOL, dag IOL, string asmstr,
52             InstrItinClass itin, list<dag> pattern>
53          : I<opcode, OOL, IOL, asmstr, itin> {
54   let Pattern = pattern;
55   bits<24> LI;
56
57   let Inst{6-29}  = LI;
58   let Inst{30}    = aa;
59   let Inst{31}    = lk;
60 }
61
62 // 1.7.2 B-Form
63 class BForm<bits<6> opcode, bit aa, bit lk, dag OOL, dag IOL, string asmstr>
64   : I<opcode, OOL, IOL, asmstr, BrB> {
65   bits<7> BIBO;  // 2 bits of BI and 5 bits of BO.
66   bits<3>  CR;
67   bits<14> BD;
68
69   bits<5> BI;
70   let BI{0-1} = BIBO{5-6};
71   let BI{2-4} = CR{0-2};
72
73   let Inst{6-10}  = BIBO{4-0};
74   let Inst{11-15} = BI;
75   let Inst{16-29} = BD;
76   let Inst{30}    = aa;
77   let Inst{31}    = lk;
78 }
79
80
81 // 1.7.4 D-Form
82 class DForm_base<bits<6> opcode, dag OOL, dag IOL, string asmstr,
83                  InstrItinClass itin, list<dag> pattern> 
84   : I<opcode, OOL, IOL, asmstr, itin> {
85   bits<5>  A;
86   bits<5>  B;
87   bits<16> C;
88
89   let Pattern = pattern;
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 OOL, dag IOL, string asmstr,
97               InstrItinClass itin, list<dag> pattern>
98   : I<opcode, OOL, IOL, asmstr, itin> {
99   bits<5>  A;
100   bits<16> C;
101   bits<5>  B;
102
103   let Pattern = pattern;
104   
105   let Inst{6-10}  = A;
106   let Inst{11-15} = B;
107   let Inst{16-31} = C;
108 }
109
110 class DForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr,
111               InstrItinClass itin, list<dag> pattern>
112   : DForm_base<opcode, OOL, IOL, asmstr, itin, pattern>;
113
114 class DForm_2_r0<bits<6> opcode, dag OOL, dag IOL, string asmstr,
115                  InstrItinClass itin, list<dag> pattern>
116   : I<opcode, OOL, IOL, asmstr, itin> {
117   bits<5>  A;
118   bits<16> B;
119   
120   let Pattern = pattern;
121   
122   let Inst{6-10}  = A;
123   let Inst{11-15} = 0;
124   let Inst{16-31} = B;
125 }
126
127 class DForm_4<bits<6> opcode, dag OOL, dag IOL, string asmstr,
128               InstrItinClass itin, list<dag> pattern>
129   : I<opcode, OOL, IOL, asmstr, itin> {
130   bits<5>  B;
131   bits<5>  A;
132   bits<16> C;
133   
134   let Pattern = pattern;
135   
136   let Inst{6-10}  = A;
137   let Inst{11-15} = B;
138   let Inst{16-31} = C;
139 }
140               
141 class DForm_4_zero<bits<6> opcode, dag OOL, dag IOL, string asmstr,
142                    InstrItinClass itin, list<dag> pattern>
143   : DForm_1<opcode, OOL, IOL, asmstr, itin, pattern> {
144   let A = 0;
145   let B = 0;
146   let C = 0;
147 }
148
149 class DForm_5<bits<6> opcode, dag OOL, dag IOL, string asmstr,
150               InstrItinClass itin>
151   : I<opcode, OOL, IOL, asmstr, itin> {
152   bits<3>  BF;
153   bits<1>  L;
154   bits<5>  RA;
155   bits<16> I;
156
157   let Inst{6-8}   = BF;
158   let Inst{9}     = 0;
159   let Inst{10}    = L;
160   let Inst{11-15} = RA;
161   let Inst{16-31} = I;
162 }
163
164 class DForm_5_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr,
165                   InstrItinClass itin>
166   : DForm_5<opcode, OOL, IOL, asmstr, itin> {
167   let L = PPC64;
168 }
169
170 class DForm_6<bits<6> opcode, dag OOL, dag IOL, string asmstr,
171               InstrItinClass itin> 
172   : DForm_5<opcode, OOL, IOL, asmstr, itin>;
173
174 class DForm_6_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr,
175                   InstrItinClass itin>
176   : DForm_6<opcode, OOL, IOL, asmstr, itin> {
177   let L = PPC64;
178 }
179
180
181 // 1.7.5 DS-Form
182 class DSForm_1<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr,
183                InstrItinClass itin, list<dag> pattern>
184          : I<opcode, OOL, IOL, asmstr, itin> {
185   bits<5>  RST;
186   bits<14> DS;
187   bits<5>  RA;
188
189   let Pattern = pattern;
190   
191   let Inst{6-10}  = RST;
192   let Inst{11-15} = RA;
193   let Inst{16-29} = DS;
194   let Inst{30-31} = xo;
195 }
196
197 // 1.7.6 X-Form
198 class XForm_base_r3xo<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 
199                       InstrItinClass itin, list<dag> pattern>
200   : I<opcode, OOL, IOL, asmstr, itin> {
201   bits<5> RST;
202   bits<5> A;
203   bits<5> B;
204
205   let Pattern = pattern;
206
207   bit RC = 0;    // set by isDOT
208
209   let Inst{6-10}  = RST;
210   let Inst{11-15} = A;
211   let Inst{16-20} = B;
212   let Inst{21-30} = xo;
213   let Inst{31}    = RC;
214 }
215
216 // This is the same as XForm_base_r3xo, but the first two operands are swapped
217 // when code is emitted.
218 class XForm_base_r3xo_swapped
219         <bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
220         InstrItinClass itin> 
221   : I<opcode, OOL, IOL, asmstr, itin> {
222   bits<5> A;
223   bits<5> RST;
224   bits<5> B;
225
226   bit RC = 0;    // set by isDOT
227
228   let Inst{6-10}  = RST;
229   let Inst{11-15} = A;
230   let Inst{16-20} = B;
231   let Inst{21-30} = xo;
232   let Inst{31}    = RC;
233 }
234
235
236 class XForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
237               InstrItinClass itin, list<dag> pattern> 
238   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
239
240 class XForm_6<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
241               InstrItinClass itin, list<dag> pattern> 
242   : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
243   let Pattern = pattern;
244 }
245
246 class XForm_8<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
247               InstrItinClass itin, list<dag> pattern> 
248   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
249
250 class XForm_10<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
251                InstrItinClass itin, list<dag> pattern> 
252   : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
253     let Pattern = pattern;
254 }
255
256 class XForm_11<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
257                InstrItinClass itin, list<dag> pattern> 
258   : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
259   let B = 0;
260   let Pattern = pattern;
261 }
262
263 class XForm_16<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
264                InstrItinClass itin>
265          : I<opcode, OOL, IOL, asmstr, itin> {
266   bits<3> BF;
267   bits<1> L; 
268   bits<5> RA;
269   bits<5> RB;
270   
271   let Inst{6-8}   = BF;
272   let Inst{9}     = 0;
273   let Inst{10}    = L;
274   let Inst{11-15} = RA;
275   let Inst{16-20} = RB;
276   let Inst{21-30} = xo;
277   let Inst{31}    = 0;
278 }
279
280 class XForm_16_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
281                    InstrItinClass itin>
282   : XForm_16<opcode, xo, OOL, IOL, asmstr, itin> {
283   let L = PPC64;
284 }
285
286 class XForm_17<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
287                InstrItinClass itin>
288          : I<opcode, OOL, IOL, asmstr, itin> {
289   bits<3> BF;
290   bits<5> FRA;
291   bits<5> FRB;
292   
293   let Inst{6-8}   = BF;
294   let Inst{9-10}  = 0;
295   let Inst{11-15} = FRA;
296   let Inst{16-20} = FRB;
297   let Inst{21-30} = xo;
298   let Inst{31}    = 0;
299 }
300
301 class XForm_25<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
302                InstrItinClass itin, list<dag> pattern> 
303   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
304 }
305
306 class XForm_26<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
307                InstrItinClass itin, list<dag> pattern>
308   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
309   let A = 0;
310 }
311
312 class XForm_28<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
313                InstrItinClass itin, list<dag> pattern> 
314   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
315 }
316
317 // This is used for MFFS, MTFSB0, MTFSB1.  42 is arbitrary; this series of
318 // numbers presumably relates to some document, but I haven't found it.
319 class XForm_42<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
320               InstrItinClass itin, list<dag> pattern>
321   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
322   let Pattern = pattern;
323
324   bit RC = 0;    // set by isDOT
325
326   let Inst{6-10}  = RST;
327   let Inst{11-20} = 0;
328   let Inst{21-30} = xo;
329   let Inst{31}    = RC;
330 }
331 class XForm_43<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
332               InstrItinClass itin, list<dag> pattern>
333   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
334   let Pattern = pattern;
335   bits<5> FM;
336
337   bit RC = 0;    // set by isDOT
338
339   let Inst{6-10}  = FM;
340   let Inst{11-20} = 0;
341   let Inst{21-30} = xo;
342   let Inst{31}    = RC;
343 }
344
345 // DCB_Form - Form X instruction, used for dcb* instructions.
346 class DCB_Form<bits<10> xo, bits<5> immfield, dag OOL, dag IOL, string asmstr, 
347                       InstrItinClass itin, list<dag> pattern>
348   : I<31, OOL, IOL, asmstr, itin> {
349   bits<5> A;
350   bits<5> B;
351
352   let Pattern = pattern;
353
354   let Inst{6-10}  = immfield;
355   let Inst{11-15} = A;
356   let Inst{16-20} = B;
357   let Inst{21-30} = xo;
358   let Inst{31}    = 0;
359 }
360
361
362 // DSS_Form - Form X instruction, used for altivec dss* instructions.
363 class DSS_Form<bits<10> xo, dag OOL, dag IOL, string asmstr, 
364                       InstrItinClass itin, list<dag> pattern>
365   : I<31, OOL, IOL, asmstr, itin> {
366   bits<1> T;
367   bits<2> STRM;
368   bits<5> A;
369   bits<5> B;
370
371   let Pattern = pattern;
372
373   let Inst{6}     = T;
374   let Inst{7-8}   = 0;
375   let Inst{9-10}  = STRM;
376   let Inst{11-15} = A;
377   let Inst{16-20} = B;
378   let Inst{21-30} = xo;
379   let Inst{31}    = 0;
380 }
381
382 // 1.7.7 XL-Form
383 class XLForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
384                InstrItinClass itin, list<dag> pattern>
385     : I<opcode, OOL, IOL, asmstr, itin> {
386   bits<5> CRD;
387   bits<5> CRA;
388   bits<5> CRB;
389   
390   let Pattern = pattern;
391   
392   let Inst{6-10}  = CRD;
393   let Inst{11-15} = CRA;
394   let Inst{16-20} = CRB;
395   let Inst{21-30} = xo;
396   let Inst{31}    = 0;
397 }
398
399 class XLForm_1_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
400                InstrItinClass itin, list<dag> pattern>
401     : I<opcode, OOL, IOL, asmstr, itin> {
402   bits<5> CRD;
403   
404   let Pattern = pattern;
405   
406   let Inst{6-10}  = CRD;
407   let Inst{11-15} = CRD;
408   let Inst{16-20} = CRD;
409   let Inst{21-30} = xo;
410   let Inst{31}    = 0;
411 }
412
413 class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, dag OOL, dag IOL, string asmstr, 
414                InstrItinClass itin, list<dag> pattern>
415     : I<opcode, OOL, IOL, asmstr, itin> {
416   bits<5> BO;
417   bits<5> BI;
418   bits<2> BH;
419   
420   let Pattern = pattern;
421   
422   let Inst{6-10}  = BO;
423   let Inst{11-15} = BI;
424   let Inst{16-18} = 0;
425   let Inst{19-20} = BH;
426   let Inst{21-30} = xo;
427   let Inst{31}    = lk;
428 }
429
430 class XLForm_2_br<bits<6> opcode, bits<10> xo, bit lk,
431                   dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
432   : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
433   bits<7> BIBO;  // 2 bits of BI and 5 bits of BO.
434   bits<3>  CR;
435   
436   let BO = BIBO{2-6};
437   let BI{0-1} = BIBO{0-1};
438   let BI{2-4} = CR;
439   let BH = 0;
440 }
441
442
443 class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo,  bits<5> bi, bit lk,
444                   dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
445   : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
446   let BO = bo;
447   let BI = bi;
448   let BH = 0;
449 }
450
451 class XLForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
452                InstrItinClass itin>
453          : I<opcode, OOL, IOL, asmstr, itin> {
454   bits<3> BF;
455   bits<3> BFA;
456   
457   let Inst{6-8}   = BF;
458   let Inst{9-10}  = 0;
459   let Inst{11-13} = BFA;
460   let Inst{14-15} = 0;
461   let Inst{16-20} = 0;
462   let Inst{21-30} = xo;
463   let Inst{31}    = 0;
464 }
465
466 // 1.7.8 XFX-Form
467 class XFXForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
468                 InstrItinClass itin>
469          : I<opcode, OOL, IOL, asmstr, itin> {
470   bits<5>  RT;
471   bits<10> SPR;
472
473   let Inst{6-10}  = RT;
474   let Inst{11}    = SPR{4};
475   let Inst{12}    = SPR{3};
476   let Inst{13}    = SPR{2};
477   let Inst{14}    = SPR{1};
478   let Inst{15}    = SPR{0};
479   let Inst{16}    = SPR{9};
480   let Inst{17}    = SPR{8};
481   let Inst{18}    = SPR{7};
482   let Inst{19}    = SPR{6};
483   let Inst{20}    = SPR{5};
484   let Inst{21-30} = xo;
485   let Inst{31}    = 0;
486 }
487
488 class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr, 
489                    dag OOL, dag IOL, string asmstr, InstrItinClass itin> 
490   : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin> {
491   let SPR = spr;
492 }
493
494 class XFXForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
495                 InstrItinClass itin>
496          : I<opcode, OOL, IOL, asmstr, itin> {
497   bits<5>  RT;
498    
499   let Inst{6-10}  = RT;
500   let Inst{11-20} = 0;
501   let Inst{21-30} = xo;
502   let Inst{31}    = 0;
503 }
504
505 class XFXForm_5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
506                 InstrItinClass itin> 
507   : I<opcode, OOL, IOL, asmstr, itin> {
508   bits<8>  FXM;
509   bits<5>  ST;
510    
511   let Inst{6-10}  = ST;
512   let Inst{11}    = 0;
513   let Inst{12-19} = FXM;
514   let Inst{20}    = 0;
515   let Inst{21-30} = xo;
516   let Inst{31}    = 0;
517 }
518
519 class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
520                  InstrItinClass itin> 
521   : I<opcode, OOL, IOL, asmstr, itin> {
522   bits<5>  ST;
523   bits<8>  FXM;
524    
525   let Inst{6-10}  = ST;
526   let Inst{11}    = 1;
527   let Inst{12-19} = FXM;
528   let Inst{20}    = 0;
529   let Inst{21-30} = xo;
530   let Inst{31}    = 0;
531 }
532
533 class XFXForm_7<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
534                 InstrItinClass itin>
535   : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin>;
536
537 class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr, 
538                     dag OOL, dag IOL, string asmstr, InstrItinClass itin> 
539   : XFXForm_7<opcode, xo, OOL, IOL, asmstr, itin> {
540   let SPR = spr;
541 }
542
543 // XFL-Form - MTFSF
544 // This is probably 1.7.9, but I don't have the reference that uses this
545 // numbering scheme...
546 class XFLForm<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 
547                       string cstr, InstrItinClass itin, list<dag>pattern>
548   : I<opcode, OOL, IOL, asmstr, itin> {
549   bits<8> FM;
550   bits<5> RT;
551
552   bit RC = 0;    // set by isDOT
553   let Pattern = pattern;
554   let Constraints = cstr;
555
556   let Inst{6} = 0;
557   let Inst{7-14}  = FM;
558   let Inst{15} = 0;
559   let Inst{16-20} = RT;
560   let Inst{21-30} = xo;
561   let Inst{31}    = RC;
562 }
563
564 // 1.7.10 XS-Form - SRADI.
565 class XSForm_1<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr,
566                InstrItinClass itin, list<dag> pattern>
567          : I<opcode, OOL, IOL, asmstr, itin> {
568   bits<5> A;
569   bits<5> RS;
570   bits<6> SH;
571
572   bit RC = 0;    // set by isDOT
573   let Pattern = pattern;
574
575   let Inst{6-10}  = RS;
576   let Inst{11-15} = A;
577   let Inst{16-20} = SH{4,3,2,1,0};
578   let Inst{21-29} = xo;
579   let Inst{30}    = SH{5};
580   let Inst{31}    = RC;
581 }
582
583 // 1.7.11 XO-Form
584 class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL, string asmstr,
585                InstrItinClass itin, list<dag> pattern>
586          : I<opcode, OOL, IOL, asmstr, itin> {
587   bits<5> RT;
588   bits<5> RA;
589   bits<5> RB;
590
591   let Pattern = pattern;
592
593   bit RC = 0;    // set by isDOT
594
595   let Inst{6-10}  = RT;
596   let Inst{11-15} = RA;
597   let Inst{16-20} = RB;
598   let Inst{21}    = oe;
599   let Inst{22-30} = xo;
600   let Inst{31}    = RC;  
601 }
602
603 class XOForm_3<bits<6> opcode, bits<9> xo, bit oe, 
604                dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
605   : XOForm_1<opcode, xo, oe, OOL, IOL, asmstr, itin, pattern> {
606   let RB = 0;
607 }
608
609 // 1.7.12 A-Form
610 class AForm_1<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr, 
611               InstrItinClass itin, list<dag> pattern>
612          : I<opcode, OOL, IOL, asmstr, itin> {
613   bits<5> FRT;
614   bits<5> FRA;
615   bits<5> FRC;
616   bits<5> FRB;
617
618   let Pattern = pattern;
619
620   bit RC = 0;    // set by isDOT
621
622   let Inst{6-10}  = FRT;
623   let Inst{11-15} = FRA;
624   let Inst{16-20} = FRB;
625   let Inst{21-25} = FRC;
626   let Inst{26-30} = xo;
627   let Inst{31}    = RC;
628 }
629
630 class AForm_2<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
631               InstrItinClass itin, list<dag> pattern>
632   : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
633   let FRC = 0;
634 }
635
636 class AForm_3<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
637               InstrItinClass itin, list<dag> pattern> 
638   : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
639   let FRB = 0;
640 }
641
642 // 1.7.13 M-Form
643 class MForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr,
644               InstrItinClass itin, list<dag> pattern>
645     : I<opcode, OOL, IOL, asmstr, itin> {
646   bits<5> RA;
647   bits<5> RS;
648   bits<5> RB;
649   bits<5> MB;
650   bits<5> ME;
651
652   let Pattern = pattern;
653
654   bit RC = 0;    // set by isDOT
655
656   let Inst{6-10}  = RS;
657   let Inst{11-15} = RA;
658   let Inst{16-20} = RB;
659   let Inst{21-25} = MB;
660   let Inst{26-30} = ME;
661   let Inst{31}    = RC;
662 }
663
664 class MForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr,
665               InstrItinClass itin, list<dag> pattern>
666   : MForm_1<opcode, OOL, IOL, asmstr, itin, pattern> {
667 }
668
669 // 1.7.14 MD-Form
670 class MDForm_1<bits<6> opcode, bits<3> xo, dag OOL, dag IOL, string asmstr,
671                InstrItinClass itin, list<dag> pattern>
672     : I<opcode, OOL, IOL, asmstr, itin> {
673   bits<5> RA;
674   bits<5> RS;
675   bits<6> SH;
676   bits<6> MBE;
677
678   let Pattern = pattern;
679
680   bit RC = 0;    // set by isDOT
681
682   let Inst{6-10}  = RS;
683   let Inst{11-15} = RA;
684   let Inst{16-20} = SH{4,3,2,1,0};
685   let Inst{21-26} = MBE{4,3,2,1,0,5};
686   let Inst{27-29} = xo;
687   let Inst{30}    = SH{5};
688   let Inst{31}    = RC;
689 }
690
691
692
693 // E-1 VA-Form
694
695 // VAForm_1 - DACB ordering.
696 class VAForm_1<bits<6> xo, dag OOL, dag IOL, string asmstr,
697                InstrItinClass itin, list<dag> pattern>
698     : I<4, OOL, IOL, asmstr, itin> {
699   bits<5> VD;
700   bits<5> VA;
701   bits<5> VC;
702   bits<5> VB;
703
704   let Pattern = pattern;
705   
706   let Inst{6-10}  = VD;
707   let Inst{11-15} = VA;
708   let Inst{16-20} = VB;
709   let Inst{21-25} = VC;
710   let Inst{26-31} = xo;
711 }
712
713 // VAForm_1a - DABC ordering.
714 class VAForm_1a<bits<6> xo, dag OOL, dag IOL, string asmstr,
715                 InstrItinClass itin, list<dag> pattern>
716     : I<4, OOL, IOL, asmstr, itin> {
717   bits<5> VD;
718   bits<5> VA;
719   bits<5> VB;
720   bits<5> VC;
721
722   let Pattern = pattern;
723   
724   let Inst{6-10}  = VD;
725   let Inst{11-15} = VA;
726   let Inst{16-20} = VB;
727   let Inst{21-25} = VC;
728   let Inst{26-31} = xo;
729 }
730
731 class VAForm_2<bits<6> xo, dag OOL, dag IOL, string asmstr,
732                InstrItinClass itin, list<dag> pattern>
733     : I<4, OOL, IOL, asmstr, itin> {
734   bits<5> VD;
735   bits<5> VA;
736   bits<5> VB;
737   bits<4> SH;
738
739   let Pattern = pattern;
740   
741   let Inst{6-10}  = VD;
742   let Inst{11-15} = VA;
743   let Inst{16-20} = VB;
744   let Inst{21}    = 0;
745   let Inst{22-25} = SH;
746   let Inst{26-31} = xo;
747 }
748
749 // E-2 VX-Form
750 class VXForm_1<bits<11> xo, dag OOL, dag IOL, string asmstr,
751                InstrItinClass itin, list<dag> pattern>
752     : I<4, OOL, IOL, asmstr, itin> {
753   bits<5> VD;
754   bits<5> VA;
755   bits<5> VB;
756   
757   let Pattern = pattern;
758   
759   let Inst{6-10}  = VD;
760   let Inst{11-15} = VA;
761   let Inst{16-20} = VB;
762   let Inst{21-31} = xo;
763 }
764
765 class VXForm_setzero<bits<11> xo, dag OOL, dag IOL, string asmstr,
766                InstrItinClass itin, list<dag> pattern>
767     : VXForm_1<xo, OOL, IOL, asmstr, itin, pattern> {
768   let VA = VD;
769   let VB = VD;
770 }
771
772
773 class VXForm_2<bits<11> xo, dag OOL, dag IOL, string asmstr,
774                InstrItinClass itin, list<dag> pattern>
775     : I<4, OOL, IOL, asmstr, itin> {
776   bits<5> VD;
777   bits<5> VB;
778   
779   let Pattern = pattern;
780   
781   let Inst{6-10}  = VD;
782   let Inst{11-15} = 0;
783   let Inst{16-20} = VB;
784   let Inst{21-31} = xo;
785 }
786
787 class VXForm_3<bits<11> xo, dag OOL, dag IOL, string asmstr,
788                InstrItinClass itin, list<dag> pattern>
789     : I<4, OOL, IOL, asmstr, itin> {
790   bits<5> VD;
791   bits<5> IMM;
792   
793   let Pattern = pattern;
794   
795   let Inst{6-10}  = VD;
796   let Inst{11-15} = IMM;
797   let Inst{16-20} = 0;
798   let Inst{21-31} = xo;
799 }
800
801 /// VXForm_4 - VX instructions with "VD,0,0" register fields, like mfvscr.
802 class VXForm_4<bits<11> xo, dag OOL, dag IOL, string asmstr,
803                InstrItinClass itin, list<dag> pattern>
804     : I<4, OOL, IOL, asmstr, itin> {
805   bits<5> VD;
806   
807   let Pattern = pattern;
808   
809   let Inst{6-10}  = VD;
810   let Inst{11-15} = 0;
811   let Inst{16-20} = 0;
812   let Inst{21-31} = xo;
813 }
814
815 /// VXForm_5 - VX instructions with "0,0,VB" register fields, like mtvscr.
816 class VXForm_5<bits<11> xo, dag OOL, dag IOL, string asmstr,
817                InstrItinClass itin, list<dag> pattern>
818     : I<4, OOL, IOL, asmstr, itin> {
819   bits<5> VB;
820   
821   let Pattern = pattern;
822   
823   let Inst{6-10}  = 0;
824   let Inst{11-15} = 0;
825   let Inst{16-20} = VB;
826   let Inst{21-31} = xo;
827 }
828
829 // E-4 VXR-Form
830 class VXRForm_1<bits<10> xo, dag OOL, dag IOL, string asmstr,
831                InstrItinClass itin, list<dag> pattern>
832     : I<4, OOL, IOL, asmstr, itin> {
833   bits<5> VD;
834   bits<5> VA;
835   bits<5> VB;
836   bit RC = 0;
837   
838   let Pattern = pattern;
839   
840   let Inst{6-10}  = VD;
841   let Inst{11-15} = VA;
842   let Inst{16-20} = VB;
843   let Inst{21}    = RC;
844   let Inst{22-31} = xo;
845 }
846
847 //===----------------------------------------------------------------------===//
848 class Pseudo<dag OOL, dag IOL, string asmstr, list<dag> pattern>
849     : I<0, OOL, IOL, asmstr, NoItinerary> {
850   let PPC64 = 0;
851   let Pattern = pattern;
852   let Inst{31-0} = 0;
853 }