e2k: Change pred type to TCGv_i32 in e2k_gen_store_preg.

This commit is contained in:
Denis Drakhnia 2021-01-05 13:23:54 +02:00 committed by Denis Drakhnia
parent fb1c8adcc7
commit b9691deedb
4 changed files with 32 additions and 30 deletions

View File

@ -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);

View File

@ -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 */

View File

@ -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);
}
}

View File

@ -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);