All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Maydell <peter.maydell@linaro.org>
To: qemu-devel@nongnu.org
Subject: [PULL 06/72] fpu: handle raising Invalid for infzero in pick_nan_muladd
Date: Wed, 11 Dec 2024 16:18:58 +0000	[thread overview]
Message-ID: <20241211162004.2795499-7-peter.maydell@linaro.org> (raw)
In-Reply-To: <20241211162004.2795499-1-peter.maydell@linaro.org>

For IEEE fused multiply-add, the (0 * inf) + NaN case should raise
Invalid for the multiplication of 0 by infinity.  Currently we handle
this in the per-architecture ifdef ladder in pickNaNMulAdd().
However, since this isn't really architecture specific we can hoist
it up to the generic code.

For the cases where the infzero test in pickNaNMulAdd was
returning 2, we can delete the check entirely and allow the
code to fall into the normal pick-a-NaN handling, because this
will return 2 anyway (input 'c' being the only NaN in this case).
For the cases where infzero was returning 3 to indicate "return
the default NaN", we must retain that "return 3".

For Arm, this looks like it might be a behaviour change because we
used to set float_flag_invalid | float_flag_invalid_imz only if C is
a quiet NaN.  However, it is not, because Arm target code never looks
at float_flag_invalid_imz, and for the (0 * inf) + SNaN case we
already raised float_flag_invalid via the "abc_mask &
float_cmask_snan" check in pick_nan_muladd.

For any target architecture using the "default implementation" at the
bottom of the ifdef, this is a behaviour change but will be fixing a
bug (where we failed to raise the Invalid exception for (0 * inf +
QNaN).  The architectures using the default case are:
 * hppa
 * i386
 * sh4
 * tricore

The x86, Tricore and SH4 CPU architecture manuals are clear that this
should have raised Invalid; HPPA is a bit vaguer but still seems
clear enough.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20241202131347.498124-2-peter.maydell@linaro.org
---
 fpu/softfloat-parts.c.inc      | 13 +++++++------
 fpu/softfloat-specialize.c.inc | 29 +----------------------------
 2 files changed, 8 insertions(+), 34 deletions(-)

diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc
index cc6e06b9761..d63cd957a19 100644
--- a/fpu/softfloat-parts.c.inc
+++ b/fpu/softfloat-parts.c.inc
@@ -66,19 +66,20 @@ static FloatPartsN *partsN(pick_nan_muladd)(FloatPartsN *a, FloatPartsN *b,
                                             int ab_mask, int abc_mask)
 {
     int which;
+    bool infzero = (ab_mask == float_cmask_infzero);
 
     if (unlikely(abc_mask & float_cmask_snan)) {
         float_raise(float_flag_invalid | float_flag_invalid_snan, s);
     }
 
-    which = pickNaNMulAdd(a->cls, b->cls, c->cls,
-                          ab_mask == float_cmask_infzero, s);
+    if (infzero) {
+        /* This is (0 * inf) + NaN or (inf * 0) + NaN */
+        float_raise(float_flag_invalid | float_flag_invalid_imz, s);
+    }
+
+    which = pickNaNMulAdd(a->cls, b->cls, c->cls, infzero, s);
 
     if (s->default_nan_mode || which == 3) {
-        /*
-         * Note that this check is after pickNaNMulAdd so that function
-         * has an opportunity to set the Invalid flag for infzero.
-         */
         parts_default_nan(a, s);
         return a;
     }
diff --git a/fpu/softfloat-specialize.c.inc b/fpu/softfloat-specialize.c.inc
index 9bca03c4aed..c557c41b2af 100644
--- a/fpu/softfloat-specialize.c.inc
+++ b/fpu/softfloat-specialize.c.inc
@@ -480,7 +480,6 @@ static int pickNaNMulAdd(FloatClass a_cls, FloatClass b_cls, FloatClass c_cls,
      * the default NaN
      */
     if (infzero && is_qnan(c_cls)) {
-        float_raise(float_flag_invalid | float_flag_invalid_imz, status);
         return 3;
     }
 
@@ -507,7 +506,6 @@ static int pickNaNMulAdd(FloatClass a_cls, FloatClass b_cls, FloatClass c_cls,
          * case sets InvalidOp and returns the default NaN
          */
         if (infzero) {
-            float_raise(float_flag_invalid | float_flag_invalid_imz, status);
             return 3;
         }
         /* Prefer sNaN over qNaN, in the a, b, c order. */
@@ -529,10 +527,6 @@ static int pickNaNMulAdd(FloatClass a_cls, FloatClass b_cls, FloatClass c_cls,
          * For MIPS systems that conform to IEEE754-2008, the (inf,zero,nan)
          * case sets InvalidOp and returns the input value 'c'
          */
-        if (infzero) {
-            float_raise(float_flag_invalid | float_flag_invalid_imz, status);
-            return 2;
-        }
         /* Prefer sNaN over qNaN, in the c, a, b order. */
         if (is_snan(c_cls)) {
             return 2;
@@ -553,10 +547,7 @@ static int pickNaNMulAdd(FloatClass a_cls, FloatClass b_cls, FloatClass c_cls,
      * For LoongArch systems that conform to IEEE754-2008, the (inf,zero,nan)
      * case sets InvalidOp and returns the input value 'c'
      */
-    if (infzero) {
-        float_raise(float_flag_invalid | float_flag_invalid_imz, status);
-        return 2;
-    }
+
     /* Prefer sNaN over qNaN, in the c, a, b order. */
     if (is_snan(c_cls)) {
         return 2;
@@ -576,10 +567,6 @@ static int pickNaNMulAdd(FloatClass a_cls, FloatClass b_cls, FloatClass c_cls,
      * to return an input NaN if we have one (ie c) rather than generating
      * a default NaN
      */
-    if (infzero) {
-        float_raise(float_flag_invalid | float_flag_invalid_imz, status);
-        return 2;
-    }
 
     /* If fRA is a NaN return it; otherwise if fRB is a NaN return it;
      * otherwise return fRC. Note that muladd on PPC is (fRA * fRC) + frB
@@ -592,14 +579,9 @@ static int pickNaNMulAdd(FloatClass a_cls, FloatClass b_cls, FloatClass c_cls,
         return 1;
     }
 #elif defined(TARGET_RISCV)
-    /* For RISC-V, InvalidOp is set when multiplicands are Inf and zero */
-    if (infzero) {
-        float_raise(float_flag_invalid | float_flag_invalid_imz, status);
-    }
     return 3; /* default NaN */
 #elif defined(TARGET_S390X)
     if (infzero) {
-        float_raise(float_flag_invalid | float_flag_invalid_imz, status);
         return 3;
     }
 
@@ -617,11 +599,6 @@ static int pickNaNMulAdd(FloatClass a_cls, FloatClass b_cls, FloatClass c_cls,
         return 2;
     }
 #elif defined(TARGET_SPARC)
-    /* For (inf,0,nan) return c. */
-    if (infzero) {
-        float_raise(float_flag_invalid | float_flag_invalid_imz, status);
-        return 2;
-    }
     /* Prefer SNaN over QNaN, order C, B, A. */
     if (is_snan(c_cls)) {
         return 2;
@@ -641,10 +618,6 @@ static int pickNaNMulAdd(FloatClass a_cls, FloatClass b_cls, FloatClass c_cls,
      * For Xtensa, the (inf,zero,nan) case sets InvalidOp and returns
      * an input NaN if we have one (ie c).
      */
-    if (infzero) {
-        float_raise(float_flag_invalid | float_flag_invalid_imz, status);
-        return 2;
-    }
     if (status->use_first_nan) {
         if (is_nan(a_cls)) {
             return 0;
-- 
2.34.1



  parent reply	other threads:[~2024-12-11 16:22 UTC|newest]

Thread overview: 75+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-12-11 16:18 [PULL 00/72] target-arm queue Peter Maydell
2024-12-11 16:18 ` [PULL 01/72] hw/net/lan9118: Extract lan9118_phy Peter Maydell
2024-12-11 16:18 ` [PULL 02/72] hw/net/lan9118_phy: Reuse in imx_fec and consolidate implementations Peter Maydell
2024-12-11 16:18 ` [PULL 03/72] hw/net/lan9118_phy: Fix off-by-one error in MII_ANLPAR register Peter Maydell
2024-12-11 16:18 ` [PULL 04/72] hw/net/lan9118_phy: Reuse MII constants Peter Maydell
2024-12-11 16:18 ` [PULL 05/72] hw/net/lan9118_phy: Add missing 100 mbps full duplex advertisement Peter Maydell
2024-12-11 16:18 ` Peter Maydell [this message]
2024-12-11 16:18 ` [PULL 07/72] fpu: Check for default_nan_mode before calling pickNaNMulAdd Peter Maydell
2024-12-11 16:19 ` [PULL 08/72] softfloat: Allow runtime choice of inf * 0 + NaN result Peter Maydell
2024-12-11 16:19 ` [PULL 09/72] tests/fp: Explicitly set inf-zero-nan rule Peter Maydell
2024-12-11 16:19 ` [PULL 10/72] target/arm: Set FloatInfZeroNaNRule explicitly Peter Maydell
2024-12-11 16:19 ` [PULL 11/72] target/s390: " Peter Maydell
2024-12-11 16:19 ` [PULL 12/72] target/ppc: " Peter Maydell
2024-12-11 16:19 ` [PULL 13/72] target/mips: " Peter Maydell
2024-12-11 16:19 ` [PULL 14/72] target/sparc: " Peter Maydell
2024-12-11 16:19 ` [PULL 15/72] target/xtensa: " Peter Maydell
2024-12-11 16:19 ` [PULL 16/72] target/x86: " Peter Maydell
2024-12-11 16:19 ` [PULL 17/72] target/loongarch: " Peter Maydell
2024-12-11 16:19 ` [PULL 18/72] target/hppa: " Peter Maydell
2024-12-11 16:19 ` [PULL 19/72] softfloat: Pass have_snan to pickNaNMulAdd Peter Maydell
2024-12-11 16:19 ` [PULL 20/72] softfloat: Allow runtime choice of NaN propagation for muladd Peter Maydell
2024-12-11 16:19 ` [PULL 21/72] tests/fp: Explicitly set 3-NaN propagation rule Peter Maydell
2024-12-11 16:19 ` [PULL 22/72] target/arm: Set Float3NaNPropRule explicitly Peter Maydell
2024-12-11 16:19 ` [PULL 23/72] target/loongarch: " Peter Maydell
2024-12-11 16:19 ` [PULL 24/72] target/ppc: " Peter Maydell
2024-12-11 16:19 ` [PULL 25/72] target/s390x: " Peter Maydell
2024-12-11 16:19 ` [PULL 26/72] target/sparc: " Peter Maydell
2024-12-11 16:19 ` [PULL 27/72] target/mips: " Peter Maydell
2024-12-11 16:19 ` [PULL 28/72] target/xtensa: " Peter Maydell
2024-12-11 16:19 ` [PULL 29/72] target/i386: " Peter Maydell
2024-12-11 16:19 ` [PULL 30/72] target/hppa: " Peter Maydell
2024-12-11 16:19 ` [PULL 31/72] fpu: Remove use_first_nan field from float_status Peter Maydell
2024-12-11 16:19 ` [PULL 32/72] target/m68k: Don't pass NULL float_status to floatx80_default_nan() Peter Maydell
2024-12-11 16:19 ` [PULL 33/72] softfloat: Create floatx80 default NaN from parts64_default_nan Peter Maydell
2024-12-11 16:19 ` [PULL 34/72] target/loongarch: Use normal float_status in fclass_s and fclass_d helpers Peter Maydell
2024-12-11 16:19 ` [PULL 35/72] target/m68k: In frem helper, initialize local float_status from env->fp_status Peter Maydell
2024-12-11 16:19 ` [PULL 36/72] target/m68k: Init local float_status from env fp_status in gdb get/set reg Peter Maydell
2024-12-11 16:19 ` [PULL 37/72] target/sparc: Initialize local scratch float_status from env->fp_status Peter Maydell
2024-12-11 16:19 ` [PULL 38/72] target/ppc: Use env->fp_status in helper_compute_fprf functions Peter Maydell
2024-12-11 16:19 ` [PULL 39/72] target/arm: Copy entire float_status in is_ebf Peter Maydell
2024-12-11 16:19 ` [PULL 40/72] fpu: Allow runtime choice of default NaN value Peter Maydell
2024-12-11 16:19 ` [PULL 41/72] tests/fp: Set default NaN pattern explicitly Peter Maydell
2024-12-11 16:19 ` [PULL 42/72] target/microblaze: " Peter Maydell
2024-12-11 16:19 ` [PULL 43/72] target/i386: " Peter Maydell
2024-12-11 16:19 ` [PULL 44/72] target/hppa: " Peter Maydell
2024-12-11 16:19 ` [PULL 45/72] target/alpha: " Peter Maydell
2024-12-11 16:19 ` [PULL 46/72] target/arm: " Peter Maydell
2024-12-11 16:19 ` [PULL 47/72] target/loongarch: " Peter Maydell
2024-12-11 16:19 ` [PULL 48/72] target/m68k: " Peter Maydell
2024-12-11 16:19 ` [PULL 49/72] target/mips: " Peter Maydell
2024-12-11 16:19 ` [PULL 50/72] target/openrisc: " Peter Maydell
2024-12-11 16:19 ` [PULL 51/72] target/ppc: " Peter Maydell
2024-12-11 16:19 ` [PULL 52/72] target/sh4: " Peter Maydell
2024-12-11 16:19 ` [PULL 53/72] target/rx: " Peter Maydell
2024-12-11 16:19 ` [PULL 54/72] target/s390x: " Peter Maydell
2024-12-11 16:19 ` [PULL 55/72] target/sparc: " Peter Maydell
2024-12-11 16:19 ` [PULL 56/72] target/xtensa: " Peter Maydell
2024-12-11 16:19 ` [PULL 57/72] target/hexagon: " Peter Maydell
2024-12-11 16:19 ` [PULL 58/72] target/riscv: " Peter Maydell
2024-12-11 16:19 ` [PULL 59/72] target/tricore: " Peter Maydell
2024-12-11 16:19 ` [PULL 60/72] fpu: Remove default handling for dnan_pattern Peter Maydell
2024-12-11 16:19 ` [PULL 61/72] softfloat: Inline pickNaNMulAdd Peter Maydell
2024-12-11 16:19 ` [PULL 62/72] softfloat: Use goto for default nan case in pick_nan_muladd Peter Maydell
2024-12-11 16:19 ` [PULL 63/72] softfloat: Remove which from parts_pick_nan_muladd Peter Maydell
2024-12-11 16:19 ` [PULL 64/72] softfloat: Pad array size in pick_nan_muladd Peter Maydell
2024-12-11 16:19 ` [PULL 65/72] softfloat: Move propagateFloatx80NaN to softfloat.c Peter Maydell
2024-12-11 16:19 ` [PULL 66/72] softfloat: Use parts_pick_nan in propagateFloatx80NaN Peter Maydell
2024-12-11 16:19 ` [PULL 67/72] softfloat: Inline pickNaN Peter Maydell
2024-12-11 16:20 ` [PULL 68/72] softfloat: Share code between parts_pick_nan cases Peter Maydell
2024-12-11 16:20 ` [PULL 69/72] softfloat: Sink frac_cmp in parts_pick_nan until needed Peter Maydell
2024-12-11 16:20 ` [PULL 70/72] softfloat: Replace WHICH with RET in parts_pick_nan Peter Maydell
2024-12-11 16:20 ` [PULL 71/72] MAINTAINERS: update email address for Leif Lindholm Peter Maydell
2024-12-11 16:20 ` [PULL 72/72] MAINTAINERS: Add correct email address for Vikram Garhwal Peter Maydell
2024-12-13  1:20 ` [PULL 00/72] target-arm queue Stefan Hajnoczi
2024-12-13 10:44   ` Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20241211162004.2795499-7-peter.maydell@linaro.org \
    --to=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.