softfloat: fix floatx80 handling of NaN
The floatx80 format uses an explicit bit that should be taken into account when converting to and from commonNaN format. When converting to commonNaN, the explicit bit should be removed if it is a 1, and a default NaN should be used if it is 0. When converting from commonNan, the explicit bit should be added. Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
parent
da26fdc314
commit
e2f422047b
@ -603,9 +603,15 @@ static commonNaNT floatx80ToCommonNaN( floatx80 a STATUS_PARAM)
|
|||||||
commonNaNT z;
|
commonNaNT z;
|
||||||
|
|
||||||
if ( floatx80_is_signaling_nan( a ) ) float_raise( float_flag_invalid STATUS_VAR);
|
if ( floatx80_is_signaling_nan( a ) ) float_raise( float_flag_invalid STATUS_VAR);
|
||||||
z.sign = a.high>>15;
|
if ( a.low >> 63 ) {
|
||||||
z.low = 0;
|
z.sign = a.high >> 15;
|
||||||
z.high = a.low;
|
z.low = 0;
|
||||||
|
z.high = a.low << 1;
|
||||||
|
} else {
|
||||||
|
z.sign = floatx80_default_nan_high >> 15;
|
||||||
|
z.low = 0;
|
||||||
|
z.high = floatx80_default_nan_low << 1;
|
||||||
|
}
|
||||||
return z;
|
return z;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -624,11 +630,14 @@ static floatx80 commonNaNToFloatx80( commonNaNT a STATUS_PARAM)
|
|||||||
return z;
|
return z;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (a.high)
|
if (a.high >> 1) {
|
||||||
z.low = a.high;
|
z.low = LIT64( 0x8000000000000000 ) | a.high >> 1;
|
||||||
else
|
z.high = ( ( (uint16_t) a.sign )<<15 ) | 0x7FFF;
|
||||||
|
} else {
|
||||||
z.low = floatx80_default_nan_low;
|
z.low = floatx80_default_nan_low;
|
||||||
z.high = ( ( (uint16_t) a.sign )<<15 ) | 0x7FFF;
|
z.high = floatx80_default_nan_high;
|
||||||
|
}
|
||||||
|
|
||||||
return z;
|
return z;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user