xref: /freebsd/contrib/llvm-project/llvm/lib/Target/Mips/MicroMipsInstrFormats.td (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
10b57cec5SDimitry Andric//===-- MicroMipsInstrFormats.td - microMIPS Inst Formats -*- tablegen -*--===//
20b57cec5SDimitry Andric//
30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric//
70b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric//
95ffd83dbSDimitry Andric// This files describes the formats of the microMIPS instruction set.
100b57cec5SDimitry Andric//
110b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
140b57cec5SDimitry Andric// MicroMIPS Base Classes
150b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
160b57cec5SDimitry Andric
170b57cec5SDimitry Andric//
180b57cec5SDimitry Andric// Base class for MicroMips instructions.
190b57cec5SDimitry Andric// This class does not depend on the instruction size.
200b57cec5SDimitry Andric//
210b57cec5SDimitry Andricclass MicroMipsInstBase<dag outs, dag ins, string asmstr, list<dag> pattern,
220b57cec5SDimitry Andric                        InstrItinClass itin, Format f> : Instruction,
230b57cec5SDimitry Andric                        PredicateControl {
240b57cec5SDimitry Andric  let Namespace = "Mips";
250b57cec5SDimitry Andric  let DecoderNamespace = "MicroMips";
260b57cec5SDimitry Andric
270b57cec5SDimitry Andric  let OutOperandList = outs;
280b57cec5SDimitry Andric  let InOperandList  = ins;
290b57cec5SDimitry Andric
300b57cec5SDimitry Andric  let AsmString   = asmstr;
310b57cec5SDimitry Andric  let Pattern     = pattern;
320b57cec5SDimitry Andric  let Itinerary   = itin;
330b57cec5SDimitry Andric
340b57cec5SDimitry Andric  let EncodingPredicates = [InMicroMips];
350b57cec5SDimitry Andric
360b57cec5SDimitry Andric  Format Form = f;
370b57cec5SDimitry Andric}
380b57cec5SDimitry Andric
390b57cec5SDimitry Andric//
400b57cec5SDimitry Andric// Base class for MicroMIPS 16-bit instructions.
410b57cec5SDimitry Andric//
420b57cec5SDimitry Andricclass MicroMipsInst16<dag outs, dag ins, string asmstr, list<dag> pattern,
430b57cec5SDimitry Andric               InstrItinClass itin, Format f> :
440b57cec5SDimitry Andric  MicroMipsInstBase<outs, ins, asmstr, pattern, itin, f>
450b57cec5SDimitry Andric{
460b57cec5SDimitry Andric  let Size = 2;
470b57cec5SDimitry Andric  field bits<16> Inst;
480b57cec5SDimitry Andric  field bits<16> SoftFail = 0;
490b57cec5SDimitry Andric  bits<6> Opcode = 0x0;
500b57cec5SDimitry Andric}
510b57cec5SDimitry Andric
520b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
530b57cec5SDimitry Andric// MicroMIPS 16-bit Instruction Formats
540b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
550b57cec5SDimitry Andric
560b57cec5SDimitry Andricclass ARITH_FM_MM16<bit funct> {
570b57cec5SDimitry Andric  bits<3> rd;
580b57cec5SDimitry Andric  bits<3> rt;
590b57cec5SDimitry Andric  bits<3> rs;
600b57cec5SDimitry Andric
610b57cec5SDimitry Andric  bits<16> Inst;
620b57cec5SDimitry Andric
630b57cec5SDimitry Andric  let Inst{15-10} = 0x01;
640b57cec5SDimitry Andric  let Inst{9-7}   = rd;
650b57cec5SDimitry Andric  let Inst{6-4}   = rt;
660b57cec5SDimitry Andric  let Inst{3-1}   = rs;
670b57cec5SDimitry Andric  let Inst{0}     = funct;
680b57cec5SDimitry Andric}
690b57cec5SDimitry Andric
700b57cec5SDimitry Andricclass ANDI_FM_MM16<bits<6> funct> {
710b57cec5SDimitry Andric  bits<3> rd;
720b57cec5SDimitry Andric  bits<3> rs;
730b57cec5SDimitry Andric  bits<4> imm;
740b57cec5SDimitry Andric
750b57cec5SDimitry Andric  bits<16> Inst;
760b57cec5SDimitry Andric
770b57cec5SDimitry Andric  let Inst{15-10} = funct;
780b57cec5SDimitry Andric  let Inst{9-7}   = rd;
790b57cec5SDimitry Andric  let Inst{6-4}   = rs;
800b57cec5SDimitry Andric  let Inst{3-0}   = imm;
810b57cec5SDimitry Andric}
820b57cec5SDimitry Andric
830b57cec5SDimitry Andricclass LOGIC_FM_MM16<bits<4> funct> {
840b57cec5SDimitry Andric  bits<3> rt;
850b57cec5SDimitry Andric  bits<3> rs;
860b57cec5SDimitry Andric
870b57cec5SDimitry Andric  bits<16> Inst;
880b57cec5SDimitry Andric
890b57cec5SDimitry Andric  let Inst{15-10} = 0x11;
900b57cec5SDimitry Andric  let Inst{9-6}   = funct;
910b57cec5SDimitry Andric  let Inst{5-3}   = rt;
920b57cec5SDimitry Andric  let Inst{2-0}   = rs;
930b57cec5SDimitry Andric}
940b57cec5SDimitry Andric
950b57cec5SDimitry Andricclass SHIFT_FM_MM16<bits<1> funct> {
960b57cec5SDimitry Andric  bits<3> rd;
970b57cec5SDimitry Andric  bits<3> rt;
980b57cec5SDimitry Andric  bits<3> shamt;
990b57cec5SDimitry Andric
1000b57cec5SDimitry Andric  bits<16> Inst;
1010b57cec5SDimitry Andric
1020b57cec5SDimitry Andric  let Inst{15-10} = 0x09;
1030b57cec5SDimitry Andric  let Inst{9-7}   = rd;
1040b57cec5SDimitry Andric  let Inst{6-4}   = rt;
1050b57cec5SDimitry Andric  let Inst{3-1}   = shamt;
1060b57cec5SDimitry Andric  let Inst{0}     = funct;
1070b57cec5SDimitry Andric}
1080b57cec5SDimitry Andric
1090b57cec5SDimitry Andricclass ADDIUR2_FM_MM16 {
1100b57cec5SDimitry Andric  bits<3> rd;
1110b57cec5SDimitry Andric  bits<3> rs;
1120b57cec5SDimitry Andric  bits<3> imm;
1130b57cec5SDimitry Andric
1140b57cec5SDimitry Andric  bits<16> Inst;
1150b57cec5SDimitry Andric
1160b57cec5SDimitry Andric  let Inst{15-10} = 0x1b;
1170b57cec5SDimitry Andric  let Inst{9-7}   = rd;
1180b57cec5SDimitry Andric  let Inst{6-4}   = rs;
1190b57cec5SDimitry Andric  let Inst{3-1}   = imm;
1200b57cec5SDimitry Andric  let Inst{0}     = 0;
1210b57cec5SDimitry Andric}
1220b57cec5SDimitry Andric
1230b57cec5SDimitry Andricclass LOAD_STORE_FM_MM16<bits<6> op> {
1240b57cec5SDimitry Andric  bits<3> rt;
1250b57cec5SDimitry Andric  bits<7> addr;
1260b57cec5SDimitry Andric
1270b57cec5SDimitry Andric  bits<16> Inst;
1280b57cec5SDimitry Andric
1290b57cec5SDimitry Andric  let Inst{15-10} = op;
1300b57cec5SDimitry Andric  let Inst{9-7}   = rt;
1310b57cec5SDimitry Andric  let Inst{6-4}   = addr{6-4};
1320b57cec5SDimitry Andric  let Inst{3-0}   = addr{3-0};
1330b57cec5SDimitry Andric}
1340b57cec5SDimitry Andric
1350b57cec5SDimitry Andricclass LOAD_STORE_SP_FM_MM16<bits<6> op> {
1360b57cec5SDimitry Andric  bits<5> rt;
1370b57cec5SDimitry Andric  bits<5> offset;
1380b57cec5SDimitry Andric
1390b57cec5SDimitry Andric  bits<16> Inst;
1400b57cec5SDimitry Andric
1410b57cec5SDimitry Andric  let Inst{15-10} = op;
1420b57cec5SDimitry Andric  let Inst{9-5}   = rt;
1430b57cec5SDimitry Andric  let Inst{4-0}   = offset;
1440b57cec5SDimitry Andric}
1450b57cec5SDimitry Andric
1460b57cec5SDimitry Andricclass LOAD_GP_FM_MM16<bits<6> op> {
1470b57cec5SDimitry Andric  bits<3> rt;
1480b57cec5SDimitry Andric  bits<7> offset;
1490b57cec5SDimitry Andric
1500b57cec5SDimitry Andric  bits<16> Inst;
1510b57cec5SDimitry Andric
1520b57cec5SDimitry Andric  let Inst{15-10} = op;
1530b57cec5SDimitry Andric  let Inst{9-7} = rt;
1540b57cec5SDimitry Andric  let Inst{6-0} = offset;
1550b57cec5SDimitry Andric}
1560b57cec5SDimitry Andric
1570b57cec5SDimitry Andricclass ADDIUS5_FM_MM16 {
1580b57cec5SDimitry Andric  bits<5> rd;
1590b57cec5SDimitry Andric  bits<4> imm;
1600b57cec5SDimitry Andric
1610b57cec5SDimitry Andric  bits<16> Inst;
1620b57cec5SDimitry Andric
1630b57cec5SDimitry Andric  let Inst{15-10} = 0x13;
1640b57cec5SDimitry Andric  let Inst{9-5}   = rd;
1650b57cec5SDimitry Andric  let Inst{4-1}   = imm;
1660b57cec5SDimitry Andric  let Inst{0}     = 0;
1670b57cec5SDimitry Andric}
1680b57cec5SDimitry Andric
1690b57cec5SDimitry Andricclass ADDIUSP_FM_MM16 {
1700b57cec5SDimitry Andric  bits<9> imm;
1710b57cec5SDimitry Andric
1720b57cec5SDimitry Andric  bits<16> Inst;
1730b57cec5SDimitry Andric
1740b57cec5SDimitry Andric  let Inst{15-10} = 0x13;
1750b57cec5SDimitry Andric  let Inst{9-1}   = imm;
1760b57cec5SDimitry Andric  let Inst{0}     = 1;
1770b57cec5SDimitry Andric}
1780b57cec5SDimitry Andric
1790b57cec5SDimitry Andricclass MOVE_FM_MM16<bits<6> funct> {
1800b57cec5SDimitry Andric  bits<5> rs;
1810b57cec5SDimitry Andric  bits<5> rd;
1820b57cec5SDimitry Andric
1830b57cec5SDimitry Andric  bits<16> Inst;
1840b57cec5SDimitry Andric
1850b57cec5SDimitry Andric  let Inst{15-10} = funct;
1860b57cec5SDimitry Andric  let Inst{9-5}   = rd;
1870b57cec5SDimitry Andric  let Inst{4-0}   = rs;
1880b57cec5SDimitry Andric}
1890b57cec5SDimitry Andric
1900b57cec5SDimitry Andricclass LI_FM_MM16 {
1910b57cec5SDimitry Andric  bits<3> rd;
1920b57cec5SDimitry Andric  bits<7> imm;
1930b57cec5SDimitry Andric
1940b57cec5SDimitry Andric  bits<16> Inst;
1950b57cec5SDimitry Andric
1960b57cec5SDimitry Andric  let Inst{15-10} = 0x3b;
1970b57cec5SDimitry Andric  let Inst{9-7}   = rd;
1980b57cec5SDimitry Andric  let Inst{6-0}   = imm;
1990b57cec5SDimitry Andric}
2000b57cec5SDimitry Andric
2010b57cec5SDimitry Andricclass JALR_FM_MM16<bits<5> op> {
2020b57cec5SDimitry Andric  bits<5> rs;
2030b57cec5SDimitry Andric
2040b57cec5SDimitry Andric  bits<16> Inst;
2050b57cec5SDimitry Andric
2060b57cec5SDimitry Andric  let Inst{15-10} = 0x11;
2070b57cec5SDimitry Andric  let Inst{9-5}   = op;
2080b57cec5SDimitry Andric  let Inst{4-0}   = rs;
2090b57cec5SDimitry Andric}
2100b57cec5SDimitry Andric
2110b57cec5SDimitry Andricclass MFHILO_FM_MM16<bits<5> funct> {
2120b57cec5SDimitry Andric  bits<5> rd;
2130b57cec5SDimitry Andric
2140b57cec5SDimitry Andric  bits<16> Inst;
2150b57cec5SDimitry Andric
2160b57cec5SDimitry Andric  let Inst{15-10} = 0x11;
2170b57cec5SDimitry Andric  let Inst{9-5}   = funct;
2180b57cec5SDimitry Andric  let Inst{4-0}   = rd;
2190b57cec5SDimitry Andric}
2200b57cec5SDimitry Andric
2210b57cec5SDimitry Andricclass JRADDIUSP_FM_MM16<bits<5> op> {
2220b57cec5SDimitry Andric  bits<5> rs;
2230b57cec5SDimitry Andric  bits<5> imm;
2240b57cec5SDimitry Andric
2250b57cec5SDimitry Andric  bits<16> Inst;
2260b57cec5SDimitry Andric
2270b57cec5SDimitry Andric  let Inst{15-10} = 0x11;
2280b57cec5SDimitry Andric  let Inst{9-5}   = op;
2290b57cec5SDimitry Andric  let Inst{4-0}   = imm;
2300b57cec5SDimitry Andric}
2310b57cec5SDimitry Andric
2320b57cec5SDimitry Andricclass ADDIUR1SP_FM_MM16 {
2330b57cec5SDimitry Andric  bits<3> rd;
2340b57cec5SDimitry Andric  bits<6> imm;
2350b57cec5SDimitry Andric
2360b57cec5SDimitry Andric  bits<16> Inst;
2370b57cec5SDimitry Andric
2380b57cec5SDimitry Andric  let Inst{15-10} = 0x1b;
2390b57cec5SDimitry Andric  let Inst{9-7}   = rd;
2400b57cec5SDimitry Andric  let Inst{6-1}   = imm;
2410b57cec5SDimitry Andric  let Inst{0}     = 1;
2420b57cec5SDimitry Andric}
2430b57cec5SDimitry Andric
2440b57cec5SDimitry Andricclass BRKSDBBP16_FM_MM<bits<6> op> {
2450b57cec5SDimitry Andric  bits<4> code_;
2460b57cec5SDimitry Andric  bits<16> Inst;
2470b57cec5SDimitry Andric
2480b57cec5SDimitry Andric  let Inst{15-10} = 0x11;
2490b57cec5SDimitry Andric  let Inst{9-4}   = op;
2500b57cec5SDimitry Andric  let Inst{3-0}   = code_;
2510b57cec5SDimitry Andric}
2520b57cec5SDimitry Andric
2530b57cec5SDimitry Andricclass BEQNEZ_FM_MM16<bits<6> op> {
2540b57cec5SDimitry Andric  bits<3> rs;
2550b57cec5SDimitry Andric  bits<7> offset;
2560b57cec5SDimitry Andric
2570b57cec5SDimitry Andric  bits<16> Inst;
2580b57cec5SDimitry Andric
2590b57cec5SDimitry Andric  let Inst{15-10} = op;
2600b57cec5SDimitry Andric  let Inst{9-7}   = rs;
2610b57cec5SDimitry Andric  let Inst{6-0}   = offset;
2620b57cec5SDimitry Andric}
2630b57cec5SDimitry Andric
2640b57cec5SDimitry Andricclass B16_FM {
2650b57cec5SDimitry Andric  bits<10> offset;
2660b57cec5SDimitry Andric
2670b57cec5SDimitry Andric  bits<16> Inst;
2680b57cec5SDimitry Andric
2690b57cec5SDimitry Andric  let Inst{15-10} = 0x33;
2700b57cec5SDimitry Andric  let Inst{9-0}   = offset;
2710b57cec5SDimitry Andric}
2720b57cec5SDimitry Andric
2730b57cec5SDimitry Andricclass MOVEP_FM_MM16 {
2740b57cec5SDimitry Andric  bits<3> rt;
2750b57cec5SDimitry Andric  bits<3> rs;
2760b57cec5SDimitry Andric
2770b57cec5SDimitry Andric  bits<16> Inst;
2780b57cec5SDimitry Andric
2790b57cec5SDimitry Andric  let Inst{15-10} = 0x21;
280*bdd1243dSDimitry Andric  // bits 7-9 are populated by MipsMCCodeEmitter::encodeInstruction, with a
281*bdd1243dSDimitry Andric  // special encoding of both rd1 and rd2.
282*bdd1243dSDimitry Andric  let Inst{9-7}   = ?;
2830b57cec5SDimitry Andric  let Inst{6-4}   = rt;
2840b57cec5SDimitry Andric  let Inst{3-1}   = rs;
2850b57cec5SDimitry Andric  let Inst{0}     = 0;
2860b57cec5SDimitry Andric}
2870b57cec5SDimitry Andric
2880b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
2890b57cec5SDimitry Andric// MicroMIPS 32-bit Instruction Formats
2900b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
2910b57cec5SDimitry Andric
2920b57cec5SDimitry Andricclass MMArch {
2930b57cec5SDimitry Andric  string Arch = "micromips";
2940b57cec5SDimitry Andric}
2950b57cec5SDimitry Andric
2960b57cec5SDimitry Andricclass ADD_FM_MM<bits<6> op, bits<10> funct> : MMArch {
2970b57cec5SDimitry Andric  bits<5> rt;
2980b57cec5SDimitry Andric  bits<5> rs;
2990b57cec5SDimitry Andric  bits<5> rd;
3000b57cec5SDimitry Andric
3010b57cec5SDimitry Andric  bits<32> Inst;
3020b57cec5SDimitry Andric
3030b57cec5SDimitry Andric  let Inst{31-26} = op;
3040b57cec5SDimitry Andric  let Inst{25-21} = rt;
3050b57cec5SDimitry Andric  let Inst{20-16} = rs;
3060b57cec5SDimitry Andric  let Inst{15-11} = rd;
3070b57cec5SDimitry Andric  let Inst{10}    = 0;
3080b57cec5SDimitry Andric  let Inst{9-0}   = funct;
3090b57cec5SDimitry Andric}
3100b57cec5SDimitry Andric
3110b57cec5SDimitry Andricclass ADDI_FM_MM<bits<6> op> : MMArch {
3120b57cec5SDimitry Andric  bits<5>  rs;
3130b57cec5SDimitry Andric  bits<5>  rt;
3140b57cec5SDimitry Andric  bits<16> imm16;
3150b57cec5SDimitry Andric
3160b57cec5SDimitry Andric  bits<32> Inst;
3170b57cec5SDimitry Andric
3180b57cec5SDimitry Andric  let Inst{31-26} = op;
3190b57cec5SDimitry Andric  let Inst{25-21} = rt;
3200b57cec5SDimitry Andric  let Inst{20-16} = rs;
3210b57cec5SDimitry Andric  let Inst{15-0}  = imm16;
3220b57cec5SDimitry Andric}
3230b57cec5SDimitry Andric
3240b57cec5SDimitry Andricclass SLTI_FM_MM<bits<6> op> : MMArch {
3250b57cec5SDimitry Andric  bits<5> rt;
3260b57cec5SDimitry Andric  bits<5> rs;
3270b57cec5SDimitry Andric  bits<16> imm16;
3280b57cec5SDimitry Andric
3290b57cec5SDimitry Andric  bits<32> Inst;
3300b57cec5SDimitry Andric
3310b57cec5SDimitry Andric  let Inst{31-26} = op;
3320b57cec5SDimitry Andric  let Inst{25-21} = rt;
3330b57cec5SDimitry Andric  let Inst{20-16} = rs;
3340b57cec5SDimitry Andric  let Inst{15-0}  = imm16;
3350b57cec5SDimitry Andric}
3360b57cec5SDimitry Andric
3370b57cec5SDimitry Andricclass LUI_FM_MM : MMArch {
3380b57cec5SDimitry Andric  bits<5> rt;
3390b57cec5SDimitry Andric  bits<16> imm16;
3400b57cec5SDimitry Andric
3410b57cec5SDimitry Andric  bits<32> Inst;
3420b57cec5SDimitry Andric
3430b57cec5SDimitry Andric  let Inst{31-26} = 0x10;
3440b57cec5SDimitry Andric  let Inst{25-21} = 0xd;
3450b57cec5SDimitry Andric  let Inst{20-16} = rt;
3460b57cec5SDimitry Andric  let Inst{15-0}  = imm16;
3470b57cec5SDimitry Andric}
3480b57cec5SDimitry Andric
3490b57cec5SDimitry Andricclass MULT_FM_MM<bits<10> funct> : MMArch {
3500b57cec5SDimitry Andric  bits<5>  rs;
3510b57cec5SDimitry Andric  bits<5>  rt;
3520b57cec5SDimitry Andric
3530b57cec5SDimitry Andric  bits<32> Inst;
3540b57cec5SDimitry Andric
3550b57cec5SDimitry Andric  let Inst{31-26} = 0x00;
3560b57cec5SDimitry Andric  let Inst{25-21} = rt;
3570b57cec5SDimitry Andric  let Inst{20-16} = rs;
3580b57cec5SDimitry Andric  let Inst{15-6}  = funct;
3590b57cec5SDimitry Andric  let Inst{5-0}   = 0x3c;
3600b57cec5SDimitry Andric}
3610b57cec5SDimitry Andric
3620b57cec5SDimitry Andricclass SRA_FM_MM<bits<10> funct, bit rotate> : MMArch {
3630b57cec5SDimitry Andric  bits<5> rd;
3640b57cec5SDimitry Andric  bits<5> rt;
3650b57cec5SDimitry Andric  bits<5> shamt;
3660b57cec5SDimitry Andric
3670b57cec5SDimitry Andric  bits<32> Inst;
3680b57cec5SDimitry Andric
3690b57cec5SDimitry Andric  let Inst{31-26} = 0;
3700b57cec5SDimitry Andric  let Inst{25-21} = rd;
3710b57cec5SDimitry Andric  let Inst{20-16} = rt;
3720b57cec5SDimitry Andric  let Inst{15-11} = shamt;
3730b57cec5SDimitry Andric  let Inst{10}    = rotate;
3740b57cec5SDimitry Andric  let Inst{9-0}   = funct;
3750b57cec5SDimitry Andric}
3760b57cec5SDimitry Andric
3770b57cec5SDimitry Andricclass SRLV_FM_MM<bits<10> funct, bit rotate> : MMArch {
3780b57cec5SDimitry Andric  bits<5> rd;
3790b57cec5SDimitry Andric  bits<5> rt;
3800b57cec5SDimitry Andric  bits<5> rs;
3810b57cec5SDimitry Andric
3820b57cec5SDimitry Andric  bits<32> Inst;
3830b57cec5SDimitry Andric
3840b57cec5SDimitry Andric  let Inst{31-26} = 0;
3850b57cec5SDimitry Andric  let Inst{25-21} = rt;
3860b57cec5SDimitry Andric  let Inst{20-16} = rs;
3870b57cec5SDimitry Andric  let Inst{15-11} = rd;
3880b57cec5SDimitry Andric  let Inst{10}    = rotate;
3890b57cec5SDimitry Andric  let Inst{9-0}   = funct;
3900b57cec5SDimitry Andric}
3910b57cec5SDimitry Andric
3920b57cec5SDimitry Andricclass LW_FM_MM<bits<6> op> : MMArch {
3930b57cec5SDimitry Andric  bits<5> rt;
3940b57cec5SDimitry Andric  bits<21> addr;
3950b57cec5SDimitry Andric  bits<5> base = addr{20-16};
3960b57cec5SDimitry Andric  bits<16> offset = addr{15-0};
3970b57cec5SDimitry Andric
3980b57cec5SDimitry Andric  bits<32> Inst;
3990b57cec5SDimitry Andric
4000b57cec5SDimitry Andric  let Inst{31-26} = op;
4010b57cec5SDimitry Andric  let Inst{25-21} = rt;
4020b57cec5SDimitry Andric  let Inst{20-16} = base;
4030b57cec5SDimitry Andric  let Inst{15-0}  = offset;
4040b57cec5SDimitry Andric}
4050b57cec5SDimitry Andric
4060b57cec5SDimitry Andricclass POOL32C_LHUE_FM_MM<bits<6> op, bits<4> fmt, bits<3> funct> : MMArch {
4070b57cec5SDimitry Andric  bits<5> rt;
4080b57cec5SDimitry Andric  bits<21> addr;
4090b57cec5SDimitry Andric  bits<5> base = addr{20-16};
4100b57cec5SDimitry Andric  bits<9> offset = addr{8-0};
4110b57cec5SDimitry Andric
4120b57cec5SDimitry Andric  bits<32> Inst;
4130b57cec5SDimitry Andric
4140b57cec5SDimitry Andric  let Inst{31-26} = op;
4150b57cec5SDimitry Andric  let Inst{25-21} = rt;
4160b57cec5SDimitry Andric  let Inst{20-16} = base;
4170b57cec5SDimitry Andric  let Inst{15-12} = fmt;
4180b57cec5SDimitry Andric  let Inst{11-9} = funct;
4190b57cec5SDimitry Andric  let Inst{8-0}  = offset;
4200b57cec5SDimitry Andric}
4210b57cec5SDimitry Andric
4220b57cec5SDimitry Andricclass LWL_FM_MM<bits<4> funct> : MMArch {
4230b57cec5SDimitry Andric  bits<5> rt;
4240b57cec5SDimitry Andric  bits<21> addr;
4250b57cec5SDimitry Andric
4260b57cec5SDimitry Andric  bits<32> Inst;
4270b57cec5SDimitry Andric
4280b57cec5SDimitry Andric  let Inst{31-26} = 0x18;
4290b57cec5SDimitry Andric  let Inst{25-21} = rt;
4300b57cec5SDimitry Andric  let Inst{20-16} = addr{20-16};
4310b57cec5SDimitry Andric  let Inst{15-12} = funct;
4320b57cec5SDimitry Andric  let Inst{11-0}  = addr{11-0};
4330b57cec5SDimitry Andric}
4340b57cec5SDimitry Andric
4350b57cec5SDimitry Andricclass POOL32C_STEVA_LDEVA_FM_MM<bits<4> type, bits<3> funct> : MMArch {
4360b57cec5SDimitry Andric  bits<5> rt;
4370b57cec5SDimitry Andric  bits<21> addr;
4380b57cec5SDimitry Andric  bits<5> base = addr{20-16};
4390b57cec5SDimitry Andric  bits<9> offset = addr{8-0};
4400b57cec5SDimitry Andric
4410b57cec5SDimitry Andric  bits<32> Inst;
4420b57cec5SDimitry Andric
4430b57cec5SDimitry Andric  let Inst{31-26} = 0x18;
4440b57cec5SDimitry Andric  let Inst{25-21} = rt;
4450b57cec5SDimitry Andric  let Inst{20-16} = base;
4460b57cec5SDimitry Andric  let Inst{15-12} = type;
4470b57cec5SDimitry Andric  let Inst{11-9} = funct;
4480b57cec5SDimitry Andric  let Inst{8-0}  = offset;
4490b57cec5SDimitry Andric}
4500b57cec5SDimitry Andric
4510b57cec5SDimitry Andricclass CMov_F_I_FM_MM<bits<7> func> : MMArch {
4520b57cec5SDimitry Andric  bits<5> rd;
4530b57cec5SDimitry Andric  bits<5> rs;
4540b57cec5SDimitry Andric  bits<3> fcc;
4550b57cec5SDimitry Andric
4560b57cec5SDimitry Andric  bits<32> Inst;
4570b57cec5SDimitry Andric
4580b57cec5SDimitry Andric  let Inst{31-26} = 0x15;
4590b57cec5SDimitry Andric  let Inst{25-21} = rd;
4600b57cec5SDimitry Andric  let Inst{20-16} = rs;
4610b57cec5SDimitry Andric  let Inst{15-13} = fcc;
4620b57cec5SDimitry Andric  let Inst{12-6}  = func;
4630b57cec5SDimitry Andric  let Inst{5-0}   = 0x3b;
4640b57cec5SDimitry Andric}
4650b57cec5SDimitry Andric
4660b57cec5SDimitry Andricclass MTLO_FM_MM<bits<10> funct> : MMArch {
4670b57cec5SDimitry Andric  bits<5> rs;
4680b57cec5SDimitry Andric
4690b57cec5SDimitry Andric  bits<32> Inst;
4700b57cec5SDimitry Andric
4710b57cec5SDimitry Andric  let Inst{31-26} = 0x00;
4720b57cec5SDimitry Andric  let Inst{25-21} = 0x00;
4730b57cec5SDimitry Andric  let Inst{20-16} = rs;
4740b57cec5SDimitry Andric  let Inst{15-6}  = funct;
4750b57cec5SDimitry Andric  let Inst{5-0}   = 0x3c;
4760b57cec5SDimitry Andric}
4770b57cec5SDimitry Andric
4780b57cec5SDimitry Andricclass MFLO_FM_MM<bits<10> funct> : MMArch {
4790b57cec5SDimitry Andric  bits<5> rd;
4800b57cec5SDimitry Andric
4810b57cec5SDimitry Andric  bits<32> Inst;
4820b57cec5SDimitry Andric
4830b57cec5SDimitry Andric  let Inst{31-26} = 0x00;
4840b57cec5SDimitry Andric  let Inst{25-21} = 0x00;
4850b57cec5SDimitry Andric  let Inst{20-16} = rd;
4860b57cec5SDimitry Andric  let Inst{15-6}  = funct;
4870b57cec5SDimitry Andric  let Inst{5-0}   = 0x3c;
4880b57cec5SDimitry Andric}
4890b57cec5SDimitry Andric
4900b57cec5SDimitry Andricclass CLO_FM_MM<bits<10> funct> : MMArch {
4910b57cec5SDimitry Andric  bits<5> rd;
4920b57cec5SDimitry Andric  bits<5> rs;
4930b57cec5SDimitry Andric
4940b57cec5SDimitry Andric  bits<32> Inst;
4950b57cec5SDimitry Andric
4960b57cec5SDimitry Andric  let Inst{31-26} = 0x00;
4970b57cec5SDimitry Andric  let Inst{25-21} = rd;
4980b57cec5SDimitry Andric  let Inst{20-16} = rs;
4990b57cec5SDimitry Andric  let Inst{15-6}  = funct;
5000b57cec5SDimitry Andric  let Inst{5-0}   = 0x3c;
5010b57cec5SDimitry Andric}
5020b57cec5SDimitry Andric
5030b57cec5SDimitry Andricclass SEB_FM_MM<bits<10> funct> : MMArch {
5040b57cec5SDimitry Andric  bits<5> rd;
5050b57cec5SDimitry Andric  bits<5> rt;
5060b57cec5SDimitry Andric
5070b57cec5SDimitry Andric  bits<32> Inst;
5080b57cec5SDimitry Andric
5090b57cec5SDimitry Andric  let Inst{31-26} = 0x00;
5100b57cec5SDimitry Andric  let Inst{25-21} = rd;
5110b57cec5SDimitry Andric  let Inst{20-16} = rt;
5120b57cec5SDimitry Andric  let Inst{15-6}  = funct;
5130b57cec5SDimitry Andric  let Inst{5-0}   = 0x3c;
5140b57cec5SDimitry Andric}
5150b57cec5SDimitry Andric
5160b57cec5SDimitry Andricclass EXT_FM_MM<bits<6> funct> : MMArch {
5170b57cec5SDimitry Andric  bits<5> rt;
5180b57cec5SDimitry Andric  bits<5> rs;
5190b57cec5SDimitry Andric  bits<5> pos;
5200b57cec5SDimitry Andric  bits<5> size;
5210b57cec5SDimitry Andric
5220b57cec5SDimitry Andric  bits<32> Inst;
5230b57cec5SDimitry Andric
5240b57cec5SDimitry Andric  let Inst{31-26} = 0x00;
5250b57cec5SDimitry Andric  let Inst{25-21} = rt;
5260b57cec5SDimitry Andric  let Inst{20-16} = rs;
5270b57cec5SDimitry Andric  let Inst{15-11} = size;
5280b57cec5SDimitry Andric  let Inst{10-6}  = pos;
5290b57cec5SDimitry Andric  let Inst{5-0}   = funct;
5300b57cec5SDimitry Andric}
5310b57cec5SDimitry Andric
5320b57cec5SDimitry Andricclass J_FM_MM<bits<6> op> : MMArch {
5330b57cec5SDimitry Andric  bits<26> target;
5340b57cec5SDimitry Andric
5350b57cec5SDimitry Andric  bits<32> Inst;
5360b57cec5SDimitry Andric
5370b57cec5SDimitry Andric  let Inst{31-26} = op;
5380b57cec5SDimitry Andric  let Inst{25-0}  = target;
5390b57cec5SDimitry Andric}
5400b57cec5SDimitry Andric
5410b57cec5SDimitry Andricclass JR_FM_MM<bits<8> funct> : MMArch {
5420b57cec5SDimitry Andric  bits<5> rs;
5430b57cec5SDimitry Andric
5440b57cec5SDimitry Andric  bits<32> Inst;
5450b57cec5SDimitry Andric
5460b57cec5SDimitry Andric  let Inst{31-21} = 0x00;
5470b57cec5SDimitry Andric  let Inst{20-16} = rs;
5480b57cec5SDimitry Andric  let Inst{15-14} = 0x0;
5490b57cec5SDimitry Andric  let Inst{13-6}  = funct;
5500b57cec5SDimitry Andric  let Inst{5-0}   = 0x3c;
5510b57cec5SDimitry Andric}
5520b57cec5SDimitry Andric
5530b57cec5SDimitry Andricclass JALR_FM_MM<bits<10> funct> {
5540b57cec5SDimitry Andric  bits<5> rs;
5550b57cec5SDimitry Andric  bits<5> rd;
5560b57cec5SDimitry Andric
5570b57cec5SDimitry Andric  bits<32> Inst;
5580b57cec5SDimitry Andric
5590b57cec5SDimitry Andric  let Inst{31-26} = 0x00;
5600b57cec5SDimitry Andric  let Inst{25-21} = rd;
5610b57cec5SDimitry Andric  let Inst{20-16} = rs;
5620b57cec5SDimitry Andric  let Inst{15-6}  = funct;
5630b57cec5SDimitry Andric  let Inst{5-0}   = 0x3c;
5640b57cec5SDimitry Andric}
5650b57cec5SDimitry Andric
5660b57cec5SDimitry Andricclass BEQ_FM_MM<bits<6> op> : MMArch {
5670b57cec5SDimitry Andric  bits<5>  rs;
5680b57cec5SDimitry Andric  bits<5>  rt;
5690b57cec5SDimitry Andric  bits<16> offset;
5700b57cec5SDimitry Andric
5710b57cec5SDimitry Andric  bits<32> Inst;
5720b57cec5SDimitry Andric
5730b57cec5SDimitry Andric  let Inst{31-26} = op;
5740b57cec5SDimitry Andric  let Inst{25-21} = rt;
5750b57cec5SDimitry Andric  let Inst{20-16} = rs;
5760b57cec5SDimitry Andric  let Inst{15-0}  = offset;
5770b57cec5SDimitry Andric}
5780b57cec5SDimitry Andric
5790b57cec5SDimitry Andricclass BGEZ_FM_MM<bits<5> funct> : MMArch {
5800b57cec5SDimitry Andric  bits<5>  rs;
5810b57cec5SDimitry Andric  bits<16> offset;
5820b57cec5SDimitry Andric
5830b57cec5SDimitry Andric  bits<32> Inst;
5840b57cec5SDimitry Andric
5850b57cec5SDimitry Andric  let Inst{31-26} = 0x10;
5860b57cec5SDimitry Andric  let Inst{25-21} = funct;
5870b57cec5SDimitry Andric  let Inst{20-16} = rs;
5880b57cec5SDimitry Andric  let Inst{15-0}  = offset;
5890b57cec5SDimitry Andric}
5900b57cec5SDimitry Andric
5910b57cec5SDimitry Andricclass BGEZAL_FM_MM<bits<5> funct> : MMArch {
5920b57cec5SDimitry Andric  bits<5>  rs;
5930b57cec5SDimitry Andric  bits<16> offset;
5940b57cec5SDimitry Andric
5950b57cec5SDimitry Andric  bits<32> Inst;
5960b57cec5SDimitry Andric
5970b57cec5SDimitry Andric  let Inst{31-26} = 0x10;
5980b57cec5SDimitry Andric  let Inst{25-21} = funct;
5990b57cec5SDimitry Andric  let Inst{20-16} = rs;
6000b57cec5SDimitry Andric  let Inst{15-0}  = offset;
6010b57cec5SDimitry Andric}
6020b57cec5SDimitry Andric
6030b57cec5SDimitry Andricclass SYNC_FM_MM : MMArch {
6040b57cec5SDimitry Andric  bits<5> stype;
6050b57cec5SDimitry Andric
6060b57cec5SDimitry Andric  bits<32> Inst;
6070b57cec5SDimitry Andric
6080b57cec5SDimitry Andric  let Inst{31-26} = 0x00;
6090b57cec5SDimitry Andric  let Inst{25-21} = 0x0;
6100b57cec5SDimitry Andric  let Inst{20-16} = stype;
6110b57cec5SDimitry Andric  let Inst{15-6}  = 0x1ad;
6120b57cec5SDimitry Andric  let Inst{5-0}   = 0x3c;
6130b57cec5SDimitry Andric}
6140b57cec5SDimitry Andric
6150b57cec5SDimitry Andricclass SYNCI_FM_MM : MMArch {
6160b57cec5SDimitry Andric  bits<21> addr;
6170b57cec5SDimitry Andric  bits<5> rs = addr{20-16};
6180b57cec5SDimitry Andric  bits<16> offset = addr{15-0};
6190b57cec5SDimitry Andric  bits<32> Inst;
6200b57cec5SDimitry Andric
6210b57cec5SDimitry Andric  let Inst{31-26} = 0b010000;
6220b57cec5SDimitry Andric  let Inst{25-21} = 0b10000;
6230b57cec5SDimitry Andric  let Inst{20-16} = rs;
6240b57cec5SDimitry Andric  let Inst{15-0}  = offset;
6250b57cec5SDimitry Andric}
6260b57cec5SDimitry Andric
6270b57cec5SDimitry Andricclass BRK_FM_MM : MMArch {
6280b57cec5SDimitry Andric  bits<10> code_1;
6290b57cec5SDimitry Andric  bits<10> code_2;
6300b57cec5SDimitry Andric  bits<32> Inst;
6310b57cec5SDimitry Andric  let Inst{31-26} = 0x0;
6320b57cec5SDimitry Andric  let Inst{25-16} = code_1;
6330b57cec5SDimitry Andric  let Inst{15-6}  = code_2;
6340b57cec5SDimitry Andric  let Inst{5-0}   = 0x07;
6350b57cec5SDimitry Andric}
6360b57cec5SDimitry Andric
6370b57cec5SDimitry Andricclass SYS_FM_MM : MMArch {
6380b57cec5SDimitry Andric  bits<10> code_;
6390b57cec5SDimitry Andric  bits<32> Inst;
6400b57cec5SDimitry Andric  let Inst{31-26} = 0x0;
6410b57cec5SDimitry Andric  let Inst{25-16} = code_;
6420b57cec5SDimitry Andric  let Inst{15-6}  = 0x22d;
6430b57cec5SDimitry Andric  let Inst{5-0}   = 0x3c;
6440b57cec5SDimitry Andric}
6450b57cec5SDimitry Andric
6460b57cec5SDimitry Andricclass WAIT_FM_MM : MMArch {
6470b57cec5SDimitry Andric  bits<10> code_;
6480b57cec5SDimitry Andric  bits<32> Inst;
6490b57cec5SDimitry Andric
6500b57cec5SDimitry Andric  let Inst{31-26} = 0x00;
6510b57cec5SDimitry Andric  let Inst{25-16} = code_;
6520b57cec5SDimitry Andric  let Inst{15-6}  = 0x24d;
6530b57cec5SDimitry Andric  let Inst{5-0}   = 0x3c;
6540b57cec5SDimitry Andric}
6550b57cec5SDimitry Andric
6560b57cec5SDimitry Andricclass ER_FM_MM<bits<10> funct> : MMArch {
6570b57cec5SDimitry Andric  bits<32> Inst;
6580b57cec5SDimitry Andric
6590b57cec5SDimitry Andric  let Inst{31-26} = 0x00;
6600b57cec5SDimitry Andric  let Inst{25-16} = 0x00;
6610b57cec5SDimitry Andric  let Inst{15-6}  = funct;
6620b57cec5SDimitry Andric  let Inst{5-0}   = 0x3c;
6630b57cec5SDimitry Andric}
6640b57cec5SDimitry Andric
6650b57cec5SDimitry Andricclass EI_FM_MM<bits<10> funct> : MMArch {
6660b57cec5SDimitry Andric  bits<32> Inst;
6670b57cec5SDimitry Andric  bits<5> rt;
6680b57cec5SDimitry Andric
6690b57cec5SDimitry Andric  let Inst{31-26} = 0x00;
6700b57cec5SDimitry Andric  let Inst{25-21} = 0x00;
6710b57cec5SDimitry Andric  let Inst{20-16} = rt;
6720b57cec5SDimitry Andric  let Inst{15-6}  = funct;
6730b57cec5SDimitry Andric  let Inst{5-0}   = 0x3c;
6740b57cec5SDimitry Andric}
6750b57cec5SDimitry Andric
6760b57cec5SDimitry Andricclass TEQ_FM_MM<bits<6> funct> : MMArch {
6770b57cec5SDimitry Andric  bits<5> rs;
6780b57cec5SDimitry Andric  bits<5> rt;
6790b57cec5SDimitry Andric  bits<4> code_;
6800b57cec5SDimitry Andric
6810b57cec5SDimitry Andric  bits<32> Inst;
6820b57cec5SDimitry Andric
6830b57cec5SDimitry Andric  let Inst{31-26} = 0x00;
6840b57cec5SDimitry Andric  let Inst{25-21} = rt;
6850b57cec5SDimitry Andric  let Inst{20-16} = rs;
6860b57cec5SDimitry Andric  let Inst{15-12} = code_;
6870b57cec5SDimitry Andric  let Inst{11-6}  = funct;
6880b57cec5SDimitry Andric  let Inst{5-0}   = 0x3c;
6890b57cec5SDimitry Andric}
6900b57cec5SDimitry Andric
6910b57cec5SDimitry Andricclass TEQI_FM_MM<bits<5> funct> : MMArch {
6920b57cec5SDimitry Andric  bits<5> rs;
6930b57cec5SDimitry Andric  bits<16> imm16;
6940b57cec5SDimitry Andric
6950b57cec5SDimitry Andric  bits<32> Inst;
6960b57cec5SDimitry Andric
6970b57cec5SDimitry Andric  let Inst{31-26} = 0x10;
6980b57cec5SDimitry Andric  let Inst{25-21} = funct;
6990b57cec5SDimitry Andric  let Inst{20-16} = rs;
7000b57cec5SDimitry Andric  let Inst{15-0}  = imm16;
7010b57cec5SDimitry Andric}
7020b57cec5SDimitry Andric
7030b57cec5SDimitry Andricclass LL_FM_MM<bits<4> funct> : MMArch {
7040b57cec5SDimitry Andric  bits<5> rt;
7050b57cec5SDimitry Andric  bits<21> addr;
7060b57cec5SDimitry Andric
7070b57cec5SDimitry Andric  bits<32> Inst;
7080b57cec5SDimitry Andric
7090b57cec5SDimitry Andric  let Inst{31-26} = 0x18;
7100b57cec5SDimitry Andric  let Inst{25-21} = rt;
7110b57cec5SDimitry Andric  let Inst{20-16} = addr{20-16};
7120b57cec5SDimitry Andric  let Inst{15-12} = funct;
7130b57cec5SDimitry Andric  let Inst{11-0}  = addr{11-0};
7140b57cec5SDimitry Andric}
7150b57cec5SDimitry Andric
7160b57cec5SDimitry Andricclass LLE_FM_MM<bits<4> funct> : MMArch {
7170b57cec5SDimitry Andric  bits<5> rt;
7180b57cec5SDimitry Andric  bits<21> addr;
7190b57cec5SDimitry Andric  bits<5> base = addr{20-16};
7200b57cec5SDimitry Andric  bits<9> offset = addr{8-0};
7210b57cec5SDimitry Andric
7220b57cec5SDimitry Andric  bits<32> Inst;
7230b57cec5SDimitry Andric
7240b57cec5SDimitry Andric  let Inst{31-26} = 0x18;
7250b57cec5SDimitry Andric  let Inst{25-21} = rt;
7260b57cec5SDimitry Andric  let Inst{20-16} = base;
7270b57cec5SDimitry Andric  let Inst{15-12} = funct;
7280b57cec5SDimitry Andric  let Inst{11-9} = 0x6;
7290b57cec5SDimitry Andric  let Inst{8-0} = offset;
7300b57cec5SDimitry Andric}
7310b57cec5SDimitry Andric
7320b57cec5SDimitry Andricclass ADDS_FM_MM<bits<2> fmt, bits<8> funct> : MMArch {
7330b57cec5SDimitry Andric  bits<5> ft;
7340b57cec5SDimitry Andric  bits<5> fs;
7350b57cec5SDimitry Andric  bits<5> fd;
7360b57cec5SDimitry Andric
7370b57cec5SDimitry Andric  bits<32> Inst;
7380b57cec5SDimitry Andric
7390b57cec5SDimitry Andric  let Inst{31-26} = 0x15;
7400b57cec5SDimitry Andric  let Inst{25-21} = ft;
7410b57cec5SDimitry Andric  let Inst{20-16} = fs;
7420b57cec5SDimitry Andric  let Inst{15-11} = fd;
7430b57cec5SDimitry Andric  let Inst{10}    = 0;
7440b57cec5SDimitry Andric  let Inst{9-8}   = fmt;
7450b57cec5SDimitry Andric  let Inst{7-0}   = funct;
7460b57cec5SDimitry Andric
7470b57cec5SDimitry Andric}
7480b57cec5SDimitry Andric
7490b57cec5SDimitry Andricclass LWXC1_FM_MM<bits<9> funct> : MMArch {
7500b57cec5SDimitry Andric  bits<5> fd;
7510b57cec5SDimitry Andric  bits<5> base;
7520b57cec5SDimitry Andric  bits<5> index;
7530b57cec5SDimitry Andric
7540b57cec5SDimitry Andric  bits<32> Inst;
7550b57cec5SDimitry Andric
7560b57cec5SDimitry Andric  let Inst{31-26} = 0x15;
7570b57cec5SDimitry Andric  let Inst{25-21} = index;
7580b57cec5SDimitry Andric  let Inst{20-16} = base;
7590b57cec5SDimitry Andric  let Inst{15-11} = fd;
7600b57cec5SDimitry Andric  let Inst{10-9}  = 0x0;
7610b57cec5SDimitry Andric  let Inst{8-0}   = funct;
7620b57cec5SDimitry Andric}
7630b57cec5SDimitry Andric
7640b57cec5SDimitry Andricclass SWXC1_FM_MM<bits<9> funct> : MMArch {
7650b57cec5SDimitry Andric  bits<5> fs;
7660b57cec5SDimitry Andric  bits<5> base;
7670b57cec5SDimitry Andric  bits<5> index;
7680b57cec5SDimitry Andric
7690b57cec5SDimitry Andric  bits<32> Inst;
7700b57cec5SDimitry Andric
7710b57cec5SDimitry Andric  let Inst{31-26} = 0x15;
7720b57cec5SDimitry Andric  let Inst{25-21} = index;
7730b57cec5SDimitry Andric  let Inst{20-16} = base;
7740b57cec5SDimitry Andric  let Inst{15-11} = fs;
7750b57cec5SDimitry Andric  let Inst{10-9}  = 0x0;
7760b57cec5SDimitry Andric  let Inst{8-0}   = funct;
7770b57cec5SDimitry Andric}
7780b57cec5SDimitry Andric
7790b57cec5SDimitry Andricclass CEQS_FM_MM<bits<2> fmt> : MMArch {
7800b57cec5SDimitry Andric  bits<5> fs;
7810b57cec5SDimitry Andric  bits<5> ft;
7820b57cec5SDimitry Andric  bits<3> fcc;
7830b57cec5SDimitry Andric  bits<4> cond;
7840b57cec5SDimitry Andric
7850b57cec5SDimitry Andric  bits<32> Inst;
7860b57cec5SDimitry Andric
7870b57cec5SDimitry Andric  let Inst{31-26} = 0x15;
7880b57cec5SDimitry Andric  let Inst{25-21} = ft;
7890b57cec5SDimitry Andric  let Inst{20-16} = fs;
7900b57cec5SDimitry Andric  let Inst{15-13} = fcc;
7910b57cec5SDimitry Andric  let Inst{12}    = 0;
7920b57cec5SDimitry Andric  let Inst{11-10} = fmt;
7930b57cec5SDimitry Andric  let Inst{9-6}   = cond;
7940b57cec5SDimitry Andric  let Inst{5-0}   = 0x3c;
7950b57cec5SDimitry Andric}
7960b57cec5SDimitry Andric
7970b57cec5SDimitry Andricclass C_COND_FM_MM<bits <2> fmt, bits<4> c> : CEQS_FM_MM<fmt> {
7980b57cec5SDimitry Andric  let cond = c;
7990b57cec5SDimitry Andric}
8000b57cec5SDimitry Andric
8010b57cec5SDimitry Andricclass BC1F_FM_MM<bits<5> tf> : MMArch {
8020b57cec5SDimitry Andric  bits<3> fcc;
8030b57cec5SDimitry Andric  bits<16> offset;
8040b57cec5SDimitry Andric
8050b57cec5SDimitry Andric  bits<32> Inst;
8060b57cec5SDimitry Andric
8070b57cec5SDimitry Andric  let Inst{31-26} = 0x10;
8080b57cec5SDimitry Andric  let Inst{25-21} = tf;
8090b57cec5SDimitry Andric  let Inst{20-18} = fcc; // cc
8100b57cec5SDimitry Andric  let Inst{17-16} = 0x0;
8110b57cec5SDimitry Andric  let Inst{15-0}  = offset;
8120b57cec5SDimitry Andric}
8130b57cec5SDimitry Andric
8140b57cec5SDimitry Andricclass ROUND_W_FM_MM<bits<1> fmt, bits<8> funct> : MMArch {
8150b57cec5SDimitry Andric  bits<5> fd;
8160b57cec5SDimitry Andric  bits<5> fs;
8170b57cec5SDimitry Andric
8180b57cec5SDimitry Andric  bits<32> Inst;
8190b57cec5SDimitry Andric
8200b57cec5SDimitry Andric  let Inst{31-26} = 0x15;
8210b57cec5SDimitry Andric  let Inst{25-21} = fd;
8220b57cec5SDimitry Andric  let Inst{20-16} = fs;
8230b57cec5SDimitry Andric  let Inst{15}    = 0;
8240b57cec5SDimitry Andric  let Inst{14}    = fmt;
8250b57cec5SDimitry Andric  let Inst{13-6}  = funct;
8260b57cec5SDimitry Andric  let Inst{5-0}   = 0x3b;
8270b57cec5SDimitry Andric}
8280b57cec5SDimitry Andric
8290b57cec5SDimitry Andricclass ABS_FM_MM<bits<2> fmt, bits<7> funct> : MMArch {
8300b57cec5SDimitry Andric  bits<5> fd;
8310b57cec5SDimitry Andric  bits<5> fs;
8320b57cec5SDimitry Andric
8330b57cec5SDimitry Andric  bits<32> Inst;
8340b57cec5SDimitry Andric
8350b57cec5SDimitry Andric  let Inst{31-26} = 0x15;
8360b57cec5SDimitry Andric  let Inst{25-21} = fd;
8370b57cec5SDimitry Andric  let Inst{20-16} = fs;
8380b57cec5SDimitry Andric  let Inst{15}    = 0;
8390b57cec5SDimitry Andric  let Inst{14-13} = fmt;
8400b57cec5SDimitry Andric  let Inst{12-6}  = funct;
8410b57cec5SDimitry Andric  let Inst{5-0}   = 0x3b;
8420b57cec5SDimitry Andric}
8430b57cec5SDimitry Andric
8440b57cec5SDimitry Andricclass CMov_F_F_FM_MM<bits<9> func, bits<2> fmt> : MMArch {
8450b57cec5SDimitry Andric  bits<5> fd;
8460b57cec5SDimitry Andric  bits<5> fs;
8470b57cec5SDimitry Andric  bits<3> fcc;
8480b57cec5SDimitry Andric  bits<32> Inst;
8490b57cec5SDimitry Andric
8500b57cec5SDimitry Andric  let Inst{31-26} = 0x15;
8510b57cec5SDimitry Andric  let Inst{25-21} = fd;
8520b57cec5SDimitry Andric  let Inst{20-16} = fs;
8530b57cec5SDimitry Andric  let Inst{15-13} = fcc; //cc
8540b57cec5SDimitry Andric  let Inst{12-11} = 0x0;
8550b57cec5SDimitry Andric  let Inst{10-9}  = fmt;
8560b57cec5SDimitry Andric  let Inst{8-0}   = func;
8570b57cec5SDimitry Andric}
8580b57cec5SDimitry Andric
8590b57cec5SDimitry Andricclass CMov_I_F_FM_MM<bits<8> funct, bits<2> fmt> : MMArch {
8600b57cec5SDimitry Andric  bits<5> fd;
8610b57cec5SDimitry Andric  bits<5> fs;
8620b57cec5SDimitry Andric  bits<5> rt;
8630b57cec5SDimitry Andric
8640b57cec5SDimitry Andric  bits<32> Inst;
8650b57cec5SDimitry Andric
8660b57cec5SDimitry Andric  let Inst{31-26} = 0x15;
8670b57cec5SDimitry Andric  let Inst{25-21} = rt;
8680b57cec5SDimitry Andric  let Inst{20-16} = fs;
8690b57cec5SDimitry Andric  let Inst{15-11} = fd;
8700b57cec5SDimitry Andric  let Inst{9-8}   = fmt;
8710b57cec5SDimitry Andric  let Inst{7-0}   = funct;
8720b57cec5SDimitry Andric}
8730b57cec5SDimitry Andric
8740b57cec5SDimitry Andricclass MFC1_FM_MM<bits<8> funct> : MMArch {
8750b57cec5SDimitry Andric  bits<5> rt;
8760b57cec5SDimitry Andric  bits<5> fs;
8770b57cec5SDimitry Andric
8780b57cec5SDimitry Andric  bits<32> Inst;
8790b57cec5SDimitry Andric
8800b57cec5SDimitry Andric  let Inst{31-26} = 0x15;
8810b57cec5SDimitry Andric  let Inst{25-21} = rt;
8820b57cec5SDimitry Andric  let Inst{20-16} = fs;
8830b57cec5SDimitry Andric  let Inst{15-14} = 0x0;
8840b57cec5SDimitry Andric  let Inst{13-6}  = funct;
8850b57cec5SDimitry Andric  let Inst{5-0}   = 0x3b;
8860b57cec5SDimitry Andric}
8870b57cec5SDimitry Andric
8880b57cec5SDimitry Andricclass MADDS_FM_MM<bits<6> funct>: MMArch {
8890b57cec5SDimitry Andric  bits<5> ft;
8900b57cec5SDimitry Andric  bits<5> fs;
8910b57cec5SDimitry Andric  bits<5> fd;
8920b57cec5SDimitry Andric  bits<5> fr;
8930b57cec5SDimitry Andric
8940b57cec5SDimitry Andric  bits<32> Inst;
8950b57cec5SDimitry Andric
8960b57cec5SDimitry Andric  let Inst{31-26} = 0x15;
8970b57cec5SDimitry Andric  let Inst{25-21} = ft;
8980b57cec5SDimitry Andric  let Inst{20-16} = fs;
8990b57cec5SDimitry Andric  let Inst{15-11} = fd;
9000b57cec5SDimitry Andric  let Inst{10-6}  = fr;
9010b57cec5SDimitry Andric  let Inst{5-0}   = funct;
9020b57cec5SDimitry Andric}
9030b57cec5SDimitry Andric
9040b57cec5SDimitry Andricclass COMPACT_BRANCH_FM_MM<bits<5> funct> {
9050b57cec5SDimitry Andric  bits<5>  rs;
9060b57cec5SDimitry Andric  bits<16> offset;
9070b57cec5SDimitry Andric
9080b57cec5SDimitry Andric  bits<32> Inst;
9090b57cec5SDimitry Andric
9100b57cec5SDimitry Andric  let Inst{31-26} = 0x10;
9110b57cec5SDimitry Andric  let Inst{25-21} = funct;
9120b57cec5SDimitry Andric  let Inst{20-16} = rs;
9130b57cec5SDimitry Andric  let Inst{15-0}  = offset;
9140b57cec5SDimitry Andric}
9150b57cec5SDimitry Andric
9160b57cec5SDimitry Andricclass COP0_TLB_FM_MM<bits<10> op> : MMArch {
9170b57cec5SDimitry Andric  bits<32> Inst;
9180b57cec5SDimitry Andric
9190b57cec5SDimitry Andric  let Inst{31-26} = 0x0;
9200b57cec5SDimitry Andric  let Inst{25-16} = 0x0;
9210b57cec5SDimitry Andric  let Inst{15-6}  = op;
9220b57cec5SDimitry Andric  let Inst{5-0}   = 0x3c;
9230b57cec5SDimitry Andric}
9240b57cec5SDimitry Andric
9250b57cec5SDimitry Andricclass SDBBP_FM_MM : MMArch {
9260b57cec5SDimitry Andric  bits<10> code_;
9270b57cec5SDimitry Andric
9280b57cec5SDimitry Andric  bits<32> Inst;
9290b57cec5SDimitry Andric
9300b57cec5SDimitry Andric  let Inst{31-26} = 0x0;
9310b57cec5SDimitry Andric  let Inst{25-16} = code_;
9320b57cec5SDimitry Andric  let Inst{15-6}  = 0x36d;
9330b57cec5SDimitry Andric  let Inst{5-0}   = 0x3c;
9340b57cec5SDimitry Andric}
9350b57cec5SDimitry Andric
9360b57cec5SDimitry Andricclass SIGRIE_FM_MM : MMArch {
9370b57cec5SDimitry Andric  bits<16> code_;
9380b57cec5SDimitry Andric
9390b57cec5SDimitry Andric  bits<32> Inst;
9400b57cec5SDimitry Andric
9410b57cec5SDimitry Andric  let Inst{31-26} = 0x0;
9420b57cec5SDimitry Andric  let Inst{25-22} = 0x0;
9430b57cec5SDimitry Andric  let Inst{21-6} = code_;
9440b57cec5SDimitry Andric  let Inst{5-0} = 0b111111;
9450b57cec5SDimitry Andric}
9460b57cec5SDimitry Andric
9470b57cec5SDimitry Andricclass RDHWR_FM_MM : MMArch {
9480b57cec5SDimitry Andric  bits<5> rt;
9490b57cec5SDimitry Andric  bits<5> rd;
9500b57cec5SDimitry Andric
9510b57cec5SDimitry Andric  bits<32> Inst;
9520b57cec5SDimitry Andric
9530b57cec5SDimitry Andric  let Inst{31-26} = 0x0;
9540b57cec5SDimitry Andric  let Inst{25-21} = rt;
9550b57cec5SDimitry Andric  let Inst{20-16} = rd;
9560b57cec5SDimitry Andric  let Inst{15-6}  = 0x1ac;
9570b57cec5SDimitry Andric  let Inst{5-0}   = 0x3c;
9580b57cec5SDimitry Andric}
9590b57cec5SDimitry Andric
9600b57cec5SDimitry Andricclass LWXS_FM_MM<bits<10> funct> {
9610b57cec5SDimitry Andric  bits<5> rd;
9620b57cec5SDimitry Andric  bits<5> base;
9630b57cec5SDimitry Andric  bits<5> index;
9640b57cec5SDimitry Andric
9650b57cec5SDimitry Andric  bits<32> Inst;
9660b57cec5SDimitry Andric
9670b57cec5SDimitry Andric  let Inst{31-26} = 0x0;
9680b57cec5SDimitry Andric  let Inst{25-21} = index;
9690b57cec5SDimitry Andric  let Inst{20-16} = base;
9700b57cec5SDimitry Andric  let Inst{15-11} = rd;
9710b57cec5SDimitry Andric  let Inst{10}    = 0;
9720b57cec5SDimitry Andric  let Inst{9-0}   = funct;
9730b57cec5SDimitry Andric}
9740b57cec5SDimitry Andric
9750b57cec5SDimitry Andricclass LWM_FM_MM<bits<4> funct> : MMArch {
9760b57cec5SDimitry Andric  bits<5> rt;
9770b57cec5SDimitry Andric  bits<21> addr;
9780b57cec5SDimitry Andric
9790b57cec5SDimitry Andric  bits<32> Inst;
9800b57cec5SDimitry Andric
9810b57cec5SDimitry Andric  let Inst{31-26} = 0x8;
9820b57cec5SDimitry Andric  let Inst{25-21} = rt;
9830b57cec5SDimitry Andric  let Inst{20-16} = addr{20-16};
9840b57cec5SDimitry Andric  let Inst{15-12} = funct;
9850b57cec5SDimitry Andric  let Inst{11-0}  = addr{11-0};
9860b57cec5SDimitry Andric}
9870b57cec5SDimitry Andric
9880b57cec5SDimitry Andricclass LWM_FM_MM16<bits<4> funct> : MMArch {
9890b57cec5SDimitry Andric  bits<2> rt;
9900b57cec5SDimitry Andric  bits<4> addr;
9910b57cec5SDimitry Andric
9920b57cec5SDimitry Andric  bits<16> Inst;
9930b57cec5SDimitry Andric
9940b57cec5SDimitry Andric  let Inst{15-10} = 0x11;
9950b57cec5SDimitry Andric  let Inst{9-6}   = funct;
9960b57cec5SDimitry Andric  let Inst{5-4}   = rt;
9970b57cec5SDimitry Andric  let Inst{3-0}   = addr;
9980b57cec5SDimitry Andric}
9990b57cec5SDimitry Andric
10000b57cec5SDimitry Andricclass CACHE_PREF_FM_MM<bits<6> op, bits<4> funct> : MMArch {
10010b57cec5SDimitry Andric  bits<21> addr;
10020b57cec5SDimitry Andric  bits<5> hint;
10030b57cec5SDimitry Andric  bits<5> base = addr{20-16};
10040b57cec5SDimitry Andric  bits<12> offset = addr{11-0};
10050b57cec5SDimitry Andric
10060b57cec5SDimitry Andric  bits<32> Inst;
10070b57cec5SDimitry Andric
10080b57cec5SDimitry Andric  let Inst{31-26} = op;
10090b57cec5SDimitry Andric  let Inst{25-21} = hint;
10100b57cec5SDimitry Andric  let Inst{20-16} = base;
10110b57cec5SDimitry Andric  let Inst{15-12} = funct;
10120b57cec5SDimitry Andric  let Inst{11-0}  = offset;
10130b57cec5SDimitry Andric}
10140b57cec5SDimitry Andric
10150b57cec5SDimitry Andricclass CACHE_PREFE_FM_MM<bits<6> op, bits<3> funct> : MMArch {
10160b57cec5SDimitry Andric  bits<21> addr;
10170b57cec5SDimitry Andric  bits<5> hint;
10180b57cec5SDimitry Andric  bits<5> base = addr{20-16};
10190b57cec5SDimitry Andric  bits<9> offset = addr{8-0};
10200b57cec5SDimitry Andric
10210b57cec5SDimitry Andric  bits<32> Inst;
10220b57cec5SDimitry Andric
10230b57cec5SDimitry Andric  let Inst{31-26} = op;
10240b57cec5SDimitry Andric  let Inst{25-21} = hint;
10250b57cec5SDimitry Andric  let Inst{20-16} = base;
10260b57cec5SDimitry Andric  let Inst{15-12} = 0xA;
10270b57cec5SDimitry Andric  let Inst{11-9} = funct;
10280b57cec5SDimitry Andric  let Inst{8-0}  = offset;
10290b57cec5SDimitry Andric}
10300b57cec5SDimitry Andric
10310b57cec5SDimitry Andricclass POOL32F_PREFX_FM_MM<bits<6> op, bits<9> funct> : MMArch {
10320b57cec5SDimitry Andric  bits<5> index;
10330b57cec5SDimitry Andric  bits<5> base;
10340b57cec5SDimitry Andric  bits<5> hint;
10350b57cec5SDimitry Andric
10360b57cec5SDimitry Andric  bits<32> Inst;
10370b57cec5SDimitry Andric
10380b57cec5SDimitry Andric  let Inst{31-26} = op;
10390b57cec5SDimitry Andric  let Inst{25-21} = index;
10400b57cec5SDimitry Andric  let Inst{20-16} = base;
10410b57cec5SDimitry Andric  let Inst{15-11} = hint;
10420b57cec5SDimitry Andric  let Inst{10-9}  = 0x0;
10430b57cec5SDimitry Andric  let Inst{8-0}   = funct;
10440b57cec5SDimitry Andric}
10450b57cec5SDimitry Andric
10460b57cec5SDimitry Andricclass BARRIER_FM_MM<bits<5> op> : MMArch {
10470b57cec5SDimitry Andric  bits<32> Inst;
10480b57cec5SDimitry Andric
10490b57cec5SDimitry Andric  let Inst{31-26} = 0x0;
10500b57cec5SDimitry Andric  let Inst{25-21} = 0x0;
10510b57cec5SDimitry Andric  let Inst{20-16} = 0x0;
10520b57cec5SDimitry Andric  let Inst{15-11} = op;
10530b57cec5SDimitry Andric  let Inst{10-6}  = 0x0;
10540b57cec5SDimitry Andric  let Inst{5-0}   = 0x0;
10550b57cec5SDimitry Andric}
10560b57cec5SDimitry Andric
10570b57cec5SDimitry Andricclass ADDIUPC_FM_MM {
10580b57cec5SDimitry Andric  bits<3> rs;
10590b57cec5SDimitry Andric  bits<23> imm;
10600b57cec5SDimitry Andric
10610b57cec5SDimitry Andric  bits<32> Inst;
10620b57cec5SDimitry Andric
10630b57cec5SDimitry Andric  let Inst{31-26} = 0x1e;
10640b57cec5SDimitry Andric  let Inst{25-23} = rs;
10650b57cec5SDimitry Andric  let Inst{22-0} = imm;
10660b57cec5SDimitry Andric}
10670b57cec5SDimitry Andric
10680b57cec5SDimitry Andricclass POOL32A_CFTC2_FM_MM<bits<10> funct> : MMArch {
10690b57cec5SDimitry Andric  bits<5> rt;
10700b57cec5SDimitry Andric  bits<5> impl;
10710b57cec5SDimitry Andric
10720b57cec5SDimitry Andric  bits<32> Inst;
10730b57cec5SDimitry Andric
10740b57cec5SDimitry Andric  let Inst{31-26} = 0b000000;
10750b57cec5SDimitry Andric  let Inst{25-21} = rt;
10760b57cec5SDimitry Andric  let Inst{20-16} = impl;
10770b57cec5SDimitry Andric  let Inst{15-6}  = funct;
10780b57cec5SDimitry Andric  let Inst{5-0}   = 0b111100;
10790b57cec5SDimitry Andric}
10800b57cec5SDimitry Andric
10810b57cec5SDimitry Andricclass POOL32A_TLBINV_FM_MM<bits<10> funct> : MMArch {
10820b57cec5SDimitry Andric  bits<32> Inst;
10830b57cec5SDimitry Andric
10840b57cec5SDimitry Andric  let Inst{31-26} = 0x0;
10850b57cec5SDimitry Andric  let Inst{25-16} = 0x0;
10860b57cec5SDimitry Andric  let Inst{15-6}  = funct;
10870b57cec5SDimitry Andric  let Inst{5-0}   = 0b111100;
10880b57cec5SDimitry Andric}
10890b57cec5SDimitry Andric
10900b57cec5SDimitry Andricclass POOL32A_MFTC0_FM_MM<bits<5> funct, bits<6> opcode> : MMArch {
10910b57cec5SDimitry Andric  bits<5> rt;
10920b57cec5SDimitry Andric  bits<5> rs;
10930b57cec5SDimitry Andric  bits<3> sel;
10940b57cec5SDimitry Andric
10950b57cec5SDimitry Andric  bits<32> Inst;
10960b57cec5SDimitry Andric
10970b57cec5SDimitry Andric  let Inst{31-26} = 0b000000;
10980b57cec5SDimitry Andric  let Inst{25-21} = rt;
10990b57cec5SDimitry Andric  let Inst{20-16} = rs;
11000b57cec5SDimitry Andric  let Inst{15-14} = 0;
11010b57cec5SDimitry Andric  let Inst{13-11} = sel;
11020b57cec5SDimitry Andric  let Inst{10-6}  = funct;
11030b57cec5SDimitry Andric  let Inst{5-0}   = opcode;
11040b57cec5SDimitry Andric}
11050b57cec5SDimitry Andric
11060b57cec5SDimitry Andricclass POOL32A_HYPCALL_FM_MM : MMArch {
11070b57cec5SDimitry Andric  bits<32> Inst;
11080b57cec5SDimitry Andric
11090b57cec5SDimitry Andric  bits<10> code_;
11100b57cec5SDimitry Andric
11110b57cec5SDimitry Andric  let Inst{31-26} = 0x0;
11120b57cec5SDimitry Andric  let Inst{25-16} = code_;
11130b57cec5SDimitry Andric  let Inst{15-6}  = 0b1100001101;
11140b57cec5SDimitry Andric  let Inst{5-0}   = 0b111100;
11150b57cec5SDimitry Andric}
1116