[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 09/28] softfloat: Reduce FloatFmt
From: |
Richard Henderson |
Subject: |
[PATCH v2 09/28] softfloat: Reduce FloatFmt |
Date: |
Tue, 25 May 2021 08:06:47 -0700 |
Remove frac_lsb, frac_lsbm1, roundeven_mask. Compute
these from round_mask in parts$N_uncanon_normal.
With floatx80, round_mask will not be tied to frac_shift.
Everything else is easily computable.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
fpu/softfloat.c | 29 ++++++++++++-----------------
fpu/softfloat-parts.c.inc | 6 +++---
2 files changed, 15 insertions(+), 20 deletions(-)
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
index 2f2bea84da..f6adc2c5ec 100644
--- a/fpu/softfloat.c
+++ b/fpu/softfloat.c
@@ -563,9 +563,7 @@ typedef struct {
* frac_size: the size of the fraction field
* frac_shift: shift to normalise the fraction with DECOMPOSED_BINARY_POINT
* The following are computed based the size of fraction
- * frac_lsb: least significant bit of fraction
- * frac_lsbm1: the bit below the least significant bit (for rounding)
- * round_mask/roundeven_mask: masks used for rounding
+ * round_mask: bits below lsb which must be rounded
* The following optional modifiers are available:
* arm_althp: handle ARM Alternative Half Precision
*/
@@ -575,24 +573,21 @@ typedef struct {
int exp_max;
int frac_size;
int frac_shift;
- uint64_t frac_lsb;
- uint64_t frac_lsbm1;
- uint64_t round_mask;
- uint64_t roundeven_mask;
bool arm_althp;
+ uint64_t round_mask;
} FloatFmt;
/* Expand fields based on the size of exponent and fraction */
-#define FLOAT_PARAMS(E, F) \
- .exp_size = E, \
- .exp_bias = ((1 << E) - 1) >> 1, \
- .exp_max = (1 << E) - 1, \
- .frac_size = F, \
- .frac_shift = (-F - 1) & 63, \
- .frac_lsb = 1ull << ((-F - 1) & 63), \
- .frac_lsbm1 = 1ull << ((-F - 2) & 63), \
- .round_mask = (1ull << ((-F - 1) & 63)) - 1, \
- .roundeven_mask = (2ull << ((-F - 1) & 63)) - 1
+#define FLOAT_PARAMS_(E, F) \
+ .exp_size = E, \
+ .exp_bias = ((1 << E) - 1) >> 1, \
+ .exp_max = (1 << E) - 1, \
+ .frac_size = F
+
+#define FLOAT_PARAMS(E, F) \
+ FLOAT_PARAMS_(E, F), \
+ .frac_shift = (-F - 1) & 63, \
+ .round_mask = (1ull << ((-F - 1) & 63)) - 1
static const FloatFmt float16_params = {
FLOAT_PARAMS(5, 10)
diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc
index d72fe3ab08..b456c1c30c 100644
--- a/fpu/softfloat-parts.c.inc
+++ b/fpu/softfloat-parts.c.inc
@@ -145,10 +145,10 @@ static void partsN(uncanon_normal)(FloatPartsN *p,
float_status *s,
{
const int exp_max = fmt->exp_max;
const int frac_shift = fmt->frac_shift;
- const uint64_t frac_lsb = fmt->frac_lsb;
- const uint64_t frac_lsbm1 = fmt->frac_lsbm1;
const uint64_t round_mask = fmt->round_mask;
- const uint64_t roundeven_mask = fmt->roundeven_mask;
+ const uint64_t frac_lsb = round_mask + 1;
+ const uint64_t frac_lsbm1 = round_mask ^ (round_mask >> 1);
+ const uint64_t roundeven_mask = round_mask | frac_lsb;
uint64_t inc;
bool overflow_norm;
int exp, flags = 0;
--
2.25.1
- [PATCH v2 00/28] Convert floatx80 and float128 to FloatParts, Richard Henderson, 2021/05/25
- [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 <=
- [PATCH v2 08/28] softfloat: Split out parts_uncanon_normal, Richard Henderson, 2021/05/25
- [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