Re: [Qemu-devel] [PATCH v1 20/30] RISC-V: Add misa to DisasContext
On 05/22/2018 09:15 PM, Michael Clark wrote: > gen methods should access state from DisasContext. Add misa > field to the DisasContext struct and remove CPURISCVState > argument from all gen methods. > > Cc: Palmer Dabbelt> Cc: Sagar Karandikar > Cc: Bastian Koppelmann > Cc: Alistair Francis > Cc: Emilio G. Cota > Signed-off-by: Michael Clark > Reviewed-by: Richard Henderson I already reviewed this one: http://lists.nongnu.org/archive/html/qemu-devel/2018-05/msg02255.html Reviewed-by: Philippe Mathieu-Daudé > --- > target/riscv/translate.c | 78 > ++-- > 1 file changed, 42 insertions(+), 36 deletions(-) > > diff --git a/target/riscv/translate.c b/target/riscv/translate.c > index a980611eb611..fd21b133a5a4 100644 > --- a/target/riscv/translate.c > +++ b/target/riscv/translate.c > @@ -45,6 +45,7 @@ typedef struct DisasContext { > target_ulong pc_succ_insn; > uint32_t opcode; > uint32_t mstatus_fs; > +uint32_t misa; > uint32_t mem_idx; > /* Remember the rounding mode encoded in the previous fp instruction, > which we have already installed into env->fp_status. Or -1 for > @@ -74,6 +75,11 @@ static const int tcg_memop_lookup[8] = { > #define CASE_OP_32_64(X) case X > #endif > > +static inline bool has_ext(DisasContext *ctx, uint32_t ext) > +{ > +return ctx->misa & ext; > +} > + > static void generate_exception(DisasContext *ctx, int excp) > { > tcg_gen_movi_tl(cpu_pc, ctx->base.pc_next); > @@ -505,14 +511,13 @@ static void gen_arith_imm(DisasContext *ctx, uint32_t > opc, int rd, > tcg_temp_free(source1); > } > > -static void gen_jal(CPURISCVState *env, DisasContext *ctx, int rd, > -target_ulong imm) > +static void gen_jal(DisasContext *ctx, int rd, target_ulong imm) > { > target_ulong next_pc; > > /* check misaligned: */ > next_pc = ctx->base.pc_next + imm; > -if (!riscv_has_ext(env, RVC)) { > +if (!has_ext(ctx, RVC)) { > if ((next_pc & 0x3) != 0) { > gen_exception_inst_addr_mis(ctx); > return; > @@ -526,8 +531,8 @@ static void gen_jal(CPURISCVState *env, DisasContext > *ctx, int rd, > ctx->base.is_jmp = DISAS_NORETURN; > } > > -static void gen_jalr(CPURISCVState *env, DisasContext *ctx, uint32_t opc, > - int rd, int rs1, target_long imm) > +static void gen_jalr(DisasContext *ctx, uint32_t opc, int rd, int rs1, > + target_long imm) > { > /* no chaining with JALR */ > TCGLabel *misaligned = NULL; > @@ -539,7 +544,7 @@ static void gen_jalr(CPURISCVState *env, DisasContext > *ctx, uint32_t opc, > tcg_gen_addi_tl(cpu_pc, cpu_pc, imm); > tcg_gen_andi_tl(cpu_pc, cpu_pc, (target_ulong)-2); > > -if (!riscv_has_ext(env, RVC)) { > +if (!has_ext(ctx, RVC)) { > misaligned = gen_new_label(); > tcg_gen_andi_tl(t0, cpu_pc, 0x2); > tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0x0, misaligned); > @@ -564,8 +569,8 @@ static void gen_jalr(CPURISCVState *env, DisasContext > *ctx, uint32_t opc, > tcg_temp_free(t0); > } > > -static void gen_branch(CPURISCVState *env, DisasContext *ctx, uint32_t opc, > - int rs1, int rs2, target_long bimm) > +static void gen_branch(DisasContext *ctx, uint32_t opc, int rs1, int rs2, > + target_long bimm) > { > TCGLabel *l = gen_new_label(); > TCGv source1, source2; > @@ -602,7 +607,7 @@ static void gen_branch(CPURISCVState *env, DisasContext > *ctx, uint32_t opc, > > gen_goto_tb(ctx, 1, ctx->pc_succ_insn); > gen_set_label(l); /* branch taken */ > -if (!riscv_has_ext(env, RVC) && ((ctx->base.pc_next + bimm) & 0x3)) { > +if (!has_ext(ctx, RVC) && ((ctx->base.pc_next + bimm) & 0x3)) { > /* misaligned */ > gen_exception_inst_addr_mis(ctx); > } else { > @@ -1311,8 +1316,8 @@ static void gen_fp_arith(DisasContext *ctx, uint32_t > opc, int rd, > } > } > > -static void gen_system(CPURISCVState *env, DisasContext *ctx, uint32_t opc, > - int rd, int rs1, int csr) > +static void gen_system(DisasContext *ctx, uint32_t opc, int rd, int rs1, > + int csr) > { > TCGv source1, csr_store, dest, rs1_pass, imm_rs1; > source1 = tcg_temp_new(); > @@ -1354,7 +1359,7 @@ static void gen_system(CPURISCVState *env, DisasContext > *ctx, uint32_t opc, > gen_exception_illegal(ctx); > break; > case 0x102: /* SRET */ > -if (riscv_has_ext(env, RVS)) { > +if (has_ext(ctx, RVS)) { > gen_helper_sret(cpu_pc, cpu_env, cpu_pc); > tcg_gen_exit_tb(0); /* no chaining */ >
[Qemu-devel] [PATCH v1 20/30] RISC-V: Add misa to DisasContext
gen methods should access state from DisasContext. Add misa field to the DisasContext struct and remove CPURISCVState argument from all gen methods. Cc: Palmer DabbeltCc: Sagar Karandikar Cc: Bastian Koppelmann Cc: Alistair Francis Cc: Emilio G. Cota Signed-off-by: Michael Clark Reviewed-by: Richard Henderson --- target/riscv/translate.c | 78 ++-- 1 file changed, 42 insertions(+), 36 deletions(-) diff --git a/target/riscv/translate.c b/target/riscv/translate.c index a980611eb611..fd21b133a5a4 100644 --- a/target/riscv/translate.c +++ b/target/riscv/translate.c @@ -45,6 +45,7 @@ typedef struct DisasContext { target_ulong pc_succ_insn; uint32_t opcode; uint32_t mstatus_fs; +uint32_t misa; uint32_t mem_idx; /* Remember the rounding mode encoded in the previous fp instruction, which we have already installed into env->fp_status. Or -1 for @@ -74,6 +75,11 @@ static const int tcg_memop_lookup[8] = { #define CASE_OP_32_64(X) case X #endif +static inline bool has_ext(DisasContext *ctx, uint32_t ext) +{ +return ctx->misa & ext; +} + static void generate_exception(DisasContext *ctx, int excp) { tcg_gen_movi_tl(cpu_pc, ctx->base.pc_next); @@ -505,14 +511,13 @@ static void gen_arith_imm(DisasContext *ctx, uint32_t opc, int rd, tcg_temp_free(source1); } -static void gen_jal(CPURISCVState *env, DisasContext *ctx, int rd, -target_ulong imm) +static void gen_jal(DisasContext *ctx, int rd, target_ulong imm) { target_ulong next_pc; /* check misaligned: */ next_pc = ctx->base.pc_next + imm; -if (!riscv_has_ext(env, RVC)) { +if (!has_ext(ctx, RVC)) { if ((next_pc & 0x3) != 0) { gen_exception_inst_addr_mis(ctx); return; @@ -526,8 +531,8 @@ static void gen_jal(CPURISCVState *env, DisasContext *ctx, int rd, ctx->base.is_jmp = DISAS_NORETURN; } -static void gen_jalr(CPURISCVState *env, DisasContext *ctx, uint32_t opc, - int rd, int rs1, target_long imm) +static void gen_jalr(DisasContext *ctx, uint32_t opc, int rd, int rs1, + target_long imm) { /* no chaining with JALR */ TCGLabel *misaligned = NULL; @@ -539,7 +544,7 @@ static void gen_jalr(CPURISCVState *env, DisasContext *ctx, uint32_t opc, tcg_gen_addi_tl(cpu_pc, cpu_pc, imm); tcg_gen_andi_tl(cpu_pc, cpu_pc, (target_ulong)-2); -if (!riscv_has_ext(env, RVC)) { +if (!has_ext(ctx, RVC)) { misaligned = gen_new_label(); tcg_gen_andi_tl(t0, cpu_pc, 0x2); tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0x0, misaligned); @@ -564,8 +569,8 @@ static void gen_jalr(CPURISCVState *env, DisasContext *ctx, uint32_t opc, tcg_temp_free(t0); } -static void gen_branch(CPURISCVState *env, DisasContext *ctx, uint32_t opc, - int rs1, int rs2, target_long bimm) +static void gen_branch(DisasContext *ctx, uint32_t opc, int rs1, int rs2, + target_long bimm) { TCGLabel *l = gen_new_label(); TCGv source1, source2; @@ -602,7 +607,7 @@ static void gen_branch(CPURISCVState *env, DisasContext *ctx, uint32_t opc, gen_goto_tb(ctx, 1, ctx->pc_succ_insn); gen_set_label(l); /* branch taken */ -if (!riscv_has_ext(env, RVC) && ((ctx->base.pc_next + bimm) & 0x3)) { +if (!has_ext(ctx, RVC) && ((ctx->base.pc_next + bimm) & 0x3)) { /* misaligned */ gen_exception_inst_addr_mis(ctx); } else { @@ -1311,8 +1316,8 @@ static void gen_fp_arith(DisasContext *ctx, uint32_t opc, int rd, } } -static void gen_system(CPURISCVState *env, DisasContext *ctx, uint32_t opc, - int rd, int rs1, int csr) +static void gen_system(DisasContext *ctx, uint32_t opc, int rd, int rs1, + int csr) { TCGv source1, csr_store, dest, rs1_pass, imm_rs1; source1 = tcg_temp_new(); @@ -1354,7 +1359,7 @@ static void gen_system(CPURISCVState *env, DisasContext *ctx, uint32_t opc, gen_exception_illegal(ctx); break; case 0x102: /* SRET */ -if (riscv_has_ext(env, RVS)) { +if (has_ext(ctx, RVS)) { gen_helper_sret(cpu_pc, cpu_env, cpu_pc); tcg_gen_exit_tb(0); /* no chaining */ ctx->base.is_jmp = DISAS_NORETURN; @@ -1495,7 +1500,7 @@ static void decode_RV32_64C0(DisasContext *ctx) } } -static void decode_RV32_64C1(CPURISCVState *env, DisasContext *ctx) +static void decode_RV32_64C1(DisasContext *ctx) { uint8_t funct3 = extract32(ctx->opcode, 13, 3); uint8_t rd_rs1 = GET_C_RS1(ctx->opcode); @@ -1515,7 +1520,7 @@ static void decode_RV32_64C1(CPURISCVState *env, DisasContext *ctx)