예제 #1
0
/*
 * 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;
  }
}