mirror of https://gitee.com/openkylin/qemu.git
softfloat: fix float{32,64}_maybe_silence_nan() for MIPS
On targets that define sNaN with the sNaN bit as one, simply clearing this bit may correspond to an infinite value. Convert it to a default NaN if SNAN_BIT_IS_ONE, as it corresponds to the MIPS implementation, the only emulated CPU with SNAN_BIT_IS_ONE. When other CPU of this type are added, this might be updated to include more cases. Acked-by: Alexander Graf <agraf@suse.de> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
parent
d735d695e7
commit
93ae1c6fea
|
@ -107,13 +107,17 @@ int float32_is_signaling_nan( float32 a_ )
|
||||||
float32 float32_maybe_silence_nan( float32 a_ )
|
float32 float32_maybe_silence_nan( float32 a_ )
|
||||||
{
|
{
|
||||||
if (float32_is_signaling_nan(a_)) {
|
if (float32_is_signaling_nan(a_)) {
|
||||||
uint32_t a = float32_val(a_);
|
|
||||||
#if SNAN_BIT_IS_ONE
|
#if SNAN_BIT_IS_ONE
|
||||||
a &= ~(1 << 22);
|
# if defined(TARGET_MIPS)
|
||||||
|
return float32_default_nan;
|
||||||
|
# else
|
||||||
|
# error Rules for silencing a signaling NaN are target-specific
|
||||||
|
# endif
|
||||||
#else
|
#else
|
||||||
|
bits32 a = float32_val(a_);
|
||||||
a |= (1 << 22);
|
a |= (1 << 22);
|
||||||
#endif
|
|
||||||
return make_float32(a);
|
return make_float32(a);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
return a_;
|
return a_;
|
||||||
}
|
}
|
||||||
|
@ -322,13 +326,17 @@ int float64_is_signaling_nan( float64 a_ )
|
||||||
float64 float64_maybe_silence_nan( float64 a_ )
|
float64 float64_maybe_silence_nan( float64 a_ )
|
||||||
{
|
{
|
||||||
if (float64_is_signaling_nan(a_)) {
|
if (float64_is_signaling_nan(a_)) {
|
||||||
bits64 a = float64_val(a_);
|
|
||||||
#if SNAN_BIT_IS_ONE
|
#if SNAN_BIT_IS_ONE
|
||||||
a &= ~LIT64( 0x0008000000000000 );
|
# if defined(TARGET_MIPS)
|
||||||
|
return float64_default_nan;
|
||||||
|
# else
|
||||||
|
# error Rules for silencing a signaling NaN are target-specific
|
||||||
|
# endif
|
||||||
#else
|
#else
|
||||||
|
bits64 a = float64_val(a_);
|
||||||
a |= LIT64( 0x0008000000000000 );
|
a |= LIT64( 0x0008000000000000 );
|
||||||
#endif
|
|
||||||
return make_float64(a);
|
return make_float64(a);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
return a_;
|
return a_;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue