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