提交 06a08679 编写于 作者: Z Zihao Yu

riscv64,exec: pass wanshu

上级 b697c95f
......@@ -95,14 +95,6 @@ make_DHelper(csr) {
#define creg2reg(creg) (creg + 8)
make_DHelper(CI) {
decode_op_r(id_src, decinfo.isa.instr.c_rd_rs1, true);
sword_t simm = (decinfo.isa.instr.c_simm12 << 5) | decinfo.isa.instr.c_imm6_2;
assert(simm != 0);
decode_op_i(id_src2, simm, true);
decode_op_r(id_dest, decinfo.isa.instr.c_rd_rs1, false);
}
make_DHelper(CR) {
decode_op_r(id_src, creg2reg(decinfo.isa.instr.c_rd_rs1_), true);
decode_op_r(id_src2, creg2reg(decinfo.isa.instr.c_rs2_), true);
......@@ -124,6 +116,22 @@ make_DHelper(CB) {
decode_op_r(id_src2, 0, true);
}
static make_DHelper(CJ) {
sword_t simm11 = decinfo.isa.instr.c_simm12;
uint32_t imm10 = (decinfo.isa.instr.c_target >> 6) & 0x1;
uint32_t imm9_8 = (decinfo.isa.instr.c_target >> 7) & 0x3;
uint32_t imm7 = (decinfo.isa.instr.c_target >> 4) & 0x1;
uint32_t imm6 = (decinfo.isa.instr.c_target >> 5) & 0x1;
uint32_t imm5 = (decinfo.isa.instr.c_target >> 0) & 0x1;
uint32_t imm4 = (decinfo.isa.instr.c_target >> 9) & 0x1;
uint32_t imm3_1 = (decinfo.isa.instr.c_target >> 1) & 0x7;
sword_t offset = (simm11 << 11) | (imm10 << 10) | (imm9_8 << 8) |
(imm7 << 7) | (imm6 << 6) | (imm5 << 5) | (imm4 << 4) | (imm3_1 << 1);
decinfo.jmp_pc = cpu.pc + offset;
decode_op_i(id_src, decinfo.jmp_pc, true);
}
make_DHelper(C_SDSP) {
decode_op_r(id_src, 2, true);
uint32_t imm8_6 = (decinfo.isa.instr.c_imm12_7 & 0x7);
......@@ -154,26 +162,37 @@ make_DHelper(C_LDSP) {
decinfo.width = 8;
}
make_DHelper(C_LI) {
decode_op_r(id_src, 0, true);
static void decode_C_xxx_imm_rd(bool is_rs1_zero) {
decode_op_r(id_src, (is_rs1_zero ? 0 : decinfo.isa.instr.c_rd_rs1), true);
sword_t simm = (decinfo.isa.instr.c_simm12 << 5) | decinfo.isa.instr.c_imm6_2;
decode_op_i(id_src2, simm, true);
decode_op_r(id_dest, decinfo.isa.instr.c_rd_rs1, false);
}
make_DHelper(C_MV) {
decode_op_r(id_src, 0, true);
decode_op_r(id_src2, decinfo.isa.instr.c_rs2, true);
decode_op_r(id_dest, decinfo.isa.instr.c_rd_rs1, false);
assert(decinfo.isa.instr.c_rs2 != 0);
assert(decinfo.isa.instr.c_rd_rs1 != 0);
make_DHelper(C_0_imm_rd) {
decode_C_xxx_imm_rd(true);
}
make_DHelper(C_10_100) {
decode_op_r(id_src, decinfo.isa.instr.c_rd_rs1, true);
decode_op_r(id_src2, decinfo.isa.instr.c_rs2, true);
decode_op_r(id_dest, 0, false);
// overwrite id_dest if necessary
make_DHelper(C_rs1_imm_rd) {
decode_C_xxx_imm_rd(false);
}
static void decode_C_xxx_xxx_xxx(bool is_rs1_zero, bool is_rs2_zero, bool is_rd_zero) {
decode_op_r(id_src, (is_rs1_zero ? 0 : decinfo.isa.instr.c_rd_rs1), true);
decode_op_r(id_src2, (is_rs2_zero ? 0 : decinfo.isa.instr.c_rs2), true);
decode_op_r(id_dest, (is_rd_zero ? 0 : decinfo.isa.instr.c_rd_rs1), false);
}
make_DHelper(C_0_rs2_rd) {
decode_C_xxx_xxx_xxx(true, false, false);
}
make_DHelper(C_rs1_rs2_0) {
decode_C_xxx_xxx_xxx(false, false, true);
}
make_DHelper(C_rs1_rs2_rd) {
decode_C_xxx_xxx_xxx(false, false, false);
}
make_DHelper(C_ADDI16SP) {
......@@ -203,3 +222,8 @@ make_DHelper(C_LW) {
decinfo.width = 4;
}
make_DHelper(C_J) {
decode_CJ(pc);
decode_op_r(id_dest, 0, false);
}
......@@ -21,6 +21,7 @@ make_EHelper(jal);
make_EHelper(jalr);
make_EHelper(branch);
make_EHelper(beq);
make_EHelper(bne);
make_EHelper(inv);
make_EHelper(nemu_trap);
......
......@@ -45,3 +45,8 @@ make_EHelper(beq) {
rtl_jrelop(RELOP_EQ, &id_src->val, &id_src2->val, decinfo.jmp_pc);
print_asm("beq %s,%s,%s", id_src->str, id_src2->str, id_dest->str);
}
make_EHelper(bne) {
rtl_jrelop(RELOP_NE, &id_src->val, &id_src2->val, decinfo.jmp_pc);
print_asm("bne %s,%s,%s", id_src->str, id_src2->str, id_dest->str);
}
......@@ -75,7 +75,7 @@ static OpcodeEntry opcode_table [32] = {
static make_EHelper(C_10_100) {
static OpcodeEntry table [8] = {
EMPTY, EMPTY, EX(jalr), IDEX(C_MV, add), EMPTY, EMPTY, EMPTY, EMPTY,
EMPTY, EMPTY, IDEX(C_rs1_rs2_0, jalr), IDEX(C_0_rs2_rd, add), EMPTY, EMPTY, EMPTY, IDEX(C_rs1_rs2_rd, add),
};
uint32_t cond_c_simm12_not0 = (decinfo.isa.instr.c_simm12 != 0);
uint32_t cond_c_rd_rs1_not0 = (decinfo.isa.instr.c_rd_rs1 != 0);
......@@ -98,7 +98,7 @@ static make_EHelper(C_01_100) {
case 3: {
decode_CR(pc);
static OpcodeEntry table [8] = {
EX(sub), EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
EX(sub), EMPTY, EMPTY, EMPTY, EMPTY, EX(addw), EMPTY, EMPTY,
};
uint32_t idx2 = (decinfo.isa.instr.c_func6 >> 2) & 0x1;
......@@ -114,8 +114,8 @@ static make_EHelper(C_01_100) {
static OpcodeEntry rvc_table [3][8] = {
{EMPTY, EMPTY, IDEX(C_LW, lds), EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, },
{IDEX(CI, add), EMPTY, IDEX(C_LI, add), EX(C_01_011), EX(C_01_100), EMPTY, IDEX(CB, beq), EMPTY, },
{EMPTY, EMPTY, EMPTY, IDEX(C_LDSP, ld), IDEX(C_10_100, C_10_100), EMPTY, EMPTY, IDEX(C_SDSP, st), },
{IDEX(C_rs1_imm_rd, add), IDEX(C_rs1_imm_rd, addw), IDEX(C_0_imm_rd, add), EX(C_01_011), EX(C_01_100), IDEX(C_J, jal), IDEX(CB, beq), IDEX(CB, bne), },
{EMPTY, EMPTY, EMPTY, IDEX(C_LDSP, ld), EX(C_10_100), EMPTY, EMPTY, IDEX(C_SDSP, st), },
};
void isa_exec(vaddr_t *pc) {
......
......@@ -111,15 +111,17 @@ make_DHelper(ld);
make_DHelper(st);
make_DHelper(csr);
make_DHelper(CI);
make_DHelper(CR);
make_DHelper(CB);
make_DHelper(C_SDSP);
make_DHelper(C_LDSP);
make_DHelper(C_MV);
make_DHelper(C_LI);
make_DHelper(C_10_100);
make_DHelper(C_0_imm_rd);
make_DHelper(C_rs1_imm_rd);
make_DHelper(C_0_rs2_rd);
make_DHelper(C_rs1_rs2_0);
make_DHelper(C_rs1_rs2_rd);
make_DHelper(C_ADDI16SP);
make_DHelper(C_LW);
make_DHelper(C_J);
#endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册