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