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