[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