diff --git a/target/e2k/translate.h b/target/e2k/translate.h index 316d1ef284..203d02b1e9 100644 --- a/target/e2k/translate.h +++ b/target/e2k/translate.h @@ -137,7 +137,11 @@ typedef struct { TCGv_i32 v32; TCGv_i64 v64; }; - } preg, ctpr; + } ctpr; + struct { + int index; + TCGv_i32 val; + } preg; }; } AlResult; @@ -441,7 +445,7 @@ static inline void e2k_gen_lcntex(TCGv_i32 ret) tcg_temp_free_i32(t0); } -void e2k_gen_store_preg(int idx, TCGv_i64 val); +void e2k_gen_store_preg(int idx, TCGv_i32 val); void e2k_gen_reg_tag_read_i64(TCGv_i32 ret, TCGv_i32 idx); void e2k_gen_reg_tag_read_i32(TCGv_i32 ret, TCGv_i32 idx); diff --git a/target/e2k/translate/alc.c b/target/e2k/translate/alc.c index 04ba4dbe70..6609c43e67 100644 --- a/target/e2k/translate/alc.c +++ b/target/e2k/translate/alc.c @@ -562,13 +562,13 @@ static inline void set_al_result_reg32(DisasContext *ctx, int chan, } static inline void set_al_result_preg(DisasContext *ctx, int chan, int index, - TCGv_i64 value) + TCGv_i32 value) { AlResult *res = &ctx->al_results[chan]; res->type = AL_RESULT_PREG; res->preg.index = index; - res->preg.v64 = value; + res->preg.val = value; } static inline void gen_al_result_i80(DisasContext *ctx, Instr *instr, @@ -2181,18 +2181,21 @@ static void gen_alopf1_cmp_ddb(DisasContext *ctx, Instr *instr, TCGLabel *l1 = gen_new_label(); Src64 s1 = get_src1_i64(ctx, chan); Src64 s2 = get_src2_i64(ctx, chan); - TCGv_i64 dst = e2k_get_temp_i64(ctx); + TCGv_i32 dst = e2k_get_temp_i32(ctx); TCGv_i32 t0 = tcg_temp_new_i32(); + TCGv_i64 t1 = tcg_temp_new_i64(); gen_tag2_i64(t0, s1.tag, s2.tag); gen_tag_check(ctx, instr->sm, t0); tcg_gen_brcondi_i32(TCG_COND_NE, t0, 0, l0); - (*op)(dst, instr->opc_cmp, s1.value, s2.value); + (*op)(t1, instr->opc_cmp, s1.value, s2.value); + tcg_gen_extrl_i64_i32(dst, t1); tcg_gen_br(l1); gen_set_label(l0); - tcg_gen_movi_i64(dst, 2); + tcg_gen_movi_i32(dst, 2); gen_set_label(l1); set_al_result_preg(ctx, chan, instr->dst_preg, dst); + tcg_temp_free_i64(t1); tcg_temp_free_i32(t0); } @@ -2204,21 +2207,18 @@ static void gen_alopf1_cmp_ssb(DisasContext *ctx, Instr *instr, TCGLabel *l1 = gen_new_label(); Src32 s1 = get_src1_i32(ctx, chan); Src32 s2 = get_src2_i32(ctx, chan); - TCGv_i64 dst = e2k_get_temp_i64(ctx); + TCGv_i32 dst = e2k_get_temp_i32(ctx); TCGv_i32 t0 = tcg_temp_new_i32(); - TCGv_i32 t1 = tcg_temp_new_i32(); gen_tag2_i32(t0, s1.tag, s2.tag); gen_tag_check(ctx, instr->sm, t0); tcg_gen_brcondi_i32(TCG_COND_NE, t0, 0, l0); - (*op)(t1, instr->opc_cmp, s1.value, s2.value); - tcg_gen_extu_i32_i64(dst, t1); + (*op)(dst, instr->opc_cmp, s1.value, s2.value); tcg_gen_br(l1); gen_set_label(l0); - tcg_gen_movi_i64(dst, 2); + tcg_gen_movi_i32(dst, 2); gen_set_label(l1); set_al_result_preg(ctx, chan, instr->dst_preg, dst); - tcg_temp_free_i32(t1); tcg_temp_free_i32(t0); } @@ -2228,18 +2228,21 @@ static void gen_alopf1_cmp_f80(DisasContext *ctx, Instr *instr, Src80 s2, TCGv_i TCGLabel *l0 = gen_new_label(); TCGLabel *l1 = gen_new_label(); Src80 s1 = get_src1_i80(ctx, instr->src1); - TCGv_i64 dst = e2k_get_temp_i64(ctx); + TCGv_i32 dst = e2k_get_temp_i32(ctx); TCGv_i32 t0 = tcg_temp_new_i32(); + TCGv_i64 t1 = tcg_temp_new_i64(); gen_tag2_i64(t0, s1.tag, s2tag); gen_tag_check(ctx, instr->sm, t0); tcg_gen_brcondi_i32(TCG_COND_NE, t0, 0, l0); - gen_fcmp_f80(dst, instr->opc_cmp, s1, s2); + gen_fcmp_f80(t1, instr->opc_cmp, s1, s2); + tcg_gen_extrl_i64_i32(dst, t1); tcg_gen_br(l1); gen_set_label(l0); - tcg_gen_movi_i64(dst, 2); + tcg_gen_movi_i32(dst, 2); gen_set_label(l1); set_al_result_preg(ctx, chan, instr->dst_preg, dst); + tcg_temp_free_i64(t1); tcg_temp_free_i32(t0); } @@ -4402,7 +4405,7 @@ void e2k_alc_commit(DisasContext *ctx) break; case AL_RESULT_PREG: /* %predN */ - e2k_gen_store_preg(res->preg.index, res->preg.v64); + e2k_gen_store_preg(res->preg.index, res->preg.val); break; case AL_RESULT_CTPR: /* %ctprN */ diff --git a/target/e2k/translate/plu.c b/target/e2k/translate/plu.c index 13c9046ced..e64998a213 100644 --- a/target/e2k/translate/plu.c +++ b/target/e2k/translate/plu.c @@ -197,17 +197,9 @@ void e2k_plu_commit(DisasContext *ctx) unsigned int i; for (i = 0; i < 3; i++) { - TCGv_i64 t0; - if (ctx->pl_results[i].reg < 0) { continue; } - - t0 = tcg_temp_new_i64(); - - tcg_gen_extu_i32_i64(t0, ctx->pl_results[i].value); - e2k_gen_store_preg(ctx->pl_results[i].reg, t0); - - tcg_temp_free_i64(t0); + e2k_gen_store_preg(ctx->pl_results[i].reg, ctx->pl_results[i].value); } } diff --git a/target/e2k/translate/state.c b/target/e2k/translate/state.c index 21248a90e0..09952eaa30 100644 --- a/target/e2k/translate/state.c +++ b/target/e2k/translate/state.c @@ -102,19 +102,22 @@ TCGv_i64 e2k_get_preg(DisasContext *dc, int reg) return ret; } -void e2k_gen_store_preg(int idx, TCGv_i64 val) +void e2k_gen_store_preg(int idx, TCGv_i32 val) { TCGv_i64 t0 = tcg_temp_new_i64(); TCGv_i64 t1 = tcg_temp_new_i64(); TCGv_i64 t2 = tcg_temp_new_i64(); TCGv_i64 t3 = tcg_temp_new_i64(); + TCGv_i64 t4 = tcg_temp_new_i64(); gen_preg_offset(t0, idx); gen_preg_clear(t1, t0); - tcg_gen_andi_i64(t2, val, 3); - tcg_gen_shl_i64(t3, val, t0); - tcg_gen_or_i64(e2k_cs.pregs, t1, t3); + tcg_gen_extu_i32_i64(t2, val); + tcg_gen_andi_i64(t3, t2, 3); + tcg_gen_shl_i64(t4, t2, t0); + tcg_gen_or_i64(e2k_cs.pregs, t1, t4); + tcg_temp_free_i64(t4); tcg_temp_free_i64(t3); tcg_temp_free_i64(t2); tcg_temp_free_i64(t1);