qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v3 2/4] target-tricore: Added MADD.F and MSUB.F


From: Bastian Koppelmann
Subject: Re: [Qemu-devel] [PATCH v3 2/4] target-tricore: Added MADD.F and MSUB.F instructions
Date: Thu, 9 Jun 2016 13:00:09 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.1

On 06/07/2016 05:49 PM, address@hidden wrote:
> From: Peer Adelt <address@hidden>
> 
> Multiplies D[a] and D[b] and adds/subtracts the result to/from D[d].
> The result is put in D[c]. All operands are floating-point numbers.
> 
> Signed-off-by: Peer Adelt <address@hidden>
> ---
>  target-tricore/fpu_helper.c | 80 
> +++++++++++++++++++++++++++++++++++++++++++++
>  target-tricore/helper.h     |  2 ++
>  target-tricore/translate.c  |  8 +++++
>  3 files changed, 90 insertions(+)
> 
> diff --git a/target-tricore/fpu_helper.c b/target-tricore/fpu_helper.c
> index 16f274c..a4b0973 100644
> --- a/target-tricore/fpu_helper.c
> +++ b/target-tricore/fpu_helper.c
> @@ -21,6 +21,7 @@
>  #include "cpu.h"
>  #include "exec/helper-proto.h"
>  
> +#define QUIET_NAN 0x7fc00000

Not necessary, see comment below

> +static inline float32 f_maddsub_nan_result(float32 arg1, float32 arg2,
> +                                           float32 arg3, float32 result)
> +{
> +    if (float32_is_any_nan(arg1) ||
> +        float32_is_any_nan(arg2) ||
> +        float32_is_any_nan(arg3)) {
> +        return QUIET_NAN;

This case is already handled by softfloat. See
fpu/fpu/softfloat-specialize.h. This has a default quiet_nan value for
TriCore.

> +uint32_t helper_fmadd(CPUTriCoreState *env, uint32_t r1,
> +                      uint32_t r2, uint32_t r3)
> +{
> +    uint32_t flags;
> +    float32 arg1 = make_float32(r1);
> +    float32 arg2 = make_float32(r2);
> +    float32 arg3 = make_float32(r3);
> +    float32 f_result;
> +
> +    f_result = float32_muladd(arg1, arg2, arg3, 0, &env->fp_status);
> +
> +    flags = f_get_excp_flags(env);
> +    if (flags) {
> +        if (flags & float_flag_invalid) {
> +            f_result = f_maddsub_nan_result(arg1, arg2, arg3, f_result);

You need to squash argN here. The reference manual squashes argN to zero
if they are denormal. This is done in float32_muladd() through the flag
fp_status->flush_inputs_to_zero. However argN as you use them in
f_maddsub_nan_result() are not.

> +uint32_t helper_fmsub(CPUTriCoreState *env, uint32_t r1,
> +                      uint32_t r2, uint32_t r3)
> +{
> +    uint32_t flags;
> +    float32 arg1 = make_float32(r1);
> +    float32 arg2 = make_float32(r2);
> +    float32 arg3 = make_float32(r3);
> +    float32 f_result;
> +
> +    f_result = float32_muladd(arg1, arg2, arg3, float_muladd_negate_product, 
> &env->fp_status);
> +
> +    flags = f_get_excp_flags(env);
> +    if (flags) {
> +        if (flags & float_flag_invalid) {
> +            f_result = f_maddsub_nan_result(arg1, arg2, arg3, f_result);

Likewise.

Cheers,
    Bastian



reply via email to

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