softfloat: Move propagateFloatx80NaN to softfloat.c
This function is part of the public interface and is not "specialized" to any target in any way. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 20241203203949.483774-7-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
8704c753e8
commit
313938c105
@ -551,58 +551,6 @@ floatx80 floatx80_silence_nan(floatx80 a, float_status *status)
|
||||
return a;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Takes two extended double-precision floating-point values `a' and `b', one
|
||||
| of which is a NaN, and returns the appropriate NaN result. If either `a' or
|
||||
| `b' is a signaling NaN, the invalid exception is raised.
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
floatx80 propagateFloatx80NaN(floatx80 a, floatx80 b, float_status *status)
|
||||
{
|
||||
bool aIsLargerSignificand;
|
||||
FloatClass a_cls, b_cls;
|
||||
|
||||
/* This is not complete, but is good enough for pickNaN. */
|
||||
a_cls = (!floatx80_is_any_nan(a)
|
||||
? float_class_normal
|
||||
: floatx80_is_signaling_nan(a, status)
|
||||
? float_class_snan
|
||||
: float_class_qnan);
|
||||
b_cls = (!floatx80_is_any_nan(b)
|
||||
? float_class_normal
|
||||
: floatx80_is_signaling_nan(b, status)
|
||||
? float_class_snan
|
||||
: float_class_qnan);
|
||||
|
||||
if (is_snan(a_cls) || is_snan(b_cls)) {
|
||||
float_raise(float_flag_invalid, status);
|
||||
}
|
||||
|
||||
if (status->default_nan_mode) {
|
||||
return floatx80_default_nan(status);
|
||||
}
|
||||
|
||||
if (a.low < b.low) {
|
||||
aIsLargerSignificand = 0;
|
||||
} else if (b.low < a.low) {
|
||||
aIsLargerSignificand = 1;
|
||||
} else {
|
||||
aIsLargerSignificand = (a.high < b.high) ? 1 : 0;
|
||||
}
|
||||
|
||||
if (pickNaN(a_cls, b_cls, aIsLargerSignificand, status)) {
|
||||
if (is_snan(b_cls)) {
|
||||
return floatx80_silence_nan(b, status);
|
||||
}
|
||||
return b;
|
||||
} else {
|
||||
if (is_snan(a_cls)) {
|
||||
return floatx80_silence_nan(a, status);
|
||||
}
|
||||
return a;
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Returns 1 if the quadruple-precision floating-point value `a' is a quiet
|
||||
| NaN; otherwise returns 0.
|
||||
|
@ -4920,6 +4920,58 @@ void normalizeFloatx80Subnormal(uint64_t aSig, int32_t *zExpPtr,
|
||||
*zExpPtr = 1 - shiftCount;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Takes two extended double-precision floating-point values `a' and `b', one
|
||||
| of which is a NaN, and returns the appropriate NaN result. If either `a' or
|
||||
| `b' is a signaling NaN, the invalid exception is raised.
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
floatx80 propagateFloatx80NaN(floatx80 a, floatx80 b, float_status *status)
|
||||
{
|
||||
bool aIsLargerSignificand;
|
||||
FloatClass a_cls, b_cls;
|
||||
|
||||
/* This is not complete, but is good enough for pickNaN. */
|
||||
a_cls = (!floatx80_is_any_nan(a)
|
||||
? float_class_normal
|
||||
: floatx80_is_signaling_nan(a, status)
|
||||
? float_class_snan
|
||||
: float_class_qnan);
|
||||
b_cls = (!floatx80_is_any_nan(b)
|
||||
? float_class_normal
|
||||
: floatx80_is_signaling_nan(b, status)
|
||||
? float_class_snan
|
||||
: float_class_qnan);
|
||||
|
||||
if (is_snan(a_cls) || is_snan(b_cls)) {
|
||||
float_raise(float_flag_invalid, status);
|
||||
}
|
||||
|
||||
if (status->default_nan_mode) {
|
||||
return floatx80_default_nan(status);
|
||||
}
|
||||
|
||||
if (a.low < b.low) {
|
||||
aIsLargerSignificand = 0;
|
||||
} else if (b.low < a.low) {
|
||||
aIsLargerSignificand = 1;
|
||||
} else {
|
||||
aIsLargerSignificand = (a.high < b.high) ? 1 : 0;
|
||||
}
|
||||
|
||||
if (pickNaN(a_cls, b_cls, aIsLargerSignificand, status)) {
|
||||
if (is_snan(b_cls)) {
|
||||
return floatx80_silence_nan(b, status);
|
||||
}
|
||||
return b;
|
||||
} else {
|
||||
if (is_snan(a_cls)) {
|
||||
return floatx80_silence_nan(a, status);
|
||||
}
|
||||
return a;
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Takes an abstract floating-point value having sign `zSign', exponent `zExp',
|
||||
| and extended significand formed by the concatenation of `zSig0' and `zSig1',
|
||||
|
Loading…
x
Reference in New Issue
Block a user