qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Cc: "Alex Bennée" <alex.bennee@linaro.org>
Subject: [PULL 09/29] softfloat: Split out parts_uncanon_normal
Date: Thu,  3 Jun 2021 14:41:11 -0700	[thread overview]
Message-ID: <20210603214131.629841-10-richard.henderson@linaro.org> (raw)
In-Reply-To: <20210603214131.629841-1-richard.henderson@linaro.org>

We will need to treat the non-normal cases of floatx80 specially,
so split out the normal case that we can reuse.

Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 fpu/softfloat.c           |  8 ++++++
 fpu/softfloat-parts.c.inc | 59 +++++++++++++++++++++------------------
 2 files changed, 40 insertions(+), 27 deletions(-)

diff --git a/fpu/softfloat.c b/fpu/softfloat.c
index 0f2eed8d29..ea7ee13201 100644
--- a/fpu/softfloat.c
+++ b/fpu/softfloat.c
@@ -764,6 +764,14 @@ static void parts128_canonicalize(FloatParts128 *p, float_status *status,
 #define parts_canonicalize(A, S, F) \
     PARTS_GENERIC_64_128(canonicalize, A)(A, S, F)
 
+static void parts64_uncanon_normal(FloatParts64 *p, float_status *status,
+                                   const FloatFmt *fmt);
+static void parts128_uncanon_normal(FloatParts128 *p, float_status *status,
+                                    const FloatFmt *fmt);
+
+#define parts_uncanon_normal(A, S, F) \
+    PARTS_GENERIC_64_128(uncanon_normal, A)(A, S, F)
+
 static void parts64_uncanon(FloatParts64 *p, float_status *status,
                             const FloatFmt *fmt);
 static void parts128_uncanon(FloatParts128 *p, float_status *status,
diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc
index d69f357352..e05909db8c 100644
--- a/fpu/softfloat-parts.c.inc
+++ b/fpu/softfloat-parts.c.inc
@@ -140,8 +140,8 @@ static void partsN(canonicalize)(FloatPartsN *p, float_status *status,
  * fraction; these bits will be removed. The exponent will be biased
  * by EXP_BIAS and must be bounded by [EXP_MAX-1, 0].
  */
-static void partsN(uncanon)(FloatPartsN *p, float_status *s,
-                            const FloatFmt *fmt)
+static void partsN(uncanon_normal)(FloatPartsN *p, float_status *s,
+                                   const FloatFmt *fmt)
 {
     const int exp_max = fmt->exp_max;
     const int frac_shift = fmt->frac_shift;
@@ -150,33 +150,9 @@ static void partsN(uncanon)(FloatPartsN *p, float_status *s,
     const uint64_t round_mask = fmt->round_mask;
     const uint64_t roundeven_mask = fmt->roundeven_mask;
     uint64_t inc;
-    bool overflow_norm;
+    bool overflow_norm = false;
     int exp, flags = 0;
 
-    if (unlikely(p->cls != float_class_normal)) {
-        switch (p->cls) {
-        case float_class_zero:
-            p->exp = 0;
-            frac_clear(p);
-            return;
-        case float_class_inf:
-            g_assert(!fmt->arm_althp);
-            p->exp = fmt->exp_max;
-            frac_clear(p);
-            return;
-        case float_class_qnan:
-        case float_class_snan:
-            g_assert(!fmt->arm_althp);
-            p->exp = fmt->exp_max;
-            frac_shr(p, fmt->frac_shift);
-            return;
-        default:
-            break;
-        }
-        g_assert_not_reached();
-    }
-
-    overflow_norm = false;
     switch (s->float_rounding_mode) {
     case float_round_nearest_even:
         inc = ((p->frac_lo & roundeven_mask) != frac_lsbm1 ? frac_lsbm1 : 0);
@@ -284,6 +260,35 @@ static void partsN(uncanon)(FloatPartsN *p, float_status *s,
     float_raise(flags, s);
 }
 
+static void partsN(uncanon)(FloatPartsN *p, float_status *s,
+                            const FloatFmt *fmt)
+{
+    if (likely(p->cls == float_class_normal)) {
+        parts_uncanon_normal(p, s, fmt);
+    } else {
+        switch (p->cls) {
+        case float_class_zero:
+            p->exp = 0;
+            frac_clear(p);
+            return;
+        case float_class_inf:
+            g_assert(!fmt->arm_althp);
+            p->exp = fmt->exp_max;
+            frac_clear(p);
+            return;
+        case float_class_qnan:
+        case float_class_snan:
+            g_assert(!fmt->arm_althp);
+            p->exp = fmt->exp_max;
+            frac_shr(p, fmt->frac_shift);
+            return;
+        default:
+            break;
+        }
+        g_assert_not_reached();
+    }
+}
+
 /*
  * Returns the result of adding or subtracting the values of the
  * floating-point values `a' and `b'. The operation is performed
-- 
2.25.1



  parent reply	other threads:[~2021-06-03 21:43 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-03 21:41 [PULL 00/29] softfloat patch queue Richard Henderson
2021-06-03 21:41 ` [PULL 01/29] softfloat: Move round_to_uint_and_pack to softfloat-parts.c.inc Richard Henderson
2021-06-03 21:41 ` [PULL 02/29] softfloat: Move int_to_float " Richard Henderson
2021-06-03 21:41 ` [PULL 03/29] softfloat: Move uint_to_float " Richard Henderson
2021-06-03 21:41 ` [PULL 04/29] softfloat: Move minmax_flags " Richard Henderson
2021-06-03 21:41 ` [PULL 05/29] softfloat: Implement float128_(min|minnum|minnummag|max|maxnum|maxnummag) Richard Henderson
2021-06-03 21:41 ` [PULL 06/29] softfloat: Move compare_floats to softfloat-parts.c.inc Richard Henderson
2022-03-31 10:46   ` Peter Maydell
2022-03-31 17:54     ` Richard Henderson
2022-03-31 18:06       ` Peter Maydell
2022-04-01 13:33         ` Richard Henderson
2021-06-03 21:41 ` [PULL 07/29] softfloat: Move scalbn_decomposed " Richard Henderson
2021-06-03 21:41 ` [PULL 08/29] softfloat: Move sqrt_float " Richard Henderson
2021-06-03 21:41 ` Richard Henderson [this message]
2021-06-03 21:41 ` [PULL 10/29] softfloat: Reduce FloatFmt Richard Henderson
2021-06-03 21:41 ` [PULL 11/29] softfloat: Introduce Floatx80RoundPrec Richard Henderson
2021-06-03 21:41 ` [PULL 12/29] softfloat: Adjust parts_uncanon_normal for floatx80 Richard Henderson
2021-06-03 21:41 ` [PULL 13/29] tests/fp/fp-test: Reverse order of floatx80 precision tests Richard Henderson
2021-06-03 21:41 ` [PULL 14/29] softfloat: Convert floatx80_add/sub to FloatParts Richard Henderson
2021-06-03 21:41 ` [PULL 15/29] softfloat: Convert floatx80_mul " Richard Henderson
2021-06-03 21:41 ` [PULL 16/29] softfloat: Convert floatx80_div " Richard Henderson
2021-06-03 21:41 ` [PULL 17/29] softfloat: Convert floatx80_sqrt " Richard Henderson
2021-06-03 21:41 ` [PULL 18/29] softfloat: Convert floatx80_round " Richard Henderson
2021-06-03 21:41 ` [PULL 19/29] softfloat: Convert floatx80_round_to_int " Richard Henderson
2021-06-03 21:41 ` [PULL 20/29] softfloat: Convert integer to floatx80 " Richard Henderson
2021-06-03 21:41 ` [PULL 21/29] softfloat: Convert floatx80 float conversions " Richard Henderson
2021-06-03 21:41 ` [PULL 22/29] softfloat: Convert floatx80 to integer " Richard Henderson
2021-06-03 21:41 ` [PULL 23/29] softfloat: Convert floatx80_scalbn " Richard Henderson
2021-06-03 21:41 ` [PULL 24/29] softfloat: Convert floatx80 compare " Richard Henderson
2021-06-03 21:41 ` [PULL 25/29] softfloat: Convert float32_exp2 " Richard Henderson
2021-06-07 21:07   ` Peter Maydell
2021-06-07 22:28     ` Richard Henderson
2021-06-03 21:41 ` [PULL 26/29] softfloat: Move floatN_log2 to softfloat-parts.c.inc Richard Henderson
2021-06-03 21:41 ` [PULL 27/29] softfloat: Convert modrem operations to FloatParts Richard Henderson
2021-06-03 21:41 ` [PULL 28/29] tests/fp: Enable more tests Richard Henderson
2021-06-03 21:41 ` [PULL 29/29] softfloat: Use hard-float for {u}int64_to_float{32,64} Richard Henderson
2021-06-04 10:36 ` [PULL 00/29] softfloat patch queue 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=20210603214131.629841-10-richard.henderson@linaro.org \
    --to=richard.henderson@linaro.org \
    --cc=alex.bennee@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).