mirror of https://github.com/xemu-project/xemu.git
target/arm: Use tcg_constant_i64() in do_sat_addsub_64()
The immediate value used for comparison is constant and read-only. Move it to the constant pool. This frees a TCG temporary for unsigned saturation opcodes. Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20211029231834.2476117-5-f4bug@amsat.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
cacb1aa486
commit
35a1ec8e47
|
@ -1943,20 +1943,20 @@ static void do_sat_addsub_32(TCGv_i64 reg, TCGv_i64 val, bool u, bool d)
|
|||
static void do_sat_addsub_64(TCGv_i64 reg, TCGv_i64 val, bool u, bool d)
|
||||
{
|
||||
TCGv_i64 t0 = tcg_temp_new_i64();
|
||||
TCGv_i64 t1 = tcg_temp_new_i64();
|
||||
TCGv_i64 t2;
|
||||
|
||||
if (u) {
|
||||
if (d) {
|
||||
tcg_gen_sub_i64(t0, reg, val);
|
||||
tcg_gen_movi_i64(t1, 0);
|
||||
tcg_gen_movcond_i64(TCG_COND_LTU, reg, reg, val, t1, t0);
|
||||
t2 = tcg_constant_i64(0);
|
||||
tcg_gen_movcond_i64(TCG_COND_LTU, reg, reg, val, t2, t0);
|
||||
} else {
|
||||
tcg_gen_add_i64(t0, reg, val);
|
||||
tcg_gen_movi_i64(t1, -1);
|
||||
tcg_gen_movcond_i64(TCG_COND_LTU, reg, t0, reg, t1, t0);
|
||||
t2 = tcg_constant_i64(-1);
|
||||
tcg_gen_movcond_i64(TCG_COND_LTU, reg, t0, reg, t2, t0);
|
||||
}
|
||||
} else {
|
||||
TCGv_i64 t1 = tcg_temp_new_i64();
|
||||
if (d) {
|
||||
/* Detect signed overflow for subtraction. */
|
||||
tcg_gen_xor_i64(t0, reg, val);
|
||||
|
@ -1966,7 +1966,7 @@ static void do_sat_addsub_64(TCGv_i64 reg, TCGv_i64 val, bool u, bool d)
|
|||
|
||||
/* Bound the result. */
|
||||
tcg_gen_movi_i64(reg, INT64_MIN);
|
||||
t2 = tcg_const_i64(0);
|
||||
t2 = tcg_constant_i64(0);
|
||||
tcg_gen_movcond_i64(TCG_COND_LT, reg, t0, t2, reg, t1);
|
||||
} else {
|
||||
/* Detect signed overflow for addition. */
|
||||
|
@ -1977,13 +1977,12 @@ static void do_sat_addsub_64(TCGv_i64 reg, TCGv_i64 val, bool u, bool d)
|
|||
|
||||
/* Bound the result. */
|
||||
tcg_gen_movi_i64(t1, INT64_MAX);
|
||||
t2 = tcg_const_i64(0);
|
||||
t2 = tcg_constant_i64(0);
|
||||
tcg_gen_movcond_i64(TCG_COND_LT, reg, t0, t2, t1, reg);
|
||||
}
|
||||
tcg_temp_free_i64(t2);
|
||||
tcg_temp_free_i64(t1);
|
||||
}
|
||||
tcg_temp_free_i64(t0);
|
||||
tcg_temp_free_i64(t1);
|
||||
}
|
||||
|
||||
/* Similarly with a vector and a scalar operand. */
|
||||
|
|
Loading…
Reference in New Issue