Home | History | Annotate | Download | only in Mips
      1 //===----------------------------------------------------------------------===//
      2 // MicroMIPS Base Classes
      3 //===----------------------------------------------------------------------===//
      4 
      5 //
      6 // Base class for MicroMips instructions.
      7 // This class does not depend on the instruction size.
      8 //
      9 class MicroMipsInstBase<dag outs, dag ins, string asmstr, list<dag> pattern,
     10                         InstrItinClass itin, Format f> : Instruction
     11 {
     12   let Namespace = "Mips";
     13   let DecoderNamespace = "MicroMips";
     14 
     15   let OutOperandList = outs;
     16   let InOperandList  = ins;
     17 
     18   let AsmString   = asmstr;
     19   let Pattern     = pattern;
     20   let Itinerary   = itin;
     21 
     22   let Predicates = [InMicroMips];
     23 
     24   Format Form = f;
     25 }
     26 
     27 //
     28 // Base class for MicroMIPS 16-bit instructions.
     29 //
     30 class MicroMipsInst16<dag outs, dag ins, string asmstr, list<dag> pattern,
     31                InstrItinClass itin, Format f> :
     32   MicroMipsInstBase<outs, ins, asmstr, pattern, itin, f>
     33 {
     34   let Size = 2;
     35   field bits<16> Inst;
     36   field bits<16> SoftFail = 0;
     37   bits<6> Opcode = 0x0;
     38 }
     39 
     40 //===----------------------------------------------------------------------===//
     41 // MicroMIPS 16-bit Instruction Formats
     42 //===----------------------------------------------------------------------===//
     43 
     44 class ARITH_FM_MM16<bit funct> {
     45   bits<3> rd;
     46   bits<3> rt;
     47   bits<3> rs;
     48 
     49   bits<16> Inst;
     50 
     51   let Inst{15-10} = 0x01;
     52   let Inst{9-7}   = rd;
     53   let Inst{6-4}   = rt;
     54   let Inst{3-1}   = rs;
     55   let Inst{0}     = funct;
     56 }
     57 
     58 class ANDI_FM_MM16<bits<6> funct> {
     59   bits<3> rd;
     60   bits<3> rs;
     61   bits<4> imm;
     62 
     63   bits<16> Inst;
     64 
     65   let Inst{15-10} = funct;
     66   let Inst{9-7}   = rd;
     67   let Inst{6-4}   = rs;
     68   let Inst{3-0}   = imm;
     69 }
     70 
     71 class LOGIC_FM_MM16<bits<4> funct> {
     72   bits<3> rt;
     73   bits<3> rs;
     74 
     75   bits<16> Inst;
     76 
     77   let Inst{15-10} = 0x11;
     78   let Inst{9-6}   = funct;
     79   let Inst{5-3}   = rt;
     80   let Inst{2-0}   = rs;
     81 }
     82 
     83 class SHIFT_FM_MM16<bits<1> funct> {
     84   bits<3> rd;
     85   bits<3> rt;
     86   bits<3> shamt;
     87 
     88   bits<16> Inst;
     89 
     90   let Inst{15-10} = 0x09;
     91   let Inst{9-7}   = rd;
     92   let Inst{6-4}   = rt;
     93   let Inst{3-1}   = shamt;
     94   let Inst{0}     = funct;
     95 }
     96 
     97 class ADDIUR2_FM_MM16 {
     98   bits<3> rd;
     99   bits<3> rs;
    100   bits<3> imm;
    101 
    102   bits<16> Inst;
    103 
    104   let Inst{15-10} = 0x1b;
    105   let Inst{9-7}   = rd;
    106   let Inst{6-4}   = rs;
    107   let Inst{3-1}   = imm;
    108   let Inst{0}     = 0;
    109 }
    110 
    111 class LOAD_STORE_FM_MM16<bits<6> op> {
    112   bits<3> rt;
    113   bits<7> addr;
    114 
    115   bits<16> Inst;
    116 
    117   let Inst{15-10} = op;
    118   let Inst{9-7}   = rt;
    119   let Inst{6-4}   = addr{6-4};
    120   let Inst{3-0}   = addr{3-0};
    121 }
    122 
    123 class LOAD_STORE_SP_FM_MM16<bits<6> op> {
    124   bits<5> rt;
    125   bits<5> offset;
    126 
    127   bits<16> Inst;
    128 
    129   let Inst{15-10} = op;
    130   let Inst{9-5}   = rt;
    131   let Inst{4-0}   = offset;
    132 }
    133 
    134 class LOAD_GP_FM_MM16<bits<6> op> {
    135   bits<3> rt;
    136   bits<7> offset;
    137 
    138   bits<16> Inst;
    139 
    140   let Inst{15-10} = op;
    141   let Inst{9-7} = rt;
    142   let Inst{6-0} = offset;
    143 }
    144 
    145 class ADDIUS5_FM_MM16 {
    146   bits<5> rd;
    147   bits<4> imm;
    148 
    149   bits<16> Inst;
    150 
    151   let Inst{15-10} = 0x13;
    152   let Inst{9-5}   = rd;
    153   let Inst{4-1}   = imm;
    154   let Inst{0}     = 0;
    155 }
    156 
    157 class ADDIUSP_FM_MM16 {
    158   bits<9> imm;
    159 
    160   bits<16> Inst;
    161 
    162   let Inst{15-10} = 0x13;
    163   let Inst{9-1}   = imm;
    164   let Inst{0}     = 1;
    165 }
    166 
    167 class MOVE_FM_MM16<bits<6> funct> {
    168   bits<5> rs;
    169   bits<5> rd;
    170 
    171   bits<16> Inst;
    172 
    173   let Inst{15-10} = funct;
    174   let Inst{9-5}   = rd;
    175   let Inst{4-0}   = rs;
    176 }
    177 
    178 class LI_FM_MM16 {
    179   bits<3> rd;
    180   bits<7> imm;
    181 
    182   bits<16> Inst;
    183 
    184   let Inst{15-10} = 0x3b;
    185   let Inst{9-7}   = rd;
    186   let Inst{6-0}   = imm;
    187 }
    188 
    189 class JALR_FM_MM16<bits<5> op> {
    190   bits<5> rs;
    191 
    192   bits<16> Inst;
    193 
    194   let Inst{15-10} = 0x11;
    195   let Inst{9-5}   = op;
    196   let Inst{4-0}   = rs;
    197 }
    198 
    199 class MFHILO_FM_MM16<bits<5> funct> {
    200   bits<5> rd;
    201 
    202   bits<16> Inst;
    203 
    204   let Inst{15-10} = 0x11;
    205   let Inst{9-5}   = funct;
    206   let Inst{4-0}   = rd;
    207 }
    208 
    209 class JRADDIUSP_FM_MM16<bits<5> op> {
    210   bits<5> rs;
    211   bits<5> imm;
    212 
    213   bits<16> Inst;
    214 
    215   let Inst{15-10} = 0x11;
    216   let Inst{9-5}   = op;
    217   let Inst{4-0}   = imm;
    218 }
    219 
    220 class ADDIUR1SP_FM_MM16 {
    221   bits<3> rd;
    222   bits<6> imm;
    223 
    224   bits<16> Inst;
    225 
    226   let Inst{15-10} = 0x1b;
    227   let Inst{9-7}   = rd;
    228   let Inst{6-1}   = imm;
    229   let Inst{0}     = 1;
    230 }
    231 
    232 class BRKSDBBP16_FM_MM<bits<6> op> {
    233   bits<4> code_;
    234   bits<16> Inst;
    235 
    236   let Inst{15-10} = 0x11;
    237   let Inst{9-4}   = op;
    238   let Inst{3-0}   = code_;
    239 }
    240 
    241 class BEQNEZ_FM_MM16<bits<6> op> {
    242   bits<3> rs;
    243   bits<7> offset;
    244 
    245   bits<16> Inst;
    246 
    247   let Inst{15-10} = op;
    248   let Inst{9-7}   = rs;
    249   let Inst{6-0}   = offset;
    250 }
    251 
    252 class B16_FM {
    253   bits<10> offset;
    254 
    255   bits<16> Inst;
    256 
    257   let Inst{15-10} = 0x33;
    258   let Inst{9-0}   = offset;
    259 }
    260 
    261 class MOVEP_FM_MM16 {
    262   bits<3> dst_regs;
    263   bits<3> rt;
    264   bits<3> rs;
    265 
    266   bits<16> Inst;
    267 
    268   let Inst{15-10} = 0x21;
    269   let Inst{9-7}   = dst_regs;
    270   let Inst{6-4}   = rt;
    271   let Inst{3-1}   = rs;
    272   let Inst{0}     = 0;
    273 }
    274 
    275 //===----------------------------------------------------------------------===//
    276 // MicroMIPS 32-bit Instruction Formats
    277 //===----------------------------------------------------------------------===//
    278 
    279 class MMArch {
    280   string Arch = "micromips";
    281   list<dag> Pattern = [];
    282 }
    283 
    284 class ADD_FM_MM<bits<6> op, bits<10> funct> : MMArch {
    285   bits<5> rt;
    286   bits<5> rs;
    287   bits<5> rd;
    288 
    289   bits<32> Inst;
    290 
    291   let Inst{31-26} = op;
    292   let Inst{25-21} = rt;
    293   let Inst{20-16} = rs;
    294   let Inst{15-11} = rd;
    295   let Inst{10}    = 0;
    296   let Inst{9-0}   = funct;
    297 }
    298 
    299 class ADDI_FM_MM<bits<6> op> : MMArch {
    300   bits<5>  rs;
    301   bits<5>  rt;
    302   bits<16> imm16;
    303 
    304   bits<32> Inst;
    305 
    306   let Inst{31-26} = op;
    307   let Inst{25-21} = rt;
    308   let Inst{20-16} = rs;
    309   let Inst{15-0}  = imm16;
    310 }
    311 
    312 class SLTI_FM_MM<bits<6> op> : MMArch {
    313   bits<5> rt;
    314   bits<5> rs;
    315   bits<16> imm16;
    316 
    317   bits<32> Inst;
    318 
    319   let Inst{31-26} = op;
    320   let Inst{25-21} = rt;
    321   let Inst{20-16} = rs;
    322   let Inst{15-0}  = imm16;
    323 }
    324 
    325 class LUI_FM_MM : MMArch {
    326   bits<5> rt;
    327   bits<16> imm16;
    328 
    329   bits<32> Inst;
    330 
    331   let Inst{31-26} = 0x10;
    332   let Inst{25-21} = 0xd;
    333   let Inst{20-16} = rt;
    334   let Inst{15-0}  = imm16;
    335 }
    336 
    337 class MULT_FM_MM<bits<10> funct> : MMArch {
    338   bits<5>  rs;
    339   bits<5>  rt;
    340 
    341   bits<32> Inst;
    342 
    343   let Inst{31-26} = 0x00;
    344   let Inst{25-21} = rt;
    345   let Inst{20-16} = rs;
    346   let Inst{15-6}  = funct;
    347   let Inst{5-0}   = 0x3c;
    348 }
    349 
    350 class SRA_FM_MM<bits<10> funct, bit rotate> : MMArch {
    351   bits<5> rd;
    352   bits<5> rt;
    353   bits<5> shamt;
    354 
    355   bits<32> Inst;
    356 
    357   let Inst{31-26} = 0;
    358   let Inst{25-21} = rd;
    359   let Inst{20-16} = rt;
    360   let Inst{15-11} = shamt;
    361   let Inst{10}    = rotate;
    362   let Inst{9-0}   = funct;
    363 }
    364 
    365 class SRLV_FM_MM<bits<10> funct, bit rotate> : MMArch {
    366   bits<5> rd;
    367   bits<5> rt;
    368   bits<5> rs;
    369 
    370   bits<32> Inst;
    371 
    372   let Inst{31-26} = 0;
    373   let Inst{25-21} = rt;
    374   let Inst{20-16} = rs;
    375   let Inst{15-11} = rd;
    376   let Inst{10}    = rotate;
    377   let Inst{9-0}   = funct;
    378 }
    379 
    380 class LW_FM_MM<bits<6> op> : MMArch {
    381   bits<5> rt;
    382   bits<21> addr;
    383 
    384   bits<32> Inst;
    385 
    386   let Inst{31-26} = op;
    387   let Inst{25-21} = rt;
    388   let Inst{20-16} = addr{20-16};
    389   let Inst{15-0}  = addr{15-0};
    390 }
    391 
    392 class LWL_FM_MM<bits<4> funct> {
    393   bits<5> rt;
    394   bits<21> addr;
    395 
    396   bits<32> Inst;
    397 
    398   let Inst{31-26} = 0x18;
    399   let Inst{25-21} = rt;
    400   let Inst{20-16} = addr{20-16};
    401   let Inst{15-12} = funct;
    402   let Inst{11-0}  = addr{11-0};
    403 }
    404 
    405 class CMov_F_I_FM_MM<bits<7> func> : MMArch {
    406   bits<5> rd;
    407   bits<5> rs;
    408   bits<3> fcc;
    409 
    410   bits<32> Inst;
    411 
    412   let Inst{31-26} = 0x15;
    413   let Inst{25-21} = rd;
    414   let Inst{20-16} = rs;
    415   let Inst{15-13} = fcc;
    416   let Inst{12-6}  = func;
    417   let Inst{5-0}   = 0x3b;
    418 }
    419 
    420 class MTLO_FM_MM<bits<10> funct> : MMArch {
    421   bits<5> rs;
    422 
    423   bits<32> Inst;
    424 
    425   let Inst{31-26} = 0x00;
    426   let Inst{25-21} = 0x00;
    427   let Inst{20-16} = rs;
    428   let Inst{15-6}  = funct;
    429   let Inst{5-0}   = 0x3c;
    430 }
    431 
    432 class MFLO_FM_MM<bits<10> funct> : MMArch {
    433   bits<5> rd;
    434 
    435   bits<32> Inst;
    436 
    437   let Inst{31-26} = 0x00;
    438   let Inst{25-21} = 0x00;
    439   let Inst{20-16} = rd;
    440   let Inst{15-6}  = funct;
    441   let Inst{5-0}   = 0x3c;
    442 }
    443 
    444 class CLO_FM_MM<bits<10> funct> : MMArch {
    445   bits<5> rd;
    446   bits<5> rs;
    447 
    448   bits<32> Inst;
    449 
    450   let Inst{31-26} = 0x00;
    451   let Inst{25-21} = rd;
    452   let Inst{20-16} = rs;
    453   let Inst{15-6}  = funct;
    454   let Inst{5-0}   = 0x3c;
    455 }
    456 
    457 class SEB_FM_MM<bits<10> funct> : MMArch {
    458   bits<5> rd;
    459   bits<5> rt;
    460 
    461   bits<32> Inst;
    462 
    463   let Inst{31-26} = 0x00;
    464   let Inst{25-21} = rd;
    465   let Inst{20-16} = rt;
    466   let Inst{15-6}  = funct;
    467   let Inst{5-0}   = 0x3c;
    468 }
    469 
    470 class EXT_FM_MM<bits<6> funct> : MMArch {
    471   bits<5> rt;
    472   bits<5> rs;
    473   bits<5> pos;
    474   bits<5> size;
    475 
    476   bits<32> Inst;
    477 
    478   let Inst{31-26} = 0x00;
    479   let Inst{25-21} = rt;
    480   let Inst{20-16} = rs;
    481   let Inst{15-11} = size;
    482   let Inst{10-6}  = pos;
    483   let Inst{5-0}   = funct;
    484 }
    485 
    486 class J_FM_MM<bits<6> op> : MMArch {
    487   bits<26> target;
    488 
    489   bits<32> Inst;
    490 
    491   let Inst{31-26} = op;
    492   let Inst{25-0}  = target;
    493 }
    494 
    495 class JR_FM_MM<bits<8> funct> : MMArch {
    496   bits<5> rs;
    497 
    498   bits<32> Inst;
    499 
    500   let Inst{31-21} = 0x00;
    501   let Inst{20-16} = rs;
    502   let Inst{15-14} = 0x0;
    503   let Inst{13-6}  = funct;
    504   let Inst{5-0}   = 0x3c;
    505 }
    506 
    507 class JALR_FM_MM<bits<10> funct> {
    508   bits<5> rs;
    509   bits<5> rd;
    510 
    511   bits<32> Inst;
    512 
    513   let Inst{31-26} = 0x00;
    514   let Inst{25-21} = rd;
    515   let Inst{20-16} = rs;
    516   let Inst{15-6}  = funct;
    517   let Inst{5-0}   = 0x3c;
    518 }
    519 
    520 class BEQ_FM_MM<bits<6> op> : MMArch {
    521   bits<5>  rs;
    522   bits<5>  rt;
    523   bits<16> offset;
    524 
    525   bits<32> Inst;
    526 
    527   let Inst{31-26} = op;
    528   let Inst{25-21} = rt;
    529   let Inst{20-16} = rs;
    530   let Inst{15-0}  = offset;
    531 }
    532 
    533 class BGEZ_FM_MM<bits<5> funct> : MMArch {
    534   bits<5>  rs;
    535   bits<16> offset;
    536 
    537   bits<32> Inst;
    538 
    539   let Inst{31-26} = 0x10;
    540   let Inst{25-21} = funct;
    541   let Inst{20-16} = rs;
    542   let Inst{15-0}  = offset;
    543 }
    544 
    545 class BGEZAL_FM_MM<bits<5> funct> : MMArch {
    546   bits<5>  rs;
    547   bits<16> offset;
    548 
    549   bits<32> Inst;
    550 
    551   let Inst{31-26} = 0x10;
    552   let Inst{25-21} = funct;
    553   let Inst{20-16} = rs;
    554   let Inst{15-0}  = offset;
    555 }
    556 
    557 class SYNC_FM_MM : MMArch {
    558   bits<5> stype;
    559 
    560   bits<32> Inst;
    561 
    562   let Inst{31-26} = 0x00;
    563   let Inst{25-21} = 0x0;
    564   let Inst{20-16} = stype;
    565   let Inst{15-6}  = 0x1ad;
    566   let Inst{5-0}   = 0x3c;
    567 }
    568 
    569 class BRK_FM_MM : MMArch {
    570   bits<10> code_1;
    571   bits<10> code_2;
    572   bits<32> Inst;
    573   let Inst{31-26} = 0x0;
    574   let Inst{25-16} = code_1;
    575   let Inst{15-6}  = code_2;
    576   let Inst{5-0}   = 0x07;
    577 }
    578 
    579 class SYS_FM_MM : MMArch {
    580   bits<10> code_;
    581   bits<32> Inst;
    582   let Inst{31-26} = 0x0;
    583   let Inst{25-16} = code_;
    584   let Inst{15-6}  = 0x22d;
    585   let Inst{5-0}   = 0x3c;
    586 }
    587 
    588 class WAIT_FM_MM {
    589   bits<10> code_;
    590   bits<32> Inst;
    591 
    592   let Inst{31-26} = 0x00;
    593   let Inst{25-16} = code_;
    594   let Inst{15-6}  = 0x24d;
    595   let Inst{5-0}   = 0x3c;
    596 }
    597 
    598 class ER_FM_MM<bits<10> funct> : MMArch {
    599   bits<32> Inst;
    600 
    601   let Inst{31-26} = 0x00;
    602   let Inst{25-16} = 0x00;
    603   let Inst{15-6}  = funct;
    604   let Inst{5-0}   = 0x3c;
    605 }
    606 
    607 class EI_FM_MM<bits<10> funct> : MMArch {
    608   bits<32> Inst;
    609   bits<5> rt;
    610 
    611   let Inst{31-26} = 0x00;
    612   let Inst{25-21} = 0x00;
    613   let Inst{20-16} = rt;
    614   let Inst{15-6}  = funct;
    615   let Inst{5-0}   = 0x3c;
    616 }
    617 
    618 class TEQ_FM_MM<bits<6> funct> : MMArch {
    619   bits<5> rs;
    620   bits<5> rt;
    621   bits<4> code_;
    622 
    623   bits<32> Inst;
    624 
    625   let Inst{31-26} = 0x00;
    626   let Inst{25-21} = rt;
    627   let Inst{20-16} = rs;
    628   let Inst{15-12} = code_;
    629   let Inst{11-6}  = funct;
    630   let Inst{5-0}   = 0x3c;
    631 }
    632 
    633 class TEQI_FM_MM<bits<5> funct> : MMArch {
    634   bits<5> rs;
    635   bits<16> imm16;
    636 
    637   bits<32> Inst;
    638 
    639   let Inst{31-26} = 0x10;
    640   let Inst{25-21} = funct;
    641   let Inst{20-16} = rs;
    642   let Inst{15-0}  = imm16;
    643 }
    644 
    645 class LL_FM_MM<bits<4> funct> {
    646   bits<5> rt;
    647   bits<21> addr;
    648 
    649   bits<32> Inst;
    650 
    651   let Inst{31-26} = 0x18;
    652   let Inst{25-21} = rt;
    653   let Inst{20-16} = addr{20-16};
    654   let Inst{15-12} = funct;
    655   let Inst{11-0}  = addr{11-0};
    656 }
    657 
    658 class ADDS_FM_MM<bits<2> fmt, bits<8> funct> : MMArch {
    659   bits<5> ft;
    660   bits<5> fs;
    661   bits<5> fd;
    662 
    663   bits<32> Inst;
    664 
    665   let Inst{31-26} = 0x15;
    666   let Inst{25-21} = ft;
    667   let Inst{20-16} = fs;
    668   let Inst{15-11} = fd;
    669   let Inst{10}    = 0;
    670   let Inst{9-8}   = fmt;
    671   let Inst{7-0}   = funct;
    672 
    673   list<dag> Pattern = [];
    674 }
    675 
    676 class LWXC1_FM_MM<bits<9> funct> : MMArch {
    677   bits<5> fd;
    678   bits<5> base;
    679   bits<5> index;
    680 
    681   bits<32> Inst;
    682 
    683   let Inst{31-26} = 0x15;
    684   let Inst{25-21} = index;
    685   let Inst{20-16} = base;
    686   let Inst{15-11} = fd;
    687   let Inst{10-9}  = 0x0;
    688   let Inst{8-0}   = funct;
    689 }
    690 
    691 class SWXC1_FM_MM<bits<9> funct> : MMArch {
    692   bits<5> fs;
    693   bits<5> base;
    694   bits<5> index;
    695 
    696   bits<32> Inst;
    697 
    698   let Inst{31-26} = 0x15;
    699   let Inst{25-21} = index;
    700   let Inst{20-16} = base;
    701   let Inst{15-11} = fs;
    702   let Inst{10-9}  = 0x0;
    703   let Inst{8-0}   = funct;
    704 }
    705 
    706 class CEQS_FM_MM<bits<2> fmt> : MMArch {
    707   bits<5> fs;
    708   bits<5> ft;
    709   bits<4> cond;
    710 
    711   bits<32> Inst;
    712 
    713   let Inst{31-26} = 0x15;
    714   let Inst{25-21} = ft;
    715   let Inst{20-16} = fs;
    716   let Inst{15-13} = 0x0;  // cc
    717   let Inst{12}    = 0;
    718   let Inst{11-10} = fmt;
    719   let Inst{9-6}   = cond;
    720   let Inst{5-0}   = 0x3c;
    721 }
    722 
    723 class BC1F_FM_MM<bits<5> tf> : MMArch {
    724   bits<16> offset;
    725 
    726   bits<32> Inst;
    727 
    728   let Inst{31-26} = 0x10;
    729   let Inst{25-21} = tf;
    730   let Inst{20-18} = 0x0; // cc
    731   let Inst{17-16} = 0x0;
    732   let Inst{15-0}  = offset;
    733 }
    734 
    735 class ROUND_W_FM_MM<bits<1> fmt, bits<8> funct> : MMArch {
    736   bits<5> fd;
    737   bits<5> fs;
    738 
    739   bits<32> Inst;
    740 
    741   let Inst{31-26} = 0x15;
    742   let Inst{25-21} = fd;
    743   let Inst{20-16} = fs;
    744   let Inst{15}    = 0;
    745   let Inst{14}    = fmt;
    746   let Inst{13-6}  = funct;
    747   let Inst{5-0}   = 0x3b;
    748 }
    749 
    750 class ABS_FM_MM<bits<2> fmt, bits<7> funct> : MMArch {
    751   bits<5> fd;
    752   bits<5> fs;
    753 
    754   bits<32> Inst;
    755 
    756   let Inst{31-26} = 0x15;
    757   let Inst{25-21} = fd;
    758   let Inst{20-16} = fs;
    759   let Inst{15}    = 0;
    760   let Inst{14-13} = fmt;
    761   let Inst{12-6}  = funct;
    762   let Inst{5-0}   = 0x3b;
    763 }
    764 
    765 class CMov_F_F_FM_MM<bits<9> func, bits<2> fmt> : MMArch {
    766   bits<5> fd;
    767   bits<5> fs;
    768 
    769   bits<32> Inst;
    770 
    771   let Inst{31-26} = 0x15;
    772   let Inst{25-21} = fd;
    773   let Inst{20-16} = fs;
    774   let Inst{15-13} = 0x0; //cc
    775   let Inst{12-11} = 0x0;
    776   let Inst{10-9}  = fmt;
    777   let Inst{8-0}   = func;
    778 }
    779 
    780 class CMov_I_F_FM_MM<bits<8> funct, bits<2> fmt> : MMArch {
    781   bits<5> fd;
    782   bits<5> fs;
    783   bits<5> rt;
    784 
    785   bits<32> Inst;
    786 
    787   let Inst{31-26} = 0x15;
    788   let Inst{25-21} = rt;
    789   let Inst{20-16} = fs;
    790   let Inst{15-11} = fd;
    791   let Inst{9-8}   = fmt;
    792   let Inst{7-0}   = funct;
    793 }
    794 
    795 class MFC1_FM_MM<bits<8> funct> : MMArch {
    796   bits<5> rt;
    797   bits<5> fs;
    798 
    799   bits<32> Inst;
    800 
    801   let Inst{31-26} = 0x15;
    802   let Inst{25-21} = rt;
    803   let Inst{20-16} = fs;
    804   let Inst{15-14} = 0x0;
    805   let Inst{13-6}  = funct;
    806   let Inst{5-0}   = 0x3b;
    807 }
    808 
    809 class MADDS_FM_MM<bits<6> funct>: MMArch {
    810   bits<5> ft;
    811   bits<5> fs;
    812   bits<5> fd;
    813   bits<5> fr;
    814 
    815   bits<32> Inst;
    816 
    817   let Inst{31-26} = 0x15;
    818   let Inst{25-21} = ft;
    819   let Inst{20-16} = fs;
    820   let Inst{15-11} = fd;
    821   let Inst{10-6}  = fr;
    822   let Inst{5-0}   = funct;
    823 }
    824 
    825 class COMPACT_BRANCH_FM_MM<bits<5> funct> {
    826   bits<5>  rs;
    827   bits<16> offset;
    828 
    829   bits<32> Inst;
    830 
    831   let Inst{31-26} = 0x10;
    832   let Inst{25-21} = funct;
    833   let Inst{20-16} = rs;
    834   let Inst{15-0}  = offset;
    835 }
    836 
    837 class COP0_TLB_FM_MM<bits<10> op> : MMArch {
    838   bits<32> Inst;
    839 
    840   let Inst{31-26} = 0x0;
    841   let Inst{25-16} = 0x0;
    842   let Inst{15-6}  = op;
    843   let Inst{5-0}   = 0x3c;
    844 }
    845 
    846 class SDBBP_FM_MM : MMArch {
    847   bits<10> code_;
    848 
    849   bits<32> Inst;
    850 
    851   let Inst{31-26} = 0x0;
    852   let Inst{25-16} = code_;
    853   let Inst{15-6}  = 0x36d;
    854   let Inst{5-0}   = 0x3c;
    855 }
    856 
    857 class RDHWR_FM_MM : MMArch {
    858   bits<5> rt;
    859   bits<5> rd;
    860 
    861   bits<32> Inst;
    862 
    863   let Inst{31-26} = 0x0;
    864   let Inst{25-21} = rt;
    865   let Inst{20-16} = rd;
    866   let Inst{15-6}  = 0x1ac;
    867   let Inst{5-0}   = 0x3c;
    868 }
    869 
    870 class LWXS_FM_MM<bits<10> funct> {
    871   bits<5> rd;
    872   bits<5> base;
    873   bits<5> index;
    874 
    875   bits<32> Inst;
    876 
    877   let Inst{31-26} = 0x0;
    878   let Inst{25-21} = index;
    879   let Inst{20-16} = base;
    880   let Inst{15-11} = rd;
    881   let Inst{10}    = 0;
    882   let Inst{9-0}   = funct;
    883 }
    884 
    885 class LWM_FM_MM<bits<4> funct> : MMArch {
    886   bits<5> rt;
    887   bits<21> addr;
    888 
    889   bits<32> Inst;
    890 
    891   let Inst{31-26} = 0x8;
    892   let Inst{25-21} = rt;
    893   let Inst{20-16} = addr{20-16};
    894   let Inst{15-12} = funct;
    895   let Inst{11-0}  = addr{11-0};
    896 }
    897 
    898 class LWM_FM_MM16<bits<4> funct> : MMArch {
    899   bits<2> rt;
    900   bits<4> addr;
    901 
    902   bits<16> Inst;
    903 
    904   let Inst{15-10} = 0x11;
    905   let Inst{9-6}   = funct;
    906   let Inst{5-4}   = rt;
    907   let Inst{3-0}   = addr;
    908 }
    909 
    910 class CACHE_PREF_FM_MM<bits<6> op, bits<4> funct> : MMArch {
    911   bits<21> addr;
    912   bits<5> hint;
    913   bits<5> base = addr{20-16};
    914   bits<12> offset = addr{11-0};
    915 
    916   bits<32> Inst;
    917 
    918   let Inst{31-26} = op;
    919   let Inst{25-21} = hint;
    920   let Inst{20-16} = base;
    921   let Inst{15-12} = funct;
    922   let Inst{11-0}  = offset;
    923 }
    924 
    925 class BARRIER_FM_MM<bits<5> op> : MMArch {
    926   bits<32> Inst;
    927 
    928   let Inst{31-26} = 0x0;
    929   let Inst{25-21} = 0x0;
    930   let Inst{20-16} = 0x0;
    931   let Inst{15-11} = op;
    932   let Inst{10-6}  = 0x0;
    933   let Inst{5-0}   = 0x0;
    934 }
    935 
    936 class ADDIUPC_FM_MM {
    937   bits<3> rs;
    938   bits<23> imm;
    939 
    940   bits<32> Inst;
    941 
    942   let Inst{31-26} = 0x1e;
    943   let Inst{25-23} = rs;
    944   let Inst{22-0} = imm;
    945 }
    946