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