mirror of https://github.com/xemu-project/xemu.git
target/riscv: Drop temp_new
Translators are no longer required to free tcg temporaries, therefore there's no need to record temps for later freeing. Replace the few uses with tcg_temp_new. Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn> Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
5d50945166
commit
574f31161e
|
@ -51,7 +51,7 @@ static bool trans_flh(DisasContext *ctx, arg_flh *a)
|
||||||
decode_save_opc(ctx);
|
decode_save_opc(ctx);
|
||||||
t0 = get_gpr(ctx, a->rs1, EXT_NONE);
|
t0 = get_gpr(ctx, a->rs1, EXT_NONE);
|
||||||
if (a->imm) {
|
if (a->imm) {
|
||||||
TCGv temp = temp_new(ctx);
|
TCGv temp = tcg_temp_new();
|
||||||
tcg_gen_addi_tl(temp, t0, a->imm);
|
tcg_gen_addi_tl(temp, t0, a->imm);
|
||||||
t0 = temp;
|
t0 = temp;
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,11 +101,8 @@ typedef struct DisasContext {
|
||||||
bool cfg_vta_all_1s;
|
bool cfg_vta_all_1s;
|
||||||
target_ulong vstart;
|
target_ulong vstart;
|
||||||
bool vl_eq_vlmax;
|
bool vl_eq_vlmax;
|
||||||
uint8_t ntemp;
|
|
||||||
CPUState *cs;
|
CPUState *cs;
|
||||||
TCGv zero;
|
TCGv zero;
|
||||||
/* Space for 3 operands plus 1 extra for address computation. */
|
|
||||||
TCGv temp[4];
|
|
||||||
/* PointerMasking extension */
|
/* PointerMasking extension */
|
||||||
bool pm_mask_enabled;
|
bool pm_mask_enabled;
|
||||||
bool pm_base_enabled;
|
bool pm_base_enabled;
|
||||||
|
@ -312,12 +309,6 @@ static void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
|
||||||
*
|
*
|
||||||
* Further, we may provide an extension for word operations.
|
* Further, we may provide an extension for word operations.
|
||||||
*/
|
*/
|
||||||
static TCGv temp_new(DisasContext *ctx)
|
|
||||||
{
|
|
||||||
assert(ctx->ntemp < ARRAY_SIZE(ctx->temp));
|
|
||||||
return ctx->temp[ctx->ntemp++] = tcg_temp_new();
|
|
||||||
}
|
|
||||||
|
|
||||||
static TCGv get_gpr(DisasContext *ctx, int reg_num, DisasExtend ext)
|
static TCGv get_gpr(DisasContext *ctx, int reg_num, DisasExtend ext)
|
||||||
{
|
{
|
||||||
TCGv t;
|
TCGv t;
|
||||||
|
@ -332,11 +323,11 @@ static TCGv get_gpr(DisasContext *ctx, int reg_num, DisasExtend ext)
|
||||||
case EXT_NONE:
|
case EXT_NONE:
|
||||||
break;
|
break;
|
||||||
case EXT_SIGN:
|
case EXT_SIGN:
|
||||||
t = temp_new(ctx);
|
t = tcg_temp_new();
|
||||||
tcg_gen_ext32s_tl(t, cpu_gpr[reg_num]);
|
tcg_gen_ext32s_tl(t, cpu_gpr[reg_num]);
|
||||||
return t;
|
return t;
|
||||||
case EXT_ZERO:
|
case EXT_ZERO:
|
||||||
t = temp_new(ctx);
|
t = tcg_temp_new();
|
||||||
tcg_gen_ext32u_tl(t, cpu_gpr[reg_num]);
|
tcg_gen_ext32u_tl(t, cpu_gpr[reg_num]);
|
||||||
return t;
|
return t;
|
||||||
default:
|
default:
|
||||||
|
@ -364,7 +355,7 @@ static TCGv get_gprh(DisasContext *ctx, int reg_num)
|
||||||
static TCGv dest_gpr(DisasContext *ctx, int reg_num)
|
static TCGv dest_gpr(DisasContext *ctx, int reg_num)
|
||||||
{
|
{
|
||||||
if (reg_num == 0 || get_olen(ctx) < TARGET_LONG_BITS) {
|
if (reg_num == 0 || get_olen(ctx) < TARGET_LONG_BITS) {
|
||||||
return temp_new(ctx);
|
return tcg_temp_new();
|
||||||
}
|
}
|
||||||
return cpu_gpr[reg_num];
|
return cpu_gpr[reg_num];
|
||||||
}
|
}
|
||||||
|
@ -372,7 +363,7 @@ static TCGv dest_gpr(DisasContext *ctx, int reg_num)
|
||||||
static TCGv dest_gprh(DisasContext *ctx, int reg_num)
|
static TCGv dest_gprh(DisasContext *ctx, int reg_num)
|
||||||
{
|
{
|
||||||
if (reg_num == 0) {
|
if (reg_num == 0) {
|
||||||
return temp_new(ctx);
|
return tcg_temp_new();
|
||||||
}
|
}
|
||||||
return cpu_gprh[reg_num];
|
return cpu_gprh[reg_num];
|
||||||
}
|
}
|
||||||
|
@ -575,7 +566,7 @@ static void gen_jal(DisasContext *ctx, int rd, target_ulong imm)
|
||||||
/* Compute a canonical address from a register plus offset. */
|
/* Compute a canonical address from a register plus offset. */
|
||||||
static TCGv get_address(DisasContext *ctx, int rs1, int imm)
|
static TCGv get_address(DisasContext *ctx, int rs1, int imm)
|
||||||
{
|
{
|
||||||
TCGv addr = temp_new(ctx);
|
TCGv addr = tcg_temp_new();
|
||||||
TCGv src1 = get_gpr(ctx, rs1, EXT_NONE);
|
TCGv src1 = get_gpr(ctx, rs1, EXT_NONE);
|
||||||
|
|
||||||
tcg_gen_addi_tl(addr, src1, imm);
|
tcg_gen_addi_tl(addr, src1, imm);
|
||||||
|
@ -593,7 +584,7 @@ static TCGv get_address(DisasContext *ctx, int rs1, int imm)
|
||||||
/* Compute a canonical address from a register plus reg offset. */
|
/* Compute a canonical address from a register plus reg offset. */
|
||||||
static TCGv get_address_indexed(DisasContext *ctx, int rs1, TCGv offs)
|
static TCGv get_address_indexed(DisasContext *ctx, int rs1, TCGv offs)
|
||||||
{
|
{
|
||||||
TCGv addr = temp_new(ctx);
|
TCGv addr = tcg_temp_new();
|
||||||
TCGv src1 = get_gpr(ctx, rs1, EXT_NONE);
|
TCGv src1 = get_gpr(ctx, rs1, EXT_NONE);
|
||||||
|
|
||||||
tcg_gen_add_tl(addr, src1, offs);
|
tcg_gen_add_tl(addr, src1, offs);
|
||||||
|
@ -1197,8 +1188,6 @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
|
||||||
ctx->misa_mxl_max = env->misa_mxl_max;
|
ctx->misa_mxl_max = env->misa_mxl_max;
|
||||||
ctx->xl = FIELD_EX32(tb_flags, TB_FLAGS, XL);
|
ctx->xl = FIELD_EX32(tb_flags, TB_FLAGS, XL);
|
||||||
ctx->cs = cs;
|
ctx->cs = cs;
|
||||||
ctx->ntemp = 0;
|
|
||||||
memset(ctx->temp, 0, sizeof(ctx->temp));
|
|
||||||
ctx->pm_mask_enabled = FIELD_EX32(tb_flags, TB_FLAGS, PM_MASK_ENABLED);
|
ctx->pm_mask_enabled = FIELD_EX32(tb_flags, TB_FLAGS, PM_MASK_ENABLED);
|
||||||
ctx->pm_base_enabled = FIELD_EX32(tb_flags, TB_FLAGS, PM_BASE_ENABLED);
|
ctx->pm_base_enabled = FIELD_EX32(tb_flags, TB_FLAGS, PM_BASE_ENABLED);
|
||||||
ctx->itrigger = FIELD_EX32(tb_flags, TB_FLAGS, ITRIGGER);
|
ctx->itrigger = FIELD_EX32(tb_flags, TB_FLAGS, ITRIGGER);
|
||||||
|
@ -1223,18 +1212,11 @@ static void riscv_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
|
||||||
DisasContext *ctx = container_of(dcbase, DisasContext, base);
|
DisasContext *ctx = container_of(dcbase, DisasContext, base);
|
||||||
CPURISCVState *env = cpu->env_ptr;
|
CPURISCVState *env = cpu->env_ptr;
|
||||||
uint16_t opcode16 = translator_lduw(env, &ctx->base, ctx->base.pc_next);
|
uint16_t opcode16 = translator_lduw(env, &ctx->base, ctx->base.pc_next);
|
||||||
int i;
|
|
||||||
|
|
||||||
ctx->ol = ctx->xl;
|
ctx->ol = ctx->xl;
|
||||||
decode_opc(env, ctx, opcode16);
|
decode_opc(env, ctx, opcode16);
|
||||||
ctx->base.pc_next = ctx->pc_succ_insn;
|
ctx->base.pc_next = ctx->pc_succ_insn;
|
||||||
|
|
||||||
for (i = ctx->ntemp - 1; i >= 0; --i) {
|
|
||||||
tcg_temp_free(ctx->temp[i]);
|
|
||||||
ctx->temp[i] = NULL;
|
|
||||||
}
|
|
||||||
ctx->ntemp = 0;
|
|
||||||
|
|
||||||
/* Only the first insn within a TB is allowed to cross a page boundary. */
|
/* Only the first insn within a TB is allowed to cross a page boundary. */
|
||||||
if (ctx->base.is_jmp == DISAS_NEXT) {
|
if (ctx->base.is_jmp == DISAS_NEXT) {
|
||||||
if (ctx->itrigger || !is_same_page(&ctx->base, ctx->base.pc_next)) {
|
if (ctx->itrigger || !is_same_page(&ctx->base, ctx->base.pc_next)) {
|
||||||
|
|
Loading…
Reference in New Issue