From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40756) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bAxhF-0008Q3-4L for qemu-devel@nongnu.org; Thu, 09 Jun 2016 07:00:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bAxh9-00030E-3K for qemu-devel@nongnu.org; Thu, 09 Jun 2016 07:00:20 -0400 Received: from mail.uni-paderborn.de ([131.234.142.9]:53585) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bAxh8-0002zq-Tw for qemu-devel@nongnu.org; Thu, 09 Jun 2016 07:00:15 -0400 References: <1465314555-11501-1-git-send-email-peer.adelt@c-lab.de> <1465314555-11501-3-git-send-email-peer.adelt@c-lab.de> From: Bastian Koppelmann Message-ID: <7819e128-8412-330a-0587-0a8071c5859c@mail.uni-paderborn.de> Date: Thu, 9 Jun 2016 13:00:09 +0200 MIME-Version: 1.0 In-Reply-To: <1465314555-11501-3-git-send-email-peer.adelt@c-lab.de> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [PATCH v3 2/4] target-tricore: Added MADD.F and MSUB.F instructions List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: peer.adelt@c-lab.de, qemu-devel@nongnu.org Cc: rth@twiddle.net On 06/07/2016 05:49 PM, peer.adelt@c-lab.de wrote: > From: Peer Adelt > > 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 > --- > 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