Reviewed-by: Philippe Mathieu-Daudé <[email protected]>
Signed-off-by: Richard Henderson <[email protected]>
---
include/fpu/softfloat.h | 10 ++++++----
fpu/softfloat.c | 2 +-
fpu/softfloat-parts.c.inc | 4 ++--
fpu/softfloat-specialize.c.inc | 2 +-
4 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h
index 4ae4ddc799..e08d1c374d 100644
--- a/include/fpu/softfloat.h
+++ b/include/fpu/softfloat.h
@@ -1018,7 +1018,7 @@ static inline bool floatx80_is_infinity(floatx80 a,
float_status *status)
bool intbit = a.low >> 63;
if (!intbit &&
- !(status->floatx80_behaviour & floatx80_pseudo_inf_valid)) {
+ !(get_floatx80_behaviour(status) & floatx80_pseudo_inf_valid)) {
return false;
}
return (a.high & 0x7fff) == 0x7fff && !(a.low << 1);
@@ -1112,6 +1112,8 @@ static inline bool floatx80_unordered_quiet(floatx80 a,
floatx80 b,
*----------------------------------------------------------------------------*/
static inline bool floatx80_invalid_encoding(floatx80 a, float_status *s)
{
+ FloatX80Behaviour rule = get_floatx80_behaviour(s);
+
if ((a.low >> 63) || (a.high & 0x7fff) == 0) {
/* Anything with the Integer bit set or the exponent 0 is valid */
return false;
@@ -1119,12 +1121,12 @@ static inline bool floatx80_invalid_encoding(floatx80
a, float_status *s)
if ((a.high & 0x7fff) == 0x7fff) {
if (a.low) {
- return !(s->floatx80_behaviour & floatx80_pseudo_nan_valid);
+ return !(rule & floatx80_pseudo_nan_valid);
} else {
- return !(s->floatx80_behaviour & floatx80_pseudo_inf_valid);
+ return !(rule & floatx80_pseudo_inf_valid);
}
} else {
- return !(s->floatx80_behaviour & floatx80_unnormal_valid);
+ return !(rule & floatx80_unnormal_valid);
}
}
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
index d2a9f97089..f774ff278c 100644
--- a/fpu/softfloat.c
+++ b/fpu/softfloat.c
@@ -1578,7 +1578,7 @@ floatx80 floatx80_round_pack_canonical(FloatParts128 *p,
float_status *s)
case float_class_inf:
/* x86 and m68k differ in the setting of the integer bit. */
- frac = s->floatx80_behaviour & floatx80_default_inf_int_bit_is_zero ?
+ frac = get_floatx80_behaviour(s) &
floatx80_default_inf_int_bit_is_zero ?
0 : (1ULL << 63);
exp = fmt->exp_max;
break;
diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc
index 7311c3696e..fd3e79fd3e 100644
--- a/fpu/softfloat-parts.c.inc
+++ b/fpu/softfloat-parts.c.inc
@@ -213,7 +213,7 @@ static void partsN(canonicalize)(FloatPartsN *p,
float_status *status,
* how we uncanonicalize results.
*/
bool has_pseudo_denormals = fmt->has_explicit_bit &&
- (status->floatx80_behaviour & floatx80_pseudo_denormal_valid);
+ (get_floatx80_behaviour(status) & floatx80_pseudo_denormal_valid);
if (unlikely(p->exp == 0)) {
if (likely(fracN(eqz)(p))) {
@@ -420,7 +420,7 @@ static void partsN(uncanon_normal)(FloatPartsN *p,
float_status *s,
} else {
bool is_tiny = s->tininess_before_rounding || exp < 0;
bool has_pseudo_denormals = fmt->has_explicit_bit &&
- (s->floatx80_behaviour & floatx80_pseudo_denormal_valid);
+ (get_floatx80_behaviour(s) & floatx80_pseudo_denormal_valid);
if (!is_tiny) {
FloatPartsN discard;
diff --git a/fpu/softfloat-specialize.c.inc b/fpu/softfloat-specialize.c.inc
index 0b527302a5..4b6c17e433 100644
--- a/fpu/softfloat-specialize.c.inc
+++ b/fpu/softfloat-specialize.c.inc
@@ -221,7 +221,7 @@ floatx80 floatx80_default_inf(bool zSign, float_status
*status)
* Whether the Integer bit is set in the default Infinity is
* target dependent.
*/
- bool z = status->floatx80_behaviour & floatx80_default_inf_int_bit_is_zero;
+ bool z = get_floatx80_behaviour(status) &
floatx80_default_inf_int_bit_is_zero;
return packFloatx80(zSign, 0x7fff, z ? 0 : (1ULL << 63));
}
--
2.43.0