qemu-stable
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [RFC PATCH] target/sh4: Fix SUBV opcode


From: Paul Cercueil
Subject: Re: [RFC PATCH] target/sh4: Fix SUBV opcode
Date: Tue, 30 Apr 2024 15:10:21 +0200

Hi Philippe,

Le mardi 30 avril 2024 à 14:06 +0200, Philippe Mathieu-Daudé a écrit :
> The documentation says:
> 
>   SUBV Rm, Rn        Rn - Rm -> Rn, underflow -> T
> 
> While correctly performing the substraction, the underflow
> is not detected.
> 
> While we can check the high xored bit for overflow, for
> underflow we need to check the xored value is not negative.

This fix still does not work properly; it will incorrectly set the
underflow bit when the sign changes from positive to negative.

e.g. Rn == 0 and Rm == 2, the result will be Rn == -2, without any
underflow.

Cheers,
-Paul

> 
> Cc: qemu-stable@nongnu.org
> Fixes: ad8d25a11f ("target-sh4: implement addv and subv using TCG")
> Reported-by: Paul Cercueil <paul@crapouillou.net>
> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2318
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
>  target/sh4/translate.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/target/sh4/translate.c b/target/sh4/translate.c
> index 4a1dd0d1f4..1c48d8ebea 100644
> --- a/target/sh4/translate.c
> +++ b/target/sh4/translate.c
> @@ -937,7 +937,7 @@ static void _decode_opc(DisasContext * ctx)
>              t2 = tcg_temp_new();
>              tcg_gen_xor_i32(t2, REG(B11_8), REG(B7_4));
>              tcg_gen_and_i32(t1, t1, t2);
> -            tcg_gen_shri_i32(cpu_sr_t, t1, 31);
> +            tcg_gen_setcondi_i32(TCG_COND_GE, cpu_sr_t, t1, 0);
>              tcg_gen_mov_i32(REG(B11_8), t0);
>          }
>          return;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]