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_ )
|
||||
{
|
||||
if (float32_is_signaling_nan(a_)) {
|
||||
uint32_t a = float32_val(a_);
|
||||
#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
|
||||
bits32 a = float32_val(a_);
|
||||
a |= (1 << 22);
|
||||
#endif
|
||||
return make_float32(a);
|
||||
#endif
|
||||
}
|
||||
return a_;
|
||||
}
|
||||
|
@ -322,13 +326,17 @@ int float64_is_signaling_nan( float64 a_ )
|
|||
float64 float64_maybe_silence_nan( float64 a_ )
|
||||
{
|
||||
if (float64_is_signaling_nan(a_)) {
|
||||
bits64 a = float64_val(a_);
|
||||
#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
|
||||
bits64 a = float64_val(a_);
|
||||
a |= LIT64( 0x0008000000000000 );
|
||||
#endif
|
||||
return make_float64(a);
|
||||
#endif
|
||||
}
|
||||
return a_;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue