mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 15:23:53 -06:00
softfloat: add float*_unordered_{,quiet}() functions
Add float*_unordered() functions to softfloat, matching the softfloat-native ones. Also add float*_unordered_quiet() functions to match the others comparison functions. This allow target-i386/ops_sse.h to be compiled with softfloat. Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
parent
67dd64bfae
commit
67b7861d63
2 changed files with 175 additions and 0 deletions
167
fpu/softfloat.c
167
fpu/softfloat.c
|
@ -2393,6 +2393,25 @@ int float32_lt( float32 a, float32 b STATUS_PARAM )
|
|||
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Returns 1 if the single-precision floating-point values `a' and `b' cannot
|
||||
| be compared, and 0 otherwise. The comparison is performed according to the
|
||||
| IEC/IEEE Standard for Binary Floating-Point Arithmetic.
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
int float32_unordered( float32 a, float32 b STATUS_PARAM )
|
||||
{
|
||||
a = float32_squash_input_denormal(a STATUS_VAR);
|
||||
b = float32_squash_input_denormal(b STATUS_VAR);
|
||||
|
||||
if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) )
|
||||
|| ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) )
|
||||
) {
|
||||
float_raise( float_flag_invalid STATUS_VAR);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/*----------------------------------------------------------------------------
|
||||
| Returns 1 if the single-precision floating-point value `a' is equal to
|
||||
| the corresponding value `b', and 0 otherwise. The invalid exception is
|
||||
|
@ -2480,6 +2499,29 @@ int float32_lt_quiet( float32 a, float32 b STATUS_PARAM )
|
|||
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Returns 1 if the single-precision floating-point values `a' and `b' cannot
|
||||
| be compared, and 0 otherwise. Quiet NaNs do not cause an exception. The
|
||||
| comparison is performed according to the IEC/IEEE Standard for Binary
|
||||
| Floating-Point Arithmetic.
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
int float32_unordered_quiet( float32 a, float32 b STATUS_PARAM )
|
||||
{
|
||||
a = float32_squash_input_denormal(a STATUS_VAR);
|
||||
b = float32_squash_input_denormal(b STATUS_VAR);
|
||||
|
||||
if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) )
|
||||
|| ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) )
|
||||
) {
|
||||
if ( float32_is_signaling_nan( a ) || float32_is_signaling_nan( b ) ) {
|
||||
float_raise( float_flag_invalid STATUS_VAR);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Returns the result of converting the double-precision floating-point value
|
||||
| `a' to the 32-bit two's complement integer format. The conversion is
|
||||
|
@ -3617,6 +3659,26 @@ int float64_lt( float64 a, float64 b STATUS_PARAM )
|
|||
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Returns 1 if the double-precision floating-point values `a' and `b' cannot
|
||||
| be compared, and 0 otherwise. The comparison is performed according to the
|
||||
| IEC/IEEE Standard for Binary Floating-Point Arithmetic.
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
int float64_unordered( float64 a, float64 b STATUS_PARAM )
|
||||
{
|
||||
a = float64_squash_input_denormal(a STATUS_VAR);
|
||||
b = float64_squash_input_denormal(b STATUS_VAR);
|
||||
|
||||
if ( ( ( extractFloat64Exp( a ) == 0x7FF ) && extractFloat64Frac( a ) )
|
||||
|| ( ( extractFloat64Exp( b ) == 0x7FF ) && extractFloat64Frac( b ) )
|
||||
) {
|
||||
float_raise( float_flag_invalid STATUS_VAR);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Returns 1 if the double-precision floating-point value `a' is equal to the
|
||||
| corresponding value `b', and 0 otherwise. The invalid exception is raised
|
||||
|
@ -3704,6 +3766,29 @@ int float64_lt_quiet( float64 a, float64 b STATUS_PARAM )
|
|||
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Returns 1 if the double-precision floating-point values `a' and `b' cannot
|
||||
| be compared, and 0 otherwise. Quiet NaNs do not cause an exception. The
|
||||
| comparison is performed according to the IEC/IEEE Standard for Binary
|
||||
| Floating-Point Arithmetic.
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
int float64_unordered_quiet( float64 a, float64 b STATUS_PARAM )
|
||||
{
|
||||
a = float64_squash_input_denormal(a STATUS_VAR);
|
||||
b = float64_squash_input_denormal(b STATUS_VAR);
|
||||
|
||||
if ( ( ( extractFloat64Exp( a ) == 0x7FF ) && extractFloat64Frac( a ) )
|
||||
|| ( ( extractFloat64Exp( b ) == 0x7FF ) && extractFloat64Frac( b ) )
|
||||
) {
|
||||
if ( float64_is_signaling_nan( a ) || float64_is_signaling_nan( b ) ) {
|
||||
float_raise( float_flag_invalid STATUS_VAR);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef FLOATX80
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
|
@ -4596,6 +4681,24 @@ int floatx80_lt( floatx80 a, floatx80 b STATUS_PARAM )
|
|||
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Returns 1 if the extended double-precision floating-point values `a' and `b'
|
||||
| cannot be compared, and 0 otherwise. The comparison is performed according
|
||||
| to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
|
||||
*----------------------------------------------------------------------------*/
|
||||
int floatx80_unordered( floatx80 a, floatx80 b STATUS_PARAM )
|
||||
{
|
||||
if ( ( ( extractFloatx80Exp( a ) == 0x7FFF )
|
||||
&& (uint64_t) ( extractFloatx80Frac( a )<<1 ) )
|
||||
|| ( ( extractFloatx80Exp( b ) == 0x7FFF )
|
||||
&& (uint64_t) ( extractFloatx80Frac( b )<<1 ) )
|
||||
) {
|
||||
float_raise( float_flag_invalid STATUS_VAR);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Returns 1 if the extended double-precision floating-point value `a' is equal
|
||||
| to the corresponding value `b', and 0 otherwise. The invalid exception is
|
||||
|
@ -4695,6 +4798,28 @@ int floatx80_lt_quiet( floatx80 a, floatx80 b STATUS_PARAM )
|
|||
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Returns 1 if the extended double-precision floating-point values `a' and `b'
|
||||
| cannot be compared, and 0 otherwise. Quiet NaNs do not cause an exception.
|
||||
| The comparison is performed according to the IEC/IEEE Standard for Binary
|
||||
| Floating-Point Arithmetic.
|
||||
*----------------------------------------------------------------------------*/
|
||||
int floatx80_unordered_quiet( floatx80 a, floatx80 b STATUS_PARAM )
|
||||
{
|
||||
if ( ( ( extractFloatx80Exp( a ) == 0x7FFF )
|
||||
&& (uint64_t) ( extractFloatx80Frac( a )<<1 ) )
|
||||
|| ( ( extractFloatx80Exp( b ) == 0x7FFF )
|
||||
&& (uint64_t) ( extractFloatx80Frac( b )<<1 ) )
|
||||
) {
|
||||
if ( floatx80_is_signaling_nan( a )
|
||||
|| floatx80_is_signaling_nan( b ) ) {
|
||||
float_raise( float_flag_invalid STATUS_VAR);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef FLOAT128
|
||||
|
@ -5717,6 +5842,25 @@ int float128_lt( float128 a, float128 b STATUS_PARAM )
|
|||
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Returns 1 if the quadruple-precision floating-point values `a' and `b' cannot
|
||||
| be compared, and 0 otherwise. The comparison is performed according to the
|
||||
| IEC/IEEE Standard for Binary Floating-Point Arithmetic.
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
int float128_unordered( float128 a, float128 b STATUS_PARAM )
|
||||
{
|
||||
if ( ( ( extractFloat128Exp( a ) == 0x7FFF )
|
||||
&& ( extractFloat128Frac0( a ) | extractFloat128Frac1( a ) ) )
|
||||
|| ( ( extractFloat128Exp( b ) == 0x7FFF )
|
||||
&& ( extractFloat128Frac0( b ) | extractFloat128Frac1( b ) ) )
|
||||
) {
|
||||
float_raise( float_flag_invalid STATUS_VAR);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Returns 1 if the quadruple-precision floating-point value `a' is equal to
|
||||
| the corresponding value `b', and 0 otherwise. The invalid exception is
|
||||
|
@ -5816,6 +5960,29 @@ int float128_lt_quiet( float128 a, float128 b STATUS_PARAM )
|
|||
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
| Returns 1 if the quadruple-precision floating-point values `a' and `b' cannot
|
||||
| be compared, and 0 otherwise. Quiet NaNs do not cause an exception. The
|
||||
| comparison is performed according to the IEC/IEEE Standard for Binary
|
||||
| Floating-Point Arithmetic.
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
int float128_unordered_quiet( float128 a, float128 b STATUS_PARAM )
|
||||
{
|
||||
if ( ( ( extractFloat128Exp( a ) == 0x7FFF )
|
||||
&& ( extractFloat128Frac0( a ) | extractFloat128Frac1( a ) ) )
|
||||
|| ( ( extractFloat128Exp( b ) == 0x7FFF )
|
||||
&& ( extractFloat128Frac0( b ) | extractFloat128Frac1( b ) ) )
|
||||
) {
|
||||
if ( float128_is_signaling_nan( a )
|
||||
|| float128_is_signaling_nan( b ) ) {
|
||||
float_raise( float_flag_invalid STATUS_VAR);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* misc functions */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue