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