mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-02-01 23:21:08 +00:00
softfloat: silence sNaN for conversions to/from floatx80
Conversions between IEEE floating-point formats should convert signaling NaNs to quiet NaNs. Most of those in QEMU's softfloat code do so, but those for floatx80 fail to. Fix those conversions to silence signaling NaNs as well. Backports commit 7537c2b4a363237534c96d089a02b0712b49d890 from qemu
This commit is contained in:
parent
7b2fb5bc63
commit
2ea23a5bbd
|
@ -4460,7 +4460,9 @@ floatx80 float32_to_floatx80(float32 a, float_status *status)
|
|||
aSign = extractFloat32Sign( a );
|
||||
if ( aExp == 0xFF ) {
|
||||
if (aSig) {
|
||||
return commonNaNToFloatx80(float32ToCommonNaN(a, status), status);
|
||||
floatx80 res = commonNaNToFloatx80(float32ToCommonNaN(a, status),
|
||||
status);
|
||||
return floatx80_silence_nan(res, status);
|
||||
}
|
||||
return packFloatx80(aSign,
|
||||
floatx80_infinity_high,
|
||||
|
@ -4978,7 +4980,9 @@ floatx80 float64_to_floatx80(float64 a, float_status *status)
|
|||
aSign = extractFloat64Sign( a );
|
||||
if ( aExp == 0x7FF ) {
|
||||
if (aSig) {
|
||||
return commonNaNToFloatx80(float64ToCommonNaN(a, status), status);
|
||||
floatx80 res = commonNaNToFloatx80(float64ToCommonNaN(a, status),
|
||||
status);
|
||||
return floatx80_silence_nan(res, status);
|
||||
}
|
||||
return packFloatx80(aSign,
|
||||
floatx80_infinity_high,
|
||||
|
@ -5580,7 +5584,9 @@ float32 floatx80_to_float32(floatx80 a, float_status *status)
|
|||
aSign = extractFloatx80Sign( a );
|
||||
if ( aExp == 0x7FFF ) {
|
||||
if ( (uint64_t) ( aSig<<1 ) ) {
|
||||
return commonNaNToFloat32(floatx80ToCommonNaN(a, status), status);
|
||||
float32 res = commonNaNToFloat32(floatx80ToCommonNaN(a, status),
|
||||
status);
|
||||
return float32_silence_nan(res, status);
|
||||
}
|
||||
return packFloat32( aSign, 0xFF, 0 );
|
||||
}
|
||||
|
@ -5612,7 +5618,9 @@ float64 floatx80_to_float64(floatx80 a, float_status *status)
|
|||
aSign = extractFloatx80Sign( a );
|
||||
if ( aExp == 0x7FFF ) {
|
||||
if ( (uint64_t) ( aSig<<1 ) ) {
|
||||
return commonNaNToFloat64(floatx80ToCommonNaN(a, status), status);
|
||||
float64 res = commonNaNToFloat64(floatx80ToCommonNaN(a, status),
|
||||
status);
|
||||
return float64_silence_nan(res, status);
|
||||
}
|
||||
return packFloat64( aSign, 0x7FF, 0 );
|
||||
}
|
||||
|
@ -5643,7 +5651,9 @@ float128 floatx80_to_float128(floatx80 a, float_status *status)
|
|||
aExp = extractFloatx80Exp( a );
|
||||
aSign = extractFloatx80Sign( a );
|
||||
if ( ( aExp == 0x7FFF ) && (uint64_t) ( aSig<<1 ) ) {
|
||||
return commonNaNToFloat128(floatx80ToCommonNaN(a, status), status);
|
||||
float128 res = commonNaNToFloat128(floatx80ToCommonNaN(a, status),
|
||||
status);
|
||||
return float128_silence_nan(res, status);
|
||||
}
|
||||
shift128Right( aSig<<1, 0, 16, &zSig0, &zSig1 );
|
||||
return packFloat128( aSign, aExp, zSig0, zSig1 );
|
||||
|
@ -6921,7 +6931,9 @@ floatx80 float128_to_floatx80(float128 a, float_status *status)
|
|||
aSign = extractFloat128Sign( a );
|
||||
if ( aExp == 0x7FFF ) {
|
||||
if ( aSig0 | aSig1 ) {
|
||||
return commonNaNToFloatx80(float128ToCommonNaN(a, status), status);
|
||||
floatx80 res = commonNaNToFloatx80(float128ToCommonNaN(a, status),
|
||||
status);
|
||||
return floatx80_silence_nan(res, status);
|
||||
}
|
||||
return packFloatx80(aSign, floatx80_infinity_high,
|
||||
floatx80_infinity_low);
|
||||
|
|
Loading…
Reference in a new issue