/* * This procedure should decode the 32-bit instruction * machineCode and instantiate it as an Instruction object * The decoding process includes extracting values from the * machineCode instruction for the opcode, func, rs, rt, rd, * shamt, imm, and target fields, as well as assigning a format, * token, and execution type (xtype) */ Instruction::Instruction(unsigned machineCode) : raw (machineCode), opcode (bitRange(31, 26)), func (bitRange(5, 0)), rs (bitRange(25, 21)), rt (bitRange(20, 16)), rd (bitRange(15, 11)), shamt (bitRange(10, 6)), imm (bitRange(15, 0)), target (bitRange(25, 0)) { switch (opcode) { case 0: format = R_TYPE; switch(func) { case 0: token = SLL; xtype = SHIFT; break; case 2: token = SRL; xtype = SHIFT; break; case 3: token = SRA; xtype = SHIFT; break; case 4: token = SLLV; xtype = SHIFT; break; case 6: token = SRLV; xtype = SHIFT; break; case 7: token = SRAV; xtype = SHIFT; break; case 8: token = JR; xtype = JUMP; break; case 9: token = JALR; xtype = JUMP; break; case 12: token = SYSCALL; xtype = OTHER; break; case 16: token = MFHI; xtype = ALU; break; case 17: token = MTHI; xtype = ALU; break; case 18: token = MFLO; xtype = ALU; break; case 19: token = MTLO; xtype = ALU; break; case 24: token = MULT; xtype = ALU; break; case 25: token = MULTU; xtype = ALU; break; case 26: token = DIV; xtype = ALU; break; case 27: token = DIVU; xtype = ALU; break; case 32: token = ADD; xtype = ALU; break; case 33: token = ADDU; xtype = ALU; break; case 34: token = SUB; xtype = ALU; break; case 35: token = SUBU; xtype = ALU; break; case 36: token = AND; xtype = ALU; break; case 37: token = OR; xtype = ALU; break; case 38: token = XOR; xtype = ALU; break; case 39: token = NOR; xtype = ALU; break; case 42: token = SLT; xtype = ALU; break; case 43: token = SLTU; xtype = ALU; break; default: printf("unknown func: raw=%08x opcode=%u func=%u\n", raw, opcode, func); assert(false && "unknown func"); } break; case 1: format = I_TYPE; xtype = BRANCH; switch (rt) { case 0: token = BLTZ; break; case 1: token = BGEZ; break; default: printf("unknown opcode 1 subtype: raw=%08x rt=%u\n", raw, rt); assert(false && "unknown opcode 1 subtype"); break; } break; case 2: token = J; format = J_TYPE; xtype = JUMP; break; case 3: token = JAL; format = J_TYPE; xtype = JUMP; break; case 4: token = BEQ; format = I_TYPE; xtype = BRANCH; break; case 5: token = BNE; format = I_TYPE; xtype = BRANCH; break; case 6: token = BLEZ; format = I_TYPE; xtype = BRANCH; break; case 7: token = BGTZ; format = I_TYPE; xtype = BRANCH; break; case 8: token = ADDI; format = I_TYPE; xtype = ALU; break; case 9: token = ADDIU; format = I_TYPE; xtype = ALU; break; case 10: token = SLTI; format = I_TYPE; xtype = ALU; break; case 11: token = SLTIU; format = I_TYPE; xtype = ALU; break; case 12: token = ANDI; format = I_TYPE; xtype = ALU; break; case 13: token = ORI; format = I_TYPE; xtype = ALU; break; case 14: token = XORI; format = I_TYPE; xtype = ALU; break; case 15: token = LUI; format = I_TYPE; xtype = ALU; break; case 32: token = LB; format = I_TYPE; xtype = LOAD; break; case 33: token = LH; format = I_TYPE; xtype = LOAD; break; case 35: token = LW; format = I_TYPE; xtype = LOAD; break; case 36: token = LBU; format = I_TYPE; xtype = LOAD; break; case 37: token = LHU; format = I_TYPE; xtype = LOAD; break; case 40: token = SB; format = I_TYPE; xtype = STORE; break; case 41: token = SH; format = I_TYPE; xtype = STORE; break; case 43: token = SW; format = I_TYPE; xtype = STORE; break; default: printf("unknown opcode: raw=%08x opcode=%u\n", raw, opcode); assert(false && "unknown opcode"); break; } }
/* * This procedure should decode the 32-bit instruction * machineCode and instantiate it as an Instruction object * The decoding process includes extracting values from the * machineCode instruction for the opcode, func, rs, rt, rd, * shamt, imm, and target fields, as well as assigning a format, * token, and execution type (xtype) */ Instruction::Instruction(unsigned machineCode) : raw (machineCode), format (IFORMAT_NONE), xtype (XTYPE_NONE), token (ITOKEN_NONE), opcode (bitRange(31, 26)), func (bitRange(5, 0)), rs (0), rt (0), rd (0), shamt (0), imm (0), target (0) { switch (opcode) { case 0: format = R_TYPE; switch(func) { case 0: token = SLL; xtype = SHIFT; break; case 2: token = SRL; xtype = SHIFT; break; // Add remaining cases for func files case 8: token = JR; xtype = JUMP; break; case 12: token = SYSCALL; xtype = OTHER; break; case 32: token = ADD; xtype = ALU; break; case 33: token = ADDU; xtype = ALU; break; case 34: token = SUB; xtype = ALU; break; case 35: token = SUBU; xtype = ALU; break; case 36: token = AND; xtype = ALU; break; case 37: token = OR; xtype = ALU; break; case 38: token = XOR; xtype = ALU; break; case 39: token = NOR; xtype = ALU; break; case 42: token = SLT; xtype = ALU; break; case 43: token = SLTU; xtype = ALU; break; default: break; } break; case 2: token = J; format = J_TYPE; xtype = JUMP; break; case 3: token = JAL; format = J_TYPE; xtype = JUMP; break; case 4: token = BEQ; format = I_TYPE; xtype = BRANCH; break; case 5: token = BNE; format = I_TYPE; xtype = BRANCH; break; case 8: token = ADDI; format = I_TYPE; xtype = ALU; break; case 9: token = ADDIU; format = I_TYPE; xtype = ALU; break; case 10: token = SLTI; format = I_TYPE; xtype = ALU; break; case 11: token = SLTIU; format = I_TYPE; xtype = ALU; break; case 12: token = ANDI; format = I_TYPE; xtype = ALU; break; case 13: token = ORI; format = I_TYPE; xtype = ALU; break; case 14: token = XORI; format = I_TYPE; xtype = ALU; break; case 15: token = LUI; format = I_TYPE; xtype = ALU; break; case 32: token = LB; format = I_TYPE; xtype = LOAD; break; case 33: token = LH; format = I_TYPE; xtype = LOAD; break; case 35: token = LW; format = I_TYPE; xtype = LOAD; break; case 36: token = LBU; format = I_TYPE; xtype = LOAD; break; case 37: token = LHU; format = I_TYPE; xtype = LOAD; break; case 40: token = SB; format = I_TYPE; xtype = STORE; break; case 41: token = SH; format = I_TYPE; xtype = STORE; break; case 43: token = SW; format = I_TYPE; xtype = STORE; break; // Add remaining cases for opcodes default: break; } }