[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 2/2] target/mips: Make the results of MOD_<U|
From: |
Aleksandar Markovic |
Subject: |
Re: [Qemu-devel] [PATCH v2 2/2] target/mips: Make the results of MOD_<U|S>.<B|H|W|D> the same as on hardware |
Date: |
Tue, 2 Apr 2019 12:50:15 +0000 |
> From: Mateja Marjanovic <address@hidden>
> Subject: [PATCH v2 2/2] target/mips: Make the results of MOD_<U|S>.<B|H|W|D>
> the same as on hardware
>
> From: Mateja Marjanovic <address@hidden>
>
> MSA instructions MOD_<U|S>.<B|H|W|D> when dividing by zero,
> didn't return the same value when executed on a referent hardware
> (FPGA MIPS 64 r6, little endian) and when executed on QEMU, which
> is not a real bug, because the result when dividing by zero is
> UNPREDICTABLE [1] (page 255, 256).
>
> [1] MIPS Architecture for Programmers
> Volume IV-j: The MIPS64 SIMD
> Architecture Module, Revision 1.12
>
> Signed-off-by: Mateja Marjanovic <address@hidden>
> ---
Reviewed-by: Aleksandar Markovic <address@hidden>
> target/mips/msa_helper.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/target/mips/msa_helper.c b/target/mips/msa_helper.c
> index 8c77f12..6693ba6 100644
> --- a/target/mips/msa_helper.c
> +++ b/target/mips/msa_helper.c
> @@ -657,14 +657,14 @@ static inline int64_t msa_mod_s_df(uint32_t df, int64_t
> arg1, int64_t > arg2)
> if (arg1 == DF_MIN_INT(df) && arg2 == -1) {
> return 0;
> }
> - return arg2 ? arg1 % arg2 : 0;
> + return arg2 ? arg1 % arg2 : arg1;
> }
>
> static inline int64_t msa_mod_u_df(uint32_t df, int64_t arg1, int64_t arg2)
> {
> uint64_t u_arg1 = UNSIGNED(arg1, df);
> uint64_t u_arg2 = UNSIGNED(arg2, df);
> - return u_arg2 ? u_arg1 % u_arg2 : 0;
> + return u_arg2 ? u_arg1 % u_arg2 : u_arg1;
> }
>
> #define SIGNED_EVEN(a, df) \
> --
> 2.7.4