Reviewed-by: Philippe Mathieu-Daudé <[email protected]>
Signed-off-by: Richard Henderson <[email protected]>
---
fpu/softfloat.c | 29 ++++++++++++-----------------
fpu/softfloat-parts.c.inc | 22 +++++++++++-----------
fpu/softfloat-specialize.c.inc | 22 ++++++++++------------
3 files changed, 33 insertions(+), 40 deletions(-)
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
index b857c13d91..fa8913a288 100644
--- a/fpu/softfloat.c
+++ b/fpu/softfloat.c
@@ -2678,7 +2678,7 @@ float32 floatx80_to_float32(floatx80 a, float_status *s)
if (floatx80_unpack_canonical(&p128, a, s)) {
p64 = parts128_to_parts64(&p128, s);
} else {
- parts64_default_nan(&p64, s);
+ p64 = parts64_default_nan(s);
}
return float32_round_pack_canonical(&p64, s);
}
@@ -2691,7 +2691,7 @@ float64 floatx80_to_float64(floatx80 a, float_status *s)
if (floatx80_unpack_canonical(&p128, a, s)) {
p64 = parts128_to_parts64(&p128, s);
} else {
- parts64_default_nan(&p64, s);
+ p64 = parts64_default_nan(s);
}
return float64_round_pack_canonical(&p64, s);
}
@@ -2703,7 +2703,7 @@ float128 floatx80_to_float128(floatx80 a, float_status *s)
if (floatx80_unpack_canonical(&p, a, s)) {
parts128_float_to_float(&p, s);
} else {
- parts128_default_nan(&p, s);
+ p = parts128_default_nan(s);
}
return float128_round_pack_canonical(&p, s);
}
@@ -2964,7 +2964,7 @@ static int32_t floatx80_to_int32_scalbn(floatx80 a,
FloatRoundMode rmode,
FloatParts128 p;
if (!floatx80_unpack_canonical(&p, a, s)) {
- parts128_default_nan(&p, s);
+ p = parts128_default_nan(s);
}
return parts128_float_to_sint(&p, rmode, scale, INT32_MIN, INT32_MAX, s);
}
@@ -2975,7 +2975,7 @@ static int64_t floatx80_to_int64_scalbn(floatx80 a,
FloatRoundMode rmode,
FloatParts128 p;
if (!floatx80_unpack_canonical(&p, a, s)) {
- parts128_default_nan(&p, s);
+ p = parts128_default_nan(s);
}
return parts128_float_to_sint(&p, rmode, scale, INT64_MIN, INT64_MAX, s);
}
@@ -4562,7 +4562,7 @@ static void parts64_log2(FloatParts64 *a, float_status
*s, const FloatFmt *fmt)
d_nan:
float_raise(float_flag_invalid, s);
- parts64_default_nan(a, s);
+ *a = parts64_default_nan(s);
}
float32 float32_log2(float32 a, float_status *status)
@@ -4587,45 +4587,40 @@ float64 float64_log2(float64 a, float_status *status)
float16 float16_default_nan(float_status *status)
{
- FloatParts64 p;
+ FloatParts64 p = parts64_default_nan(status);
- parts64_default_nan(&p, status);
p.frac >>= float16_params.frac_shift;
return pack_raw64(&p, &float16_params);
}
float32 float32_default_nan(float_status *status)
{
- FloatParts64 p;
+ FloatParts64 p = parts64_default_nan(status);
- parts64_default_nan(&p, status);
p.frac >>= float32_params.frac_shift;
return pack_raw64(&p, &float32_params);
}
float64 float64_default_nan(float_status *status)
{
- FloatParts64 p;
+ FloatParts64 p = parts64_default_nan(status);
- parts64_default_nan(&p, status);
p.frac >>= float64_params.frac_shift;
return pack_raw64(&p, &float64_params);
}
float128 float128_default_nan(float_status *status)
{
- FloatParts128 p;
+ FloatParts128 p = parts128_default_nan(status);
- parts128_default_nan(&p, status);
frac128_shr(&p, float128_params.frac_shift);
return float128_pack_raw(&p);
}
bfloat16 bfloat16_default_nan(float_status *status)
{
- FloatParts64 p;
+ FloatParts64 p = parts64_default_nan(status);
- parts64_default_nan(&p, status);
p.frac >>= bfloat16_params.frac_shift;
return pack_raw64(&p, &bfloat16_params);
}
@@ -5131,7 +5126,7 @@ static void parts_s390_divide_to_integer(FloatParts64 *a,
FloatParts64 *b,
*n = *r;
*cc = 1;
} else if (a->cls == float_class_inf || b->cls == float_class_zero) {
- parts64_default_nan(r, status);
+ *r = parts64_default_nan(status);
*n = *r;
*cc = 1;
status->float_exception_flags |= float_flag_invalid;
diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc
index 5d344f9afe..ed7080d886 100644
--- a/fpu/softfloat-parts.c.inc
+++ b/fpu/softfloat-parts.c.inc
@@ -21,14 +21,14 @@ static void partsN(return_nan)(FloatPartsN *a, float_status
*s)
case float_class_snan:
float_raise(float_flag_invalid | float_flag_invalid_snan, s);
if (s->default_nan_mode) {
- partsN(default_nan)(a, s);
+ *a = partsN(default_nan)(s);
} else {
partsN(silence_nan)(a, s);
}
break;
case float_class_qnan:
if (s->default_nan_mode) {
- partsN(default_nan)(a, s);
+ *a = partsN(default_nan)(s);
}
break;
default:
@@ -49,7 +49,7 @@ static FloatPartsN *partsN(pick_nan)(FloatPartsN *a,
FloatPartsN *b,
}
if (s->default_nan_mode) {
- partsN(default_nan)(a, s);
+ *a = partsN(default_nan)(s);
return a;
}
@@ -184,7 +184,7 @@ static FloatPartsN *partsN(pick_nan_muladd)(FloatPartsN *a,
FloatPartsN *b,
return ret;
default_nan:
- partsN(default_nan)(a, s);
+ *a = partsN(default_nan)(s);
return a;
}
@@ -281,7 +281,7 @@ static void partsN(uncanon_e4m3_overflow)(FloatPartsN *p,
float_status *s,
p->exp = fmt->exp_max;
p->frac_hi = E4M3_NORMAL_FRAC_MAX;
} else {
- partsN(default_nan)(p, s);
+ *p = partsN(default_nan)(s);
}
}
@@ -568,7 +568,7 @@ static FloatPartsN *partsN(addsub)(FloatPartsN *a,
FloatPartsN *b,
}
/* Inf - Inf */
float_raise(float_flag_invalid | float_flag_invalid_isi, s);
- partsN(default_nan)(a, s);
+ *a = partsN(default_nan)(s);
return a;
}
} else {
@@ -641,7 +641,7 @@ static FloatPartsN *partsN(mul)(FloatPartsN *a, FloatPartsN
*b,
/* Inf * Zero == NaN */
if (unlikely(ab_mask == float_cmask_infzero)) {
float_raise(float_flag_invalid | float_flag_invalid_imz, s);
- partsN(default_nan)(a, s);
+ *a = partsN(default_nan)(s);
return a;
}
@@ -796,7 +796,7 @@ static FloatPartsN *partsN(muladd_scalbn)(FloatPartsN *a,
FloatPartsN *b,
goto finish_sign;
d_nan:
- partsN(default_nan)(a, s);
+ *a = partsN(default_nan)(s);
return a;
}
@@ -864,7 +864,7 @@ static FloatPartsN *partsN(div)(FloatPartsN *a, FloatPartsN
*b,
return a;
d_nan:
- partsN(default_nan)(a, s);
+ *a = partsN(default_nan)(s);
return a;
}
@@ -896,7 +896,7 @@ static FloatPartsN *partsN(modrem)(FloatPartsN *a,
FloatPartsN *b,
/* Inf % N; N % 0 */
if (a->cls == float_class_inf || b->cls == float_class_zero) {
float_raise(float_flag_invalid, s);
- partsN(default_nan)(a, s);
+ *a = partsN(default_nan)(s);
return a;
}
@@ -1118,7 +1118,7 @@ static void partsN(sqrt)(FloatPartsN *a, float_status
*status,
d_nan:
float_raise(float_flag_invalid | float_flag_invalid_sqrt, status);
- partsN(default_nan)(a, status);
+ *a = partsN(default_nan)(status);
}
/*
diff --git a/fpu/softfloat-specialize.c.inc b/fpu/softfloat-specialize.c.inc
index 9ed968c79b..dd65432813 100644
--- a/fpu/softfloat-specialize.c.inc
+++ b/fpu/softfloat-specialize.c.inc
@@ -118,7 +118,7 @@ static bool parts_is_snan_frac(uint64_t frac, float_status
*status)
| The pattern for a default generated deconstructed floating-point NaN.
*----------------------------------------------------------------------------*/
-static void parts64_default_nan(FloatParts64 *p, float_status *status)
+static FloatParts64 parts64_default_nan(float_status *status)
{
bool sign = 0;
uint64_t frac;
@@ -134,7 +134,7 @@ static void parts64_default_nan(FloatParts64 *p,
float_status *status)
frac = deposit64(0, DECOMPOSED_BINARY_POINT - 7, 7, dnan_pattern);
frac = deposit64(frac, 0, DECOMPOSED_BINARY_POINT - 7, -(dnan_pattern &
1));
- *p = (FloatParts64) {
+ return (FloatParts64) {
.cls = float_class_qnan,
.sign = sign,
.exp = INT_MAX,
@@ -142,17 +142,16 @@ static void parts64_default_nan(FloatParts64 *p,
float_status *status)
};
}
-static void parts128_default_nan(FloatParts128 *p, float_status *status)
+static FloatParts128 parts128_default_nan(float_status *status)
{
/*
* Extrapolate from the choices made by parts64_default_nan to fill
* in the quad-floating format. If the low bit is set, assume we
* want to set all non-snan bits.
*/
- FloatParts64 p64;
- parts64_default_nan(&p64, status);
+ FloatParts64 p64 = parts64_default_nan(status);
- *p = (FloatParts128) {
+ return (FloatParts128) {
.cls = float_class_qnan,
.sign = p64.sign,
.exp = INT_MAX,
@@ -197,19 +196,18 @@ static void parts128_silence_nan(FloatParts128 *p,
float_status *status)
*----------------------------------------------------------------------------*/
floatx80 floatx80_default_nan(float_status *status)
{
- floatx80 r;
/*
* Extrapolate from the choices made by parts64_default_nan to fill
* in the floatx80 format. We assume that floatx80's explicit
* integer bit is always set (this is true for i386 and m68k,
* which are the only real users of this format).
*/
- FloatParts64 p64;
- parts64_default_nan(&p64, status);
+ FloatParts64 p64 = parts64_default_nan(status);
- r.high = 0x7FFF | (p64.sign << 15);
- r.low = (1ULL << DECOMPOSED_BINARY_POINT) | p64.frac;
- return r;
+ return (floatx80) {
+ .high = 0x7FFF | (p64.sign << 15),
+ .low = (1ULL << DECOMPOSED_BINARY_POINT) | p64.frac,
+ };
}
/*----------------------------------------------------------------------------
--
2.43.0