qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 4/5] target-ppc: use the softfloat float32_mulad


From: Peter Maydell
Subject: Re: [Qemu-devel] [PATCH 4/5] target-ppc: use the softfloat float32_muladd function
Date: Sun, 9 Sep 2012 10:51:20 +0100

On 8 September 2012 22:12, Aurelien Jarno <address@hidden> wrote:
> +#define VARITHFPFMA(suffix, type)                                       \
> +    void helper_v##suffix(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a, \
> +                           ppc_avr_t *b, ppc_avr_t *c)                  \
> +    {                                                                   \
> +        int i;                                                          \
> +        for (i = 0; i < ARRAY_SIZE(r->f); i++) {                        \
> +            r->f[i] = float32_muladd(a->f[i], c->f[i], b->f[i],         \
> +                                     type, &env->vec_status);           \
> +        }                                                               \
> +    }
> +VARITHFPFMA(maddfp, 0);
> +VARITHFPFMA(nmsubfp, float_muladd_negate_result);
> +#undef VARITHFPFMA
> +
>  #define VARITHSAT_CASE(type, op, cvt, element)                          \
>      {                                                                   \
>          type result = (type)a->element[i] op (type)b->element[i];       \
> -void helper_vnmsubfp(CPUPPCState *env, ppc_avr_t *r, ppc_avr_t *a,
> -                     ppc_avr_t *b, ppc_avr_t *c)
> -{
> -    int i;
> -
> -    for (i = 0; i < ARRAY_SIZE(r->f); i++) {
> -        HANDLE_NAN3(r->f[i], a->f[i], b->f[i], c->f[i]) {
> -            /* Need to do the computation is higher precision and round
> -             * once at the end.  */
> -            float64 af, bf, cf, t;
> -
> -            af = float32_to_float64(a->f[i], &env->vec_status);
> -            bf = float32_to_float64(b->f[i], &env->vec_status);
> -            cf = float32_to_float64(c->f[i], &env->vec_status);
> -            t = float64_mul(af, cf, &env->vec_status);
> -            t = float64_sub(t, bf, &env->vec_status);
> -            t = float64_chs(t);
> -            r->f[i] = float64_to_float32(t, &env->vec_status);
> -        }
> -    }
> -}

I mentioned this in my comment on the other patch, but just to attach
it to the right patch for the benefit of the archives:
the code here for vnmsub is (correctly) doing a subtraction of bf
and then negating the final result, so you need to pass float_muladd
the flags negate_result | negate_c, not just negate_result.

thanks
-- PMM



reply via email to

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