[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 08/28] softfloat: Split out parts_uncanon_normal
From: |
Richard Henderson |
Subject: |
[PATCH v2 08/28] softfloat: Split out parts_uncanon_normal |
Date: |
Tue, 25 May 2021 08:06:46 -0700 |
We will need to treat the non-normal cases of floatx80 specially,
so split out the normal case that we can reuse.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
fpu/softfloat.c | 8 ++++++
fpu/softfloat-parts.c.inc | 56 ++++++++++++++++++++++-----------------
2 files changed, 39 insertions(+), 25 deletions(-)
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
index 50af8e4e09..2f2bea84da 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 840ccfdf20..d72fe3ab08 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;
@@ -153,29 +153,6 @@ static void partsN(uncanon)(FloatPartsN *p, float_status
*s,
bool overflow_norm;
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();
- }
-
switch (s->float_rounding_mode) {
case float_round_nearest_even:
overflow_norm = false;
@@ -282,6 +259,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
- [PATCH v2 01/28] softfloat: Move round_to_uint_and_pack to softfloat-parts.c.inc, (continued)
- [PATCH v2 01/28] softfloat: Move round_to_uint_and_pack to softfloat-parts.c.inc, Richard Henderson, 2021/05/25
- [PATCH v2 04/28] softfloat: Move minmax_flags to softfloat-parts.c.inc, Richard Henderson, 2021/05/25
- [PATCH v2 02/28] softfloat: Move int_to_float to softfloat-parts.c.inc, Richard Henderson, 2021/05/25
- [PATCH v2 05/28] softfloat: Move compare_floats to softfloat-parts.c.inc, Richard Henderson, 2021/05/25
- [PATCH v2 06/28] softfloat: Move scalbn_decomposed to softfloat-parts.c.inc, Richard Henderson, 2021/05/25
- [PATCH v2 07/28] softfloat: Move sqrt_float to softfloat-parts.c.inc, Richard Henderson, 2021/05/25
- [PATCH v2 03/28] softfloat: Move uint_to_float to softfloat-parts.c.inc, Richard Henderson, 2021/05/25
- [PATCH v2 12/28] tests/fp/fp-test: Reverse order of floatx80 precision tests, Richard Henderson, 2021/05/25
- [PATCH v2 11/28] softfloat: Adjust parts_uncanon_normal for floatx80, Richard Henderson, 2021/05/25
- [PATCH v2 09/28] softfloat: Reduce FloatFmt, Richard Henderson, 2021/05/25
- [PATCH v2 08/28] softfloat: Split out parts_uncanon_normal,
Richard Henderson <=
- [PATCH v2 10/28] softfloat: Introduce Floatx80RoundPrec, Richard Henderson, 2021/05/25
- [PATCH v2 15/28] softfloat: Convert floatx80_div to FloatParts, Richard Henderson, 2021/05/25
- [PATCH v2 18/28] softfloat: Convert floatx80_round_to_int to FloatParts, Richard Henderson, 2021/05/25
- [PATCH v2 17/28] softfloat: Convert floatx80_round to FloatParts, Richard Henderson, 2021/05/25
- [PATCH v2 21/28] softfloat: Convert floatx80 to integer to FloatParts, Richard Henderson, 2021/05/25
- [PATCH v2 20/28] softfloat: Convert floatx80 float conversions to FloatParts, Richard Henderson, 2021/05/25
- [PATCH v2 28/28] softfloat: Use hard-float for {u}int64_to_float{32, 64}, Richard Henderson, 2021/05/25
- [PATCH v2 27/28] tests/fp: Enable more tests, Richard Henderson, 2021/05/25
- [PATCH v2 14/28] softfloat: Convert floatx80_mul to FloatParts, Richard Henderson, 2021/05/25
- [PATCH v2 13/28] softfloat: Convert floatx80_add/sub to FloatParts, Richard Henderson, 2021/05/25