Home | History | Annotate | Download | only in Mips
      1 //===-- MipsInstrFormats.td - Mips 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 //  Describe MIPS instructions format
     12 //
     13 //  CPU INSTRUCTION FORMATS
     14 //
     15 //  opcode  - operation code.
     16 //  rs      - src reg.
     17 //  rt      - dst reg (on a 2 regs instr) or src reg (on a 3 reg instr).
     18 //  rd      - dst reg, only used on 3 regs instr.
     19 //  shamt   - only used on shift instructions, contains the shift amount.
     20 //  funct   - combined with opcode field give us an operation code.
     21 //
     22 //===----------------------------------------------------------------------===//
     23 
     24 // Format specifies the encoding used by the instruction.  This is part of the
     25 // ad-hoc solution used to emit machine instruction encodings by our machine
     26 // code emitter.
     27 class Format<bits<4> val> {
     28   bits<4> Value = val;
     29 }
     30 
     31 def Pseudo    : Format<0>;
     32 def FrmR      : Format<1>;
     33 def FrmI      : Format<2>;
     34 def FrmJ      : Format<3>;
     35 def FrmFR     : Format<4>;
     36 def FrmFI     : Format<5>;
     37 def FrmOther  : Format<6>; // Instruction w/ a custom format
     38 
     39 class MMRel;
     40 
     41 def Std2MicroMips : InstrMapping {
     42   let FilterClass = "MMRel";
     43   // Instructions with the same BaseOpcode and isNVStore values form a row.
     44   let RowFields = ["BaseOpcode"];
     45   // Instructions with the same predicate sense form a column.
     46   let ColFields = ["Arch"];
     47   // The key column is the unpredicated instructions.
     48   let KeyCol = ["se"];
     49   // Value columns are PredSense=true and PredSense=false
     50   let ValueCols = [["se"], ["micromips"]];
     51 }
     52 
     53 class StdMMR6Rel;
     54 
     55 def Std2MicroMipsR6 : InstrMapping {
     56   let FilterClass = "StdMMR6Rel";
     57   // Instructions with the same BaseOpcode and isNVStore values form a row.
     58   let RowFields = ["BaseOpcode"];
     59   // Instructions with the same predicate sense form a column.
     60   let ColFields = ["Arch"];
     61   // The key column is the unpredicated instructions.
     62   let KeyCol = ["se"];
     63   // Value columns are PredSense=true and PredSense=false
     64   let ValueCols = [["se"], ["micromipsr6"]];
     65 }
     66 
     67 class StdArch {
     68   string Arch = "se";
     69 }
     70 
     71 // Generic Mips Format
     72 class MipsInst<dag outs, dag ins, string asmstr, list<dag> pattern,
     73                InstrItinClass itin, Format f>: Instruction, PredicateControl
     74 {
     75   field bits<32> Inst;
     76   Format Form = f;
     77 
     78   let Namespace = "Mips";
     79 
     80   let Size = 4;
     81 
     82   bits<6> Opcode = 0;
     83 
     84   // Top 6 bits are the 'opcode' field
     85   let Inst{31-26} = Opcode;
     86 
     87   let OutOperandList = outs;
     88   let InOperandList  = ins;
     89 
     90   let AsmString   = asmstr;
     91   let Pattern     = pattern;
     92   let Itinerary   = itin;
     93 
     94   //
     95   // Attributes specific to Mips instructions...
     96   //
     97   bits<4> FormBits     = Form.Value;
     98   bit isCTI            = 0; // Any form of Control Transfer Instruction.
     99                             // Required for MIPSR6
    100   bit hasForbiddenSlot = 0; // Instruction has a forbidden slot.
    101   bit IsPCRelativeLoad = 0; // Load instruction with implicit source register
    102                             // ($pc) and with explicit offset and destination
    103                             // register
    104   bit hasFCCRegOperand = 0; // Instruction uses $fcc<X> register and is
    105                             // present in MIPS-I to MIPS-III.
    106 
    107   // TSFlags layout should be kept in sync with MCTargetDesc/MipsBaseInfo.h.
    108   let TSFlags{3-0}   = FormBits;
    109   let TSFlags{4}     = isCTI;
    110   let TSFlags{5}     = hasForbiddenSlot;
    111   let TSFlags{6}     = IsPCRelativeLoad;
    112   let TSFlags{7}     = hasFCCRegOperand;
    113 
    114   let DecoderNamespace = "Mips";
    115 
    116   field bits<32> SoftFail = 0;
    117 }
    118 
    119 // Mips32/64 Instruction Format
    120 class InstSE<dag outs, dag ins, string asmstr, list<dag> pattern,
    121              InstrItinClass itin, Format f, string opstr = ""> :
    122   MipsInst<outs, ins, asmstr, pattern, itin, f> {
    123   let EncodingPredicates = [NotInMips16Mode];
    124   string BaseOpcode = opstr;
    125   string Arch;
    126 }
    127 
    128 // Mips Pseudo Instructions Format
    129 class MipsPseudo<dag outs, dag ins, list<dag> pattern,
    130                  InstrItinClass itin = IIPseudo> :
    131   MipsInst<outs, ins, "", pattern, itin, Pseudo> {
    132   let isCodeGenOnly = 1;
    133   let isPseudo = 1;
    134 }
    135 
    136 // Mips32/64 Pseudo Instruction Format
    137 class PseudoSE<dag outs, dag ins, list<dag> pattern,
    138                InstrItinClass itin = IIPseudo> :
    139   MipsPseudo<outs, ins, pattern, itin> {
    140   let EncodingPredicates = [NotInMips16Mode];
    141 }
    142 
    143 // Pseudo-instructions for alternate assembly syntax (never used by codegen).
    144 // These are aliases that require C++ handling to convert to the target
    145 // instruction, while InstAliases can be handled directly by tblgen.
    146 class MipsAsmPseudoInst<dag outs, dag ins, string asmstr>:
    147   MipsInst<outs, ins, asmstr, [], IIPseudo, Pseudo> {
    148   let isPseudo = 1;
    149   let Pattern = [];
    150 }
    151 //===----------------------------------------------------------------------===//
    152 // Format R instruction class in Mips : <|opcode|rs|rt|rd|shamt|funct|>
    153 //===----------------------------------------------------------------------===//
    154 
    155 class FR<bits<6> op, bits<6> _funct, dag outs, dag ins, string asmstr,
    156          list<dag> pattern, InstrItinClass itin>:
    157   InstSE<outs, ins, asmstr, pattern, itin, FrmR>
    158 {
    159   bits<5>  rd;
    160   bits<5>  rs;
    161   bits<5>  rt;
    162   bits<5>  shamt;
    163   bits<6>  funct;
    164 
    165   let Opcode = op;
    166   let funct  = _funct;
    167 
    168   let Inst{25-21} = rs;
    169   let Inst{20-16} = rt;
    170   let Inst{15-11} = rd;
    171   let Inst{10-6}  = shamt;
    172   let Inst{5-0}   = funct;
    173 }
    174 
    175 //===----------------------------------------------------------------------===//
    176 // Format I instruction class in Mips : <|opcode|rs|rt|immediate|>
    177 //===----------------------------------------------------------------------===//
    178 
    179 class FI<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern,
    180          InstrItinClass itin>: InstSE<outs, ins, asmstr, pattern, itin, FrmI>
    181 {
    182   bits<5>  rt;
    183   bits<5>  rs;
    184   bits<16> imm16;
    185 
    186   let Opcode = op;
    187 
    188   let Inst{25-21} = rs;
    189   let Inst{20-16} = rt;
    190   let Inst{15-0}  = imm16;
    191 }
    192 
    193 class BranchBase<bits<6> op, dag outs, dag ins, string asmstr,
    194                   list<dag> pattern, InstrItinClass itin>:
    195   InstSE<outs, ins, asmstr, pattern, itin, FrmI>
    196 {
    197   bits<5>  rs;
    198   bits<5>  rt;
    199   bits<16> imm16;
    200 
    201   let Opcode = op;
    202 
    203   let Inst{25-21} = rs;
    204   let Inst{20-16} = rt;
    205   let Inst{15-0}  = imm16;
    206 }
    207 
    208 //===----------------------------------------------------------------------===//
    209 // Format J instruction class in Mips : <|opcode|address|>
    210 //===----------------------------------------------------------------------===//
    211 
    212 class FJ<bits<6> op> : StdArch
    213 {
    214   bits<26> target;
    215 
    216   bits<32> Inst;
    217 
    218   let Inst{31-26} = op;
    219   let Inst{25-0}  = target;
    220 }
    221 
    222 //===----------------------------------------------------------------------===//
    223 // MFC instruction class in Mips : <|op|mf|rt|rd|gst|0000|sel|>
    224 //===----------------------------------------------------------------------===//
    225 class MFC3OP_FM<bits<6> op, bits<5> mfmt, bits<3> guest> : StdArch {
    226   bits<5> rt;
    227   bits<5> rd;
    228   bits<3> sel;
    229 
    230   bits<32> Inst;
    231 
    232   let Inst{31-26} = op;
    233   let Inst{25-21} = mfmt;
    234   let Inst{20-16} = rt;
    235   let Inst{15-11} = rd;
    236   let Inst{10-8}  = guest;
    237   let Inst{7-3}   = 0;
    238   let Inst{2-0}   = sel;
    239 }
    240 
    241 class MFC2OP_FM<bits<6> op, bits<5> mfmt> : StdArch {
    242   bits<5>  rt;
    243   bits<16> imm16;
    244 
    245   bits<32> Inst;
    246 
    247   let Inst{31-26} = op;
    248   let Inst{25-21} = mfmt;
    249   let Inst{20-16} = rt;
    250   let Inst{15-0}  = imm16;
    251 }
    252 
    253 class ADD_FM<bits<6> op, bits<6> funct> : StdArch {
    254   bits<5> rd;
    255   bits<5> rs;
    256   bits<5> rt;
    257 
    258   bits<32> Inst;
    259 
    260   let Inst{31-26} = op;
    261   let Inst{25-21} = rs;
    262   let Inst{20-16} = rt;
    263   let Inst{15-11} = rd;
    264   let Inst{10-6}  = 0;
    265   let Inst{5-0}   = funct;
    266 }
    267 
    268 class ADDI_FM<bits<6> op> : StdArch {
    269   bits<5>  rs;
    270   bits<5>  rt;
    271   bits<16> imm16;
    272 
    273   bits<32> Inst;
    274 
    275   let Inst{31-26} = op;
    276   let Inst{25-21} = rs;
    277   let Inst{20-16} = rt;
    278   let Inst{15-0}  = imm16;
    279 }
    280 
    281 class SRA_FM<bits<6> funct, bit rotate> : StdArch {
    282   bits<5> rd;
    283   bits<5> rt;
    284   bits<5> shamt;
    285 
    286   bits<32> Inst;
    287 
    288   let Inst{31-26} = 0;
    289   let Inst{25-22} = 0;
    290   let Inst{21}    = rotate;
    291   let Inst{20-16} = rt;
    292   let Inst{15-11} = rd;
    293   let Inst{10-6}  = shamt;
    294   let Inst{5-0}   = funct;
    295 }
    296 
    297 class SRLV_FM<bits<6> funct, bit rotate> : StdArch {
    298   bits<5> rd;
    299   bits<5> rt;
    300   bits<5> rs;
    301 
    302   bits<32> Inst;
    303 
    304   let Inst{31-26} = 0;
    305   let Inst{25-21} = rs;
    306   let Inst{20-16} = rt;
    307   let Inst{15-11} = rd;
    308   let Inst{10-7}  = 0;
    309   let Inst{6}     = rotate;
    310   let Inst{5-0}   = funct;
    311 }
    312 
    313 class BEQ_FM<bits<6> op> : StdArch {
    314   bits<5>  rs;
    315   bits<5>  rt;
    316   bits<16> offset;
    317 
    318   bits<32> Inst;
    319 
    320   let Inst{31-26} = op;
    321   let Inst{25-21} = rs;
    322   let Inst{20-16} = rt;
    323   let Inst{15-0}  = offset;
    324 }
    325 
    326 class BGEZ_FM<bits<6> op, bits<5> funct> : StdArch {
    327   bits<5>  rs;
    328   bits<16> offset;
    329 
    330   bits<32> Inst;
    331 
    332   let Inst{31-26} = op;
    333   let Inst{25-21} = rs;
    334   let Inst{20-16} = funct;
    335   let Inst{15-0}  = offset;
    336 }
    337 
    338 class BBIT_FM<bits<6> op> : StdArch {
    339   bits<5>  rs;
    340   bits<5>  p;
    341   bits<16> offset;
    342 
    343   bits<32> Inst;
    344 
    345   let Inst{31-26} = op;
    346   let Inst{25-21} = rs;
    347   let Inst{20-16} = p;
    348   let Inst{15-0}  = offset;
    349 }
    350 
    351 class SLTI_FM<bits<6> op> : StdArch {
    352   bits<5> rt;
    353   bits<5> rs;
    354   bits<16> imm16;
    355 
    356   bits<32> Inst;
    357 
    358   let Inst{31-26} = op;
    359   let Inst{25-21} = rs;
    360   let Inst{20-16} = rt;
    361   let Inst{15-0}  = imm16;
    362 }
    363 
    364 class MFLO_FM<bits<6> funct> : StdArch {
    365   bits<5> rd;
    366 
    367   bits<32> Inst;
    368 
    369   let Inst{31-26} = 0;
    370   let Inst{25-16} = 0;
    371   let Inst{15-11} = rd;
    372   let Inst{10-6}  = 0;
    373   let Inst{5-0}   = funct;
    374 }
    375 
    376 class MTLO_FM<bits<6> funct> : StdArch {
    377   bits<5> rs;
    378 
    379   bits<32> Inst;
    380 
    381   let Inst{31-26} = 0;
    382   let Inst{25-21} = rs;
    383   let Inst{20-6}  = 0;
    384   let Inst{5-0}   = funct;
    385 }
    386 
    387 class SEB_FM<bits<5> funct, bits<6> funct2> : StdArch {
    388   bits<5> rd;
    389   bits<5> rt;
    390 
    391   bits<32> Inst;
    392 
    393   let Inst{31-26} = 0x1f;
    394   let Inst{25-21} = 0;
    395   let Inst{20-16} = rt;
    396   let Inst{15-11} = rd;
    397   let Inst{10-6}  = funct;
    398   let Inst{5-0}   = funct2;
    399 }
    400 
    401 class CLO_FM<bits<6> funct> : StdArch {
    402   bits<5> rd;
    403   bits<5> rs;
    404   bits<5> rt;
    405 
    406   bits<32> Inst;
    407 
    408   let Inst{31-26} = 0x1c;
    409   let Inst{25-21} = rs;
    410   let Inst{20-16} = rt;
    411   let Inst{15-11} = rd;
    412   let Inst{10-6}  = 0;
    413   let Inst{5-0}   = funct;
    414   let rt = rd;
    415 }
    416 
    417 class LUI_FM : StdArch {
    418   bits<5> rt;
    419   bits<16> imm16;
    420 
    421   bits<32> Inst;
    422 
    423   let Inst{31-26} = 0xf;
    424   let Inst{25-21} = 0;
    425   let Inst{20-16} = rt;
    426   let Inst{15-0}  = imm16;
    427 }
    428 
    429 class JALR_FM {
    430   bits<5> rd;
    431   bits<5> rs;
    432 
    433   bits<32> Inst;
    434 
    435   let Inst{31-26} = 0;
    436   let Inst{25-21} = rs;
    437   let Inst{20-16} = 0;
    438   let Inst{15-11} = rd;
    439   let Inst{10-6}  = 0;
    440   let Inst{5-0}   = 9;
    441 }
    442 
    443 class BGEZAL_FM<bits<5> funct> : StdArch {
    444   bits<5>  rs;
    445   bits<16> offset;
    446 
    447   bits<32> Inst;
    448 
    449   let Inst{31-26} = 1;
    450   let Inst{25-21} = rs;
    451   let Inst{20-16} = funct;
    452   let Inst{15-0}  = offset;
    453 }
    454 
    455 class SYNC_FM : StdArch {
    456   bits<5> stype;
    457 
    458   bits<32> Inst;
    459 
    460   let Inst{31-26} = 0;
    461   let Inst{10-6}  = stype;
    462   let Inst{5-0}   = 0xf;
    463 }
    464 
    465 class SYNCI_FM : StdArch {
    466   // Produced by the mem_simm16 address as reg << 16 | imm (see getMemEncoding).
    467   bits<21> addr;
    468   bits<5> rs = addr{20-16};
    469   bits<16> offset = addr{15-0};
    470 
    471   bits<32> Inst;
    472 
    473   let Inst{31-26} = 0b000001;
    474   let Inst{25-21} = rs;
    475   let Inst{20-16} = 0b11111;
    476   let Inst{15-0}  = offset;
    477 }
    478 
    479 class MULT_FM<bits<6> op, bits<6> funct> : StdArch {
    480   bits<5>  rs;
    481   bits<5>  rt;
    482 
    483   bits<32> Inst;
    484 
    485   let Inst{31-26} = op;
    486   let Inst{25-21} = rs;
    487   let Inst{20-16} = rt;
    488   let Inst{15-6}  = 0;
    489   let Inst{5-0}   = funct;
    490 }
    491 
    492 class EXT_FM<bits<6> funct> : StdArch {
    493   bits<5> rt;
    494   bits<5> rs;
    495   bits<5> pos;
    496   bits<5> size;
    497 
    498   bits<32> Inst;
    499 
    500   let Inst{31-26} = 0x1f;
    501   let Inst{25-21} = rs;
    502   let Inst{20-16} = rt;
    503   let Inst{15-11} = size;
    504   let Inst{10-6}  = pos;
    505   let Inst{5-0}   = funct;
    506 }
    507 
    508 class RDHWR_FM : StdArch {
    509   bits<5> rt;
    510   bits<5> rd;
    511   bits<3> sel;
    512 
    513   bits<32> Inst;
    514 
    515   let Inst{31-26} = 0x1f;
    516   let Inst{25-21} = 0;
    517   let Inst{20-16} = rt;
    518   let Inst{15-11} = rd;
    519   let Inst{10-9}  = 0b00;
    520   let Inst{8-6}   = sel;
    521   let Inst{5-0}   = 0x3b;
    522 }
    523 
    524 class TEQ_FM<bits<6> funct> : StdArch {
    525   bits<5> rs;
    526   bits<5> rt;
    527   bits<10> code_;
    528 
    529   bits<32> Inst;
    530 
    531   let Inst{31-26} = 0;
    532   let Inst{25-21} = rs;
    533   let Inst{20-16} = rt;
    534   let Inst{15-6}  = code_;
    535   let Inst{5-0}   = funct;
    536 }
    537 
    538 class TEQI_FM<bits<5> funct> : StdArch {
    539   bits<5> rs;
    540   bits<16> imm16;
    541 
    542   bits<32> Inst;
    543 
    544   let Inst{31-26} = 1;
    545   let Inst{25-21} = rs;
    546   let Inst{20-16}   = funct;
    547   let Inst{15-0}  = imm16;
    548 }
    549 
    550 class WAIT_FM : StdArch {
    551   bits<32> Inst;
    552 
    553   let Inst{31-26} = 0x10;
    554   let Inst{25}    = 1;
    555   let Inst{24-6}  = 0;
    556   let Inst{5-0}   = 0x20;
    557 }
    558 
    559 class EXTS_FM<bits<6> funct> : StdArch {
    560   bits<5> rt;
    561   bits<5> rs;
    562   bits<5> pos;
    563   bits<5> lenm1;
    564 
    565   bits<32> Inst;
    566 
    567   let Inst{31-26} = 0x1c;
    568   let Inst{25-21} = rs;
    569   let Inst{20-16} = rt;
    570   let Inst{15-11} = lenm1;
    571   let Inst{10-6}  = pos;
    572   let Inst{5-0}   = funct;
    573 }
    574 
    575 class MTMR_FM<bits<6> funct> : StdArch {
    576   bits<5> rs;
    577 
    578   bits<32> Inst;
    579 
    580   let Inst{31-26} = 0x1c;
    581   let Inst{25-21} = rs;
    582   let Inst{20-6}  = 0;
    583   let Inst{5-0}   = funct;
    584 }
    585 
    586 class POP_FM<bits<6> funct> : StdArch {
    587   bits<5> rd;
    588   bits<5> rs;
    589 
    590   bits<32> Inst;
    591 
    592   let Inst{31-26} = 0x1c;
    593   let Inst{25-21} = rs;
    594   let Inst{20-16} = 0;
    595   let Inst{15-11} = rd;
    596   let Inst{10-6}  = 0;
    597   let Inst{5-0}   = funct;
    598 }
    599 
    600 class SEQ_FM<bits<6> funct> : StdArch {
    601   bits<5> rd;
    602   bits<5> rs;
    603   bits<5> rt;
    604 
    605   bits<32> Inst;
    606 
    607   let Inst{31-26} = 0x1c;
    608   let Inst{25-21} = rs;
    609   let Inst{20-16} = rt;
    610   let Inst{15-11} = rd;
    611   let Inst{10-6}  = 0;
    612   let Inst{5-0}   = funct;
    613 }
    614 
    615 class SEQI_FM<bits<6> funct> : StdArch {
    616   bits<5> rs;
    617   bits<5> rt;
    618   bits<10> imm10;
    619 
    620   bits<32> Inst;
    621 
    622   let Inst{31-26} = 0x1c;
    623   let Inst{25-21} = rs;
    624   let Inst{20-16} = rt;
    625   let Inst{15-6}  = imm10;
    626   let Inst{5-0}   = funct;
    627 }
    628 
    629 //===----------------------------------------------------------------------===//
    630 //  System calls format <op|code_|funct>
    631 //===----------------------------------------------------------------------===//
    632 
    633 class SYS_FM<bits<6> funct> : StdArch
    634 {
    635   bits<20> code_;
    636   bits<32> Inst;
    637   let Inst{31-26} = 0x0;
    638   let Inst{25-6} = code_;
    639   let Inst{5-0}  = funct;
    640 }
    641 
    642 //===----------------------------------------------------------------------===//
    643 //  Break instruction format <op|code_1|funct>
    644 //===----------------------------------------------------------------------===//
    645 
    646 class BRK_FM<bits<6> funct> : StdArch
    647 {
    648   bits<10> code_1;
    649   bits<10> code_2;
    650   bits<32> Inst;
    651   let Inst{31-26} = 0x0;
    652   let Inst{25-16} = code_1;
    653   let Inst{15-6}  = code_2;
    654   let Inst{5-0}   = funct;
    655 }
    656 
    657 //===----------------------------------------------------------------------===//
    658 //  Exception return format <Cop0|1|0|funct>
    659 //===----------------------------------------------------------------------===//
    660 
    661 class ER_FM<bits<6> funct, bit LLBit> : StdArch
    662 {
    663   bits<32> Inst;
    664   let Inst{31-26} = 0x10;
    665   let Inst{25}    = 1;
    666   let Inst{24-7}  = 0;
    667   let Inst{6} = LLBit;
    668   let Inst{5-0}   = funct;
    669 }
    670 
    671 //===----------------------------------------------------------------------===//
    672 //  Enable/disable interrupt instruction format <Cop0|MFMC0|rt|12|0|sc|0|0>
    673 //===----------------------------------------------------------------------===//
    674 
    675 class EI_FM<bits<1> sc> : StdArch
    676 {
    677   bits<32> Inst;
    678   bits<5> rt;
    679   let Inst{31-26} = 0x10;
    680   let Inst{25-21} = 0xb;
    681   let Inst{20-16} = rt;
    682   let Inst{15-11} = 0xc;
    683   let Inst{10-6}  = 0;
    684   let Inst{5}     = sc;
    685   let Inst{4-0}   = 0;
    686 }
    687 
    688 //===----------------------------------------------------------------------===//
    689 //
    690 //  FLOATING POINT INSTRUCTION FORMATS
    691 //
    692 //  opcode  - operation code.
    693 //  fs      - src reg.
    694 //  ft      - dst reg (on a 2 regs instr) or src reg (on a 3 reg instr).
    695 //  fd      - dst reg, only used on 3 regs instr.
    696 //  fmt     - double or single precision.
    697 //  funct   - combined with opcode field give us an operation code.
    698 //
    699 //===----------------------------------------------------------------------===//
    700 
    701 //===----------------------------------------------------------------------===//
    702 // Format FI instruction class in Mips : <|opcode|base|ft|immediate|>
    703 //===----------------------------------------------------------------------===//
    704 
    705 class FFI<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern>:
    706   InstSE<outs, ins, asmstr, pattern, NoItinerary, FrmFI>
    707 {
    708   bits<5>  ft;
    709   bits<5>  base;
    710   bits<16> imm16;
    711 
    712   let Opcode = op;
    713 
    714   let Inst{25-21} = base;
    715   let Inst{20-16} = ft;
    716   let Inst{15-0}  = imm16;
    717 }
    718 
    719 class ADDS_FM<bits<6> funct, bits<5> fmt> : StdArch {
    720   bits<5> fd;
    721   bits<5> fs;
    722   bits<5> ft;
    723 
    724   bits<32> Inst;
    725 
    726   let Inst{31-26} = 0x11;
    727   let Inst{25-21} = fmt;
    728   let Inst{20-16} = ft;
    729   let Inst{15-11} = fs;
    730   let Inst{10-6}  = fd;
    731   let Inst{5-0}   = funct;
    732 }
    733 
    734 class ABSS_FM<bits<6> funct, bits<5> fmt> : StdArch {
    735   bits<5> fd;
    736   bits<5> fs;
    737 
    738   bits<32> Inst;
    739 
    740   let Inst{31-26} = 0x11;
    741   let Inst{25-21} = fmt;
    742   let Inst{20-16} = 0;
    743   let Inst{15-11} = fs;
    744   let Inst{10-6}  = fd;
    745   let Inst{5-0}   = funct;
    746 }
    747 
    748 class MFC1_FM<bits<5> funct> : StdArch {
    749   bits<5> rt;
    750   bits<5> fs;
    751 
    752   bits<32> Inst;
    753 
    754   let Inst{31-26} = 0x11;
    755   let Inst{25-21} = funct;
    756   let Inst{20-16} = rt;
    757   let Inst{15-11} = fs;
    758   let Inst{10-0}  = 0;
    759 }
    760 
    761 class LW_FM<bits<6> op> : StdArch {
    762   bits<5> rt;
    763   bits<21> addr;
    764 
    765   bits<32> Inst;
    766 
    767   let Inst{31-26} = op;
    768   let Inst{25-21} = addr{20-16};
    769   let Inst{20-16} = rt;
    770   let Inst{15-0}  = addr{15-0};
    771 }
    772 
    773 class MADDS_FM<bits<3> funct, bits<3> fmt> : StdArch {
    774   bits<5> fd;
    775   bits<5> fr;
    776   bits<5> fs;
    777   bits<5> ft;
    778 
    779   bits<32> Inst;
    780 
    781   let Inst{31-26} = 0x13;
    782   let Inst{25-21} = fr;
    783   let Inst{20-16} = ft;
    784   let Inst{15-11} = fs;
    785   let Inst{10-6}  = fd;
    786   let Inst{5-3}   = funct;
    787   let Inst{2-0}   = fmt;
    788 }
    789 
    790 class LWXC1_FM<bits<6> funct> : StdArch {
    791   bits<5> fd;
    792   bits<5> base;
    793   bits<5> index;
    794 
    795   bits<32> Inst;
    796 
    797   let Inst{31-26} = 0x13;
    798   let Inst{25-21} = base;
    799   let Inst{20-16} = index;
    800   let Inst{15-11} = 0;
    801   let Inst{10-6}  = fd;
    802   let Inst{5-0}   = funct;
    803 }
    804 
    805 class SWXC1_FM<bits<6> funct> : StdArch {
    806   bits<5> fs;
    807   bits<5> base;
    808   bits<5> index;
    809 
    810   bits<32> Inst;
    811 
    812   let Inst{31-26} = 0x13;
    813   let Inst{25-21} = base;
    814   let Inst{20-16} = index;
    815   let Inst{15-11} = fs;
    816   let Inst{10-6}  = 0;
    817   let Inst{5-0}   = funct;
    818 }
    819 
    820 class BC1F_FM<bit nd, bit tf> : StdArch {
    821   bits<3>  fcc;
    822   bits<16> offset;
    823 
    824   bits<32> Inst;
    825 
    826   let Inst{31-26} = 0x11;
    827   let Inst{25-21} = 0x8;
    828   let Inst{20-18} = fcc;
    829   let Inst{17} = nd;
    830   let Inst{16} = tf;
    831   let Inst{15-0} = offset;
    832 }
    833 
    834 class CEQS_FM<bits<5> fmt> : StdArch {
    835   bits<5> fs;
    836   bits<5> ft;
    837   bits<3> fcc;
    838   bits<4> cond;
    839 
    840   bits<32> Inst;
    841 
    842   let Inst{31-26} = 0x11;
    843   let Inst{25-21} = fmt;
    844   let Inst{20-16} = ft;
    845   let Inst{15-11} = fs;
    846   let Inst{10-8} = fcc;
    847   let Inst{7-4} = 0x3;
    848   let Inst{3-0} = cond;
    849 }
    850 
    851 class C_COND_FM<bits<5> fmt, bits<4> c> : CEQS_FM<fmt> {
    852   let cond = c;
    853 }
    854 
    855 class CMov_I_F_FM<bits<6> funct, bits<5> fmt> : StdArch {
    856   bits<5> fd;
    857   bits<5> fs;
    858   bits<5> rt;
    859 
    860   bits<32> Inst;
    861 
    862   let Inst{31-26} = 0x11;
    863   let Inst{25-21} = fmt;
    864   let Inst{20-16} = rt;
    865   let Inst{15-11} = fs;
    866   let Inst{10-6} = fd;
    867   let Inst{5-0} = funct;
    868 }
    869 
    870 class CMov_F_I_FM<bit tf> : StdArch {
    871   bits<5> rd;
    872   bits<5> rs;
    873   bits<3> fcc;
    874 
    875   bits<32> Inst;
    876 
    877   let Inst{31-26} = 0;
    878   let Inst{25-21} = rs;
    879   let Inst{20-18} = fcc;
    880   let Inst{17} = 0;
    881   let Inst{16} = tf;
    882   let Inst{15-11} = rd;
    883   let Inst{10-6} = 0;
    884   let Inst{5-0} = 1;
    885 }
    886 
    887 class CMov_F_F_FM<bits<5> fmt, bit tf> : StdArch {
    888   bits<5> fd;
    889   bits<5> fs;
    890   bits<3> fcc;
    891 
    892   bits<32> Inst;
    893 
    894   let Inst{31-26} = 0x11;
    895   let Inst{25-21} = fmt;
    896   let Inst{20-18} = fcc;
    897   let Inst{17} = 0;
    898   let Inst{16} = tf;
    899   let Inst{15-11} = fs;
    900   let Inst{10-6} = fd;
    901   let Inst{5-0} = 0x11;
    902 }
    903 
    904 class BARRIER_FM<bits<5> op> : StdArch {
    905   bits<32> Inst;
    906 
    907   let Inst{31-26} = 0; // SPECIAL
    908   let Inst{25-21} = 0;
    909   let Inst{20-16} = 0; // rt = 0
    910   let Inst{15-11} = 0; // rd = 0
    911   let Inst{10-6} = op; // Operation
    912   let Inst{5-0} = 0;   // SLL
    913 }
    914 
    915 class SDBBP_FM : StdArch {
    916   bits<20> code_;
    917 
    918   bits<32> Inst;
    919 
    920   let Inst{31-26} = 0b011100; // SPECIAL2
    921   let Inst{25-6} = code_;
    922   let Inst{5-0} = 0b111111;   // SDBBP
    923 }
    924 
    925 class JR_HB_FM<bits<6> op> : StdArch{
    926   bits<5> rs;
    927 
    928   bits<32> Inst;
    929 
    930   let Inst{31-26} = 0; // SPECIAL
    931   let Inst{25-21} = rs;
    932   let Inst{20-11} = 0;
    933   let Inst{10} = 1;
    934   let Inst{9-6} = 0;
    935   let Inst{5-0} = op;
    936 }
    937 
    938 class JALR_HB_FM<bits<6> op> : StdArch {
    939   bits<5> rd;
    940   bits<5> rs;
    941 
    942   bits<32> Inst;
    943 
    944   let Inst{31-26} = 0; // SPECIAL
    945   let Inst{25-21} = rs;
    946   let Inst{20-16} = 0;
    947   let Inst{15-11} = rd;
    948   let Inst{10} = 1;
    949   let Inst{9-6} = 0;
    950   let Inst{5-0} = op;
    951 }
    952 
    953 class COP0_TLB_FM<bits<6> op> : StdArch {
    954   bits<32> Inst;
    955 
    956   let Inst{31-26} = 0x10; // COP0
    957   let Inst{25} = 1;       // CO
    958   let Inst{24-6} = 0;
    959   let Inst{5-0} = op;     // Operation
    960 }
    961 
    962 class CACHEOP_FM<bits<6> op> : StdArch {
    963   bits<21> addr;
    964   bits<5> hint;
    965   bits<5> base = addr{20-16};
    966   bits<16> offset = addr{15-0};
    967 
    968   bits<32> Inst;
    969 
    970   let Inst{31-26} = op;
    971   let Inst{25-21} = base;
    972   let Inst{20-16} = hint;
    973   let Inst{15-0}  = offset;
    974 }
    975 
    976 class HYPCALL_FM<bits<6> op> : StdArch {
    977   bits<10> code_;
    978 
    979   bits<32> Inst;
    980 
    981   let Inst{31-26} = 0b010000;
    982   let Inst{25}    = 1;
    983   let Inst{20-11} = code_;
    984   let Inst{5-0}   = op;
    985 }
    986