[PowerPC] Generate Power9 extswsli extend sign and shift immediate instruction
[llvm-core.git] / lib / Target / PowerPC / PPCInstrFormats.td
blobf5f4b46344cff8959e347a437cd49b894229b33c
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 //===----------------------------------------------------------------------===//
10 //===----------------------------------------------------------------------===//
12 // PowerPC instruction formats
14 class I<bits<6> opcode, dag OOL, dag IOL, string asmstr, InstrItinClass itin>
15         : Instruction {
16   field bits<32> Inst;
17   field bits<32> SoftFail = 0;
18   let Size = 4;
20   bit PPC64 = 0;  // Default value, override with isPPC64
22   let Namespace = "PPC";
23   let Inst{0-5} = opcode;
24   let OutOperandList = OOL;
25   let InOperandList = IOL;
26   let AsmString = asmstr;
27   let Itinerary = itin;
29   bits<1> PPC970_First = 0;
30   bits<1> PPC970_Single = 0;
31   bits<1> PPC970_Cracked = 0;
32   bits<3> PPC970_Unit = 0;
34   /// These fields correspond to the fields in PPCInstrInfo.h.  Any changes to
35   /// these must be reflected there!  See comments there for what these are.
36   let TSFlags{0}   = PPC970_First;
37   let TSFlags{1}   = PPC970_Single;
38   let TSFlags{2}   = PPC970_Cracked;
39   let TSFlags{5-3} = PPC970_Unit;
41   /// Indicate that the VSX instruction is to use VSX numbering/encoding.
42   /// Since ISA 3.0, there are scalar instructions that use the upper
43   /// half of the VSX register set only. Rather than adding further complexity
44   /// to the register class set, the VSX registers just include the Altivec
45   /// registers and this flag decides the numbering to be used for them.
46   bits<1> UseVSXReg = 0;
47   let TSFlags{6}   = UseVSXReg;
49   // Indicate that this instruction is of type X-Form Load or Store
50   bits<1> XFormMemOp = 0;
51   let TSFlags{7}  = XFormMemOp;
53   // Fields used for relation models.
54   string BaseName = "";
56   // For cases where multiple instruction definitions really represent the
57   // same underlying instruction but with one definition for 64-bit arguments
58   // and one for 32-bit arguments, this bit breaks the degeneracy between
59   // the two forms and allows TableGen to generate mapping tables.
60   bit Interpretation64Bit = 0;
63 class PPC970_DGroup_First   { bits<1> PPC970_First = 1;  }
64 class PPC970_DGroup_Single  { bits<1> PPC970_Single = 1; }
65 class PPC970_DGroup_Cracked { bits<1> PPC970_Cracked = 1; }
66 class PPC970_MicroCode;
68 class PPC970_Unit_Pseudo   { bits<3> PPC970_Unit = 0;   }
69 class PPC970_Unit_FXU      { bits<3> PPC970_Unit = 1;   }
70 class PPC970_Unit_LSU      { bits<3> PPC970_Unit = 2;   }
71 class PPC970_Unit_FPU      { bits<3> PPC970_Unit = 3;   }
72 class PPC970_Unit_CRU      { bits<3> PPC970_Unit = 4;   }
73 class PPC970_Unit_VALU     { bits<3> PPC970_Unit = 5;   }
74 class PPC970_Unit_VPERM    { bits<3> PPC970_Unit = 6;   }
75 class PPC970_Unit_BRU      { bits<3> PPC970_Unit = 7;   }
77 class UseVSXReg { bits<1> UseVSXReg = 1; }
78 class XFormMemOp { bits<1> XFormMemOp = 1; }
80 // Two joined instructions; used to emit two adjacent instructions as one.
81 // The itinerary from the first instruction is used for scheduling and
82 // classification.
83 class I2<bits<6> opcode1, bits<6> opcode2, dag OOL, dag IOL, string asmstr,
84          InstrItinClass itin>
85         : Instruction {
86   field bits<64> Inst;
87   field bits<64> SoftFail = 0;
88   let Size = 8;
90   bit PPC64 = 0;  // Default value, override with isPPC64
92   let Namespace = "PPC";
93   let Inst{0-5} = opcode1;
94   let Inst{32-37} = opcode2;
95   let OutOperandList = OOL;
96   let InOperandList = IOL;
97   let AsmString = asmstr;
98   let Itinerary = itin;
100   bits<1> PPC970_First = 0;
101   bits<1> PPC970_Single = 0;
102   bits<1> PPC970_Cracked = 0;
103   bits<3> PPC970_Unit = 0;
105   /// These fields correspond to the fields in PPCInstrInfo.h.  Any changes to
106   /// these must be reflected there!  See comments there for what these are.
107   let TSFlags{0}   = PPC970_First;
108   let TSFlags{1}   = PPC970_Single;
109   let TSFlags{2}   = PPC970_Cracked;
110   let TSFlags{5-3} = PPC970_Unit;
112   // Fields used for relation models.
113   string BaseName = "";
114   bit Interpretation64Bit = 0;
117 // Base class for all X-Form memory instructions
118 class IXFormMemOp<bits<6> opcode, dag OOL, dag IOL, string asmstr,
119                   InstrItinClass itin>
120         :I<opcode, OOL, IOL, asmstr, itin>, XFormMemOp;
122 // 1.7.1 I-Form
123 class IForm<bits<6> opcode, bit aa, bit lk, dag OOL, dag IOL, string asmstr,
124             InstrItinClass itin, list<dag> pattern>
125          : I<opcode, OOL, IOL, asmstr, itin> {
126   let Pattern = pattern;
127   bits<24> LI;
129   let Inst{6-29}  = LI;
130   let Inst{30}    = aa;
131   let Inst{31}    = lk;
134 // 1.7.2 B-Form
135 class BForm<bits<6> opcode, bit aa, bit lk, dag OOL, dag IOL, string asmstr>
136   : I<opcode, OOL, IOL, asmstr, IIC_BrB> {
137   bits<7> BIBO;  // 2 bits of BI and 5 bits of BO.
138   bits<3>  CR;
139   bits<14> BD;
141   bits<5> BI;
142   let BI{0-1} = BIBO{5-6};
143   let BI{2-4} = CR{0-2};
145   let Inst{6-10}  = BIBO{4-0};
146   let Inst{11-15} = BI;
147   let Inst{16-29} = BD;
148   let Inst{30}    = aa;
149   let Inst{31}    = lk;
152 class BForm_1<bits<6> opcode, bits<5> bo, bit aa, bit lk, dag OOL, dag IOL,
153              string asmstr>
154   : BForm<opcode, aa, lk, OOL, IOL, asmstr> {
155   let BIBO{4-0} = bo;
156   let BIBO{6-5} = 0;
157   let CR = 0;
160 class BForm_2<bits<6> opcode, bits<5> bo, bits<5> bi, bit aa, bit lk,
161               dag OOL, dag IOL, string asmstr>
162   : I<opcode, OOL, IOL, asmstr, IIC_BrB> {
163   bits<14> BD;
165   let Inst{6-10}  = bo;
166   let Inst{11-15} = bi;
167   let Inst{16-29} = BD;
168   let Inst{30}    = aa;
169   let Inst{31}    = lk;
172 class BForm_3<bits<6> opcode, bit aa, bit lk,
173               dag OOL, dag IOL, string asmstr>
174   : I<opcode, OOL, IOL, asmstr, IIC_BrB> {
175   bits<5> BO;
176   bits<5> BI;
177   bits<14> BD;
179   let Inst{6-10}  = BO;
180   let Inst{11-15} = BI;
181   let Inst{16-29} = BD;
182   let Inst{30}    = aa;
183   let Inst{31}    = lk;
186 class BForm_3_at<bits<6> opcode, bit aa, bit lk,
187                  dag OOL, dag IOL, string asmstr>
188   : I<opcode, OOL, IOL, asmstr, IIC_BrB> {
189   bits<5> BO;
190   bits<2> at;
191   bits<5> BI;
192   bits<14> BD;
194   let Inst{6-8}   = BO{4-2};
195   let Inst{9-10}  = at;
196   let Inst{11-15} = BI;
197   let Inst{16-29} = BD;
198   let Inst{30}    = aa;
199   let Inst{31}    = lk;
202 class BForm_4<bits<6> opcode, bits<5> bo, bit aa, bit lk,
203               dag OOL, dag IOL, string asmstr>
204   : I<opcode, OOL, IOL, asmstr, IIC_BrB> {
205   bits<5> BI;
206   bits<14> BD;
208   let Inst{6-10}  = bo;
209   let Inst{11-15} = BI;
210   let Inst{16-29} = BD;
211   let Inst{30}    = aa;
212   let Inst{31}    = lk;
215 // 1.7.3 SC-Form
216 class SCForm<bits<6> opcode, bits<1> xo,
217                      dag OOL, dag IOL, string asmstr, InstrItinClass itin,
218                      list<dag> pattern>
219   : I<opcode, OOL, IOL, asmstr, itin> {
220   bits<7>  LEV;
222   let Pattern = pattern;
224   let Inst{20-26} = LEV;
225   let Inst{30}    = xo;
228 // 1.7.4 D-Form
229 class DForm_base<bits<6> opcode, dag OOL, dag IOL, string asmstr,
230                  InstrItinClass itin, list<dag> pattern> 
231   : I<opcode, OOL, IOL, asmstr, itin> {
232   bits<5>  A;
233   bits<5>  B;
234   bits<16> C;
236   let Pattern = pattern;
237   
238   let Inst{6-10}  = A;
239   let Inst{11-15} = B;
240   let Inst{16-31} = C;
243 class DForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr,
244               InstrItinClass itin, list<dag> pattern>
245   : I<opcode, OOL, IOL, asmstr, itin> {
246   bits<5>  A;
247   bits<21> Addr;
249   let Pattern = pattern;
250   
251   let Inst{6-10}  = A;
252   let Inst{11-15} = Addr{20-16}; // Base Reg
253   let Inst{16-31} = Addr{15-0};  // Displacement
256 class DForm_1a<bits<6> opcode, dag OOL, dag IOL, string asmstr,
257                InstrItinClass itin, list<dag> pattern>
258   : I<opcode, OOL, IOL, asmstr, itin> {
259   bits<5>  A;
260   bits<16> C;
261   bits<5>  B;
263   let Pattern = pattern;
264   
265   let Inst{6-10}  = A;
266   let Inst{11-15} = B;
267   let Inst{16-31} = C;
271 class DForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr,
272               InstrItinClass itin, list<dag> pattern>
273   : DForm_base<opcode, OOL, IOL, asmstr, itin, pattern> {
275   // Even though ADDICo does not really have an RC bit, provide
276   // the declaration of one here so that isDOT has something to set.
277   bit RC = 0;
280 class DForm_2_r0<bits<6> opcode, dag OOL, dag IOL, string asmstr,
281                  InstrItinClass itin, list<dag> pattern>
282   : I<opcode, OOL, IOL, asmstr, itin> {
283   bits<5>  A;
284   bits<16> B;
285   
286   let Pattern = pattern;
287   
288   let Inst{6-10}  = A;
289   let Inst{11-15} = 0;
290   let Inst{16-31} = B;
293 class DForm_4<bits<6> opcode, dag OOL, dag IOL, string asmstr,
294               InstrItinClass itin, list<dag> pattern>
295   : I<opcode, OOL, IOL, asmstr, itin> {
296   bits<5>  B;
297   bits<5>  A;
298   bits<16> C;
299   
300   let Pattern = pattern;
301   
302   let Inst{6-10}  = A;
303   let Inst{11-15} = B;
304   let Inst{16-31} = C;
306               
307 class DForm_4_zero<bits<6> opcode, dag OOL, dag IOL, string asmstr,
308                    InstrItinClass itin, list<dag> pattern>
309   : DForm_1<opcode, OOL, IOL, asmstr, itin, pattern> {
310   let A = 0;
311   let Addr = 0;
314 class DForm_4_fixedreg_zero<bits<6> opcode, bits<5> R, dag OOL, dag IOL,
315                             string asmstr, InstrItinClass itin,
316                             list<dag> pattern>
317   : DForm_4<opcode, OOL, IOL, asmstr, itin, pattern> {
318   let A = R;
319   let B = R;
320   let C = 0; 
323 class IForm_and_DForm_1<bits<6> opcode1, bit aa, bit lk, bits<6> opcode2,
324             dag OOL, dag IOL, string asmstr,
325             InstrItinClass itin, list<dag> pattern>
326          : I2<opcode1, opcode2, OOL, IOL, asmstr, itin> {
327   bits<5>  A;
328   bits<21> Addr;
330   let Pattern = pattern;
331   bits<24> LI;
333   let Inst{6-29}  = LI;
334   let Inst{30}    = aa;
335   let Inst{31}    = lk;
337   let Inst{38-42}  = A;
338   let Inst{43-47} = Addr{20-16}; // Base Reg
339   let Inst{48-63} = Addr{15-0};  // Displacement
342 // This is used to emit BL8+NOP.
343 class IForm_and_DForm_4_zero<bits<6> opcode1, bit aa, bit lk, bits<6> opcode2,
344             dag OOL, dag IOL, string asmstr,
345             InstrItinClass itin, list<dag> pattern>
346          :  IForm_and_DForm_1<opcode1, aa, lk, opcode2,
347                               OOL, IOL, asmstr, itin, pattern> {
348   let A = 0;
349   let Addr = 0;
352 class DForm_5<bits<6> opcode, dag OOL, dag IOL, string asmstr,
353               InstrItinClass itin>
354   : I<opcode, OOL, IOL, asmstr, itin> {
355   bits<3>  BF;
356   bits<1>  L;
357   bits<5>  RA;
358   bits<16> I;
360   let Inst{6-8}   = BF;
361   let Inst{9}     = 0;
362   let Inst{10}    = L;
363   let Inst{11-15} = RA;
364   let Inst{16-31} = I;
367 class DForm_5_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr,
368                   InstrItinClass itin>
369   : DForm_5<opcode, OOL, IOL, asmstr, itin> {
370   let L = PPC64;
373 class DForm_6<bits<6> opcode, dag OOL, dag IOL, string asmstr,
374               InstrItinClass itin> 
375   : DForm_5<opcode, OOL, IOL, asmstr, itin>;
377 class DForm_6_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr,
378                   InstrItinClass itin>
379   : DForm_6<opcode, OOL, IOL, asmstr, itin> {
380   let L = PPC64;
384 // 1.7.5 DS-Form
385 class DSForm_1<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr,
386                InstrItinClass itin, list<dag> pattern>
387          : I<opcode, OOL, IOL, asmstr, itin> {
388   bits<5>  RST;
389   bits<19> DS_RA;
391   let Pattern = pattern;
392   
393   let Inst{6-10}  = RST;
394   let Inst{11-15} = DS_RA{18-14};  // Register #
395   let Inst{16-29} = DS_RA{13-0};   // Displacement.
396   let Inst{30-31} = xo;
399 // ISA V3.0B 1.6.6 DX-Form
400 class DXForm<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
401              InstrItinClass itin, list<dag> pattern>
402          : I<opcode, OOL, IOL, asmstr, itin> {
403   bits<5>  RT;
404   bits<16> D;
406   let Pattern = pattern;
408   let Inst{6-10}  = RT;
409   let Inst{11-15} = D{5-1};  // d1
410   let Inst{16-25} = D{15-6}; // d0
411   let Inst{26-30} = xo;
412   let Inst{31}    = D{0};    // d2
415 // DQ-Form: [PO T RA DQ TX XO] or [PO S RA DQ SX XO]
416 class DQ_RD6_RS5_DQ12<bits<6> opcode, bits<3> xo, dag OOL, dag IOL,
417                       string asmstr, InstrItinClass itin, list<dag> pattern>
418   : I<opcode, OOL, IOL, asmstr, itin> {
419   bits<6>  XT;
420   bits<17> DS_RA;
422   let Pattern = pattern;
424   let Inst{6-10}  = XT{4-0};
425   let Inst{11-15} = DS_RA{16-12};  // Register #
426   let Inst{16-27} = DS_RA{11-0};   // Displacement.
427   let Inst{28}    = XT{5};
428   let Inst{29-31} = xo;
431 // 1.7.6 X-Form
432 class XForm_base_r3xo<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 
433                       InstrItinClass itin, list<dag> pattern>
434   : I<opcode, OOL, IOL, asmstr, itin> {
435   bits<5> RST;
436   bits<5> A;
437   bits<5> B;
439   let Pattern = pattern;
441   bit RC = 0;    // set by isDOT
443   let Inst{6-10}  = RST;
444   let Inst{11-15} = A;
445   let Inst{16-20} = B;
446   let Inst{21-30} = xo;
447   let Inst{31}    = RC;
450 class XForm_base_r3xo_memOp<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
451                             string asmstr, InstrItinClass itin,
452                             list<dag> pattern>
453   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>, XFormMemOp;
455 class XForm_tlb<bits<10> xo, dag OOL, dag IOL, string asmstr,
456                 InstrItinClass itin> : XForm_base_r3xo<31, xo, OOL, IOL, asmstr, itin, []> {
457   let RST = 0;
460 class XForm_attn<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
461                  InstrItinClass itin>
462   : I<opcode, OOL, IOL, asmstr, itin> {
463   let Inst{21-30} = xo;
466 // This is the same as XForm_base_r3xo, but the first two operands are swapped
467 // when code is emitted.
468 class XForm_base_r3xo_swapped
469         <bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
470         InstrItinClass itin> 
471   : I<opcode, OOL, IOL, asmstr, itin> {
472   bits<5> A;
473   bits<5> RST;
474   bits<5> B;
476   bit RC = 0;    // set by isDOT
478   let Inst{6-10}  = RST;
479   let Inst{11-15} = A;
480   let Inst{16-20} = B;
481   let Inst{21-30} = xo;
482   let Inst{31}    = RC;
486 class XForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
487               InstrItinClass itin, list<dag> pattern>
488   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
490 class XForm_1_memOp<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
491               InstrItinClass itin, list<dag> pattern>
492   : XForm_base_r3xo_memOp<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
494 class XForm_1a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
495               InstrItinClass itin, list<dag> pattern>
496   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
497   let RST = 0;
500 class XForm_rs<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
501               InstrItinClass itin, list<dag> pattern>
502   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
503   let A = 0;
504   let B = 0;
507 class XForm_tlbws<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
508               InstrItinClass itin, list<dag> pattern>
509   : I<opcode, OOL, IOL, asmstr, itin> {
510   bits<5> RST;
511   bits<5> A;
512   bits<1> WS;
514   let Pattern = pattern;
516   let Inst{6-10}  = RST;
517   let Inst{11-15} = A;
518   let Inst{20}    = WS;
519   let Inst{21-30} = xo;
520   let Inst{31}    = 0;
523 class XForm_6<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
524               InstrItinClass itin, list<dag> pattern> 
525   : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
526   let Pattern = pattern;
529 class XForm_8<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
530               InstrItinClass itin, list<dag> pattern> 
531   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
533 class XForm_8_memOp<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
534               InstrItinClass itin, list<dag> pattern> 
535   : XForm_base_r3xo_memOp<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
537 class XForm_10<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
538                InstrItinClass itin, list<dag> pattern> 
539   : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
540     let Pattern = pattern;
543 class XForm_11<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
544                InstrItinClass itin, list<dag> pattern> 
545   : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
546   let B = 0;
547   let Pattern = pattern;
550 class XForm_16<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
551                InstrItinClass itin>
552          : I<opcode, OOL, IOL, asmstr, itin> {
553   bits<3> BF;
554   bits<1> L; 
555   bits<5> RA;
556   bits<5> RB;
557   
558   let Inst{6-8}   = BF;
559   let Inst{9}     = 0;
560   let Inst{10}    = L;
561   let Inst{11-15} = RA;
562   let Inst{16-20} = RB;
563   let Inst{21-30} = xo;
564   let Inst{31}    = 0;
567 class XForm_icbt<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
568                  InstrItinClass itin>
569          : I<opcode, OOL, IOL, asmstr, itin> {
570   bits<4> CT;
571   bits<5> RA;
572   bits<5> RB;
574   let Inst{6} = 0;
575   let Inst{7-10} = CT;
576   let Inst{11-15} = RA;
577   let Inst{16-20} = RB;
578   let Inst{21-30} = xo;
579   let Inst{31} = 0;
582 class XForm_sr<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
583                 InstrItinClass itin>
584          : I<opcode, OOL, IOL, asmstr, itin> {
585   bits<5> RS;
586   bits<4> SR;
588   let Inst{6-10} = RS;
589   let Inst{12-15} = SR;
590   let Inst{21-30} = xo;
593 class XForm_mbar<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
594                 InstrItinClass itin>
595          : I<opcode, OOL, IOL, asmstr, itin> {
596   bits<5> MO;
598   let Inst{6-10} = MO;
599   let Inst{21-30} = xo;
602 class XForm_srin<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
603                 InstrItinClass itin>
604          : I<opcode, OOL, IOL, asmstr, itin> {
605   bits<5> RS;
606   bits<5> RB;
608   let Inst{6-10} = RS;
609   let Inst{16-20} = RB;
610   let Inst{21-30} = xo;
613 class XForm_mtmsr<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
614                 InstrItinClass itin>
615          : I<opcode, OOL, IOL, asmstr, itin> {
616   bits<5> RS;
617   bits<1> L;
619   let Inst{6-10} = RS;
620   let Inst{15} = L;
621   let Inst{21-30} = xo;
624 class XForm_16_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
625                    InstrItinClass itin>
626   : XForm_16<opcode, xo, OOL, IOL, asmstr, itin> {
627   let L = PPC64;
630 class XForm_17<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
631                InstrItinClass itin>
632          : I<opcode, OOL, IOL, asmstr, itin> {
633   bits<3> BF;
634   bits<5> FRA;
635   bits<5> FRB;
636   
637   let Inst{6-8}   = BF;
638   let Inst{9-10}  = 0;
639   let Inst{11-15} = FRA;
640   let Inst{16-20} = FRB;
641   let Inst{21-30} = xo;
642   let Inst{31}    = 0;
645 class XForm_17a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
646                InstrItinClass itin>
647   : XForm_17<opcode, xo, OOL, IOL, asmstr, itin > {
648   let FRA = 0;
651 // Used for QPX
652 class XForm_18<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
653                InstrItinClass itin, list<dag> pattern>
654          : I<opcode, OOL, IOL, asmstr, itin> {
655   bits<5> FRT;
656   bits<5> FRA;
657   bits<5> FRB;
659   let Pattern = pattern;
660   
661   let Inst{6-10}  = FRT;
662   let Inst{11-15} = FRA;
663   let Inst{16-20} = FRB;
664   let Inst{21-30} = xo;
665   let Inst{31}    = 0;
668 class XForm_19<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
669               InstrItinClass itin, list<dag> pattern> 
670   : XForm_18<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
671   let FRA = 0;
674 class XForm_20<bits<6> opcode, bits<6> xo, dag OOL, dag IOL, string asmstr,
675                InstrItinClass itin, list<dag> pattern>
676          : I<opcode, OOL, IOL, asmstr, itin> {
677   bits<5> FRT;
678   bits<5> FRA;
679   bits<5> FRB;
680   bits<4> tttt;
682   let Pattern = pattern;
683   
684   let Inst{6-10}  = FRT;
685   let Inst{11-15} = FRA;
686   let Inst{16-20} = FRB;
687   let Inst{21-24} = tttt;
688   let Inst{25-30} = xo;
689   let Inst{31}    = 0;
692 class XForm_24<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
693                InstrItinClass itin, list<dag> pattern> 
694   : I<opcode, OOL, IOL, asmstr, itin> {
695   let Pattern = pattern;
696   let Inst{6-10}  = 31;
697   let Inst{11-15} = 0;
698   let Inst{16-20} = 0;
699   let Inst{21-30} = xo;
700   let Inst{31}    = 0;
703 class XForm_24_sync<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
704                string asmstr, InstrItinClass itin, list<dag> pattern> 
705   : I<opcode, OOL, IOL, asmstr, itin> {
706   bits<2> L;
708   let Pattern = pattern;
709   let Inst{6-8}   = 0;
710   let Inst{9-10}  = L;
711   let Inst{11-15} = 0;
712   let Inst{16-20} = 0;
713   let Inst{21-30} = xo;
714   let Inst{31}    = 0;
717 class XForm_24_eieio<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
718                string asmstr, InstrItinClass itin, list<dag> pattern>
719   : XForm_24_sync<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
720   let L = 0;
723 class XForm_25<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
724                InstrItinClass itin, list<dag> pattern>
725   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
728 class XForm_25_memOp<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
729                     string asmstr, InstrItinClass itin, list<dag> pattern>
730   : XForm_base_r3xo_memOp<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
733 class XForm_26<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
734                InstrItinClass itin, list<dag> pattern>
735   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
736   let A = 0;
739 class XForm_28_memOp<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
740                     string asmstr, InstrItinClass itin, list<dag> pattern>
741   : XForm_base_r3xo_memOp<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
744 class XForm_28<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
745                InstrItinClass itin, list<dag> pattern>
746   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
749 // This is used for MFFS, MTFSB0, MTFSB1.  42 is arbitrary; this series of
750 // numbers presumably relates to some document, but I haven't found it.
751 class XForm_42<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
752               InstrItinClass itin, list<dag> pattern>
753   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
754   let Pattern = pattern;
756   bit RC = 0;    // set by isDOT
758   let Inst{6-10}  = RST;
759   let Inst{11-20} = 0;
760   let Inst{21-30} = xo;
761   let Inst{31}    = RC;
763 class XForm_43<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
764               InstrItinClass itin, list<dag> pattern>
765   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
766   let Pattern = pattern;
767   bits<5> FM;
769   bit RC = 0;    // set by isDOT
771   let Inst{6-10}  = FM;
772   let Inst{11-20} = 0;
773   let Inst{21-30} = xo;
774   let Inst{31}    = RC;
777 class XForm_44<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
778                InstrItinClass itin>
779          : I<opcode, OOL, IOL, asmstr, itin> {
780   bits<5> RT;
781   bits<3> BFA;
783   let Inst{6-10}  = RT;
784   let Inst{11-13} = BFA;
785   let Inst{14-15} = 0;
786   let Inst{16-20} = 0;
787   let Inst{21-30} = xo;
788   let Inst{31}    = 0;
791 class XForm_45<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
792                InstrItinClass itin>
793          : I<opcode, OOL, IOL, asmstr, itin> {
794   bits<5> RT;
795   bits<2> L;
797   let Inst{6-10}  = RT;
798   let Inst{11-13} = 0;
799   let Inst{14-15} = L;
800   let Inst{16-20} = 0;
801   let Inst{21-30} = xo;
802   let Inst{31}    = 0;
805 class X_FRT5_XO2_XO3_XO10<bits<6> opcode, bits<2> xo1, bits<3> xo2, bits<10> xo,
806                          dag OOL, dag IOL, string asmstr, InstrItinClass itin,
807                          list<dag> pattern>
808   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
809   let Pattern = pattern;
811   let Inst{6-10}  = RST;
812   let Inst{11-12} = xo1;
813   let Inst{13-15} = xo2;
814   let Inst{16-20} = 0;
815   let Inst{21-30} = xo;
816   let Inst{31}    = 0;
819 class X_FRT5_XO2_XO3_FRB5_XO10<bits<6> opcode, bits<2> xo1, bits<3> xo2,
820                               bits<10> xo, dag OOL, dag IOL, string asmstr,
821                               InstrItinClass itin, list<dag> pattern>
822   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
823   let Pattern = pattern;
824   bits<5> FRB;
826   let Inst{6-10}  = RST;
827   let Inst{11-12} = xo1;
828   let Inst{13-15} = xo2;
829   let Inst{16-20} = FRB;
830   let Inst{21-30} = xo;
831   let Inst{31}    = 0;
834 class X_FRT5_XO2_XO3_DRM3_XO10<bits<6> opcode, bits<2> xo1, bits<3> xo2,
835                               bits<10> xo, dag OOL, dag IOL, string asmstr,
836                               InstrItinClass itin, list<dag> pattern>
837   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
838   let Pattern = pattern;
839   bits<3> DRM;
841   let Inst{6-10}  = RST;
842   let Inst{11-12} = xo1;
843   let Inst{13-15} = xo2;
844   let Inst{16-17} = 0;
845   let Inst{18-20} = DRM;
846   let Inst{21-30} = xo;
847   let Inst{31}    = 0;
850 class X_FRT5_XO2_XO3_RM2_X10<bits<6> opcode, bits<2> xo1, bits<3> xo2,
851                             bits<10> xo, dag OOL, dag IOL, string asmstr,
852                             InstrItinClass itin, list<dag> pattern>
853   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
854   let Pattern = pattern;
855   bits<2> RM;
857   let Inst{6-10}  = RST;
858   let Inst{11-12} = xo1;
859   let Inst{13-15} = xo2;
860   let Inst{16-18} = 0;
861   let Inst{19-20} = RM;
862   let Inst{21-30} = xo;
863   let Inst{31}    = 0;
867 class XForm_0<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
868               InstrItinClass itin, list<dag> pattern>
869   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
870   let RST = 0;
871   let A = 0;
872   let B = 0;
875 class XForm_16b<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
876               InstrItinClass itin, list<dag> pattern>
877   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
878   let RST = 0;
879   let A = 0;
882 class XForm_htm0<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
883                  string asmstr, InstrItinClass itin, list<dag> pattern>
884   : I<opcode, OOL, IOL, asmstr, itin> {
885   bit R;
887   bit RC = 1;
889   let Inst{6-9}   = 0;
890   let Inst{10}    = R;
891   let Inst{11-20} = 0;
892   let Inst{21-30} = xo;
893   let Inst{31}    = RC;
896 class XForm_htm1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
897                  string asmstr, InstrItinClass itin, list<dag> pattern>
898   : I<opcode, OOL, IOL, asmstr, itin> {
899   bit A;
901   bit RC = 1;
903   let Inst{6}     = A;
904   let Inst{7-20}  = 0;
905   let Inst{21-30} = xo;
906   let Inst{31}    = RC;
909 class XForm_htm2<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
910               InstrItinClass itin, list<dag> pattern>
911   : I<opcode, OOL, IOL, asmstr, itin> {
912   bit L;
914   bit RC = 0;    // set by isDOT
916   let Inst{7-9}   = 0;
917   let Inst{10}    = L;
918   let Inst{11-20} = 0;
919   let Inst{21-30} = xo;
920   let Inst{31}    = RC;
923 class XForm_htm3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
924               InstrItinClass itin, list<dag> pattern>
925   : I<opcode, OOL, IOL, asmstr, itin> {
926   bits<3> BF;
928   bit RC = 0;
930   let Inst{6-8}   = BF;
931   let Inst{9-20}  = 0;
932   let Inst{21-30} = xo;
933   let Inst{31}    = RC;
936 // [PO RT RA RB XO /]
937 class X_BF3_L1_RS5_RS5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
938                        string asmstr, InstrItinClass itin, list<dag> pattern>
939   : I<opcode, OOL, IOL, asmstr, itin> {
940   bits<3> BF;
941   bits<1> L;
942   bits<5> RA;
943   bits<5> RB;
945   let Pattern = pattern;
947   let Inst{6-8}   = BF;
948   let Inst{9}     = 0;
949   let Inst{10}    = L;
950   let Inst{11-15} = RA;
951   let Inst{16-20} = RB;
952   let Inst{21-30} = xo;
953   let Inst{31}    = 0;
956 // Same as XForm_17 but with GPR's and new naming convention
957 class X_BF3_RS5_RS5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
958                     string asmstr, InstrItinClass itin, list<dag> pattern>
959          : I<opcode, OOL, IOL, asmstr, itin> {
960   bits<3> BF;
961   bits<5> RA;
962   bits<5> RB;
964   let Pattern = pattern;
966   let Inst{6-8}   = BF;
967   let Inst{9-10}  = 0;
968   let Inst{11-15} = RA;
969   let Inst{16-20} = RB;
970   let Inst{21-30} = xo;
971   let Inst{31}    = 0;
974 // e.g. [PO VRT XO VRB XO /] or [PO VRT XO VRB XO RO]
975 class X_RD5_XO5_RS5<bits<6> opcode, bits<5> xo2, bits<10> xo, dag OOL, dag IOL,
976                     string asmstr, InstrItinClass itin, list<dag> pattern>
977   : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
978   let A = xo2;
981 class X_BF3_DCMX7_RS5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
982                       string asmstr, InstrItinClass itin, list<dag> pattern>
983   : I<opcode, OOL, IOL, asmstr, itin> {
984   bits<3> BF;
985   bits<7> DCMX;
986   bits<5> VB;
988   let Pattern = pattern;
990   let Inst{6-8}  = BF;
991   let Inst{9-15} = DCMX;
992   let Inst{16-20} = VB;
993   let Inst{21-30} = xo;
994   let Inst{31}    = 0;
997 class X_RD6_IMM8<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
998                  string asmstr, InstrItinClass itin, list<dag> pattern>
999   : I<opcode, OOL, IOL, asmstr, itin> {
1000   bits<6> XT;
1001   bits<8> IMM8;
1003   let Pattern = pattern;
1005   let Inst{6-10}  = XT{4-0};
1006   let Inst{11-12} = 0;
1007   let Inst{13-20} = IMM8;
1008   let Inst{21-30} = xo;
1009   let Inst{31}    = XT{5};
1012 // XForm_base_r3xo for instructions such as P9 atomics where we don't want
1013 // to specify an SDAG pattern for matching.
1014 class X_RD5_RS5_IM5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
1015                     string asmstr, InstrItinClass itin>
1016   : XForm_base_r3xo_memOp<opcode, xo, OOL, IOL, asmstr, itin, []> {
1019 class X_BF3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1020             InstrItinClass itin>
1021   : XForm_17<opcode, xo, OOL, IOL, asmstr, itin> {
1022   let FRA = 0;
1023   let FRB = 0;
1026 // [PO /// L RA RB XO /]
1027 class X_L1_RS5_RS5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
1028                    string asmstr, InstrItinClass itin, list<dag> pattern>
1029   : XForm_16<opcode, xo, OOL, IOL, asmstr, itin> {
1030   let BF = 0;
1031   let Pattern = pattern;
1033   bit RC = 0;
1034   let Inst{31} = RC;
1037 // XX*-Form (VSX)
1038 class XX1Form<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 
1039               InstrItinClass itin, list<dag> pattern>
1040   : I<opcode, OOL, IOL, asmstr, itin> {
1041   bits<6> XT;
1042   bits<5> A;
1043   bits<5> B;
1045   let Pattern = pattern;
1047   let Inst{6-10}  = XT{4-0};
1048   let Inst{11-15} = A;
1049   let Inst{16-20} = B;
1050   let Inst{21-30} = xo;
1051   let Inst{31}    = XT{5};
1054 class XX1Form_memOp<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
1055                     string asmstr, InstrItinClass itin, list<dag> pattern>
1056   : XX1Form<opcode, xo, OOL, IOL, asmstr, itin, pattern>, XFormMemOp;
1058 class XX1_RS6_RD5_XO<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
1059                      string asmstr, InstrItinClass itin, list<dag> pattern>
1060   : XX1Form<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
1061   let B = 0;
1064 class XX2Form<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr, 
1065               InstrItinClass itin, list<dag> pattern>
1066   : I<opcode, OOL, IOL, asmstr, itin> {
1067   bits<6> XT;
1068   bits<6> XB;
1070   let Pattern = pattern;
1072   let Inst{6-10}  = XT{4-0};
1073   let Inst{11-15} = 0;
1074   let Inst{16-20} = XB{4-0};
1075   let Inst{21-29} = xo;
1076   let Inst{30}    = XB{5};
1077   let Inst{31}    = XT{5};
1080 class XX2Form_1<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr, 
1081                 InstrItinClass itin, list<dag> pattern>
1082   : I<opcode, OOL, IOL, asmstr, itin> {
1083   bits<3> CR;
1084   bits<6> XB;
1086   let Pattern = pattern;
1088   let Inst{6-8}   = CR;
1089   let Inst{9-15}  = 0;
1090   let Inst{16-20} = XB{4-0};
1091   let Inst{21-29} = xo;
1092   let Inst{30}    = XB{5};
1093   let Inst{31}    = 0;
1096 class XX2Form_2<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr, 
1097                 InstrItinClass itin, list<dag> pattern>
1098   : I<opcode, OOL, IOL, asmstr, itin> {
1099   bits<6> XT;
1100   bits<6> XB;
1101   bits<2> D;
1103   let Pattern = pattern;
1105   let Inst{6-10}  = XT{4-0};
1106   let Inst{11-13} = 0;
1107   let Inst{14-15} = D;
1108   let Inst{16-20} = XB{4-0};
1109   let Inst{21-29} = xo;
1110   let Inst{30}    = XB{5};
1111   let Inst{31}    = XT{5};
1114 class XX2_RD6_UIM5_RS6<bits<6> opcode, bits<9> xo, dag OOL, dag IOL,
1115                        string asmstr, InstrItinClass itin, list<dag> pattern>
1116   : I<opcode, OOL, IOL, asmstr, itin> {
1117   bits<6> XT;
1118   bits<6> XB;
1119   bits<5> UIM5;
1121   let Pattern = pattern;
1123   let Inst{6-10}  = XT{4-0};
1124   let Inst{11-15} = UIM5;
1125   let Inst{16-20} = XB{4-0};
1126   let Inst{21-29} = xo;
1127   let Inst{30}    = XB{5};
1128   let Inst{31}    = XT{5};
1131 // [PO T XO B XO BX /]
1132 class XX2_RD5_XO5_RS6<bits<6> opcode, bits<5> xo2, bits<9> xo, dag OOL, dag IOL,
1133                        string asmstr, InstrItinClass itin, list<dag> pattern>
1134   : I<opcode, OOL, IOL, asmstr, itin> {
1135   bits<5> RT;
1136   bits<6> XB;
1138   let Pattern = pattern;
1140   let Inst{6-10}  = RT;
1141   let Inst{11-15} = xo2;
1142   let Inst{16-20} = XB{4-0};
1143   let Inst{21-29} = xo;
1144   let Inst{30}    = XB{5};
1145   let Inst{31}    = 0;
1148 // [PO T XO B XO BX TX]
1149 class XX2_RD6_XO5_RS6<bits<6> opcode, bits<5> xo2, bits<9> xo, dag OOL, dag IOL,
1150                       string asmstr, InstrItinClass itin, list<dag> pattern>
1151   : I<opcode, OOL, IOL, asmstr, itin> {
1152   bits<6> XT;
1153   bits<6> XB;
1155   let Pattern = pattern;
1157   let Inst{6-10}  = XT{4-0};
1158   let Inst{11-15} = xo2;
1159   let Inst{16-20} = XB{4-0};
1160   let Inst{21-29} = xo;
1161   let Inst{30}    = XB{5};
1162   let Inst{31}    = XT{5};
1165 class XX2_BF3_DCMX7_RS6<bits<6> opcode, bits<9> xo, dag OOL, dag IOL,
1166                       string asmstr, InstrItinClass itin, list<dag> pattern>
1167   : I<opcode, OOL, IOL, asmstr, itin> {
1168   bits<3> BF;
1169   bits<7> DCMX;
1170   bits<6> XB;
1172   let Pattern = pattern;
1174   let Inst{6-8}  = BF;
1175   let Inst{9-15} = DCMX;
1176   let Inst{16-20} = XB{4-0};
1177   let Inst{21-29} = xo;
1178   let Inst{30}    = XB{5};
1179   let Inst{31}    = 0;
1182 class XX2_RD6_DCMX7_RS6<bits<6> opcode, bits<4> xo1, bits<3> xo2,
1183                         dag OOL, dag IOL, string asmstr, InstrItinClass itin,
1184                         list<dag> pattern>
1185   : I<opcode, OOL, IOL, asmstr, itin> {
1186   bits<6> XT;
1187   bits<7> DCMX;
1188   bits<6> XB;
1190   let Pattern = pattern;
1192   let Inst{6-10}  = XT{4-0};
1193   let Inst{11-15} = DCMX{4-0};
1194   let Inst{16-20} = XB{4-0};
1195   let Inst{21-24} = xo1;
1196   let Inst{25}    = DCMX{5};
1197   let Inst{26-28} = xo2;
1198   let Inst{29}    = DCMX{6};
1199   let Inst{30}    = XB{5};
1200   let Inst{31}    = XT{5};
1203 class XX3Form<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr, 
1204               InstrItinClass itin, list<dag> pattern>
1205   : I<opcode, OOL, IOL, asmstr, itin> {
1206   bits<6> XT;
1207   bits<6> XA;
1208   bits<6> XB;
1210   let Pattern = pattern;
1212   let Inst{6-10}  = XT{4-0};
1213   let Inst{11-15} = XA{4-0};
1214   let Inst{16-20} = XB{4-0};
1215   let Inst{21-28} = xo;
1216   let Inst{29}    = XA{5};
1217   let Inst{30}    = XB{5};
1218   let Inst{31}    = XT{5};
1221 class XX3Form_Zero<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr,
1222               InstrItinClass itin, list<dag> pattern>
1223   : XX3Form<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
1224   let XA = XT;
1225   let XB = XT;
1228 class XX3Form_SetZero<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr,
1229                InstrItinClass itin, list<dag> pattern>
1230     : XX3Form<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
1231   let XB = XT;
1232   let XA = XT;
1235 class XX3Form_1<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr, 
1236                 InstrItinClass itin, list<dag> pattern>
1237   : I<opcode, OOL, IOL, asmstr, itin> {
1238   bits<3> CR;
1239   bits<6> XA;
1240   bits<6> XB;
1242   let Pattern = pattern;
1244   let Inst{6-8}   = CR;
1245   let Inst{9-10}  = 0;
1246   let Inst{11-15} = XA{4-0};
1247   let Inst{16-20} = XB{4-0};
1248   let Inst{21-28} = xo;
1249   let Inst{29}    = XA{5};
1250   let Inst{30}    = XB{5};
1251   let Inst{31}    = 0;
1254 class XX3Form_2<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr, 
1255                 InstrItinClass itin, list<dag> pattern>
1256   : I<opcode, OOL, IOL, asmstr, itin> {
1257   bits<6> XT;
1258   bits<6> XA;
1259   bits<6> XB;
1260   bits<2> D;
1262   let Pattern = pattern;
1264   let Inst{6-10}  = XT{4-0};
1265   let Inst{11-15} = XA{4-0};
1266   let Inst{16-20} = XB{4-0};
1267   let Inst{21}    = 0;
1268   let Inst{22-23} = D;
1269   let Inst{24-28} = xo;
1270   let Inst{29}    = XA{5};
1271   let Inst{30}    = XB{5};
1272   let Inst{31}    = XT{5};
1275 class XX3Form_Rc<bits<6> opcode, bits<7> xo, dag OOL, dag IOL, string asmstr, 
1276               InstrItinClass itin, list<dag> pattern>
1277   : I<opcode, OOL, IOL, asmstr, itin> {
1278   bits<6> XT;
1279   bits<6> XA;
1280   bits<6> XB;
1282   let Pattern = pattern;
1284   bit RC = 0;    // set by isDOT
1286   let Inst{6-10}  = XT{4-0};
1287   let Inst{11-15} = XA{4-0};
1288   let Inst{16-20} = XB{4-0};
1289   let Inst{21}    = RC;
1290   let Inst{22-28} = xo;
1291   let Inst{29}    = XA{5};
1292   let Inst{30}    = XB{5};
1293   let Inst{31}    = XT{5};
1296 class XX4Form<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr, 
1297               InstrItinClass itin, list<dag> pattern>
1298   : I<opcode, OOL, IOL, asmstr, itin> {
1299   bits<6> XT;
1300   bits<6> XA;
1301   bits<6> XB;
1302   bits<6> XC;
1304   let Pattern = pattern;
1306   let Inst{6-10}  = XT{4-0};
1307   let Inst{11-15} = XA{4-0};
1308   let Inst{16-20} = XB{4-0};
1309   let Inst{21-25} = XC{4-0};
1310   let Inst{26-27} = xo;
1311   let Inst{28}    = XC{5};
1312   let Inst{29}    = XA{5};
1313   let Inst{30}    = XB{5};
1314   let Inst{31}    = XT{5};
1317 // DCB_Form - Form X instruction, used for dcb* instructions.
1318 class DCB_Form<bits<10> xo, bits<5> immfield, dag OOL, dag IOL, string asmstr, 
1319                       InstrItinClass itin, list<dag> pattern>
1320   : I<31, OOL, IOL, asmstr, itin> {
1321   bits<5> A;
1322   bits<5> B;
1324   let Pattern = pattern;
1326   let Inst{6-10}  = immfield;
1327   let Inst{11-15} = A;
1328   let Inst{16-20} = B;
1329   let Inst{21-30} = xo;
1330   let Inst{31}    = 0;
1333 class DCB_Form_hint<bits<10> xo, dag OOL, dag IOL, string asmstr,
1334                     InstrItinClass itin, list<dag> pattern>
1335   : I<31, OOL, IOL, asmstr, itin> {
1336   bits<5> TH;
1337   bits<5> A;
1338   bits<5> B;
1340   let Pattern = pattern;
1342   let Inst{6-10}  = TH;
1343   let Inst{11-15} = A;
1344   let Inst{16-20} = B;
1345   let Inst{21-30} = xo;
1346   let Inst{31}    = 0;
1349 // DSS_Form - Form X instruction, used for altivec dss* instructions.
1350 class DSS_Form<bits<1> T, bits<10> xo, dag OOL, dag IOL, string asmstr,
1351                       InstrItinClass itin, list<dag> pattern>
1352   : I<31, OOL, IOL, asmstr, itin> {
1353   bits<2> STRM;
1354   bits<5> A;
1355   bits<5> B;
1357   let Pattern = pattern;
1359   let Inst{6}     = T;
1360   let Inst{7-8}   = 0;
1361   let Inst{9-10}  = STRM;
1362   let Inst{11-15} = A;
1363   let Inst{16-20} = B;
1364   let Inst{21-30} = xo;
1365   let Inst{31}    = 0;
1368 // 1.7.7 XL-Form
1369 class XLForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1370                InstrItinClass itin, list<dag> pattern>
1371     : I<opcode, OOL, IOL, asmstr, itin> {
1372   bits<5> CRD;
1373   bits<5> CRA;
1374   bits<5> CRB;
1375   
1376   let Pattern = pattern;
1377   
1378   let Inst{6-10}  = CRD;
1379   let Inst{11-15} = CRA;
1380   let Inst{16-20} = CRB;
1381   let Inst{21-30} = xo;
1382   let Inst{31}    = 0;
1385 class XLForm_1_np<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1386                   InstrItinClass itin, list<dag> pattern>
1387   : XLForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
1388   let CRD = 0;
1389   let CRA = 0;
1390   let CRB = 0;
1393 class XLForm_1_gen<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1394                    InstrItinClass itin, list<dag> pattern>
1395   : XLForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
1396   bits<5> RT;
1397   bits<5> RB;
1399   let CRD = RT;
1400   let CRA = 0;
1401   let CRB = RB;
1404 class XLForm_1_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1405                InstrItinClass itin, list<dag> pattern>
1406     : I<opcode, OOL, IOL, asmstr, itin> {
1407   bits<5> CRD;
1408   
1409   let Pattern = pattern;
1410   
1411   let Inst{6-10}  = CRD;
1412   let Inst{11-15} = CRD;
1413   let Inst{16-20} = CRD;
1414   let Inst{21-30} = xo;
1415   let Inst{31}    = 0;
1418 class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, dag OOL, dag IOL, string asmstr, 
1419                InstrItinClass itin, list<dag> pattern>
1420     : I<opcode, OOL, IOL, asmstr, itin> {
1421   bits<5> BO;
1422   bits<5> BI;
1423   bits<2> BH;
1424   
1425   let Pattern = pattern;
1426   
1427   let Inst{6-10}  = BO;
1428   let Inst{11-15} = BI;
1429   let Inst{16-18} = 0;
1430   let Inst{19-20} = BH;
1431   let Inst{21-30} = xo;
1432   let Inst{31}    = lk;
1435 class XLForm_2_br<bits<6> opcode, bits<10> xo, bit lk,
1436                   dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
1437   : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
1438   bits<7> BIBO;  // 2 bits of BI and 5 bits of BO.
1439   bits<3>  CR;
1440   
1441   let BO = BIBO{4-0};
1442   let BI{0-1} = BIBO{5-6};
1443   let BI{2-4} = CR{0-2};
1444   let BH = 0;
1447 class XLForm_2_br2<bits<6> opcode, bits<10> xo, bits<5> bo, bit lk,
1448                    dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
1449   : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
1450   let BO = bo;
1451   let BH = 0;
1454 class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo,  bits<5> bi, bit lk,
1455                   dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
1456   : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
1457   let BO = bo;
1458   let BI = bi;
1459   let BH = 0;
1462 class XLForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1463                InstrItinClass itin>
1464          : I<opcode, OOL, IOL, asmstr, itin> {
1465   bits<3> BF;
1466   bits<3> BFA;
1467   
1468   let Inst{6-8}   = BF;
1469   let Inst{9-10}  = 0;
1470   let Inst{11-13} = BFA;
1471   let Inst{14-15} = 0;
1472   let Inst{16-20} = 0;
1473   let Inst{21-30} = xo;
1474   let Inst{31}    = 0;
1477 class XLForm_4<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1478                InstrItinClass itin>
1479          : I<opcode, OOL, IOL, asmstr, itin> {
1480   bits<3> BF;
1481   bit W;
1482   bits<4> U;
1483   
1484   bit RC = 0;
1485   
1486   let Inst{6-8}   = BF;
1487   let Inst{9-10}  = 0;
1488   let Inst{11-14} = 0;
1489   let Inst{15}    = W;
1490   let Inst{16-19} = U;
1491   let Inst{20}    = 0;
1492   let Inst{21-30} = xo;
1493   let Inst{31}    = RC;
1496 class XLForm_S<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1497                InstrItinClass itin, list<dag> pattern>
1498     : I<opcode, OOL, IOL, asmstr, itin> {
1499   bits<1> S;
1500   
1501   let Pattern = pattern;
1502   
1503   let Inst{6-19}  = 0;
1504   let Inst{20}    = S;
1505   let Inst{21-30} = xo;
1506   let Inst{31}    = 0;
1509 class XLForm_2_and_DSForm_1<bits<6> opcode1, bits<10> xo1, bit lk,
1510                             bits<6> opcode2, bits<2> xo2,
1511                             dag OOL, dag IOL, string asmstr,
1512                             InstrItinClass itin, list<dag> pattern>
1513         : I2<opcode1, opcode2, OOL, IOL, asmstr, itin> {
1514   bits<5> BO;
1515   bits<5> BI;
1516   bits<2> BH;
1518   bits<5>  RST;
1519   bits<19> DS_RA;
1521   let Pattern = pattern;
1523   let Inst{6-10}  = BO;
1524   let Inst{11-15} = BI;
1525   let Inst{16-18} = 0;
1526   let Inst{19-20} = BH;
1527   let Inst{21-30} = xo1;
1528   let Inst{31}    = lk;
1530   let Inst{38-42} = RST;
1531   let Inst{43-47} = DS_RA{18-14};  // Register #
1532   let Inst{48-61} = DS_RA{13-0};   // Displacement.
1533   let Inst{62-63} = xo2;
1536 class XLForm_2_ext_and_DSForm_1<bits<6> opcode1, bits<10> xo1,
1537                                 bits<5> bo, bits<5> bi, bit lk,
1538                                 bits<6> opcode2, bits<2> xo2,
1539                                 dag OOL, dag IOL, string asmstr,
1540                                 InstrItinClass itin, list<dag> pattern>
1541   : XLForm_2_and_DSForm_1<opcode1, xo1, lk, opcode2, xo2,
1542                           OOL, IOL, asmstr, itin, pattern> {
1543   let BO = bo;
1544   let BI = bi;
1545   let BH = 0;
1548 // 1.7.8 XFX-Form
1549 class XFXForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1550                 InstrItinClass itin>
1551          : I<opcode, OOL, IOL, asmstr, itin> {
1552   bits<5>  RT;
1553   bits<10> SPR;
1555   let Inst{6-10}  = RT;
1556   let Inst{11}    = SPR{4};
1557   let Inst{12}    = SPR{3};
1558   let Inst{13}    = SPR{2};
1559   let Inst{14}    = SPR{1};
1560   let Inst{15}    = SPR{0};
1561   let Inst{16}    = SPR{9};
1562   let Inst{17}    = SPR{8};
1563   let Inst{18}    = SPR{7};
1564   let Inst{19}    = SPR{6};
1565   let Inst{20}    = SPR{5};
1566   let Inst{21-30} = xo;
1567   let Inst{31}    = 0;
1570 class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr, 
1571                    dag OOL, dag IOL, string asmstr, InstrItinClass itin> 
1572   : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin> {
1573   let SPR = spr;
1576 class XFXForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1577                 InstrItinClass itin>
1578          : I<opcode, OOL, IOL, asmstr, itin> {
1579   bits<5>  RT;
1580    
1581   let Inst{6-10}  = RT;
1582   let Inst{11-20} = 0;
1583   let Inst{21-30} = xo;
1584   let Inst{31}    = 0;
1587 class XFXForm_3p<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1588                  InstrItinClass itin, list<dag> pattern>
1589          : I<opcode, OOL, IOL, asmstr, itin> {
1590   bits<5>  RT;
1591   bits<10> Entry;
1592   let Pattern = pattern;
1594   let Inst{6-10}  = RT;
1595   let Inst{11-20} = Entry;
1596   let Inst{21-30} = xo;
1597   let Inst{31}    = 0;
1600 class XFXForm_5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1601                 InstrItinClass itin> 
1602   : I<opcode, OOL, IOL, asmstr, itin> {
1603   bits<8>  FXM;
1604   bits<5>  rS;
1605    
1606   let Inst{6-10}  = rS;
1607   let Inst{11}    = 0;
1608   let Inst{12-19} = FXM;
1609   let Inst{20}    = 0;
1610   let Inst{21-30} = xo;
1611   let Inst{31}    = 0;
1614 class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1615                  InstrItinClass itin> 
1616   : I<opcode, OOL, IOL, asmstr, itin> {
1617   bits<5>  ST;
1618   bits<8>  FXM;
1619    
1620   let Inst{6-10}  = ST;
1621   let Inst{11}    = 1;
1622   let Inst{12-19} = FXM;
1623   let Inst{20}    = 0;
1624   let Inst{21-30} = xo;
1625   let Inst{31}    = 0;
1628 class XFXForm_7<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1629                 InstrItinClass itin>
1630   : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin>;
1632 class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr, 
1633                     dag OOL, dag IOL, string asmstr, InstrItinClass itin> 
1634   : XFXForm_7<opcode, xo, OOL, IOL, asmstr, itin> {
1635   let SPR = spr;
1638 // XFL-Form - MTFSF
1639 // This is probably 1.7.9, but I don't have the reference that uses this
1640 // numbering scheme...
1641 class XFLForm<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, 
1642               InstrItinClass itin, list<dag>pattern>
1643   : I<opcode, OOL, IOL, asmstr, itin> {
1644   bits<8> FM;
1645   bits<5> rT;
1647   bit RC = 0;    // set by isDOT
1648   let Pattern = pattern;
1650   let Inst{6} = 0;
1651   let Inst{7-14}  = FM;
1652   let Inst{15} = 0;
1653   let Inst{16-20} = rT;
1654   let Inst{21-30} = xo;
1655   let Inst{31}    = RC;
1658 class XFLForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
1659                 InstrItinClass itin, list<dag>pattern>
1660   : I<opcode, OOL, IOL, asmstr, itin> {
1661   bit L;
1662   bits<8> FLM;
1663   bit W;
1664   bits<5> FRB;
1666   bit RC = 0;    // set by isDOT
1667   let Pattern = pattern;
1669   let Inst{6}     = L;
1670   let Inst{7-14}  = FLM;
1671   let Inst{15}    = W;
1672   let Inst{16-20} = FRB;
1673   let Inst{21-30} = xo;
1674   let Inst{31}    = RC;
1677 // 1.7.10 XS-Form - SRADI.
1678 class XSForm_1<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr,
1679                InstrItinClass itin, list<dag> pattern>
1680          : I<opcode, OOL, IOL, asmstr, itin> {
1681   bits<5> A;
1682   bits<5> RS;
1683   bits<6> SH;
1685   bit RC = 0;    // set by isDOT
1686   let Pattern = pattern;
1688   let Inst{6-10}  = RS;
1689   let Inst{11-15} = A;
1690   let Inst{16-20} = SH{4,3,2,1,0};
1691   let Inst{21-29} = xo;
1692   let Inst{30}    = SH{5};
1693   let Inst{31}    = RC;
1696 // 1.7.11 XO-Form
1697 class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL, string asmstr,
1698                InstrItinClass itin, list<dag> pattern>
1699          : I<opcode, OOL, IOL, asmstr, itin> {
1700   bits<5> RT;
1701   bits<5> RA;
1702   bits<5> RB;
1704   let Pattern = pattern;
1706   bit RC = 0;    // set by isDOT
1708   let Inst{6-10}  = RT;
1709   let Inst{11-15} = RA;
1710   let Inst{16-20} = RB;
1711   let Inst{21}    = oe;
1712   let Inst{22-30} = xo;
1713   let Inst{31}    = RC;  
1716 class XOForm_3<bits<6> opcode, bits<9> xo, bit oe, 
1717                dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
1718   : XOForm_1<opcode, xo, oe, OOL, IOL, asmstr, itin, pattern> {
1719   let RB = 0;
1722 // 1.7.12 A-Form
1723 class AForm_1<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr, 
1724               InstrItinClass itin, list<dag> pattern>
1725          : I<opcode, OOL, IOL, asmstr, itin> {
1726   bits<5> FRT;
1727   bits<5> FRA;
1728   bits<5> FRC;
1729   bits<5> FRB;
1731   let Pattern = pattern;
1733   bit RC = 0;    // set by isDOT
1735   let Inst{6-10}  = FRT;
1736   let Inst{11-15} = FRA;
1737   let Inst{16-20} = FRB;
1738   let Inst{21-25} = FRC;
1739   let Inst{26-30} = xo;
1740   let Inst{31}    = RC;
1743 class AForm_2<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
1744               InstrItinClass itin, list<dag> pattern>
1745   : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
1746   let FRC = 0;
1749 class AForm_3<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
1750               InstrItinClass itin, list<dag> pattern> 
1751   : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
1752   let FRB = 0;
1755 class AForm_4<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr, 
1756               InstrItinClass itin, list<dag> pattern>
1757          : I<opcode, OOL, IOL, asmstr, itin> {
1758   bits<5> RT;
1759   bits<5> RA;
1760   bits<5> RB;
1761   bits<5> COND;
1763   let Pattern = pattern;
1765   let Inst{6-10}  = RT;
1766   let Inst{11-15} = RA;
1767   let Inst{16-20} = RB;
1768   let Inst{21-25} = COND;
1769   let Inst{26-30} = xo;
1770   let Inst{31}    = 0;
1773 // Used for QPX
1774 class AForm_4a<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
1775               InstrItinClass itin, list<dag> pattern>
1776   : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
1777   let FRA = 0;
1778   let FRC = 0;
1781 // 1.7.13 M-Form
1782 class MForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr,
1783               InstrItinClass itin, list<dag> pattern>
1784     : I<opcode, OOL, IOL, asmstr, itin> {
1785   bits<5> RA;
1786   bits<5> RS;
1787   bits<5> RB;
1788   bits<5> MB;
1789   bits<5> ME;
1791   let Pattern = pattern;
1793   bit RC = 0;    // set by isDOT
1795   let Inst{6-10}  = RS;
1796   let Inst{11-15} = RA;
1797   let Inst{16-20} = RB;
1798   let Inst{21-25} = MB;
1799   let Inst{26-30} = ME;
1800   let Inst{31}    = RC;
1803 class MForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr,
1804               InstrItinClass itin, list<dag> pattern>
1805   : MForm_1<opcode, OOL, IOL, asmstr, itin, pattern> {
1808 // 1.7.14 MD-Form
1809 class MDForm_1<bits<6> opcode, bits<3> xo, dag OOL, dag IOL, string asmstr,
1810                InstrItinClass itin, list<dag> pattern>
1811     : I<opcode, OOL, IOL, asmstr, itin> {
1812   bits<5> RA;
1813   bits<5> RS;
1814   bits<6> SH;
1815   bits<6> MBE;
1817   let Pattern = pattern;
1819   bit RC = 0;    // set by isDOT
1821   let Inst{6-10}  = RS;
1822   let Inst{11-15} = RA;
1823   let Inst{16-20} = SH{4,3,2,1,0};
1824   let Inst{21-26} = MBE{4,3,2,1,0,5};
1825   let Inst{27-29} = xo;
1826   let Inst{30}    = SH{5};
1827   let Inst{31}    = RC;
1830 class MDSForm_1<bits<6> opcode, bits<4> xo, dag OOL, dag IOL, string asmstr,
1831                 InstrItinClass itin, list<dag> pattern>
1832     : I<opcode, OOL, IOL, asmstr, itin> {
1833   bits<5> RA;
1834   bits<5> RS;
1835   bits<5> RB;
1836   bits<6> MBE;
1838   let Pattern = pattern;
1840   bit RC = 0;    // set by isDOT
1842   let Inst{6-10}  = RS;
1843   let Inst{11-15} = RA;
1844   let Inst{16-20} = RB;
1845   let Inst{21-26} = MBE{4,3,2,1,0,5};
1846   let Inst{27-30} = xo;
1847   let Inst{31}    = RC;
1851 // E-1 VA-Form
1853 // VAForm_1 - DACB ordering.
1854 class VAForm_1<bits<6> xo, dag OOL, dag IOL, string asmstr,
1855                InstrItinClass itin, list<dag> pattern>
1856     : I<4, OOL, IOL, asmstr, itin> {
1857   bits<5> VD;
1858   bits<5> VA;
1859   bits<5> VC;
1860   bits<5> VB;
1862   let Pattern = pattern;
1863   
1864   let Inst{6-10}  = VD;
1865   let Inst{11-15} = VA;
1866   let Inst{16-20} = VB;
1867   let Inst{21-25} = VC;
1868   let Inst{26-31} = xo;
1871 // VAForm_1a - DABC ordering.
1872 class VAForm_1a<bits<6> xo, dag OOL, dag IOL, string asmstr,
1873                 InstrItinClass itin, list<dag> pattern>
1874     : I<4, OOL, IOL, asmstr, itin> {
1875   bits<5> VD;
1876   bits<5> VA;
1877   bits<5> VB;
1878   bits<5> VC;
1880   let Pattern = pattern;
1881   
1882   let Inst{6-10}  = VD;
1883   let Inst{11-15} = VA;
1884   let Inst{16-20} = VB;
1885   let Inst{21-25} = VC;
1886   let Inst{26-31} = xo;
1889 class VAForm_2<bits<6> xo, dag OOL, dag IOL, string asmstr,
1890                InstrItinClass itin, list<dag> pattern>
1891     : I<4, OOL, IOL, asmstr, itin> {
1892   bits<5> VD;
1893   bits<5> VA;
1894   bits<5> VB;
1895   bits<4> SH;
1897   let Pattern = pattern;
1898   
1899   let Inst{6-10}  = VD;
1900   let Inst{11-15} = VA;
1901   let Inst{16-20} = VB;
1902   let Inst{21}    = 0;
1903   let Inst{22-25} = SH;
1904   let Inst{26-31} = xo;
1907 // E-2 VX-Form
1908 class VXForm_1<bits<11> xo, dag OOL, dag IOL, string asmstr,
1909                InstrItinClass itin, list<dag> pattern>
1910     : I<4, OOL, IOL, asmstr, itin> {
1911   bits<5> VD;
1912   bits<5> VA;
1913   bits<5> VB;
1914   
1915   let Pattern = pattern;
1916   
1917   let Inst{6-10}  = VD;
1918   let Inst{11-15} = VA;
1919   let Inst{16-20} = VB;
1920   let Inst{21-31} = xo;
1923 class VXForm_setzero<bits<11> xo, dag OOL, dag IOL, string asmstr,
1924                InstrItinClass itin, list<dag> pattern>
1925     : VXForm_1<xo, OOL, IOL, asmstr, itin, pattern> {
1926   let VA = VD;
1927   let VB = VD;
1931 class VXForm_2<bits<11> xo, dag OOL, dag IOL, string asmstr,
1932                InstrItinClass itin, list<dag> pattern>
1933     : I<4, OOL, IOL, asmstr, itin> {
1934   bits<5> VD;
1935   bits<5> VB;
1936   
1937   let Pattern = pattern;
1938   
1939   let Inst{6-10}  = VD;
1940   let Inst{11-15} = 0;
1941   let Inst{16-20} = VB;
1942   let Inst{21-31} = xo;
1945 class VXForm_3<bits<11> xo, dag OOL, dag IOL, string asmstr,
1946                InstrItinClass itin, list<dag> pattern>
1947     : I<4, OOL, IOL, asmstr, itin> {
1948   bits<5> VD;
1949   bits<5> IMM;
1950   
1951   let Pattern = pattern;
1952   
1953   let Inst{6-10}  = VD;
1954   let Inst{11-15} = IMM;
1955   let Inst{16-20} = 0;
1956   let Inst{21-31} = xo;
1959 /// VXForm_4 - VX instructions with "VD,0,0" register fields, like mfvscr.
1960 class VXForm_4<bits<11> xo, dag OOL, dag IOL, string asmstr,
1961                InstrItinClass itin, list<dag> pattern>
1962     : I<4, OOL, IOL, asmstr, itin> {
1963   bits<5> VD;
1964   
1965   let Pattern = pattern;
1966   
1967   let Inst{6-10}  = VD;
1968   let Inst{11-15} = 0;
1969   let Inst{16-20} = 0;
1970   let Inst{21-31} = xo;
1973 /// VXForm_5 - VX instructions with "0,0,VB" register fields, like mtvscr.
1974 class VXForm_5<bits<11> xo, dag OOL, dag IOL, string asmstr,
1975                InstrItinClass itin, list<dag> pattern>
1976     : I<4, OOL, IOL, asmstr, itin> {
1977   bits<5> VB;
1978   
1979   let Pattern = pattern;
1980   
1981   let Inst{6-10}  = 0;
1982   let Inst{11-15} = 0;
1983   let Inst{16-20} = VB;
1984   let Inst{21-31} = xo;
1987 // e.g. [PO VRT EO VRB XO]
1988 class VXForm_RD5_XO5_RS5<bits<11> xo, bits<5> eo, dag OOL, dag IOL,
1989                          string asmstr, InstrItinClass itin, list<dag> pattern>
1990     : I<4, OOL, IOL, asmstr, itin> {
1991   bits<5> RD;
1992   bits<5> VB;
1994   let Pattern = pattern;
1996   let Inst{6-10}  = RD;
1997   let Inst{11-15} = eo;
1998   let Inst{16-20} = VB;
1999   let Inst{21-31} = xo;
2002 /// VXForm_CR - VX crypto instructions with "VRT, VRA, ST, SIX"
2003 class VXForm_CR<bits<11> xo, dag OOL, dag IOL, string asmstr,
2004                InstrItinClass itin, list<dag> pattern>
2005     : I<4, OOL, IOL, asmstr, itin> {
2006   bits<5> VD;
2007   bits<5> VA;
2008   bits<1> ST;
2009   bits<4> SIX;
2010   
2011   let Pattern = pattern;
2012   
2013   let Inst{6-10}  = VD;
2014   let Inst{11-15} = VA;
2015   let Inst{16} =  ST;
2016   let Inst{17-20} = SIX;
2017   let Inst{21-31} = xo;
2020 /// VXForm_BX - VX crypto instructions with "VRT, VRA, 0 - like vsbox"
2021 class VXForm_BX<bits<11> xo, dag OOL, dag IOL, string asmstr,
2022                InstrItinClass itin, list<dag> pattern>
2023     : I<4, OOL, IOL, asmstr, itin> {
2024   bits<5> VD;
2025   bits<5> VA;
2026   
2027   let Pattern = pattern;
2028   
2029   let Inst{6-10}  = VD;
2030   let Inst{11-15} = VA;
2031   let Inst{16-20} = 0;
2032   let Inst{21-31} = xo;
2035 // E-4 VXR-Form
2036 class VXRForm_1<bits<10> xo, dag OOL, dag IOL, string asmstr,
2037                InstrItinClass itin, list<dag> pattern>
2038     : I<4, OOL, IOL, asmstr, itin> {
2039   bits<5> VD;
2040   bits<5> VA;
2041   bits<5> VB;
2042   bit RC = 0;
2043   
2044   let Pattern = pattern;
2045   
2046   let Inst{6-10}  = VD;
2047   let Inst{11-15} = VA;
2048   let Inst{16-20} = VB;
2049   let Inst{21}    = RC;
2050   let Inst{22-31} = xo;
2053 // VX-Form: [PO VRT EO VRB 1 PS XO]
2054 class VX_RD5_EO5_RS5_PS1_XO9<bits<5> eo, bits<9> xo,
2055                              dag OOL, dag IOL, string asmstr,
2056                              InstrItinClass itin, list<dag> pattern>
2057   : I<4, OOL, IOL, asmstr, itin> {
2058   bits<5> VD;
2059   bits<5> VB;
2060   bit PS;
2062   let Pattern = pattern;
2064   let Inst{6-10}  = VD;
2065   let Inst{11-15} = eo;
2066   let Inst{16-20} = VB;
2067   let Inst{21}    = 1;
2068   let Inst{22}    = PS;
2069   let Inst{23-31} = xo;
2072 // VX-Form: [PO VRT VRA VRB 1 PS XO] or [PO VRT VRA VRB 1 / XO]
2073 class VX_RD5_RSp5_PS1_XO9<bits<9> xo, dag OOL, dag IOL, string asmstr,
2074                           InstrItinClass itin, list<dag> pattern>
2075   : I<4, OOL, IOL, asmstr, itin> {
2076   bits<5> VD;
2077   bits<5> VA;
2078   bits<5> VB;
2079   bit PS;
2081   let Pattern = pattern;
2083   let Inst{6-10}  = VD;
2084   let Inst{11-15} = VA;
2085   let Inst{16-20} = VB;
2086   let Inst{21}    = 1;
2087   let Inst{22}    = PS;
2088   let Inst{23-31} = xo;
2091 // Z23-Form (used by QPX)
2092 class Z23Form_1<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr, 
2093               InstrItinClass itin, list<dag> pattern>
2094          : I<opcode, OOL, IOL, asmstr, itin> {
2095   bits<5> FRT;
2096   bits<5> FRA;
2097   bits<5> FRB;
2098   bits<2> idx;
2100   let Pattern = pattern;
2102   bit RC = 0;    // set by isDOT
2104   let Inst{6-10}  = FRT;
2105   let Inst{11-15} = FRA;
2106   let Inst{16-20} = FRB;
2107   let Inst{21-22} = idx;
2108   let Inst{23-30} = xo;
2109   let Inst{31}    = RC;
2112 class Z23Form_2<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr,
2113               InstrItinClass itin, list<dag> pattern>
2114   : Z23Form_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
2115   let FRB = 0;
2118 class Z23Form_3<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr, 
2119               InstrItinClass itin, list<dag> pattern>
2120          : I<opcode, OOL, IOL, asmstr, itin> {
2121   bits<5> FRT;
2122   bits<12> idx;
2124   let Pattern = pattern;
2126   bit RC = 0;    // set by isDOT
2128   let Inst{6-10}  = FRT;
2129   let Inst{11-22} = idx;
2130   let Inst{23-30} = xo;
2131   let Inst{31}    = RC;
2134 class Z23Form_8<bits<6> opcode, bits<8> xo, dag OOL, dag IOL, string asmstr,
2135               InstrItinClass itin, list<dag> pattern>
2136          : I<opcode, OOL, IOL, asmstr, itin> {
2137   bits<5> VRT;
2138   bit R;
2139   bits<5> VRB;
2140   bits<2> idx;
2142   let Pattern = pattern;
2144   bit RC = 0;    // set by isDOT
2146   let Inst{6-10}  = VRT;
2147   let Inst{11-14} = 0;
2148   let Inst{15} = R;
2149   let Inst{16-20} = VRB;
2150   let Inst{21-22} = idx;
2151   let Inst{23-30} = xo;
2152   let Inst{31}    = RC;
2155 //===----------------------------------------------------------------------===//
2156 class Pseudo<dag OOL, dag IOL, string asmstr, list<dag> pattern>
2157     : I<0, OOL, IOL, asmstr, NoItinerary> {
2158   let isCodeGenOnly = 1;
2159   let PPC64 = 0;
2160   let Pattern = pattern;
2161   let Inst{31-0} = 0;
2162   let hasNoSchedulingInfo = 1;
2165 class PseudoXFormMemOp<dag OOL, dag IOL, string asmstr, list<dag> pattern>
2166     : Pseudo<OOL, IOL, asmstr, pattern>, XFormMemOp;