No real bug fix here, as we've already shown the full value fits in int32_t, but simple subtraction in tcg_target_long may produce a positive out-of-range intermediate.
Signed-off-by: Richard Henderson <[email protected]> --- tcg/riscv64/tcg-target.c.inc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tcg/riscv64/tcg-target.c.inc b/tcg/riscv64/tcg-target.c.inc index 99bc658c264..d0c9d8e9cd2 100644 --- a/tcg/riscv64/tcg-target.c.inc +++ b/tcg/riscv64/tcg-target.c.inc @@ -792,21 +792,22 @@ static bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg) static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd, tcg_target_long val) { - tcg_target_long lo, hi, tmp; + tcg_target_long tmp; + int32_t lo, hi; int shift, ret; if (type == TCG_TYPE_I32) { val = (int32_t)val; } - lo = sextreg(val, 0, 12); + lo = sextract32(val, 0, 12); if (val == lo) { tcg_out_opc_imm(s, OPC_ADDI, rd, TCG_REG_ZERO, lo); return; } - hi = val - lo; if (val == (int32_t)val) { + hi = val - lo; tcg_out_opc_upper(s, OPC_LUI, rd, hi); if (lo != 0) { tcg_out_opc_imm(s, OPC_ADDIW, rd, rd, lo); -- 2.53.0
