decoder.isa revision 2026
111482Sandreas.sandberg@arm.com//////////////////////////////////////////////////////////////////// 211482Sandreas.sandberg@arm.com// 311482Sandreas.sandberg@arm.com// The actual MIPS32 ISA decoder 411482Sandreas.sandberg@arm.com// ----------------------------- 511482Sandreas.sandberg@arm.com// The following instructions are specified in the MIPS32 ISA 611482Sandreas.sandberg@arm.com// Specification. Decoding closely follows the style specified 711482Sandreas.sandberg@arm.com// in the MIPS32 ISAthe specification document starting with Table 811482Sandreas.sandberg@arm.com// A-2 (document available @ www.mips.com) 911482Sandreas.sandberg@arm.com// 1011482Sandreas.sandberg@arm.com//@todo: Distinguish "unknown/future" use insts from "reserved" 1111482Sandreas.sandberg@arm.com// ones 1211482Sandreas.sandberg@arm.comdecode OPCODE_HI default FailUnimpl::unknown() { 1311482Sandreas.sandberg@arm.com 1411482Sandreas.sandberg@arm.com // Derived From ... Table A-2 MIPS32 ISA Manual 1511482Sandreas.sandberg@arm.com 0x0: decode OPCODE_LO default FailUnimpl::reserved(){ 1611482Sandreas.sandberg@arm.com 1711482Sandreas.sandberg@arm.com 0x0: decode FUNCTION_HI { 1811482Sandreas.sandberg@arm.com 0x0: decode FUNCTION_LO { 1911482Sandreas.sandberg@arm.com 0x1: decode MOVCI { 2011482Sandreas.sandberg@arm.com format Move { 2111482Sandreas.sandberg@arm.com 0: movc({{ }}); 2211482Sandreas.sandberg@arm.com 1: movt({{ }}); 2311482Sandreas.sandberg@arm.com } 2411482Sandreas.sandberg@arm.com } 2511482Sandreas.sandberg@arm.com 2611482Sandreas.sandberg@arm.com format ShiftRotate { 2711482Sandreas.sandberg@arm.com //Table A-3 Note: "1. Specific encodings of the rt, rd, and sa fields 2811482Sandreas.sandberg@arm.com //are used to distinguish among the SLL, NOP, SSNOP and EHB functions." 2911482Sandreas.sandberg@arm.com 0x0: sll({{ }}); 3011482Sandreas.sandberg@arm.com 3111482Sandreas.sandberg@arm.com 0x2: decode SRL { 3211482Sandreas.sandberg@arm.com 0: srl({{ }}); 3311482Sandreas.sandberg@arm.com 1: rotr({{ }}); 3411482Sandreas.sandberg@arm.com } 3511482Sandreas.sandberg@arm.com 3611482Sandreas.sandberg@arm.com 0x3: sar({{ }}); 3711482Sandreas.sandberg@arm.com 3811482Sandreas.sandberg@arm.com 0x4: sllv({{ }}); 3911482Sandreas.sandberg@arm.com 4011482Sandreas.sandberg@arm.com 0x6: decode SRLV { 4111482Sandreas.sandberg@arm.com 0: srlv({{ }}); 4211482Sandreas.sandberg@arm.com 1: rotrv({{ }}); 4311482Sandreas.sandberg@arm.com } 4411482Sandreas.sandberg@arm.com 4511482Sandreas.sandberg@arm.com 0x7: srav({{ }}); 4611482Sandreas.sandberg@arm.com } 4711482Sandreas.sandberg@arm.com } 4811482Sandreas.sandberg@arm.com 4911482Sandreas.sandberg@arm.com 0x1: decode FUNCTION_LO { 5011482Sandreas.sandberg@arm.com 5111482Sandreas.sandberg@arm.com //Table A-3 Note: "Specific encodings of the hint field are used 5211482Sandreas.sandberg@arm.com //to distinguish JR from JR.HB and JALR from JALR.HB" 5311482Sandreas.sandberg@arm.com format Jump { 5411482Sandreas.sandberg@arm.com 0x0: jr({{ }}); 5511482Sandreas.sandberg@arm.com 0x1: jalr({{ }}); 5611482Sandreas.sandberg@arm.com } 5711482Sandreas.sandberg@arm.com 5811482Sandreas.sandberg@arm.com format Move { 5911482Sandreas.sandberg@arm.com 0x2: movz({{ }}); 6011482Sandreas.sandberg@arm.com 0x3: movn({{ }}); 6111482Sandreas.sandberg@arm.com } 6211482Sandreas.sandberg@arm.com 6311482Sandreas.sandberg@arm.com 0x4: Syscall::syscall({{ }}); 6411482Sandreas.sandberg@arm.com 0x5: Break::break({{ }}); 6511482Sandreas.sandberg@arm.com 0x7: Synchronize::synch({{ }}); 6611482Sandreas.sandberg@arm.com } 6711482Sandreas.sandberg@arm.com 6811482Sandreas.sandberg@arm.com 0x2: decode FUNCTION_LO { 6911482Sandreas.sandberg@arm.com format MultDiv { 7011482Sandreas.sandberg@arm.com 0x0: mfhi({{ }}); 7111482Sandreas.sandberg@arm.com 0x1: mthi({{ }}); 7211482Sandreas.sandberg@arm.com 0x2: mflo({{ }}); 7311482Sandreas.sandberg@arm.com 0x3: mtlo({{ }}); 7411482Sandreas.sandberg@arm.com } 7511482Sandreas.sandberg@arm.com }; 7611482Sandreas.sandberg@arm.com 7711482Sandreas.sandberg@arm.com 0x3: decode FUNCTION_LO { 7811482Sandreas.sandberg@arm.com format MultDiv { 7911482Sandreas.sandberg@arm.com 0x0: mult({{ }}); 8011482Sandreas.sandberg@arm.com 0x1: multu({{ }}); 8111482Sandreas.sandberg@arm.com 0x2: div({{ }}); 8211482Sandreas.sandberg@arm.com 0x3: divu({{ }}); 8311482Sandreas.sandberg@arm.com } 8411482Sandreas.sandberg@arm.com }; 8511482Sandreas.sandberg@arm.com 8611482Sandreas.sandberg@arm.com 0x4: decode FUNCTION_LO { 8711482Sandreas.sandberg@arm.com format Arithmetic { 8811482Sandreas.sandberg@arm.com 0x0: add({{ }}); 8911482Sandreas.sandberg@arm.com 0x1: addu({{ }}); 9011482Sandreas.sandberg@arm.com 0x2: sub({{ }}); 9111482Sandreas.sandberg@arm.com 0x3: subu({{ }}); 9211482Sandreas.sandberg@arm.com } 9311482Sandreas.sandberg@arm.com 9411482Sandreas.sandberg@arm.com format Logical { 9511482Sandreas.sandberg@arm.com 0x0: and({{ }}); 9611482Sandreas.sandberg@arm.com 0x1: or({{ }}); 9711482Sandreas.sandberg@arm.com 0x2: xor({{ }}); 9811482Sandreas.sandberg@arm.com 0x3: nor({{ }}); 9911482Sandreas.sandberg@arm.com } 10011482Sandreas.sandberg@arm.com } 10111482Sandreas.sandberg@arm.com 10211482Sandreas.sandberg@arm.com 0x5: decode FUNCTION_LO { 10311482Sandreas.sandberg@arm.com format SetInstructions{ 10411482Sandreas.sandberg@arm.com 0x2: slt({{ }}); 10511482Sandreas.sandberg@arm.com 0x3: sltu({{ }}); 10611482Sandreas.sandberg@arm.com } 10711482Sandreas.sandberg@arm.com }; 10811482Sandreas.sandberg@arm.com 10911482Sandreas.sandberg@arm.com 0x6: decode FUNCTION_LO { 11011482Sandreas.sandberg@arm.com format Trap { 11111482Sandreas.sandberg@arm.com 0x0: tge({{ }}); 11211482Sandreas.sandberg@arm.com 0x1: tgeu({{ }}); 11311482Sandreas.sandberg@arm.com 0x2: tlt({{ }}); 11411482Sandreas.sandberg@arm.com 0x3: tltu({{ }}); 11511482Sandreas.sandberg@arm.com 0x4: teq({{ }}); 11611482Sandreas.sandberg@arm.com 0x6: tne({{ }}); 11711482Sandreas.sandberg@arm.com } 11811482Sandreas.sandberg@arm.com } 11911482Sandreas.sandberg@arm.com } 12011482Sandreas.sandberg@arm.com 12111482Sandreas.sandberg@arm.com 0x1: decode REGIMM_HI { 12211482Sandreas.sandberg@arm.com 0x0: decode REGIMM_LO { 12311482Sandreas.sandberg@arm.com format Branch { 12411482Sandreas.sandberg@arm.com 0x0: bltz({{ }}); 12511482Sandreas.sandberg@arm.com 0x1: bgez({{ }}); 12611482Sandreas.sandberg@arm.com 12711482Sandreas.sandberg@arm.com //MIPS obsolete instructions 12811482Sandreas.sandberg@arm.com 0x2: bltzl({{ }}); 12911482Sandreas.sandberg@arm.com 0x3: bgezl({{ }}); 13011482Sandreas.sandberg@arm.com } 13111482Sandreas.sandberg@arm.com } 13211482Sandreas.sandberg@arm.com 13311482Sandreas.sandberg@arm.com 0x1: decode REGIMM_LO { 13411482Sandreas.sandberg@arm.com format Trap { 13511482Sandreas.sandberg@arm.com 0x0: tgei({{ }}); 13611482Sandreas.sandberg@arm.com 0x1: tgeiu({{ }}); 13711482Sandreas.sandberg@arm.com 0x2: tlti({{ }}); 13811482Sandreas.sandberg@arm.com 0x3: tltiu({{ }}); 13911482Sandreas.sandberg@arm.com 0x4: teqi({{ }}); 14011482Sandreas.sandberg@arm.com 0x6: tnei({{ }}); 14111482Sandreas.sandberg@arm.com } 14211482Sandreas.sandberg@arm.com } 14311482Sandreas.sandberg@arm.com 14411482Sandreas.sandberg@arm.com 0x2: decode REGIMM_LO { 14511482Sandreas.sandberg@arm.com format Branch { 14611482Sandreas.sandberg@arm.com 0x0: bltzal({{ }}); 14711482Sandreas.sandberg@arm.com 0x1: bgezal({{ }}); 14811482Sandreas.sandberg@arm.com 14911482Sandreas.sandberg@arm.com //MIPS obsolete instructions 15011482Sandreas.sandberg@arm.com 0x2: bltzall({{ }}); 15111482Sandreas.sandberg@arm.com 0x3: bgezall({{ }}); 15211482Sandreas.sandberg@arm.com } 15311482Sandreas.sandberg@arm.com } 15411482Sandreas.sandberg@arm.com 15511482Sandreas.sandberg@arm.com 0x3: decode REGIMM_LO { 15611482Sandreas.sandberg@arm.com 0x7: synci({{ }}); 15711482Sandreas.sandberg@arm.com } 15811482Sandreas.sandberg@arm.com } 15911482Sandreas.sandberg@arm.com 16011482Sandreas.sandberg@arm.com format Jump { 16111482Sandreas.sandberg@arm.com 0x2: j({{ }}); 16211482Sandreas.sandberg@arm.com 0x3: jal({{ }}); 16311482Sandreas.sandberg@arm.com } 16411482Sandreas.sandberg@arm.com 16511482Sandreas.sandberg@arm.com format Branch { 16611482Sandreas.sandberg@arm.com 0x4: beq({{ }}); 16711482Sandreas.sandberg@arm.com 0x5: bne({{ }}); 16811482Sandreas.sandberg@arm.com 0x6: blez({{ }}); 16911482Sandreas.sandberg@arm.com 0x7: bgtz({{ }}); 17011482Sandreas.sandberg@arm.com } 17111482Sandreas.sandberg@arm.com }; 17211482Sandreas.sandberg@arm.com 17311482Sandreas.sandberg@arm.com 0x1: decode OPCODE_LO default FailUnimpl::reserved(){ 17411482Sandreas.sandberg@arm.com format IntImmediate { 17511482Sandreas.sandberg@arm.com 0x0: addi({{ }}); 17611482Sandreas.sandberg@arm.com 0x1: addiu({{ }}); 17711482Sandreas.sandberg@arm.com 0x2: slti({{ }}); 17811482Sandreas.sandberg@arm.com 0x3: sltiu({{ }}); 17911482Sandreas.sandberg@arm.com 0x4: andi({{ }}); 18011482Sandreas.sandberg@arm.com 0x5: ori({{ }}); 18111482Sandreas.sandberg@arm.com 0x6: xori({{ }}); 18211482Sandreas.sandberg@arm.com 0x7: lui({{ }}); 18311482Sandreas.sandberg@arm.com }; 18411482Sandreas.sandberg@arm.com }; 18511482Sandreas.sandberg@arm.com 18611482Sandreas.sandberg@arm.com 0x2: decode OPCODE_LO default FailUnimpl::reserved(){ 18711482Sandreas.sandberg@arm.com 18811482Sandreas.sandberg@arm.com 0x0: decode RS { 18911482Sandreas.sandberg@arm.com //Table A-11 MIPS32 COP0 Encoding of rs Field 19011482Sandreas.sandberg@arm.com } 19111482Sandreas.sandberg@arm.com 19211482Sandreas.sandberg@arm.com 0x1: decode RS { 19311482Sandreas.sandberg@arm.com //Table A-13 MIPS32 COP1 Encoding of rs Field 19411482Sandreas.sandberg@arm.com } 19511482Sandreas.sandberg@arm.com 19611482Sandreas.sandberg@arm.com 0x2: decode RS { 19711482Sandreas.sandberg@arm.com //Table A-19 MIPS32 COP2 Encoding of rs Field 19811482Sandreas.sandberg@arm.com } 19911482Sandreas.sandberg@arm.com 20011482Sandreas.sandberg@arm.com 0x3: decode FUNCTION_HI { 20111482Sandreas.sandberg@arm.com //Table A-20 MIPS64 COP1X Encoding of Function Field 1 20211482Sandreas.sandberg@arm.com } 20311482Sandreas.sandberg@arm.com 20411482Sandreas.sandberg@arm.com //MIPS obsolete instructions 20511482Sandreas.sandberg@arm.com 0x4: beql({{ }}); 20611482Sandreas.sandberg@arm.com 0x5: bnel({{ }}); 20711482Sandreas.sandberg@arm.com 0x6: blezl({{ }}); 20811482Sandreas.sandberg@arm.com 0x7: bgtzl({{ }}); 20911482Sandreas.sandberg@arm.com }; 21011482Sandreas.sandberg@arm.com 21111482Sandreas.sandberg@arm.com 0x3: decode OPCODE_LO default FailUnimpl::reserved(){ 21211482Sandreas.sandberg@arm.com format FailUnimpl{ 21311482Sandreas.sandberg@arm.com 0x0: reserved_inst_exception({{ }}) 21411482Sandreas.sandberg@arm.com 0x1: reserved_inst_exception({{ }}) 21511482Sandreas.sandberg@arm.com 0x2: reserved_inst_exception({{ }}) 21611482Sandreas.sandberg@arm.com 0x3: reserved_inst_exception({{ }}) 21711482Sandreas.sandberg@arm.com 0x5: reserved_inst_exception({{ }}) 21811482Sandreas.sandberg@arm.com 0x6: reserved_inst_exception({{ }}) 21911482Sandreas.sandberg@arm.com }; 22011482Sandreas.sandberg@arm.com 22111482Sandreas.sandberg@arm.com 0x4: decode FUNCTION_HI { 22211482Sandreas.sandberg@arm.com 0x0:; 22311482Sandreas.sandberg@arm.com 0x1:; 22411482Sandreas.sandberg@arm.com 0x2:; 22511482Sandreas.sandberg@arm.com 0x3:; 22611482Sandreas.sandberg@arm.com 0x4:; 22711482Sandreas.sandberg@arm.com 0x5:; 22811482Sandreas.sandberg@arm.com 0x6:; 22911482Sandreas.sandberg@arm.com } 23011482Sandreas.sandberg@arm.com 23111482Sandreas.sandberg@arm.com 0x7: decode FUNCTION_HI { 23211482Sandreas.sandberg@arm.com //Table A-6 MIPS32 SPECIAL31 Encoding of Function Field for Release 2 of the Architecture 23311482Sandreas.sandberg@arm.com 0x0: decode FUNCTION_LO { 23411482Sandreas.sandberg@arm.com 0x1: ext({{ }}); 23511482Sandreas.sandberg@arm.com 0x4: ins({{ }}); 23611482Sandreas.sandberg@arm.com } 23711482Sandreas.sandberg@arm.com 23811482Sandreas.sandberg@arm.com 0x4: decode SA { 23911482Sandreas.sandberg@arm.com //Table A-10 MIPS32 BSHFL Encoding of sa Field 24011482Sandreas.sandberg@arm.com 0x02: wsbh({{ }}); 24111482Sandreas.sandberg@arm.com 0x10: seb({{ }}); 24211482Sandreas.sandberg@arm.com 0x18: seh({{ }}); 24311482Sandreas.sandberg@arm.com } 24411482Sandreas.sandberg@arm.com 24511482Sandreas.sandberg@arm.com 0x6: decode FUNCTION_LO { 24611482Sandreas.sandberg@arm.com 0x7: rdhwr({{ }}); 24711482Sandreas.sandberg@arm.com } 24811482Sandreas.sandberg@arm.com } 24911482Sandreas.sandberg@arm.com }; 25011482Sandreas.sandberg@arm.com 25111482Sandreas.sandberg@arm.com 0x4: decode OPCODE_LO default FailUnimpl::reserved(){ 25211482Sandreas.sandberg@arm.com format LoadMemory{ 25311482Sandreas.sandberg@arm.com 0x0: lb({{ }}); 25411482Sandreas.sandberg@arm.com 0x1: lh({{ }}); 25511482Sandreas.sandberg@arm.com 0x2: lwl({{ }}); 25611482Sandreas.sandberg@arm.com 0x3: lw({{ }}); 25711482Sandreas.sandberg@arm.com 0x4: lbu({{ }}); 25811482Sandreas.sandberg@arm.com 0x5: lhu({{ }}); 25911482Sandreas.sandberg@arm.com 0x6: lhu({{ }}); 26011482Sandreas.sandberg@arm.com }; 26111482Sandreas.sandberg@arm.com 26211482Sandreas.sandberg@arm.com 0x7: FailUnimpl::reserved_inst_exception({{ }}); 26311482Sandreas.sandberg@arm.com }; 26411482Sandreas.sandberg@arm.com 26511482Sandreas.sandberg@arm.com 0x5: decode OPCODE_LO default FailUnimpl::reserved(){ 26611482Sandreas.sandberg@arm.com format StoreMemory{ 26711482Sandreas.sandberg@arm.com 0x0: sb({{ }}); 26811482Sandreas.sandberg@arm.com 0x1: sh({{ }}); 26911482Sandreas.sandberg@arm.com 0x2: swl({{ }}); 27011482Sandreas.sandberg@arm.com 0x3: sw({{ }}); 27111482Sandreas.sandberg@arm.com 0x6: swr({{ }}); 27211482Sandreas.sandberg@arm.com }; 27311482Sandreas.sandberg@arm.com 27411482Sandreas.sandberg@arm.com format FailUnimpl{ 27511482Sandreas.sandberg@arm.com 0x4: reserved_inst_exception({{ }}); 27611482Sandreas.sandberg@arm.com 0x5: reserved_inst_exception({{ }}); 27711482Sandreas.sandberg@arm.com 0x2: cache({{ }}); 27811482Sandreas.sandberg@arm.com }; 27911482Sandreas.sandberg@arm.com 28011482Sandreas.sandberg@arm.com }; 28111482Sandreas.sandberg@arm.com 28211482Sandreas.sandberg@arm.com 0x6: decode OPCODE_LO default FailUnimpl::reserved(){ 28311482Sandreas.sandberg@arm.com format LoadMemory{ 28411482Sandreas.sandberg@arm.com 0x0: ll({{ }}); 28511482Sandreas.sandberg@arm.com 0x1: lwc1({{ }}); 28611482Sandreas.sandberg@arm.com 0x5: ldc1({{ }}); 28711482Sandreas.sandberg@arm.com }; 28811482Sandreas.sandberg@arm.com 28911482Sandreas.sandberg@arm.com format FailUnimpl{ 29011482Sandreas.sandberg@arm.com 0x2: lwc2({{ }}); 291 0x3: pref({{ }}); 292 0x4: reserved_inst_exception({{ }}); 293 0x6: ldc2({{ }}); 294 0x7: reserved_inst_exception({{ }}); 295 }; 296 297 }; 298 299 0x7: decode OPCODE_LO default FailUnimpl::reserved(){ 300 format StoreMemory{ 301 0x0: sc({{ }}); 302 0x1: swc1({{ }}); 303 0x5: sdc1({{ }}); 304 }; 305 306 format FailUnimpl{ 307 0x2: swc2({{ }}); 308 0x3: reserved_inst_exception({{ }}); 309 0x4: reserved_inst_exception({{ }}); 310 0x6: sdc2({{ }}); 311 0x7: reserved_inst_exception({{ }}); 312 }; 313 314 }; 315 316} 317 318