qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 7/7] target-mips: Add IEEE 754-2008 features sup


From: Leon Alrae
Subject: Re: [Qemu-devel] [PATCH 7/7] target-mips: Add IEEE 754-2008 features support
Date: Mon, 9 Feb 2015 17:10:42 +0000
User-agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0

On 09/12/2014 01:56, Maciej W. Rozycki wrote:
> +        if (info->elf_flags & EF_MIPS_NAN2008)
> +            env->active_fpu.fcr31 |=
> +                (1 << FCR31_NAN2008) & env->active_fpu.fcr31_rw_bitmask;
> +        else
> +            env->active_fpu.fcr31 &=
> +                ~((1 << FCR31_NAN2008) & env->active_fpu.fcr31_rw_bitmask);

braces are needed here

> +uint64_t helper_float_chs_d(CPUMIPSState *env, uint64_t fdt0)
> +{
> +    uint64_t fdt1;
> +
> +    fdt1 = float64_sub(0, fdt0, &env->active_fpu.fp_status);
> +    update_fcr31(env, GETPC());
> +    return fdt1;
> +}
> +
> +uint32_t helper_float_chs_s(CPUMIPSState *env, uint32_t fst0)
> +{
> +    uint32_t fst1;
> +
> +    fst1 = float32_sub(0, fst0, &env->active_fpu.fp_status);
> +    update_fcr31(env, GETPC());
> +    return fst1;
> +}

I think there is one case where helper_float_chs_{d,s,ps} are not
correct -- when we have zero. In this case in subFloat32Sigs() we call:

return packFloat32(status->float_rounding_mode == float_round_down, 0, 0);

and the packFloat32() definition:

static inline float32 packFloat32(flag zSign, int_fast16_t zExp,
uint32_t zSig)
{

    return make_float32(
          ( ( (uint32_t) zSign )<<31 ) + ( ( (uint32_t) zExp )<<23 ) +
zSig);

}

Which means that the sign may not get changed, whereas I believe NEG.fmt
is supposed to reverse the sign bit of positive/negative zero regardless
of rounding mode.

>  
>  enum {
> @@ -8718,7 +8719,10 @@ static void gen_farith (DisasContext *ct
>              TCGv_i32 fp0 = tcg_temp_new_i32();
>  
>              gen_load_fpr32(fp0, fs);
> -            gen_helper_float_abs_s(fp0, fp0);
> +            if (ctx->abs2008)
> +                gen_helper_float_abs2008_s(fp0, fp0);
> +            else
> +                gen_helper_float_abs_s(fp0, cpu_env, fp0);

braces are needed here too (and also in a few other places in this patch).

Thanks,
Leon



reply via email to

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