===================================================================
@@ -51,7 +51,7 @@ these four paragraphs for those parts of
/*----------------------------------------------------------------------------
| The pattern for a default generated half-precision NaN.
*----------------------------------------------------------------------------*/
-inline float16 float16_default_nan(void)
+inline float16 float16_default_nan(STATUS_PARAM_ONLY)
{
#if defined(TARGET_ARM)
return const_float16(0x7E00);
@@ -65,7 +65,7 @@ inline float16 float16_default_nan(void)
/*----------------------------------------------------------------------------
| The pattern for a default generated single-precision NaN.
*----------------------------------------------------------------------------*/
-inline float32 float32_default_nan(void)
+inline float32 float32_default_nan(STATUS_PARAM_ONLY)
{
#if defined(TARGET_SPARC)
return const_float32(0x7FFFFFFF);
@@ -82,7 +82,7 @@ inline float32 float32_default_nan(void)
/*----------------------------------------------------------------------------
| The pattern for a default generated double-precision NaN.
*----------------------------------------------------------------------------*/
-inline float64 float64_default_nan(void)
+inline float64 float64_default_nan(STATUS_PARAM_ONLY)
{
#if defined(TARGET_SPARC)
return const_float64(LIT64(0x7FFFFFFFFFFFFFFF));
@@ -98,7 +98,7 @@ inline float64 float64_default_nan(void)
/*----------------------------------------------------------------------------
| The pattern for a default generated extended double-precision NaN.
*----------------------------------------------------------------------------*/
-inline floatx80 floatx80_default_nan(void)
+inline floatx80 floatx80_default_nan(STATUS_PARAM_ONLY)
{
#if SNAN_BIT_IS_ONE
return make_floatx80(0x7FFF, LIT64(0xBFFFFFFFFFFFFFFF));
@@ -111,7 +111,7 @@ inline floatx80 floatx80_default_nan(voi
| The pattern for a default generated quadruple-precision NaN. The `high' and
| `low' values hold the most- and least-significant bits, respectively.
*----------------------------------------------------------------------------*/
-inline float128 float128_default_nan(void)
+inline float128 float128_default_nan(STATUS_PARAM_ONLY)
{
#if SNAN_BIT_IS_ONE
return make_float128(LIT64(0x7FFF7FFFFFFFFFFF), LIT64(0xFFFFFFFFFFFFFFFF));
@@ -141,12 +141,12 @@ typedef struct {
} commonNaNT;
#ifdef NO_SIGNALING_NANS
-int float16_is_quiet_nan(float16 a_)
+int float16_is_quiet_nan(float16 a_ STATUS_PARAM)
{
return float16_is_any_nan(a_);
}
-int float16_is_signaling_nan(float16 a_)
+int float16_is_signaling_nan(float16 a_ STATUS_PARAM)
{
return 0;
}
@@ -156,7 +156,7 @@ int float16_is_signaling_nan(float16 a_)
| NaN; otherwise returns 0.
*----------------------------------------------------------------------------*/
-int float16_is_quiet_nan(float16 a_)
+int float16_is_quiet_nan(float16 a_ STATUS_PARAM)
{
uint16_t a = float16_val(a_);
#if SNAN_BIT_IS_ONE
@@ -171,7 +171,7 @@ int float16_is_quiet_nan(float16 a_)
| NaN; otherwise returns 0.
*----------------------------------------------------------------------------*/
-int float16_is_signaling_nan(float16 a_)
+int float16_is_signaling_nan(float16 a_ STATUS_PARAM)
{
uint16_t a = float16_val(a_);
#if SNAN_BIT_IS_ONE
@@ -186,12 +186,12 @@ int float16_is_signaling_nan(float16 a_)
| Returns a quiet NaN if the half-precision floating point value `a' is a
| signaling NaN; otherwise returns `a'.
*----------------------------------------------------------------------------*/
-float16 float16_maybe_silence_nan(float16 a_)
+float16 float16_maybe_silence_nan(float16 a_ STATUS_PARAM)
{
- if (float16_is_signaling_nan(a_)) {
+ if (float16_is_signaling_nan(a_ STATUS_VAR)) {
#if SNAN_BIT_IS_ONE
# if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
- return float16_default_nan();
+ return float16_default_nan(status);
# else
# error Rules for silencing a signaling NaN are target-specific
# endif
@@ -210,14 +210,16 @@ float16 float16_maybe_silence_nan(float1
| exception is raised.
*----------------------------------------------------------------------------*/
-static commonNaNT float16ToCommonNaN( float16 a STATUS_PARAM )
+static commonNaNT float16ToCommonNaN(float16 a STATUS_PARAM)
{
commonNaNT z;
- if ( float16_is_signaling_nan( a ) ) float_raise( float_flag_invalid STATUS_VAR );
+ if (float16_is_signaling_nan(a STATUS_VAR)) {
+ float_raise(float_flag_invalid STATUS_VAR);
+ }
z.sign = float16_val(a) >> 15;
z.low = 0;
- z.high = ((uint64_t) float16_val(a))<<54;
+ z.high = ((uint64_t) float16_val(a)) << 54;
return z;
}
@@ -231,24 +233,24 @@ static float16 commonNaNToFloat16(common
uint16_t mantissa = a.high>>54;
if (STATUS(default_nan_mode)) {
- return float16_default_nan();
+ return float16_default_nan(status);
}
if (mantissa) {
return make_float16(((((uint16_t) a.sign) << 15)
| (0x1F << 10) | mantissa));
} else {
- return float16_default_nan();
+ return float16_default_nan(status);
}
}
#ifdef NO_SIGNALING_NANS
-int float32_is_quiet_nan(float32 a_)
+int float32_is_quiet_nan(float32 a_ STATUS_PARAM)
{
return float32_is_any_nan(a_);
}
-int float32_is_signaling_nan(float32 a_)
+int float32_is_signaling_nan(float32 a_ STATUS_PARAM)
{
return 0;
}
@@ -258,7 +260,7 @@ int float32_is_signaling_nan(float32 a_)
| NaN; otherwise returns 0.
*----------------------------------------------------------------------------*/
-int float32_is_quiet_nan( float32 a_ )
+int float32_is_quiet_nan(float32 a_ STATUS_PARAM)
{
uint32_t a = float32_val(a_);
#if SNAN_BIT_IS_ONE
@@ -273,7 +275,7 @@ int float32_is_quiet_nan( float32 a_ )
| NaN; otherwise returns 0.
*----------------------------------------------------------------------------*/
-int float32_is_signaling_nan( float32 a_ )
+int float32_is_signaling_nan(float32 a_ STATUS_PARAM)
{
uint32_t a = float32_val(a_);
#if SNAN_BIT_IS_ONE
@@ -289,12 +291,12 @@ int float32_is_signaling_nan( float32 a_
| signaling NaN; otherwise returns `a'.
*----------------------------------------------------------------------------*/
-float32 float32_maybe_silence_nan( float32 a_ )
+float32 float32_maybe_silence_nan(float32 a_ STATUS_PARAM)
{
- if (float32_is_signaling_nan(a_)) {
+ if (float32_is_signaling_nan(a_ STATUS_VAR)) {
#if SNAN_BIT_IS_ONE
# if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
- return float32_default_nan();
+ return float32_default_nan(status);
# else
# error Rules for silencing a signaling NaN are target-specific
# endif
@@ -313,14 +315,16 @@ float32 float32_maybe_silence_nan( float
| exception is raised.
*----------------------------------------------------------------------------*/
-static commonNaNT float32ToCommonNaN( float32 a STATUS_PARAM )
+static commonNaNT float32ToCommonNaN(float32 a STATUS_PARAM)
{
commonNaNT z;
- if ( float32_is_signaling_nan( a ) ) float_raise( float_flag_invalid STATUS_VAR );
- z.sign = float32_val(a)>>31;
+ if (float32_is_signaling_nan(a STATUS_VAR)) {
+ float_raise(float_flag_invalid STATUS_VAR);
+ }
+ z.sign = float32_val(a) >> 31;
z.low = 0;
- z.high = ( (uint64_t) float32_val(a) )<<41;
+ z.high = ((uint64_t) float32_val(a)) << 41;
return z;
}
@@ -334,14 +338,14 @@ static float32 commonNaNToFloat32( commo
uint32_t mantissa = a.high>>41;
if ( STATUS(default_nan_mode) ) {
- return float32_default_nan();
+ return float32_default_nan(status);
}
if ( mantissa )
return make_float32(
( ( (uint32_t) a.sign )<<31 ) | 0x7F800000 | ( a.high>>41 ) );
else
- return float32_default_nan();
+ return float32_default_nan(status);
}
/*----------------------------------------------------------------------------
@@ -571,17 +575,17 @@ static float32 propagateFloat32NaN( floa
flag aIsLargerSignificand;
uint32_t av, bv;
- aIsQuietNaN = float32_is_quiet_nan( a );
- aIsSignalingNaN = float32_is_signaling_nan( a );
- bIsQuietNaN = float32_is_quiet_nan( b );
- bIsSignalingNaN = float32_is_signaling_nan( b );
+ aIsQuietNaN = float32_is_quiet_nan(a STATUS_VAR);
+ aIsSignalingNaN = float32_is_signaling_nan(a STATUS_VAR);
+ bIsQuietNaN = float32_is_quiet_nan(b STATUS_VAR);
+ bIsSignalingNaN = float32_is_signaling_nan(b STATUS_VAR);
av = float32_val(a);
bv = float32_val(b);
if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_invalid STATUS_VAR);
if ( STATUS(default_nan_mode) )
- return float32_default_nan();
+ return float32_default_nan(status);
if ((uint32_t)(av<<1) < (uint32_t)(bv<<1)) {
aIsLargerSignificand = 0;
@@ -593,9 +597,9 @@ static float32 propagateFloat32NaN( floa
if (pickNaN(aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN,
aIsLargerSignificand)) {
- return float32_maybe_silence_nan(b);
+ return float32_maybe_silence_nan(b STATUS_VAR);
} else {
- return float32_maybe_silence_nan(a);
+ return float32_maybe_silence_nan(a STATUS_VAR);
}
}
@@ -615,12 +619,12 @@ static float32 propagateFloat32MulAddNaN
cIsQuietNaN, cIsSignalingNaN;
int which;
- aIsQuietNaN = float32_is_quiet_nan(a);
- aIsSignalingNaN = float32_is_signaling_nan(a);
- bIsQuietNaN = float32_is_quiet_nan(b);
- bIsSignalingNaN = float32_is_signaling_nan(b);
- cIsQuietNaN = float32_is_quiet_nan(c);
- cIsSignalingNaN = float32_is_signaling_nan(c);
+ aIsQuietNaN = float32_is_quiet_nan(a STATUS_VAR);
+ aIsSignalingNaN = float32_is_signaling_nan(a STATUS_VAR);
+ bIsQuietNaN = float32_is_quiet_nan(b STATUS_VAR);
+ bIsSignalingNaN = float32_is_signaling_nan(b STATUS_VAR);
+ cIsQuietNaN = float32_is_quiet_nan(c STATUS_VAR);
+ cIsSignalingNaN = float32_is_signaling_nan(c STATUS_VAR);
if (aIsSignalingNaN | bIsSignalingNaN | cIsSignalingNaN) {
float_raise(float_flag_invalid STATUS_VAR);
@@ -634,29 +638,29 @@ static float32 propagateFloat32MulAddNaN
/* Note that this check is after pickNaNMulAdd so that function
* has an opportunity to set the Invalid flag.
*/
- return float32_default_nan();
+ return float32_default_nan(status);
}
switch (which) {
case 0:
- return float32_maybe_silence_nan(a);
+ return float32_maybe_silence_nan(a STATUS_VAR);
case 1:
- return float32_maybe_silence_nan(b);
+ return float32_maybe_silence_nan(b STATUS_VAR);
case 2:
- return float32_maybe_silence_nan(c);
+ return float32_maybe_silence_nan(c STATUS_VAR);
case 3:
default:
- return float32_default_nan();
+ return float32_default_nan(status);
}
}
#ifdef NO_SIGNALING_NANS
-int float64_is_quiet_nan(float64 a_)
+int float64_is_quiet_nan(float64 a_ STATUS_PARAM)
{
return float64_is_any_nan(a_);
}
-int float64_is_signaling_nan(float64 a_)
+int float64_is_signaling_nan(float64 a_ STATUS_PARAM)
{
return 0;
}
@@ -666,7 +670,7 @@ int float64_is_signaling_nan(float64 a_)
| NaN; otherwise returns 0.
*----------------------------------------------------------------------------*/
-int float64_is_quiet_nan( float64 a_ )
+int float64_is_quiet_nan(float64 a_ STATUS_PARAM)
{
uint64_t a = float64_val(a_);
#if SNAN_BIT_IS_ONE
@@ -683,7 +687,7 @@ int float64_is_quiet_nan( float64 a_ )
| NaN; otherwise returns 0.
*----------------------------------------------------------------------------*/
-int float64_is_signaling_nan( float64 a_ )
+int float64_is_signaling_nan(float64 a_ STATUS_PARAM)
{
uint64_t a = float64_val(a_);
#if SNAN_BIT_IS_ONE
@@ -701,12 +705,12 @@ int float64_is_signaling_nan( float64 a_
| signaling NaN; otherwise returns `a'.
*----------------------------------------------------------------------------*/
-float64 float64_maybe_silence_nan( float64 a_ )
+float64 float64_maybe_silence_nan(float64 a_ STATUS_PARAM)
{
- if (float64_is_signaling_nan(a_)) {
+ if (float64_is_signaling_nan(a_ STATUS_VAR)) {
#if SNAN_BIT_IS_ONE
# if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
- return float64_default_nan();
+ return float64_default_nan(status);
# else
# error Rules for silencing a signaling NaN are target-specific
# endif
@@ -725,14 +729,16 @@ float64 float64_maybe_silence_nan( float
| exception is raised.
*----------------------------------------------------------------------------*/
-static commonNaNT float64ToCommonNaN( float64 a STATUS_PARAM)
+static commonNaNT float64ToCommonNaN(float64 a STATUS_PARAM)
{
commonNaNT z;
- if ( float64_is_signaling_nan( a ) ) float_raise( float_flag_invalid STATUS_VAR);
- z.sign = float64_val(a)>>63;
+ if (float64_is_signaling_nan(a STATUS_VAR)) {
+ float_raise(float_flag_invalid STATUS_VAR);
+ }
+ z.sign = float64_val(a) >> 63;
z.low = 0;
- z.high = float64_val(a)<<12;
+ z.high = float64_val(a) << 12;
return z;
}
@@ -746,7 +752,7 @@ static float64 commonNaNToFloat64( commo
uint64_t mantissa = a.high>>12;
if ( STATUS(default_nan_mode) ) {
- return float64_default_nan();
+ return float64_default_nan(status);
}
if ( mantissa )
@@ -755,7 +761,7 @@ static float64 commonNaNToFloat64( commo
| LIT64( 0x7FF0000000000000 )
| ( a.high>>12 ));
else
- return float64_default_nan();
+ return float64_default_nan(status);
}
/*----------------------------------------------------------------------------
@@ -770,17 +776,17 @@ static float64 propagateFloat64NaN( floa
flag aIsLargerSignificand;
uint64_t av, bv;
- aIsQuietNaN = float64_is_quiet_nan( a );
- aIsSignalingNaN = float64_is_signaling_nan( a );
- bIsQuietNaN = float64_is_quiet_nan( b );
- bIsSignalingNaN = float64_is_signaling_nan( b );
+ aIsQuietNaN = float64_is_quiet_nan(a STATUS_VAR);
+ aIsSignalingNaN = float64_is_signaling_nan(a STATUS_VAR);
+ bIsQuietNaN = float64_is_quiet_nan(b STATUS_VAR);
+ bIsSignalingNaN = float64_is_signaling_nan(b STATUS_VAR);
av = float64_val(a);
bv = float64_val(b);
if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_invalid STATUS_VAR);
if ( STATUS(default_nan_mode) )
- return float64_default_nan();
+ return float64_default_nan(status);
if ((uint64_t)(av<<1) < (uint64_t)(bv<<1)) {
aIsLargerSignificand = 0;
@@ -792,9 +798,9 @@ static float64 propagateFloat64NaN( floa
if (pickNaN(aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN,
aIsLargerSignificand)) {
- return float64_maybe_silence_nan(b);
+ return float64_maybe_silence_nan(b STATUS_VAR);
} else {
- return float64_maybe_silence_nan(a);
+ return float64_maybe_silence_nan(a STATUS_VAR);
}
}
@@ -814,12 +820,12 @@ static float64 propagateFloat64MulAddNaN
cIsQuietNaN, cIsSignalingNaN;
int which;
- aIsQuietNaN = float64_is_quiet_nan(a);
- aIsSignalingNaN = float64_is_signaling_nan(a);
- bIsQuietNaN = float64_is_quiet_nan(b);
- bIsSignalingNaN = float64_is_signaling_nan(b);
- cIsQuietNaN = float64_is_quiet_nan(c);
- cIsSignalingNaN = float64_is_signaling_nan(c);
+ aIsQuietNaN = float64_is_quiet_nan(a STATUS_VAR);
+ aIsSignalingNaN = float64_is_signaling_nan(a STATUS_VAR);
+ bIsQuietNaN = float64_is_quiet_nan(b STATUS_VAR);
+ bIsSignalingNaN = float64_is_signaling_nan(b STATUS_VAR);
+ cIsQuietNaN = float64_is_quiet_nan(c STATUS_VAR);
+ cIsSignalingNaN = float64_is_signaling_nan(c STATUS_VAR);
if (aIsSignalingNaN | bIsSignalingNaN | cIsSignalingNaN) {
float_raise(float_flag_invalid STATUS_VAR);
@@ -833,29 +839,29 @@ static float64 propagateFloat64MulAddNaN
/* Note that this check is after pickNaNMulAdd so that function
* has an opportunity to set the Invalid flag.
*/
- return float64_default_nan();
+ return float64_default_nan(status);
}
switch (which) {
case 0:
- return float64_maybe_silence_nan(a);
+ return float64_maybe_silence_nan(a STATUS_VAR);
case 1:
- return float64_maybe_silence_nan(b);
+ return float64_maybe_silence_nan(b STATUS_VAR);
case 2:
- return float64_maybe_silence_nan(c);
+ return float64_maybe_silence_nan(c STATUS_VAR);
case 3:
default:
- return float64_default_nan();
+ return float64_default_nan(status);
}
}
#ifdef NO_SIGNALING_NANS
-int floatx80_is_quiet_nan(floatx80 a_)
+int floatx80_is_quiet_nan(floatx80 a_ STATUS_PARAM)
{
return floatx80_is_any_nan(a_);
}
-int floatx80_is_signaling_nan(floatx80 a_)
+int floatx80_is_signaling_nan(floatx80 a_ STATUS_PARAM)
{
return 0;
}
@@ -866,7 +872,7 @@ int floatx80_is_signaling_nan(floatx80 a
| function for other types as floatx80 has an explicit bit.
*----------------------------------------------------------------------------*/
-int floatx80_is_quiet_nan( floatx80 a )
+int floatx80_is_quiet_nan(floatx80 a STATUS_PARAM)
{
#if SNAN_BIT_IS_ONE
uint64_t aLow;
@@ -888,7 +894,7 @@ int floatx80_is_quiet_nan( floatx80 a )
| function for other types as floatx80 has an explicit bit.
*----------------------------------------------------------------------------*/
-int floatx80_is_signaling_nan( floatx80 a )
+int floatx80_is_signaling_nan(floatx80 a STATUS_PARAM)
{
#if SNAN_BIT_IS_ONE
return ( ( a.high & 0x7FFF ) == 0x7FFF )
@@ -910,12 +916,12 @@ int floatx80_is_signaling_nan( floatx80
| `a' is a signaling NaN; otherwise returns `a'.
*----------------------------------------------------------------------------*/
-floatx80 floatx80_maybe_silence_nan( floatx80 a )
+floatx80 floatx80_maybe_silence_nan(floatx80 a STATUS_PARAM)
{
- if (floatx80_is_signaling_nan(a)) {
+ if (floatx80_is_signaling_nan(a STATUS_VAR)) {
#if SNAN_BIT_IS_ONE
# if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
- a = floatx80_default_nan();
+ a = floatx80_default_nan(status);
# else
# error Rules for silencing a signaling NaN are target-specific
# endif
@@ -933,14 +939,16 @@ floatx80 floatx80_maybe_silence_nan( flo
| invalid exception is raised.
*----------------------------------------------------------------------------*/
-static commonNaNT floatx80ToCommonNaN( floatx80 a STATUS_PARAM)
+static commonNaNT floatx80ToCommonNaN(floatx80 a STATUS_PARAM)
{
commonNaNT z;
- if ( floatx80_is_signaling_nan( a ) ) float_raise( float_flag_invalid STATUS_VAR);
+ if (floatx80_is_signaling_nan(a STATUS_VAR)) {
+ float_raise(float_flag_invalid STATUS_VAR);
+ }
/* Replace a Pseudo NaN with a default NaN. */
if (!(a.low >> 63)) {
- a = floatx80_default_nan();
+ a = floatx80_default_nan(status);
}
z.sign = a.high >> 15;
z.low = 0;
@@ -958,14 +966,14 @@ static floatx80 commonNaNToFloatx80( com
floatx80 z;
if ( STATUS(default_nan_mode) ) {
- return floatx80_default_nan();
+ return floatx80_default_nan(status);
}
if (a.high >> 1) {
z.low = LIT64( 0x8000000000000000 ) | a.high >> 1;
z.high = ( ( (uint16_t) a.sign )<<15 ) | 0x7FFF;
} else {
- z = floatx80_default_nan();
+ z = floatx80_default_nan(status);
}
return z;
@@ -982,15 +990,15 @@ static floatx80 propagateFloatx80NaN( fl
flag aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN;
flag aIsLargerSignificand;
- aIsQuietNaN = floatx80_is_quiet_nan( a );
- aIsSignalingNaN = floatx80_is_signaling_nan( a );
- bIsQuietNaN = floatx80_is_quiet_nan( b );
- bIsSignalingNaN = floatx80_is_signaling_nan( b );
+ aIsQuietNaN = floatx80_is_quiet_nan(a STATUS_VAR);
+ aIsSignalingNaN = floatx80_is_signaling_nan(a STATUS_VAR);
+ bIsQuietNaN = floatx80_is_quiet_nan(b STATUS_VAR);
+ bIsSignalingNaN = floatx80_is_signaling_nan(b STATUS_VAR);
if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_invalid STATUS_VAR);
if ( STATUS(default_nan_mode) ) {
- return floatx80_default_nan();
+ return floatx80_default_nan(status);
}
if (a.low < b.low) {
@@ -1003,19 +1011,19 @@ static floatx80 propagateFloatx80NaN( fl
if (pickNaN(aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN,
aIsLargerSignificand)) {
- return floatx80_maybe_silence_nan(b);
+ return floatx80_maybe_silence_nan(b STATUS_VAR);
} else {
- return floatx80_maybe_silence_nan(a);
+ return floatx80_maybe_silence_nan(a STATUS_VAR);
}
}
#ifdef NO_SIGNALING_NANS
-int float128_is_quiet_nan(float128 a_)
+int float128_is_quiet_nan(float128 a_ STATUS_PARAM)
{
return float128_is_any_nan(a_);
}
-int float128_is_signaling_nan(float128 a_)
+int float128_is_signaling_nan(float128 a_ STATUS_PARAM)
{
return 0;
}
@@ -1025,7 +1033,7 @@ int float128_is_signaling_nan(float128 a
| NaN; otherwise returns 0.
*----------------------------------------------------------------------------*/
-int float128_is_quiet_nan( float128 a )
+int float128_is_quiet_nan(float128 a STATUS_PARAM)
{
#if SNAN_BIT_IS_ONE
return
@@ -1043,7 +1051,7 @@ int float128_is_quiet_nan( float128 a )
| signaling NaN; otherwise returns 0.
*----------------------------------------------------------------------------*/
-int float128_is_signaling_nan( float128 a )
+int float128_is_signaling_nan(float128 a STATUS_PARAM)
{
#if SNAN_BIT_IS_ONE
return
@@ -1062,12 +1070,12 @@ int float128_is_signaling_nan( float128
| a signaling NaN; otherwise returns `a'.
*----------------------------------------------------------------------------*/
-float128 float128_maybe_silence_nan( float128 a )
+float128 float128_maybe_silence_nan(float128 a STATUS_PARAM)
{
- if (float128_is_signaling_nan(a)) {
+ if (float128_is_signaling_nan(a STATUS_VAR)) {
#if SNAN_BIT_IS_ONE
# if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
- a = float128_default_nan();
+ a = float128_default_nan(status);
# else
# error Rules for silencing a signaling NaN are target-specific
# endif
@@ -1085,13 +1093,15 @@ float128 float128_maybe_silence_nan( flo
| exception is raised.
*----------------------------------------------------------------------------*/
-static commonNaNT float128ToCommonNaN( float128 a STATUS_PARAM)
+static commonNaNT float128ToCommonNaN(float128 a STATUS_PARAM)
{
commonNaNT z;
- if ( float128_is_signaling_nan( a ) ) float_raise( float_flag_invalid STATUS_VAR);
- z.sign = a.high>>63;
- shortShift128Left( a.high, a.low, 16, &z.high, &z.low );
+ if (float128_is_signaling_nan(a STATUS_VAR)) {
+ float_raise(float_flag_invalid STATUS_VAR);
+ }
+ z.sign = a.high >> 63;
+ shortShift128Left(a.high, a.low, 16, &z.high, &z.low);
return z;
}
@@ -1105,7 +1115,7 @@ static float128 commonNaNToFloat128( com
float128 z;
if ( STATUS(default_nan_mode) ) {
- return float128_default_nan();
+ return float128_default_nan(status);
}
shift128Right( a.high, a.low, 16, &z.high, &z.low );
@@ -1124,15 +1134,15 @@ static float128 propagateFloat128NaN( fl
flag aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN;
flag aIsLargerSignificand;
- aIsQuietNaN = float128_is_quiet_nan( a );
- aIsSignalingNaN = float128_is_signaling_nan( a );
- bIsQuietNaN = float128_is_quiet_nan( b );
- bIsSignalingNaN = float128_is_signaling_nan( b );
+ aIsQuietNaN = float128_is_quiet_nan(a STATUS_VAR);
+ aIsSignalingNaN = float128_is_signaling_nan(a STATUS_VAR);
+ bIsQuietNaN = float128_is_quiet_nan(b STATUS_VAR);
+ bIsSignalingNaN = float128_is_signaling_nan(b STATUS_VAR);
if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_invalid STATUS_VAR);
if ( STATUS(default_nan_mode) ) {
- return float128_default_nan();
+ return float128_default_nan(status);
}
if (lt128(a.high<<1, a.low, b.high<<1, b.low)) {
@@ -1145,9 +1155,9 @@ static float128 propagateFloat128NaN( fl
if (pickNaN(aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN,
aIsLargerSignificand)) {
- return float128_maybe_silence_nan(b);
+ return float128_maybe_silence_nan(b STATUS_VAR);
} else {
- return float128_maybe_silence_nan(a);
+ return float128_maybe_silence_nan(a STATUS_VAR);
}
}
===================================================================
@@ -1714,7 +1714,8 @@ float64 float32_to_float64( float32 a ST
if (aSig) {
return float64_maybe_silence_nan(
commonNaNToFloat64(float32ToCommonNaN(a STATUS_VAR)
- STATUS_VAR));
+ STATUS_VAR)
+ STATUS_VAR);
}
return packFloat64( aSign, 0x7FF, 0 );
}
@@ -1748,7 +1749,8 @@ floatx80 float32_to_floatx80( float32 a
if (aSig) {
return floatx80_maybe_silence_nan(
commonNaNToFloatx80(float32ToCommonNaN(a STATUS_VAR)
- STATUS_VAR));
+ STATUS_VAR)
+ STATUS_VAR);
}
return packFloatx80( aSign, 0x7FFF, LIT64( 0x8000000000000000 ) );
}
@@ -1782,7 +1784,8 @@ float128 float32_to_float128( float32 a
if (aSig) {
return float128_maybe_silence_nan(
commonNaNToFloat128(float32ToCommonNaN(a STATUS_VAR)
- STATUS_VAR));
+ STATUS_VAR)
+ STATUS_VAR);
}
return packFloat128( aSign, 0x7FFF, 0, 0 );
}
@@ -1979,7 +1982,7 @@ static float32 subFloat32Sigs( float32 a
if ( aExp == 0xFF ) {
if ( aSig | bSig ) return propagateFloat32NaN( a, b STATUS_VAR );
float_raise( float_flag_invalid STATUS_VAR);
- return float32_default_nan();
+ return float32_default_nan(status);
}
if ( aExp == 0 ) {
aExp = 1;
@@ -2104,7 +2107,7 @@ float32 float32_mul( float32 a, float32
}
if ( ( bExp | bSig ) == 0 ) {
float_raise( float_flag_invalid STATUS_VAR);
- return float32_default_nan();
+ return float32_default_nan(status);
}
return packFloat32( zSign, 0xFF, 0 );
}
@@ -2112,7 +2115,7 @@ float32 float32_mul( float32 a, float32
if ( bSig ) return propagateFloat32NaN( a, b STATUS_VAR );
if ( ( aExp | aSig ) == 0 ) {
float_raise( float_flag_invalid STATUS_VAR);
- return float32_default_nan();
+ return float32_default_nan(status);
}
return packFloat32( zSign, 0xFF, 0 );
}
@@ -2163,7 +2166,7 @@ float32 float32_div( float32 a, float32
if ( bExp == 0xFF ) {
if ( bSig ) return propagateFloat32NaN( a, b STATUS_VAR );
float_raise( float_flag_invalid STATUS_VAR);
- return float32_default_nan();
+ return float32_default_nan(status);
}
return packFloat32( zSign, 0xFF, 0 );
}
@@ -2175,7 +2178,7 @@ float32 float32_div( float32 a, float32
if ( bSig == 0 ) {
if ( ( aExp | aSig ) == 0 ) {
float_raise( float_flag_invalid STATUS_VAR);
- return float32_default_nan();
+ return float32_default_nan(status);
}
float_raise( float_flag_divbyzero STATUS_VAR);
return packFloat32( zSign, 0xFF, 0 );
@@ -2229,7 +2232,7 @@ float32 float32_rem( float32 a, float32
return propagateFloat32NaN( a, b STATUS_VAR );
}
float_raise( float_flag_invalid STATUS_VAR);
- return float32_default_nan();
+ return float32_default_nan(status);
}
if ( bExp == 0xFF ) {
if ( bSig ) return propagateFloat32NaN( a, b STATUS_VAR );
@@ -2238,7 +2241,7 @@ float32 float32_rem( float32 a, float32
if ( bExp == 0 ) {
if ( bSig == 0 ) {
float_raise( float_flag_invalid STATUS_VAR);
- return float32_default_nan();
+ return float32_default_nan(status);
}
normalizeFloat32Subnormal( bSig, &bExp, &bSig );
}
@@ -2353,7 +2356,7 @@ float32 float32_muladd(float32 a, float3
if (infzero) {
float_raise(float_flag_invalid STATUS_VAR);
- return float32_default_nan();
+ return float32_default_nan(status);
}
if (flags & float_muladd_negate_c) {
@@ -2374,7 +2377,7 @@ float32 float32_muladd(float32 a, float3
if (pInf && (pSign ^ cSign)) {
/* addition of opposite-signed infinities => InvalidOperation */
float_raise(float_flag_invalid STATUS_VAR);
- return float32_default_nan();
+ return float32_default_nan(status);
}
/* Otherwise generate an infinity of the same sign */
return packFloat32(cSign ^ signflip, 0xff, 0);
@@ -2548,12 +2551,12 @@ float32 float32_sqrt( float32 a STATUS_P
if ( aSig ) return propagateFloat32NaN( a, float32_zero STATUS_VAR );
if ( ! aSign ) return a;
float_raise( float_flag_invalid STATUS_VAR);
- return float32_default_nan();
+ return float32_default_nan(status);
}
if ( aSign ) {
if ( ( aExp | aSig ) == 0 ) return a;
float_raise( float_flag_invalid STATUS_VAR);
- return float32_default_nan();
+ return float32_default_nan(status);
}
if ( aExp == 0 ) {
if ( aSig == 0 ) return float32_zero;
@@ -2684,7 +2687,7 @@ float32 float32_log2( float32 a STATUS_P
}
if ( aSign ) {
float_raise( float_flag_invalid STATUS_VAR);
- return float32_default_nan();
+ return float32_default_nan(status);
}
if ( aExp == 0xFF ) {
if ( aSig ) return propagateFloat32NaN( a, float32_zero STATUS_VAR );
@@ -2828,8 +2831,9 @@ int float32_eq_quiet( float32 a, float32
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);
+ if (float32_is_signaling_nan(a STATUS_VAR) ||
+ float32_is_signaling_nan(b STATUS_VAR)) {
+ float_raise(float_flag_invalid STATUS_VAR);
}
return 0;
}
@@ -2854,8 +2858,9 @@ int float32_le_quiet( float32 a, float32
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);
+ if (float32_is_signaling_nan(a STATUS_VAR) ||
+ float32_is_signaling_nan(b STATUS_VAR)) {
+ float_raise(float_flag_invalid STATUS_VAR);
}
return 0;
}
@@ -2885,8 +2890,9 @@ int float32_lt_quiet( float32 a, float32
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);
+ if (float32_is_signaling_nan(a STATUS_VAR) ||
+ float32_is_signaling_nan(b STATUS_VAR)) {
+ float_raise(float_flag_invalid STATUS_VAR);
}
return 0;
}
@@ -2914,8 +2920,9 @@ int float32_unordered_quiet( float32 a,
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);
+ if (float32_is_signaling_nan(a STATUS_VAR) ||
+ float32_is_signaling_nan(b STATUS_VAR)) {
+ float_raise(float_flag_invalid STATUS_VAR);
}
return 1;
}
@@ -3166,7 +3173,8 @@ float32 float64_to_float32( float64 a ST
if (aSig) {
return float32_maybe_silence_nan(
commonNaNToFloat32(float64ToCommonNaN(a STATUS_VAR)
- STATUS_VAR));
+ STATUS_VAR)
+ STATUS_VAR);
}
return packFloat32( aSign, 0xFF, 0 );
}
@@ -3336,7 +3344,8 @@ float32 float16_to_float32(float16 a, fl
if (aSig) {
return float32_maybe_silence_nan(
commonNaNToFloat32(float16ToCommonNaN(a STATUS_VAR)
- STATUS_VAR));
+ STATUS_VAR)
+ STATUS_VAR);
}
return packFloat32(aSign, 0xff, 0);
}
@@ -3371,7 +3380,8 @@ float16 float32_to_float16(float32 a, fl
}
return float16_maybe_silence_nan(
commonNaNToFloat16(float32ToCommonNaN(a STATUS_VAR)
- STATUS_VAR));
+ STATUS_VAR)
+ STATUS_VAR);
}
/* Infinity */
if (!ieee) {
@@ -3410,7 +3420,8 @@ float64 float16_to_float64(float16 a, fl
if (aSig) {
return float64_maybe_silence_nan(
commonNaNToFloat64(float16ToCommonNaN(a STATUS_VAR)
- STATUS_VAR));
+ STATUS_VAR)
+ STATUS_VAR);
}
return packFloat64(aSign, 0x7ff, 0);
}
@@ -3446,7 +3457,8 @@ float16 float64_to_float16(float64 a, fl
}
return float16_maybe_silence_nan(
commonNaNToFloat16(float64ToCommonNaN(a STATUS_VAR)
- STATUS_VAR));
+ STATUS_VAR)
+ STATUS_VAR);
}
/* Infinity */
if (!ieee) {
@@ -3494,7 +3506,8 @@ floatx80 float64_to_floatx80( float64 a
if (aSig) {
return floatx80_maybe_silence_nan(
commonNaNToFloatx80(float64ToCommonNaN(a STATUS_VAR)
- STATUS_VAR));
+ STATUS_VAR)
+ STATUS_VAR);
}
return packFloatx80( aSign, 0x7FFF, LIT64( 0x8000000000000000 ) );
}
@@ -3529,7 +3542,8 @@ float128 float64_to_float128( float64 a
if (aSig) {
return float128_maybe_silence_nan(
commonNaNToFloat128(float64ToCommonNaN(a STATUS_VAR)
- STATUS_VAR));
+ STATUS_VAR)
+ STATUS_VAR);
}
return packFloat128( aSign, 0x7FFF, 0, 0 );
}
@@ -3740,7 +3754,7 @@ static float64 subFloat64Sigs( float64 a
if ( aExp == 0x7FF ) {
if ( aSig | bSig ) return propagateFloat64NaN( a, b STATUS_VAR );
float_raise( float_flag_invalid STATUS_VAR);
- return float64_default_nan();
+ return float64_default_nan(status);
}
if ( aExp == 0 ) {
aExp = 1;
@@ -3863,7 +3877,7 @@ float64 float64_mul( float64 a, float64
}
if ( ( bExp | bSig ) == 0 ) {
float_raise( float_flag_invalid STATUS_VAR);
- return float64_default_nan();
+ return float64_default_nan(status);
}
return packFloat64( zSign, 0x7FF, 0 );
}
@@ -3871,7 +3885,7 @@ float64 float64_mul( float64 a, float64
if ( bSig ) return propagateFloat64NaN( a, b STATUS_VAR );
if ( ( aExp | aSig ) == 0 ) {
float_raise( float_flag_invalid STATUS_VAR);
- return float64_default_nan();
+ return float64_default_nan(status);
}
return packFloat64( zSign, 0x7FF, 0 );
}
@@ -3924,7 +3938,7 @@ float64 float64_div( float64 a, float64
if ( bExp == 0x7FF ) {
if ( bSig ) return propagateFloat64NaN( a, b STATUS_VAR );
float_raise( float_flag_invalid STATUS_VAR);
- return float64_default_nan();
+ return float64_default_nan(status);
}
return packFloat64( zSign, 0x7FF, 0 );
}
@@ -3936,7 +3950,7 @@ float64 float64_div( float64 a, float64
if ( bSig == 0 ) {
if ( ( aExp | aSig ) == 0 ) {
float_raise( float_flag_invalid STATUS_VAR);
- return float64_default_nan();
+ return float64_default_nan(status);
}
float_raise( float_flag_divbyzero STATUS_VAR);
return packFloat64( zSign, 0x7FF, 0 );
@@ -3994,7 +4008,7 @@ float64 float64_rem( float64 a, float64
return propagateFloat64NaN( a, b STATUS_VAR );
}
float_raise( float_flag_invalid STATUS_VAR);
- return float64_default_nan();
+ return float64_default_nan(status);
}
if ( bExp == 0x7FF ) {
if ( bSig ) return propagateFloat64NaN( a, b STATUS_VAR );
@@ -4003,7 +4017,7 @@ float64 float64_rem( float64 a, float64
if ( bExp == 0 ) {
if ( bSig == 0 ) {
float_raise( float_flag_invalid STATUS_VAR);
- return float64_default_nan();
+ return float64_default_nan(status);
}
normalizeFloat64Subnormal( bSig, &bExp, &bSig );
}
@@ -4104,7 +4118,7 @@ float64 float64_muladd(float64 a, float6
if (infzero) {
float_raise(float_flag_invalid STATUS_VAR);
- return float64_default_nan();
+ return float64_default_nan(status);
}
if (flags & float_muladd_negate_c) {
@@ -4125,7 +4139,7 @@ float64 float64_muladd(float64 a, float6
if (pInf && (pSign ^ cSign)) {
/* addition of opposite-signed infinities => InvalidOperation */
float_raise(float_flag_invalid STATUS_VAR);
- return float64_default_nan();
+ return float64_default_nan(status);
}
/* Otherwise generate an infinity of the same sign */
return packFloat64(cSign ^ signflip, 0x7ff, 0);
@@ -4321,12 +4335,12 @@ float64 float64_sqrt( float64 a STATUS_P
if ( aSig ) return propagateFloat64NaN( a, a STATUS_VAR );
if ( ! aSign ) return a;
float_raise( float_flag_invalid STATUS_VAR);
- return float64_default_nan();
+ return float64_default_nan(status);
}
if ( aSign ) {
if ( ( aExp | aSig ) == 0 ) return a;
float_raise( float_flag_invalid STATUS_VAR);
- return float64_default_nan();
+ return float64_default_nan(status);
}
if ( aExp == 0 ) {
if ( aSig == 0 ) return float64_zero;
@@ -4374,7 +4388,7 @@ float64 float64_log2( float64 a STATUS_P
}
if ( aSign ) {
float_raise( float_flag_invalid STATUS_VAR);
- return float64_default_nan();
+ return float64_default_nan(status);
}
if ( aExp == 0x7FF ) {
if ( aSig ) return propagateFloat64NaN( a, float64_zero STATUS_VAR );
@@ -4519,8 +4533,9 @@ int float64_eq_quiet( float64 a, float64
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);
+ if (float64_is_signaling_nan(a STATUS_VAR) ||
+ float64_is_signaling_nan(b STATUS_VAR)) {
+ float_raise(float_flag_invalid STATUS_VAR);
}
return 0;
}
@@ -4547,8 +4562,9 @@ int float64_le_quiet( float64 a, float64
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);
+ if (float64_is_signaling_nan(a STATUS_VAR) ||
+ float64_is_signaling_nan(b STATUS_VAR)) {
+ float_raise(float_flag_invalid STATUS_VAR);
}
return 0;
}
@@ -4578,8 +4594,9 @@ int float64_lt_quiet( float64 a, float64
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);
+ if (float64_is_signaling_nan(a STATUS_VAR) ||
+ float64_is_signaling_nan(b STATUS_VAR)) {
+ float_raise(float_flag_invalid STATUS_VAR);
}
return 0;
}
@@ -4607,8 +4624,9 @@ int float64_unordered_quiet( float64 a,
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);
+ if (float64_is_signaling_nan(a STATUS_VAR) ||
+ float64_is_signaling_nan(b STATUS_VAR)) {
+ float_raise(float_flag_invalid STATUS_VAR);
}
return 1;
}
@@ -4791,7 +4809,8 @@ float32 floatx80_to_float32( floatx80 a
if ((uint64_t)(aSig << 1)) {
return float32_maybe_silence_nan(
commonNaNToFloat32(floatx80ToCommonNaN(a STATUS_VAR)
- STATUS_VAR));
+ STATUS_VAR)
+ STATUS_VAR);
}
return packFloat32( aSign, 0xFF, 0 );
}
@@ -4821,7 +4840,8 @@ float64 floatx80_to_float64( floatx80 a
if ((uint64_t)(aSig << 1)) {
return float64_maybe_silence_nan(
commonNaNToFloat64(floatx80ToCommonNaN(a STATUS_VAR)
- STATUS_VAR));
+ STATUS_VAR)
+ STATUS_VAR);
}
return packFloat64( aSign, 0x7FF, 0 );
}
@@ -4849,7 +4869,8 @@ float128 floatx80_to_float128( floatx80
aSign = extractFloatx80Sign( a );
if (aExp == 0x7FFF && (uint64_t)(aSig << 1)) {
return float128_maybe_silence_nan(
- commonNaNToFloat128(floatx80ToCommonNaN(a STATUS_VAR) STATUS_VAR));
+ commonNaNToFloat128(floatx80ToCommonNaN(a STATUS_VAR) STATUS_VAR)
+ STATUS_VAR);
}
shift128Right( aSig<<1, 0, 16, &zSig0, &zSig1 );
return packFloat128( aSign, aExp, zSig0, zSig1 );
@@ -5040,7 +5061,7 @@ static floatx80 subFloatx80Sigs( floatx8
return propagateFloatx80NaN( a, b STATUS_VAR );
}
float_raise( float_flag_invalid STATUS_VAR);
- return floatx80_default_nan();
+ return floatx80_default_nan(status);
}
if ( aExp == 0 ) {
aExp = 1;
@@ -5153,7 +5174,7 @@ floatx80 floatx80_mul( floatx80 a, float
if ( ( aExp | aSig ) == 0 ) {
invalid:
float_raise( float_flag_invalid STATUS_VAR);
- return floatx80_default_nan();
+ return floatx80_default_nan(status);
}
return packFloatx80( zSign, 0x7FFF, LIT64( 0x8000000000000000 ) );
}
@@ -5214,7 +5235,7 @@ floatx80 floatx80_div( floatx80 a, float
if ( ( aExp | aSig ) == 0 ) {
invalid:
float_raise( float_flag_invalid STATUS_VAR);
- return floatx80_default_nan();
+ return floatx80_default_nan(status);
}
float_raise( float_flag_divbyzero STATUS_VAR);
return packFloatx80( zSign, 0x7FFF, LIT64( 0x8000000000000000 ) );
@@ -5287,7 +5308,7 @@ floatx80 floatx80_rem( floatx80 a, float
if ( bSig == 0 ) {
invalid:
float_raise( float_flag_invalid STATUS_VAR);
- return floatx80_default_nan();
+ return floatx80_default_nan(status);
}
normalizeFloatx80Subnormal( bSig, &bExp, &bSig );
}
@@ -5372,7 +5393,7 @@ floatx80 floatx80_sqrt( floatx80 a STATU
if ( ( aExp | aSig0 ) == 0 ) return a;
invalid:
float_raise( float_flag_invalid STATUS_VAR);
- return floatx80_default_nan();
+ return floatx80_default_nan(status);
}
if ( aExp == 0 ) {
if ( aSig0 == 0 ) return packFloatx80( 0, 0, 0 );
@@ -5542,9 +5563,9 @@ int floatx80_eq_quiet( floatx80 a, float
|| ( ( 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);
+ if (floatx80_is_signaling_nan(a STATUS_VAR) ||
+ floatx80_is_signaling_nan(b STATUS_VAR)) {
+ float_raise(float_flag_invalid STATUS_VAR);
}
return 0;
}
@@ -5573,9 +5594,9 @@ int floatx80_le_quiet( floatx80 a, float
|| ( ( 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);
+ if (floatx80_is_signaling_nan(a STATUS_VAR) ||
+ floatx80_is_signaling_nan(b STATUS_VAR)) {
+ float_raise(float_flag_invalid STATUS_VAR);
}
return 0;
}
@@ -5609,9 +5630,9 @@ int floatx80_lt_quiet( floatx80 a, float
|| ( ( 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);
+ if (floatx80_is_signaling_nan(a STATUS_VAR) ||
+ floatx80_is_signaling_nan(b STATUS_VAR)) {
+ float_raise(float_flag_invalid STATUS_VAR);
}
return 0;
}
@@ -5642,9 +5663,9 @@ int floatx80_unordered_quiet( floatx80 a
|| ( ( 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);
+ if (floatx80_is_signaling_nan(a STATUS_VAR) ||
+ floatx80_is_signaling_nan(b STATUS_VAR)) {
+ float_raise(float_flag_invalid STATUS_VAR);
}
return 1;
}
@@ -5854,7 +5875,8 @@ float32 float128_to_float32( float128 a
if (aSig0 | aSig1) {
return float32_maybe_silence_nan(
commonNaNToFloat32(float128ToCommonNaN(a STATUS_VAR)
- STATUS_VAR));
+ STATUS_VAR)
+ STATUS_VAR);
}
return packFloat32( aSign, 0xFF, 0 );
}
@@ -5890,7 +5912,8 @@ float64 float128_to_float64( float128 a
if (aSig0 | aSig1) {
return float64_maybe_silence_nan(
commonNaNToFloat64(float128ToCommonNaN(a STATUS_VAR)
- STATUS_VAR));
+ STATUS_VAR)
+ STATUS_VAR);
}
return packFloat64( aSign, 0x7FF, 0 );
}
@@ -5925,7 +5948,8 @@ floatx80 float128_to_floatx80( float128
if (aSig0 | aSig1) {
return floatx80_maybe_silence_nan(
commonNaNToFloatx80(float128ToCommonNaN(a STATUS_VAR)
- STATUS_VAR));
+ STATUS_VAR)
+ STATUS_VAR);
}
return packFloatx80( aSign, 0x7FFF, LIT64( 0x8000000000000000 ) );
}
@@ -6195,7 +6219,7 @@ static float128 subFloat128Sigs( float12
return propagateFloat128NaN( a, b STATUS_VAR );
}
float_raise( float_flag_invalid STATUS_VAR);
- return float128_default_nan();
+ return float128_default_nan(status);
}
if ( aExp == 0 ) {
aExp = 1;
@@ -6322,7 +6346,7 @@ float128 float128_mul( float128 a, float
if ( ( aExp | aSig0 | aSig1 ) == 0 ) {
invalid:
float_raise( float_flag_invalid STATUS_VAR);
- return float128_default_nan();
+ return float128_default_nan(status);
}
return packFloat128( zSign, 0x7FFF, 0, 0 );
}
@@ -6388,7 +6412,7 @@ float128 float128_div( float128 a, float
if ( ( aExp | aSig0 | aSig1 ) == 0 ) {
invalid:
float_raise( float_flag_invalid STATUS_VAR);
- return float128_default_nan();
+ return float128_default_nan(status);
}
float_raise( float_flag_divbyzero STATUS_VAR);
return packFloat128( zSign, 0x7FFF, 0, 0 );
@@ -6466,7 +6490,7 @@ float128 float128_rem( float128 a, float
if ( ( bSig0 | bSig1 ) == 0 ) {
invalid:
float_raise( float_flag_invalid STATUS_VAR);
- return float128_default_nan();
+ return float128_default_nan(status);
}
normalizeFloat128Subnormal( bSig0, bSig1, &bExp, &bSig0, &bSig1 );
}
@@ -6562,7 +6586,7 @@ float128 float128_sqrt( float128 a STATU
if ( ( aExp | aSig0 | aSig1 ) == 0 ) return a;
invalid:
float_raise( float_flag_invalid STATUS_VAR);
- return float128_default_nan();
+ return float128_default_nan(status);
}
if ( aExp == 0 ) {
if ( ( aSig0 | aSig1 ) == 0 ) return packFloat128( 0, 0, 0, 0 );
@@ -6730,9 +6754,9 @@ int float128_eq_quiet( float128 a, float
|| ( ( 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);
+ if (float128_is_signaling_nan(a STATUS_VAR) ||
+ float128_is_signaling_nan(b STATUS_VAR)) {
+ float_raise(float_flag_invalid STATUS_VAR);
}
return 0;
}
@@ -6761,9 +6785,9 @@ int float128_le_quiet( float128 a, float
|| ( ( 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);
+ if (float128_is_signaling_nan(a STATUS_VAR) ||
+ float128_is_signaling_nan(b STATUS_VAR)) {
+ float_raise(float_flag_invalid STATUS_VAR);
}
return 0;
}
@@ -6797,9 +6821,9 @@ int float128_lt_quiet( float128 a, float
|| ( ( 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);
+ if (float128_is_signaling_nan(a STATUS_VAR) ||
+ float128_is_signaling_nan(b STATUS_VAR)) {
+ float_raise(float_flag_invalid STATUS_VAR);
}
return 0;
}
@@ -6831,9 +6855,9 @@ int float128_unordered_quiet( float128 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);
+ if (float128_is_signaling_nan(a STATUS_VAR) ||
+ float128_is_signaling_nan(b STATUS_VAR)) {
+ float_raise(float_flag_invalid STATUS_VAR);
}
return 1;
}
@@ -7111,9 +7135,9 @@ static inline int float ## s ## _compare
( ( extractFloat ## s ## Exp( b ) == nan_exp ) && \
extractFloat ## s ## Frac( b ) )) { \
if (!is_quiet || \
- float ## s ## _is_signaling_nan( a ) || \
- float ## s ## _is_signaling_nan( b ) ) { \
- float_raise( float_flag_invalid STATUS_VAR); \
+ float ## s ## _is_signaling_nan(a STATUS_VAR) || \
+ float ## s ## _is_signaling_nan(b STATUS_VAR)) { \
+ float_raise(float_flag_invalid STATUS_VAR); \
} \
return float_relation_unordered; \
} \
@@ -7160,9 +7184,9 @@ static inline int floatx80_compare_inter
( ( extractFloatx80Exp( b ) == 0x7fff ) &&
( extractFloatx80Frac( b )<<1 ) )) {
if (!is_quiet ||
- floatx80_is_signaling_nan( a ) ||
- floatx80_is_signaling_nan( b ) ) {
- float_raise( float_flag_invalid STATUS_VAR);
+ floatx80_is_signaling_nan(a STATUS_VAR) ||
+ floatx80_is_signaling_nan(b STATUS_VAR)) {
+ float_raise(float_flag_invalid STATUS_VAR);
}
return float_relation_unordered;
}
@@ -7206,9 +7230,9 @@ static inline int float128_compare_inter
( ( extractFloat128Exp( b ) == 0x7fff ) &&
( extractFloat128Frac0( b ) | extractFloat128Frac1( b ) ) )) {
if (!is_quiet ||
- float128_is_signaling_nan( a ) ||
- float128_is_signaling_nan( b ) ) {
- float_raise( float_flag_invalid STATUS_VAR);
+ float128_is_signaling_nan(a STATUS_VAR) ||
+ float128_is_signaling_nan(b STATUS_VAR)) {
+ float_raise(float_flag_invalid STATUS_VAR);
}
return float_relation_unordered;
}
@@ -7266,10 +7290,10 @@ static inline float ## s float ## s ## _
if (float ## s ## _is_any_nan(a) || \
float ## s ## _is_any_nan(b)) { \
if (isieee) { \
- if (float ## s ## _is_quiet_nan(a) && \
+ if (float ## s ## _is_quiet_nan(a STATUS_VAR) && \
!float ## s ##_is_any_nan(b)) { \
return b; \
- } else if (float ## s ## _is_quiet_nan(b) && \
+ } else if (float ## s ## _is_quiet_nan(b STATUS_VAR) && \
!float ## s ## _is_any_nan(a)) { \
return a; \
} \
===================================================================
@@ -64,7 +64,8 @@ typedef int64_t int64;
#define LIT64( a ) a##LL
-#define STATUS_PARAM , float_status *status
+#define STATUS_PARAM_ONLY float_status *status
+#define STATUS_PARAM , STATUS_PARAM_ONLY
#define STATUS(field) status->field
#define STATUS_VAR , status
@@ -314,9 +315,9 @@ float64 float16_to_float64(float16 a, fl
/*----------------------------------------------------------------------------
| Software half-precision operations.
*----------------------------------------------------------------------------*/
-int float16_is_quiet_nan( float16 );
-int float16_is_signaling_nan( float16 );
-float16 float16_maybe_silence_nan( float16 );
+int float16_is_quiet_nan(float16 STATUS_PARAM);
+int float16_is_signaling_nan(float16 STATUS_PARAM);
+float16 float16_maybe_silence_nan(float16 STATUS_PARAM);
static inline int float16_is_any_nan(float16 a)
{
@@ -326,7 +327,7 @@ static inline int float16_is_any_nan(flo
/*----------------------------------------------------------------------------
| The pattern for a default generated half-precision NaN.
*----------------------------------------------------------------------------*/
-__inline__ float16 float16_default_nan(void);
+__inline__ float16 float16_default_nan(STATUS_PARAM_ONLY);
/*----------------------------------------------------------------------------
| Software IEC/IEEE single-precision conversion routines.
@@ -376,9 +377,9 @@ float32 float32_minnum(float32, float32
float32 float32_maxnum(float32, float32 STATUS_PARAM);
float32 float32_minnummag(float32, float32 STATUS_PARAM);
float32 float32_maxnummag(float32, float32 STATUS_PARAM);
-int float32_is_quiet_nan( float32 );
-int float32_is_signaling_nan( float32 );
-float32 float32_maybe_silence_nan( float32 );
+int float32_is_quiet_nan(float32 STATUS_PARAM);
+int float32_is_signaling_nan(float32 STATUS_PARAM);
+float32 float32_maybe_silence_nan(float32 STATUS_PARAM);
float32 float32_scalbn( float32, int STATUS_PARAM );
static inline float32 float32_abs(float32 a)
@@ -438,7 +439,7 @@ static inline float32 float32_set_sign(f
/*----------------------------------------------------------------------------
| The pattern for a default generated single-precision NaN.
*----------------------------------------------------------------------------*/
-__inline__ float32 float32_default_nan(void);
+__inline__ float32 float32_default_nan(STATUS_PARAM_ONLY);
/*----------------------------------------------------------------------------
| Software IEC/IEEE double-precision conversion routines.
@@ -488,9 +489,9 @@ float64 float64_minnum(float64, float64
float64 float64_maxnum(float64, float64 STATUS_PARAM);
float64 float64_minnummag(float64, float64 STATUS_PARAM);
float64 float64_maxnummag(float64, float64 STATUS_PARAM);
-int float64_is_quiet_nan( float64 a );
-int float64_is_signaling_nan( float64 );
-float64 float64_maybe_silence_nan( float64 );
+int float64_is_quiet_nan(float64 a STATUS_PARAM);
+int float64_is_signaling_nan(float64 STATUS_PARAM);
+float64 float64_maybe_silence_nan(float64 STATUS_PARAM);
float64 float64_scalbn( float64, int STATUS_PARAM );
static inline float64 float64_abs(float64 a)
@@ -550,7 +551,7 @@ static inline float64 float64_set_sign(f
/*----------------------------------------------------------------------------
| The pattern for a default generated double-precision NaN.
*----------------------------------------------------------------------------*/
-__inline__ float64 float64_default_nan(void);
+__inline__ float64 float64_default_nan(STATUS_PARAM_ONLY);
/*----------------------------------------------------------------------------
| Software IEC/IEEE extended double-precision conversion routines.
@@ -583,9 +584,9 @@ int floatx80_lt_quiet( floatx80, floatx8
int floatx80_unordered_quiet( floatx80, floatx80 STATUS_PARAM );
int floatx80_compare( floatx80, floatx80 STATUS_PARAM );
int floatx80_compare_quiet( floatx80, floatx80 STATUS_PARAM );
-int floatx80_is_quiet_nan( floatx80 );
-int floatx80_is_signaling_nan( floatx80 );
-floatx80 floatx80_maybe_silence_nan( floatx80 );
+int floatx80_is_quiet_nan(floatx80 STATUS_PARAM);
+int floatx80_is_signaling_nan(floatx80 STATUS_PARAM);
+floatx80 floatx80_maybe_silence_nan(floatx80 STATUS_PARAM);
floatx80 floatx80_scalbn( floatx80, int STATUS_PARAM );
static inline floatx80 floatx80_abs(floatx80 a)
@@ -635,7 +636,7 @@ static inline int floatx80_is_any_nan(fl
/*----------------------------------------------------------------------------
| The pattern for a default generated extended double-precision NaN.
*----------------------------------------------------------------------------*/
-__inline__ floatx80 floatx80_default_nan(void);
+__inline__ floatx80 floatx80_default_nan(STATUS_PARAM_ONLY);
/*----------------------------------------------------------------------------
| Software IEC/IEEE quadruple-precision conversion routines.
@@ -668,9 +669,9 @@ int float128_lt_quiet( float128, float12
int float128_unordered_quiet( float128, float128 STATUS_PARAM );
int float128_compare( float128, float128 STATUS_PARAM );
int float128_compare_quiet( float128, float128 STATUS_PARAM );
-int float128_is_quiet_nan( float128 );
-int float128_is_signaling_nan( float128 );
-float128 float128_maybe_silence_nan( float128 );
+int float128_is_quiet_nan(float128 STATUS_PARAM);
+int float128_is_signaling_nan(float128 STATUS_PARAM);
+float128 float128_maybe_silence_nan(float128 STATUS_PARAM);
float128 float128_scalbn( float128, int STATUS_PARAM );
static inline float128 float128_abs(float128 a)
@@ -716,6 +717,6 @@ static inline int float128_is_any_nan(fl
/*----------------------------------------------------------------------------
| The pattern for a default generated quadruple-precision NaN.
*----------------------------------------------------------------------------*/
-__inline__ float128 float128_default_nan(void);
+__inline__ float128 float128_default_nan(STATUS_PARAM_ONLY);
#endif /* !SOFTFLOAT_H */
===================================================================
@@ -337,12 +337,12 @@ float32 HELPER(frecpx_f32)(float32 a, vo
if (float32_is_any_nan(a)) {
float32 nan = a;
- if (float32_is_signaling_nan(a)) {
+ if (float32_is_signaling_nan(a, fpst)) {
float_raise(float_flag_invalid, fpst);
- nan = float32_maybe_silence_nan(a);
+ nan = float32_maybe_silence_nan(a, fpst);
}
if (fpst->default_nan_mode) {
- nan = float32_default_nan();
+ nan = float32_default_nan(fpst);
}
return nan;
}
@@ -366,12 +366,12 @@ float64 HELPER(frecpx_f64)(float64 a, vo
if (float64_is_any_nan(a)) {
float64 nan = a;
- if (float64_is_signaling_nan(a)) {
+ if (float64_is_signaling_nan(a, fpst)) {
float_raise(float_flag_invalid, fpst);
- nan = float64_maybe_silence_nan(a);
+ nan = float64_maybe_silence_nan(a, fpst);
}
if (fpst->default_nan_mode) {
- nan = float64_default_nan();
+ nan = float64_default_nan(fpst);
}
return nan;
}
@@ -400,7 +400,7 @@ float32 HELPER(fcvtx_f64_to_f32)(float64
set_float_rounding_mode(float_round_to_zero, &tstat);
set_float_exception_flags(0, &tstat);
r = float64_to_float32(a, &tstat);
- r = float32_maybe_silence_nan(r);
+ r = float32_maybe_silence_nan(r, &tstat);
exflags = get_float_exception_flags(&tstat);
if (exflags & float_flag_inexact) {
r = make_float32(float32_val(r) | 1);
===================================================================
@@ -5523,7 +5523,7 @@ float64 VFP_HELPER(fcvtd, s)(float32 x,
/* ARM requires that S<->D conversion of any kind of NaN generates
* a quiet NaN by forcing the most significant frac bit to 1.
*/
- return float64_maybe_silence_nan(r);
+ return float64_maybe_silence_nan(r, &env->vfp.fp_status);
}
float32 VFP_HELPER(fcvts, d)(float64 x, CPUARMState *env)
@@ -5532,7 +5532,7 @@ float32 VFP_HELPER(fcvts, d)(float64 x,
/* ARM requires that S<->D conversion of any kind of NaN generates
* a quiet NaN by forcing the most significant frac bit to 1.
*/
- return float32_maybe_silence_nan(r);
+ return float32_maybe_silence_nan(r, &env->vfp.fp_status);
}
/* VFP3 fixed point conversion. */
@@ -5631,7 +5631,7 @@ static float32 do_fcvt_f16_to_f32(uint32
int ieee = (env->vfp.xregs[ARM_VFP_FPSCR] & (1 << 26)) == 0;
float32 r = float16_to_float32(make_float16(a), ieee, s);
if (ieee) {
- return float32_maybe_silence_nan(r);
+ return float32_maybe_silence_nan(r, s);
}
return r;
}
@@ -5641,7 +5641,7 @@ static uint32_t do_fcvt_f32_to_f16(float
int ieee = (env->vfp.xregs[ARM_VFP_FPSCR] & (1 << 26)) == 0;
float16 r = float32_to_float16(a, ieee, s);
if (ieee) {
- r = float16_maybe_silence_nan(r);
+ r = float16_maybe_silence_nan(r, s);
}
return float16_val(r);
}
@@ -5671,7 +5671,7 @@ float64 HELPER(vfp_fcvt_f16_to_f64)(uint
int ieee = (env->vfp.xregs[ARM_VFP_FPSCR] & (1 << 26)) == 0;
float64 r = float16_to_float64(make_float16(a), ieee, &env->vfp.fp_status);
if (ieee) {
- return float64_maybe_silence_nan(r);
+ return float64_maybe_silence_nan(r, &env->vfp.fp_status);
}
return r;
}
@@ -5681,7 +5681,7 @@ uint32_t HELPER(vfp_fcvt_f64_to_f16)(flo
int ieee = (env->vfp.xregs[ARM_VFP_FPSCR] & (1 << 26)) == 0;
float16 r = float64_to_float16(a, ieee, &env->vfp.fp_status);
if (ieee) {
- r = float16_maybe_silence_nan(r);
+ r = float16_maybe_silence_nan(r, &env->vfp.fp_status);
}
return float16_val(r);
}
@@ -5831,12 +5831,12 @@ float32 HELPER(recpe_f32)(float32 input,
if (float32_is_any_nan(f32)) {
float32 nan = f32;
- if (float32_is_signaling_nan(f32)) {
+ if (float32_is_signaling_nan(f32, fpst)) {
float_raise(float_flag_invalid, fpst);
- nan = float32_maybe_silence_nan(f32);
+ nan = float32_maybe_silence_nan(f32, fpst);
}
if (fpst->default_nan_mode) {
- nan = float32_default_nan();
+ nan = float32_default_nan(fpst);
}
return nan;
} else if (float32_is_infinity(f32)) {
@@ -5885,12 +5885,12 @@ float64 HELPER(recpe_f64)(float64 input,
/* Deal with any special cases */
if (float64_is_any_nan(f64)) {
float64 nan = f64;
- if (float64_is_signaling_nan(f64)) {
+ if (float64_is_signaling_nan(f64, fpst)) {
float_raise(float_flag_invalid, fpst);
- nan = float64_maybe_silence_nan(f64);
+ nan = float64_maybe_silence_nan(f64, fpst);
}
if (fpst->default_nan_mode) {
- nan = float64_default_nan();
+ nan = float64_default_nan(fpst);
}
return nan;
} else if (float64_is_infinity(f64)) {
@@ -5992,12 +5992,12 @@ float32 HELPER(rsqrte_f32)(float32 input
if (float32_is_any_nan(f32)) {
float32 nan = f32;
- if (float32_is_signaling_nan(f32)) {
+ if (float32_is_signaling_nan(f32, s)) {
float_raise(float_flag_invalid, s);
- nan = float32_maybe_silence_nan(f32);
+ nan = float32_maybe_silence_nan(f32, s);
}
if (s->default_nan_mode) {
- nan = float32_default_nan();
+ nan = float32_default_nan(s);
}
return nan;
} else if (float32_is_zero(f32)) {
@@ -6005,7 +6005,7 @@ float32 HELPER(rsqrte_f32)(float32 input
return float32_set_sign(float32_infinity, float32_is_neg(f32));
} else if (float32_is_neg(f32)) {
float_raise(float_flag_invalid, s);
- return float32_default_nan();
+ return float32_default_nan(s);
} else if (float32_is_infinity(f32)) {
return float32_zero;
}
@@ -6056,12 +6056,12 @@ float64 HELPER(rsqrte_f64)(float64 input
if (float64_is_any_nan(f64)) {
float64 nan = f64;
- if (float64_is_signaling_nan(f64)) {
+ if (float64_is_signaling_nan(f64, s)) {
float_raise(float_flag_invalid, s);
- nan = float64_maybe_silence_nan(f64);
+ nan = float64_maybe_silence_nan(f64, s);
}
if (s->default_nan_mode) {
- nan = float64_default_nan();
+ nan = float64_default_nan(s);
}
return nan;
} else if (float64_is_zero(f64)) {
@@ -6069,7 +6069,7 @@ float64 HELPER(rsqrte_f64)(float64 input
return float64_set_sign(float64_infinity, float64_is_neg(f64));
} else if (float64_is_neg(f64)) {
float_raise(float_flag_invalid, s);
- return float64_default_nan();
+ return float64_default_nan(s);
} else if (float64_is_infinity(f64)) {
return float64_zero;
}
===================================================================
@@ -556,10 +556,10 @@ float64 HELPER(sub_cmp_f64)(CPUM68KState
/* ??? Should flush denormals to zero. */
float64 res;
res = float64_sub(a, b, &env->fp_status);
- if (float64_is_quiet_nan(res)) {
+ if (float64_is_quiet_nan(res, &env->fp_status)) {
/* +/-inf compares equal against itself, but sub returns nan. */
- if (!float64_is_quiet_nan(a)
- && !float64_is_quiet_nan(b)) {
+ if (!float64_is_quiet_nan(a, &env->fp_status)
+ && !float64_is_quiet_nan(b, &env->fp_status)) {
res = float64_zero;
if (float64_lt_quiet(a, res, &env->fp_status))
res = float64_chs(res);
===================================================================
@@ -289,12 +289,14 @@ uint32_t helper_fcmp_un(CPUMBState *env,
fa.l = a;
fb.l = b;
- if (float32_is_signaling_nan(fa.f) || float32_is_signaling_nan(fb.f)) {
+ if (float32_is_signaling_nan(fa.f, &env->fp_status)
+ || float32_is_signaling_nan(fb.f, &env->fp_status)) {
update_fpu_flags(env, float_flag_invalid);
r = 1;
}
- if (float32_is_quiet_nan(fa.f) || float32_is_quiet_nan(fb.f)) {
+ if (float32_is_quiet_nan(fa.f, &env->fp_status) ||
+ float32_is_quiet_nan(fb.f, &env->fp_status)) {
r = 1;
}
===================================================================
@@ -209,8 +209,8 @@ DEF_HELPER_2(float_cvtw_d, i32, env, i64
DEF_HELPER_3(float_addr_ps, i64, env, i64, i64)
DEF_HELPER_3(float_mulr_ps, i64, env, i64, i64)
-DEF_HELPER_FLAGS_1(float_class_s, TCG_CALL_NO_RWG_SE, i32, i32)
-DEF_HELPER_FLAGS_1(float_class_d, TCG_CALL_NO_RWG_SE, i64, i64)
+DEF_HELPER_FLAGS_3(float_class_s, TCG_CALL_NO_RWG_SE, i32, env, i32, i32)
+DEF_HELPER_FLAGS_3(float_class_d, TCG_CALL_NO_RWG_SE, i64, env, i64, i32)
#define FOP_PROTO(op) \
DEF_HELPER_4(float_ ## op ## _s, i32, env, i32, i32, i32) \
===================================================================
@@ -1503,11 +1503,11 @@ MSA_UNOP_DF(pcnt)
#define FLOAT_ONE32 make_float32(0x3f8 << 20)
#define FLOAT_ONE64 make_float64(0x3ffULL << 52)
-#define FLOAT_SNAN16 (float16_default_nan() ^ 0x0220)
+#define FLOAT_SNAN16(s) (float16_default_nan(s) ^ 0x0220)
/* 0x7c20 */
-#define FLOAT_SNAN32 (float32_default_nan() ^ 0x00400020)
+#define FLOAT_SNAN32(s) (float32_default_nan(s) ^ 0x00400020)
/* 0x7f800020 */
-#define FLOAT_SNAN64 (float64_default_nan() ^ 0x0008000000000020ULL)
+#define FLOAT_SNAN64(s) (float64_default_nan(s) ^ 0x0008000000000020ULL)
/* 0x7ff0000000000020 */
static inline void clear_msacsr_cause(CPUMIPSState *env)
@@ -1619,7 +1619,7 @@ static inline float16 float16_from_float
float16 f_val;
f_val = float32_to_float16((float32)a, ieee STATUS_VAR);
- f_val = float16_maybe_silence_nan(f_val);
+ f_val = float16_maybe_silence_nan(f_val STATUS_VAR);
return a < 0 ? (f_val | (1 << 15)) : f_val;
}
@@ -1629,7 +1629,7 @@ static inline float32 float32_from_float
float32 f_val;
f_val = float64_to_float32((float64)a STATUS_VAR);
- f_val = float32_maybe_silence_nan(f_val);
+ f_val = float32_maybe_silence_nan(f_val STATUS_VAR);
return a < 0 ? (f_val | (1 << 31)) : f_val;
}
@@ -1639,7 +1639,7 @@ static inline float32 float32_from_float
float32 f_val;
f_val = float16_to_float32((float16)a, ieee STATUS_VAR);
- f_val = float32_maybe_silence_nan(f_val);
+ f_val = float32_maybe_silence_nan(f_val STATUS_VAR);
return a < 0 ? (f_val | (1 << 31)) : f_val;
}
@@ -1649,7 +1649,7 @@ static inline float64 float64_from_float
float64 f_val;
f_val = float32_to_float64((float64)a STATUS_VAR);
- f_val = float64_maybe_silence_nan(f_val);
+ f_val = float64_maybe_silence_nan(f_val STATUS_VAR);
return a < 0 ? (f_val | (1ULL << 63)) : f_val;
}
@@ -1795,7 +1795,7 @@ static inline int32 float64_to_q32(float
c = update_msacsr(env, CLEAR_IS_INEXACT, 0); \
\
if (get_enabled_exceptions(env, c)) { \
- DEST = ((FLOAT_SNAN ## BITS >> 6) << 6) | c; \
+ DEST = ((FLOAT_SNAN ## BITS(status) >> 6) << 6) | c; \
} \
} while (0)
@@ -2382,7 +2382,7 @@ void helper_msa_fsne_df(CPUMIPSState *en
c = update_msacsr(env, 0, IS_DENORMAL(DEST, BITS)); \
\
if (get_enabled_exceptions(env, c)) { \
- DEST = ((FLOAT_SNAN ## BITS >> 6) << 6) | c; \
+ DEST = ((FLOAT_SNAN ## BITS(status) >> 6) << 6) | c; \
} \
} while (0)
@@ -2518,7 +2518,7 @@ void helper_msa_fdiv_df(CPUMIPSState *en
c = update_msacsr(env, 0, IS_DENORMAL(DEST, BITS)); \
\
if (get_enabled_exceptions(env, c)) { \
- DEST = ((FLOAT_SNAN ## BITS >> 6) << 6) | c; \
+ DEST = ((FLOAT_SNAN ## BITS(status) >> 6) << 6) | c; \
} \
} while (0)
@@ -2637,7 +2637,7 @@ void helper_msa_fexp2_df(CPUMIPSState *e
c = update_msacsr(env, 0, IS_DENORMAL(DEST, BITS)); \
\
if (get_enabled_exceptions(env, c)) { \
- DEST = ((FLOAT_SNAN ## BITS >> 6) << 6) | c; \
+ DEST = ((FLOAT_SNAN ## BITS(status) >> 6) << 6) | c; \
} \
} while (0)
@@ -2686,7 +2686,7 @@ void helper_msa_fexdo_df(CPUMIPSState *e
c = update_msacsr(env, CLEAR_FS_UNDERFLOW, 0); \
\
if (get_enabled_exceptions(env, c)) { \
- DEST = ((FLOAT_SNAN ## XBITS >> 6) << 6) | c; \
+ DEST = ((FLOAT_SNAN ## XBITS(status) >> 6) << 6) | c; \
} \
} while (0)
@@ -2723,9 +2723,9 @@ void helper_msa_ftq_df(CPUMIPSState *env
msa_move_v(pwd, pwx);
}
-#define NUMBER_QNAN_PAIR(ARG1, ARG2, BITS) \
- !float ## BITS ## _is_any_nan(ARG1) \
- && float ## BITS ## _is_quiet_nan(ARG2)
+#define NUMBER_QNAN_PAIR(ARG1, ARG2, BITS, STATUS) \
+ !float ## BITS ## _is_any_nan(ARG1) \
+ && float ## BITS ## _is_quiet_nan(ARG2, STATUS)
#define MSA_FLOAT_MAXOP(DEST, OP, ARG1, ARG2, BITS) \
do { \
@@ -2737,18 +2737,18 @@ void helper_msa_ftq_df(CPUMIPSState *env
c = update_msacsr(env, 0, 0); \
\
if (get_enabled_exceptions(env, c)) { \
- DEST = ((FLOAT_SNAN ## BITS >> 6) << 6) | c; \
+ DEST = ((FLOAT_SNAN ## BITS(status) >> 6) << 6) | c; \
} \
} while (0)
-#define FMAXMIN_A(F, G, X, _S, _T, BITS) \
+#define FMAXMIN_A(F, G, X, _S, _T, BITS, STATUS) \
do { \
uint## BITS ##_t S = _S, T = _T; \
uint## BITS ##_t as, at, xs, xt, xd; \
- if (NUMBER_QNAN_PAIR(S, T, BITS)) { \
+ if (NUMBER_QNAN_PAIR(S, T, BITS, STATUS)) { \
T = S; \
} \
- else if (NUMBER_QNAN_PAIR(T, S, BITS)) { \
+ else if (NUMBER_QNAN_PAIR(T, S, BITS, STATUS)) { \
S = T; \
} \
as = float## BITS ##_abs(S); \
@@ -2762,6 +2762,7 @@ void helper_msa_ftq_df(CPUMIPSState *env
void helper_msa_fmin_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
uint32_t ws, uint32_t wt)
{
+ float_status *status = &env->active_tc.msa_fp_status;
wr_t wx, *pwx = &wx;
wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
wr_t *pws = &(env->active_fpu.fpr[ws].wr);
@@ -2773,9 +2774,9 @@ void helper_msa_fmin_df(CPUMIPSState *en
switch (df) {
case DF_WORD:
for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
- if (NUMBER_QNAN_PAIR(pws->w[i], pwt->w[i], 32)) {
+ if (NUMBER_QNAN_PAIR(pws->w[i], pwt->w[i], 32, status)) {
MSA_FLOAT_MAXOP(pwx->w[i], min, pws->w[i], pws->w[i], 32);
- } else if (NUMBER_QNAN_PAIR(pwt->w[i], pws->w[i], 32)) {
+ } else if (NUMBER_QNAN_PAIR(pwt->w[i], pws->w[i], 32, status)) {
MSA_FLOAT_MAXOP(pwx->w[i], min, pwt->w[i], pwt->w[i], 32);
} else {
MSA_FLOAT_MAXOP(pwx->w[i], min, pws->w[i], pwt->w[i], 32);
@@ -2784,9 +2785,9 @@ void helper_msa_fmin_df(CPUMIPSState *en
break;
case DF_DOUBLE:
for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
- if (NUMBER_QNAN_PAIR(pws->d[i], pwt->d[i], 64)) {
+ if (NUMBER_QNAN_PAIR(pws->d[i], pwt->d[i], 64, status)) {
MSA_FLOAT_MAXOP(pwx->d[i], min, pws->d[i], pws->d[i], 64);
- } else if (NUMBER_QNAN_PAIR(pwt->d[i], pws->d[i], 64)) {
+ } else if (NUMBER_QNAN_PAIR(pwt->d[i], pws->d[i], 64, status)) {
MSA_FLOAT_MAXOP(pwx->d[i], min, pwt->d[i], pwt->d[i], 64);
} else {
MSA_FLOAT_MAXOP(pwx->d[i], min, pws->d[i], pwt->d[i], 64);
@@ -2805,6 +2806,7 @@ void helper_msa_fmin_df(CPUMIPSState *en
void helper_msa_fmin_a_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
uint32_t ws, uint32_t wt)
{
+ float_status *status = &env->active_tc.msa_fp_status;
wr_t wx, *pwx = &wx;
wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
wr_t *pws = &(env->active_fpu.fpr[ws].wr);
@@ -2816,12 +2818,12 @@ void helper_msa_fmin_a_df(CPUMIPSState *
switch (df) {
case DF_WORD:
for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
- FMAXMIN_A(min, max, pwx->w[i], pws->w[i], pwt->w[i], 32);
+ FMAXMIN_A(min, max, pwx->w[i], pws->w[i], pwt->w[i], 32, status);
}
break;
case DF_DOUBLE:
for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
- FMAXMIN_A(min, max, pwx->d[i], pws->d[i], pwt->d[i], 64);
+ FMAXMIN_A(min, max, pwx->d[i], pws->d[i], pwt->d[i], 64, status);
}
break;
default:
@@ -2836,6 +2838,7 @@ void helper_msa_fmin_a_df(CPUMIPSState *
void helper_msa_fmax_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
uint32_t ws, uint32_t wt)
{
+ float_status *status = &env->active_tc.msa_fp_status;
wr_t wx, *pwx = &wx;
wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
wr_t *pws = &(env->active_fpu.fpr[ws].wr);
@@ -2847,9 +2850,9 @@ void helper_msa_fmax_df(CPUMIPSState *en
switch (df) {
case DF_WORD:
for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
- if (NUMBER_QNAN_PAIR(pws->w[i], pwt->w[i], 32)) {
+ if (NUMBER_QNAN_PAIR(pws->w[i], pwt->w[i], 32, status)) {
MSA_FLOAT_MAXOP(pwx->w[i], max, pws->w[i], pws->w[i], 32);
- } else if (NUMBER_QNAN_PAIR(pwt->w[i], pws->w[i], 32)) {
+ } else if (NUMBER_QNAN_PAIR(pwt->w[i], pws->w[i], 32, status)) {
MSA_FLOAT_MAXOP(pwx->w[i], max, pwt->w[i], pwt->w[i], 32);
} else {
MSA_FLOAT_MAXOP(pwx->w[i], max, pws->w[i], pwt->w[i], 32);
@@ -2858,9 +2861,9 @@ void helper_msa_fmax_df(CPUMIPSState *en
break;
case DF_DOUBLE:
for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
- if (NUMBER_QNAN_PAIR(pws->d[i], pwt->d[i], 64)) {
+ if (NUMBER_QNAN_PAIR(pws->d[i], pwt->d[i], 64, status)) {
MSA_FLOAT_MAXOP(pwx->d[i], max, pws->d[i], pws->d[i], 64);
- } else if (NUMBER_QNAN_PAIR(pwt->d[i], pws->d[i], 64)) {
+ } else if (NUMBER_QNAN_PAIR(pwt->d[i], pws->d[i], 64, status)) {
MSA_FLOAT_MAXOP(pwx->d[i], max, pwt->d[i], pwt->d[i], 64);
} else {
MSA_FLOAT_MAXOP(pwx->d[i], max, pws->d[i], pwt->d[i], 64);
@@ -2879,6 +2882,7 @@ void helper_msa_fmax_df(CPUMIPSState *en
void helper_msa_fmax_a_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
uint32_t ws, uint32_t wt)
{
+ float_status *status = &env->active_tc.msa_fp_status;
wr_t wx, *pwx = &wx;
wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
wr_t *pws = &(env->active_fpu.fpr[ws].wr);
@@ -2890,12 +2894,12 @@ void helper_msa_fmax_a_df(CPUMIPSState *
switch (df) {
case DF_WORD:
for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
- FMAXMIN_A(max, min, pwx->w[i], pws->w[i], pwt->w[i], 32);
+ FMAXMIN_A(max, min, pwx->w[i], pws->w[i], pwt->w[i], 32, status);
}
break;
case DF_DOUBLE:
for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
- FMAXMIN_A(max, min, pwx->d[i], pws->d[i], pwt->d[i], 64);
+ FMAXMIN_A(max, min, pwx->d[i], pws->d[i], pwt->d[i], 64, status);
}
break;
default:
@@ -2913,13 +2917,13 @@ void helper_msa_fclass_df(CPUMIPSState *
wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
wr_t *pws = &(env->active_fpu.fpr[ws].wr);
if (df == DF_WORD) {
- pwd->w[0] = helper_float_class_s(pws->w[0]);
- pwd->w[1] = helper_float_class_s(pws->w[1]);
- pwd->w[2] = helper_float_class_s(pws->w[2]);
- pwd->w[3] = helper_float_class_s(pws->w[3]);
+ pwd->w[0] = helper_float_class_s(env, pws->w[0], 1);
+ pwd->w[1] = helper_float_class_s(env, pws->w[1], 1);
+ pwd->w[2] = helper_float_class_s(env, pws->w[2], 1);
+ pwd->w[3] = helper_float_class_s(env, pws->w[3], 1);
} else {
- pwd->d[0] = helper_float_class_d(pws->d[0]);
- pwd->d[1] = helper_float_class_d(pws->d[1]);
+ pwd->d[0] = helper_float_class_d(env, pws->d[0], 1);
+ pwd->d[1] = helper_float_class_d(env, pws->d[1], 1);
}
}
@@ -2933,7 +2937,7 @@ void helper_msa_fclass_df(CPUMIPSState *
c = update_msacsr(env, CLEAR_FS_UNDERFLOW, 0); \
\
if (get_enabled_exceptions(env, c)) { \
- DEST = ((FLOAT_SNAN ## BITS >> 6) << 6) | c; \
+ DEST = ((FLOAT_SNAN ## BITS(status) >> 6) << 6) | c; \
} else if (float ## BITS ## _is_any_nan(ARG)) { \
DEST = 0; \
} \
@@ -3037,12 +3041,12 @@ void helper_msa_fsqrt_df(CPUMIPSState *e
set_float_exception_flags(0, status); \
DEST = float ## BITS ## _ ## div(FLOAT_ONE ## BITS, ARG, status); \
c = update_msacsr(env, float ## BITS ## _is_infinity(ARG) || \
- float ## BITS ## _is_quiet_nan(DEST) ? \
+ float ## BITS ## _is_quiet_nan(DEST, status) ? \
0 : RECIPROCAL_INEXACT, \
IS_DENORMAL(DEST, BITS)); \
\
if (get_enabled_exceptions(env, c)) { \
- DEST = ((FLOAT_SNAN ## BITS >> 6) << 6) | c; \
+ DEST = ((FLOAT_SNAN ## BITS(status) >> 6) << 6) | c; \
} \
} while (0)
@@ -3158,7 +3162,7 @@ void helper_msa_frint_df(CPUMIPSState *e
c = update_msacsr(env, 0, IS_DENORMAL(DEST, BITS)); \
\
if (get_enabled_exceptions(env, c)) { \
- DEST = ((FLOAT_SNAN ## BITS >> 6) << 6) | c; \
+ DEST = ((FLOAT_SNAN ## BITS(status) >> 6) << 6) | c; \
} \
} while (0)
===================================================================
@@ -2990,11 +2990,17 @@ FLOAT_RINT(rint_d, 64)
#define FLOAT_CLASS_POSITIVE_ZERO 0x200
#define FLOAT_CLASS(name, bits) \
-uint ## bits ## _t helper_float_ ## name (uint ## bits ## _t arg) \
+uint ## bits ## _t helper_float_ ## name (CPUMIPSState *env, \
+ uint ## bits ## _t arg, \
+ uint32_t msa) \
{ \
- if (float ## bits ## _is_signaling_nan(arg)) { \
+ float_status *status = msa ? \
+ &env->active_tc.msa_fp_status : \
+ &env->active_fpu.fp_status; \
+ \
+ if (float ## bits ## _is_signaling_nan(arg, status)) { \
return FLOAT_CLASS_SIGNALING_NAN; \
- } else if (float ## bits ## _is_quiet_nan(arg)) { \
+ } else if (float ## bits ## _is_quiet_nan(arg, status)) { \
return FLOAT_CLASS_QUIET_NAN; \
} else if (float ## bits ## _is_neg(arg)) { \
if (float ## bits ## _is_infinity(arg)) { \
===================================================================
@@ -8972,9 +8972,11 @@ static void gen_farith (DisasContext *ct
check_insn(ctx, ISA_MIPS32R6);
{
TCGv_i32 fp0 = tcg_temp_new_i32();
+ TCGv_i32 msa = tcg_const_i32(0);
gen_load_fpr32(fp0, fs);
- gen_helper_float_class_s(fp0, fp0);
+ gen_helper_float_class_s(fp0, cpu_env, fp0, msa);
gen_store_fpr32(fp0, fd);
+ tcg_temp_free_i32(msa);
tcg_temp_free_i32(fp0);
opn = "class.s";
}
@@ -9517,9 +9519,11 @@ static void gen_farith (DisasContext *ct
check_insn(ctx, ISA_MIPS32R6);
{
TCGv_i64 fp0 = tcg_temp_new_i64();
+ TCGv_i32 msa = tcg_const_i32(0);
gen_load_fpr64(ctx, fp0, fs);
- gen_helper_float_class_d(fp0, fp0);
+ gen_helper_float_class_d(fp0, cpu_env, fp0, msa);
gen_store_fpr64(ctx, fp0, fd);
+ tcg_temp_free_i32(msa);
tcg_temp_free_i64(fp0);
opn = "class.d";
}
===================================================================
@@ -69,7 +69,7 @@ uint32_t helper_compute_fprf(CPUPPCState
farg.ll = arg;
isneg = float64_is_neg(farg.d);
if (unlikely(float64_is_any_nan(farg.d))) {
- if (float64_is_signaling_nan(farg.d)) {
+ if (float64_is_signaling_nan(farg.d, &env->fp_status)) {
/* Signaling NaN: flags are undefined */
ret = 0x00;
} else {
@@ -534,8 +534,8 @@ uint64_t helper_fadd(CPUPPCState *env, u
/* Magnitude subtraction of infinities */
farg1.ll = fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXISI, 1);
} else {
- if (unlikely(float64_is_signaling_nan(farg1.d) ||
- float64_is_signaling_nan(farg2.d))) {
+ if (unlikely(float64_is_signaling_nan(farg1.d, &env->fp_status) ||
+ float64_is_signaling_nan(farg2.d, &env->fp_status))) {
/* sNaN addition */
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 1);
}
@@ -558,8 +558,8 @@ uint64_t helper_fsub(CPUPPCState *env, u
/* Magnitude subtraction of infinities */
farg1.ll = fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXISI, 1);
} else {
- if (unlikely(float64_is_signaling_nan(farg1.d) ||
- float64_is_signaling_nan(farg2.d))) {
+ if (unlikely(float64_is_signaling_nan(farg1.d, &env->fp_status) ||
+ float64_is_signaling_nan(farg2.d, &env->fp_status))) {
/* sNaN subtraction */
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 1);
}
@@ -582,8 +582,8 @@ uint64_t helper_fmul(CPUPPCState *env, u
/* Multiplication of zero by infinity */
farg1.ll = fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXIMZ, 1);
} else {
- if (unlikely(float64_is_signaling_nan(farg1.d) ||
- float64_is_signaling_nan(farg2.d))) {
+ if (unlikely(float64_is_signaling_nan(farg1.d, &env->fp_status) ||
+ float64_is_signaling_nan(farg2.d, &env->fp_status))) {
/* sNaN multiplication */
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 1);
}
@@ -609,8 +609,8 @@ uint64_t helper_fdiv(CPUPPCState *env, u
/* Division of zero by zero */
farg1.ll = fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXZDZ, 1);
} else {
- if (unlikely(float64_is_signaling_nan(farg1.d) ||
- float64_is_signaling_nan(farg2.d))) {
+ if (unlikely(float64_is_signaling_nan(farg1.d, &env->fp_status) ||
+ float64_is_signaling_nan(farg2.d, &env->fp_status))) {
/* sNaN division */
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 1);
}
@@ -632,7 +632,7 @@ uint64_t helper_##op(CPUPPCState *env, u
if (unlikely(env->fp_status.float_exception_flags)) { \
if (float64_is_any_nan(arg)) { \
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXCVI, 1); \
- if (float64_is_signaling_nan(arg)) { \
+ if (float64_is_signaling_nan(arg, &env->fp_status)) { \
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 1); \
} \
farg.ll = nanval; \
@@ -681,7 +681,7 @@ static inline uint64_t do_fri(CPUPPCStat
farg.ll = arg;
- if (unlikely(float64_is_signaling_nan(farg.d))) {
+ if (unlikely(float64_is_signaling_nan(farg.d, &env->fp_status))) {
/* sNaN round */
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 1);
farg.ll = arg | 0x0008000000000000ULL;
@@ -737,9 +737,9 @@ uint64_t helper_fmadd(CPUPPCState *env,
/* Multiplication of zero by infinity */
farg1.ll = fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXIMZ, 1);
} else {
- if (unlikely(float64_is_signaling_nan(farg1.d) ||
- float64_is_signaling_nan(farg2.d) ||
- float64_is_signaling_nan(farg3.d))) {
+ if (unlikely(float64_is_signaling_nan(farg1.d, &env->fp_status) ||
+ float64_is_signaling_nan(farg2.d, &env->fp_status) ||
+ float64_is_signaling_nan(farg3.d, &env->fp_status))) {
/* sNaN operation */
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 1);
}
@@ -780,9 +780,9 @@ uint64_t helper_fmsub(CPUPPCState *env,
/* Multiplication of zero by infinity */
farg1.ll = fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXIMZ, 1);
} else {
- if (unlikely(float64_is_signaling_nan(farg1.d) ||
- float64_is_signaling_nan(farg2.d) ||
- float64_is_signaling_nan(farg3.d))) {
+ if (unlikely(float64_is_signaling_nan(farg1.d, &env->fp_status) ||
+ float64_is_signaling_nan(farg2.d, &env->fp_status) ||
+ float64_is_signaling_nan(farg3.d, &env->fp_status))) {
/* sNaN operation */
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 1);
}
@@ -821,9 +821,9 @@ uint64_t helper_fnmadd(CPUPPCState *env,
/* Multiplication of zero by infinity */
farg1.ll = fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXIMZ, 1);
} else {
- if (unlikely(float64_is_signaling_nan(farg1.d) ||
- float64_is_signaling_nan(farg2.d) ||
- float64_is_signaling_nan(farg3.d))) {
+ if (unlikely(float64_is_signaling_nan(farg1.d, &env->fp_status) ||
+ float64_is_signaling_nan(farg2.d, &env->fp_status) ||
+ float64_is_signaling_nan(farg3.d, &env->fp_status))) {
/* sNaN operation */
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 1);
}
@@ -866,9 +866,9 @@ uint64_t helper_fnmsub(CPUPPCState *env,
/* Multiplication of zero by infinity */
farg1.ll = fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXIMZ, 1);
} else {
- if (unlikely(float64_is_signaling_nan(farg1.d) ||
- float64_is_signaling_nan(farg2.d) ||
- float64_is_signaling_nan(farg3.d))) {
+ if (unlikely(float64_is_signaling_nan(farg1.d, &env->fp_status) ||
+ float64_is_signaling_nan(farg2.d, &env->fp_status) ||
+ float64_is_signaling_nan(farg3.d, &env->fp_status))) {
/* sNaN operation */
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 1);
}
@@ -903,7 +903,7 @@ uint64_t helper_frsp(CPUPPCState *env, u
farg.ll = arg;
- if (unlikely(float64_is_signaling_nan(farg.d))) {
+ if (unlikely(float64_is_signaling_nan(farg.d, &env->fp_status))) {
/* sNaN square root */
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 1);
}
@@ -924,7 +924,7 @@ uint64_t helper_fsqrt(CPUPPCState *env,
/* Square root of a negative nonzero number */
farg.ll = fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSQRT, 1);
} else {
- if (unlikely(float64_is_signaling_nan(farg.d))) {
+ if (unlikely(float64_is_signaling_nan(farg.d, &env->fp_status))) {
/* sNaN square root */
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 1);
}
@@ -940,7 +940,7 @@ uint64_t helper_fre(CPUPPCState *env, ui
farg.ll = arg;
- if (unlikely(float64_is_signaling_nan(farg.d))) {
+ if (unlikely(float64_is_signaling_nan(farg.d, &env->fp_status))) {
/* sNaN reciprocal */
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 1);
}
@@ -956,7 +956,7 @@ uint64_t helper_fres(CPUPPCState *env, u
farg.ll = arg;
- if (unlikely(float64_is_signaling_nan(farg.d))) {
+ if (unlikely(float64_is_signaling_nan(farg.d, &env->fp_status))) {
/* sNaN reciprocal */
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 1);
}
@@ -978,7 +978,7 @@ uint64_t helper_frsqrte(CPUPPCState *env
/* Reciprocal square root of a negative nonzero number */
farg.ll = fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSQRT, 1);
} else {
- if (unlikely(float64_is_signaling_nan(farg.d))) {
+ if (unlikely(float64_is_signaling_nan(farg.d, &env->fp_status))) {
/* sNaN reciprocal square root */
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 1);
}
@@ -1095,8 +1095,8 @@ void helper_fcmpu(CPUPPCState *env, uint
env->fpscr |= ret << FPSCR_FPRF;
env->crf[crfD] = ret;
if (unlikely(ret == 0x01UL
- && (float64_is_signaling_nan(farg1.d) ||
- float64_is_signaling_nan(farg2.d)))) {
+ && (float64_is_signaling_nan(farg1.d, &env->fp_status) ||
+ float64_is_signaling_nan(farg2.d, &env->fp_status)))) {
/* sNaN comparison */
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 1);
}
@@ -1126,8 +1126,8 @@ void helper_fcmpo(CPUPPCState *env, uint
env->fpscr |= ret << FPSCR_FPRF;
env->crf[crfD] = ret;
if (unlikely(ret == 0x01UL)) {
- if (float64_is_signaling_nan(farg1.d) ||
- float64_is_signaling_nan(farg2.d)) {
+ if (float64_is_signaling_nan(farg1.d, &env->fp_status) ||
+ float64_is_signaling_nan(farg2.d, &env->fp_status)) {
/* sNaN comparison */
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN |
POWERPC_EXCP_FP_VXVC, 1);
@@ -1163,7 +1163,7 @@ static inline int32_t efsctsi(CPUPPCStat
u.l = val;
/* NaN are not treated the same way IEEE 754 does */
- if (unlikely(float32_is_quiet_nan(u.f))) {
+ if (unlikely(float32_is_quiet_nan(u.f, &env->vec_status))) {
return 0;
}
@@ -1176,7 +1176,7 @@ static inline uint32_t efsctui(CPUPPCSta
u.l = val;
/* NaN are not treated the same way IEEE 754 does */
- if (unlikely(float32_is_quiet_nan(u.f))) {
+ if (unlikely(float32_is_quiet_nan(u.f, &env->vec_status))) {
return 0;
}
@@ -1189,7 +1189,7 @@ static inline uint32_t efsctsiz(CPUPPCSt
u.l = val;
/* NaN are not treated the same way IEEE 754 does */
- if (unlikely(float32_is_quiet_nan(u.f))) {
+ if (unlikely(float32_is_quiet_nan(u.f, &env->vec_status))) {
return 0;
}
@@ -1202,7 +1202,7 @@ static inline uint32_t efsctuiz(CPUPPCSt
u.l = val;
/* NaN are not treated the same way IEEE 754 does */
- if (unlikely(float32_is_quiet_nan(u.f))) {
+ if (unlikely(float32_is_quiet_nan(u.f, &env->vec_status))) {
return 0;
}
@@ -1240,7 +1240,7 @@ static inline uint32_t efsctsf(CPUPPCSta
u.l = val;
/* NaN are not treated the same way IEEE 754 does */
- if (unlikely(float32_is_quiet_nan(u.f))) {
+ if (unlikely(float32_is_quiet_nan(u.f, &env->vec_status))) {
return 0;
}
tmp = uint64_to_float32(1ULL << 32, &env->vec_status);
@@ -1256,7 +1256,7 @@ static inline uint32_t efsctuf(CPUPPCSta
u.l = val;
/* NaN are not treated the same way IEEE 754 does */
- if (unlikely(float32_is_quiet_nan(u.f))) {
+ if (unlikely(float32_is_quiet_nan(u.f, &env->vec_status))) {
return 0;
}
tmp = uint64_to_float32(1ULL << 32, &env->vec_status);
@@ -1834,8 +1834,8 @@ void helper_##name(CPUPPCState *env, uin
if (unlikely(tstat.float_exception_flags & float_flag_invalid)) { \
if (tp##_is_infinity(xa.fld) && tp##_is_infinity(xb.fld)) { \
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXISI, sfprf); \
- } else if (tp##_is_signaling_nan(xa.fld) || \
- tp##_is_signaling_nan(xb.fld)) { \
+ } else if (tp##_is_signaling_nan(xa.fld, &tstat) || \
+ tp##_is_signaling_nan(xb.fld, &tstat)) { \
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, sfprf); \
} \
} \
@@ -1889,8 +1889,8 @@ void helper_##op(CPUPPCState *env, uint3
if ((tp##_is_infinity(xa.fld) && tp##_is_zero(xb.fld)) || \
(tp##_is_infinity(xb.fld) && tp##_is_zero(xa.fld))) { \
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXIMZ, sfprf); \
- } else if (tp##_is_signaling_nan(xa.fld) || \
- tp##_is_signaling_nan(xb.fld)) { \
+ } else if (tp##_is_signaling_nan(xa.fld, &tstat) || \
+ tp##_is_signaling_nan(xb.fld, &tstat)) { \
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, sfprf); \
} \
} \
@@ -1943,8 +1943,8 @@ void helper_##op(CPUPPCState *env, uint3
} else if (tp##_is_zero(xa.fld) && \
tp##_is_zero(xb.fld)) { \
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXZDZ, sfprf); \
- } else if (tp##_is_signaling_nan(xa.fld) || \
- tp##_is_signaling_nan(xb.fld)) { \
+ } else if (tp##_is_signaling_nan(xa.fld, &tstat) || \
+ tp##_is_signaling_nan(xb.fld, &tstat)) { \
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, sfprf); \
} \
} \
@@ -1985,7 +1985,7 @@ void helper_##op(CPUPPCState *env, uint3
helper_reset_fpstatus(env); \
\
for (i = 0; i < nels; i++) { \
- if (unlikely(tp##_is_signaling_nan(xb.fld))) { \
+ if (unlikely(tp##_is_signaling_nan(xb.fld, &env->fp_status))) { \
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, sfprf); \
} \
xt.fld = tp##_div(tp##_one, xb.fld, &env->fp_status); \
@@ -2034,7 +2034,7 @@ void helper_##op(CPUPPCState *env, uint3
if (unlikely(tstat.float_exception_flags & float_flag_invalid)) { \
if (tp##_is_neg(xb.fld) && !tp##_is_zero(xb.fld)) { \
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSQRT, sfprf); \
- } else if (tp##_is_signaling_nan(xb.fld)) { \
+ } else if (tp##_is_signaling_nan(xb.fld, &tstat)) { \
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, sfprf); \
} \
} \
@@ -2084,7 +2084,7 @@ void helper_##op(CPUPPCState *env, uint3
if (unlikely(tstat.float_exception_flags & float_flag_invalid)) { \
if (tp##_is_neg(xb.fld) && !tp##_is_zero(xb.fld)) { \
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSQRT, sfprf); \
- } else if (tp##_is_signaling_nan(xb.fld)) { \
+ } else if (tp##_is_signaling_nan(xb.fld, &tstat)) { \
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, sfprf); \
} \
} \
@@ -2269,9 +2269,9 @@ void helper_##op(CPUPPCState *env, uint3
env->fp_status.float_exception_flags |= tstat.float_exception_flags; \
\
if (unlikely(tstat.float_exception_flags & float_flag_invalid)) { \
- if (tp##_is_signaling_nan(xa.fld) || \
- tp##_is_signaling_nan(b->fld) || \
- tp##_is_signaling_nan(c->fld)) { \
+ if (tp##_is_signaling_nan(xa.fld, &tstat) || \
+ tp##_is_signaling_nan(b->fld, &tstat) || \
+ tp##_is_signaling_nan(c->fld, &tstat)) { \
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, sfprf); \
tstat.float_exception_flags &= ~float_flag_invalid; \
} \
@@ -2353,8 +2353,8 @@ void helper_##op(CPUPPCState *env, uint3
\
if (unlikely(float64_is_any_nan(xa.VsrD(0)) || \
float64_is_any_nan(xb.VsrD(0)))) { \
- if (float64_is_signaling_nan(xa.VsrD(0)) || \
- float64_is_signaling_nan(xb.VsrD(0))) { \
+ if (float64_is_signaling_nan(xa.VsrD(0), &env->fp_status) || \
+ float64_is_signaling_nan(xb.VsrD(0), &env->fp_status)) { \
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 0); \
} \
if (ordered) { \
@@ -2404,8 +2404,8 @@ void helper_##name(CPUPPCState *env, uin
\
for (i = 0; i < nels; i++) { \
xt.fld = tp##_##op(xa.fld, xb.fld, &env->fp_status); \
- if (unlikely(tp##_is_signaling_nan(xa.fld) || \
- tp##_is_signaling_nan(xb.fld))) { \
+ if (unlikely(tp##_is_signaling_nan(xa.fld, &env->fp_status) || \
+ tp##_is_signaling_nan(xb.fld, &env->fp_status))) { \
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 0); \
} \
} \
@@ -2444,8 +2444,8 @@ void helper_##op(CPUPPCState *env, uint3
for (i = 0; i < nels; i++) { \
if (unlikely(tp##_is_any_nan(xa.fld) || \
tp##_is_any_nan(xb.fld))) { \
- if (tp##_is_signaling_nan(xa.fld) || \
- tp##_is_signaling_nan(xb.fld)) { \
+ if (tp##_is_signaling_nan(xa.fld, &env->fp_status) || \
+ tp##_is_signaling_nan(xb.fld, &env->fp_status)) { \
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 0); \
} \
if (svxvc) { \
@@ -2498,7 +2498,8 @@ void helper_##op(CPUPPCState *env, uint3
\
for (i = 0; i < nels; i++) { \
xt.tfld = stp##_to_##ttp(xb.sfld, &env->fp_status); \
- if (unlikely(stp##_is_signaling_nan(xb.sfld))) { \
+ if (unlikely(stp##_is_signaling_nan(xb.sfld, \
+ &env->fp_status))) { \
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 0); \
xt.tfld = ttp##_snan_to_qnan(xt.tfld); \
} \
@@ -2553,7 +2554,7 @@ void helper_##op(CPUPPCState *env, uint3
\
for (i = 0; i < nels; i++) { \
if (unlikely(stp##_is_any_nan(xb.sfld))) { \
- if (stp##_is_signaling_nan(xb.sfld)) { \
+ if (stp##_is_signaling_nan(xb.sfld, &env->fp_status)) { \
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 0); \
} \
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXCVI, 0); \
@@ -2662,7 +2663,8 @@ void helper_##op(CPUPPCState *env, uint3
} \
\
for (i = 0; i < nels; i++) { \
- if (unlikely(tp##_is_signaling_nan(xb.fld))) { \
+ if (unlikely(tp##_is_signaling_nan(xb.fld, \
+ &env->fp_status))) { \
fload_invalid_op_excp(env, POWERPC_EXCP_FP_VXSNAN, 0); \
xt.fld = tp##_snan_to_qnan(xb.fld); \
} else { \
===================================================================
@@ -591,7 +591,7 @@ uint64_t HELPER(msdb)(CPUS390XState *env
}
/* test data class 32-bit */
-uint32_t HELPER(tceb)(uint64_t f1, uint64_t m2)
+uint32_t HELPER(tceb)(CPUS390XState *env, uint64_t f1, uint64_t m2)
{
float32 v1 = f1;
int neg = float32_is_neg(v1);
@@ -600,7 +600,8 @@ uint32_t HELPER(tceb)(uint64_t f1, uint6
if ((float32_is_zero(v1) && (m2 & (1 << (11-neg)))) ||
(float32_is_infinity(v1) && (m2 & (1 << (5-neg)))) ||
(float32_is_any_nan(v1) && (m2 & (1 << (3-neg)))) ||
- (float32_is_signaling_nan(v1) && (m2 & (1 << (1-neg))))) {
+ (float32_is_signaling_nan(v1, &env->fpu_status) &&
+ (m2 & (1 << (1-neg))))) {
cc = 1;
} else if (m2 & (1 << (9-neg))) {
/* assume normalized number */
@@ -611,7 +612,7 @@ uint32_t HELPER(tceb)(uint64_t f1, uint6
}
/* test data class 64-bit */
-uint32_t HELPER(tcdb)(uint64_t v1, uint64_t m2)
+uint32_t HELPER(tcdb)(CPUS390XState *env, uint64_t v1, uint64_t m2)
{
int neg = float64_is_neg(v1);
uint32_t cc = 0;
@@ -619,7 +620,8 @@ uint32_t HELPER(tcdb)(uint64_t v1, uint6
if ((float64_is_zero(v1) && (m2 & (1 << (11-neg)))) ||
(float64_is_infinity(v1) && (m2 & (1 << (5-neg)))) ||
(float64_is_any_nan(v1) && (m2 & (1 << (3-neg)))) ||
- (float64_is_signaling_nan(v1) && (m2 & (1 << (1-neg))))) {
+ (float64_is_signaling_nan(v1, &env->fpu_status) &&
+ (m2 & (1 << (1-neg))))) {
cc = 1;
} else if (m2 & (1 << (9-neg))) {
/* assume normalized number */
@@ -630,7 +632,8 @@ uint32_t HELPER(tcdb)(uint64_t v1, uint6
}
/* test data class 128-bit */
-uint32_t HELPER(tcxb)(uint64_t ah, uint64_t al, uint64_t m2)
+uint32_t HELPER(tcxb)(CPUS390XState *env, uint64_t ah,
+ uint64_t al, uint64_t m2)
{
float128 v1 = make_float128(ah, al);
int neg = float128_is_neg(v1);
@@ -639,7 +642,8 @@ uint32_t HELPER(tcxb)(uint64_t ah, uint6
if ((float128_is_zero(v1) && (m2 & (1 << (11-neg)))) ||
(float128_is_infinity(v1) && (m2 & (1 << (5-neg)))) ||
(float128_is_any_nan(v1) && (m2 & (1 << (3-neg)))) ||
- (float128_is_signaling_nan(v1) && (m2 & (1 << (1-neg))))) {
+ (float128_is_signaling_nan(v1, &env->fpu_status) &&
+ (m2 & (1 << (1-neg))))) {
cc = 1;
} else if (m2 & (1 << (9-neg))) {
/* assume normalized number */
===================================================================
@@ -68,9 +68,9 @@ DEF_HELPER_FLAGS_4(maeb, TCG_CALL_NO_WG,
DEF_HELPER_FLAGS_4(madb, TCG_CALL_NO_WG, i64, env, i64, i64, i64)
DEF_HELPER_FLAGS_4(mseb, TCG_CALL_NO_WG, i64, env, i64, i64, i64)
DEF_HELPER_FLAGS_4(msdb, TCG_CALL_NO_WG, i64, env, i64, i64, i64)
-DEF_HELPER_FLAGS_2(tceb, TCG_CALL_NO_RWG_SE, i32, i64, i64)
-DEF_HELPER_FLAGS_2(tcdb, TCG_CALL_NO_RWG_SE, i32, i64, i64)
-DEF_HELPER_FLAGS_3(tcxb, TCG_CALL_NO_RWG_SE, i32, i64, i64, i64)
+DEF_HELPER_FLAGS_3(tceb, TCG_CALL_NO_RWG_SE, i32, env, i64, i64)
+DEF_HELPER_FLAGS_3(tcdb, TCG_CALL_NO_RWG_SE, i32, env, i64, i64)
+DEF_HELPER_FLAGS_4(tcxb, TCG_CALL_NO_RWG_SE, i32, env, i64, i64, i64)
DEF_HELPER_FLAGS_1(clz, TCG_CALL_NO_RWG_SE, i64, i64)
DEF_HELPER_FLAGS_2(sqeb, TCG_CALL_NO_WG, i64, env, i64)
DEF_HELPER_FLAGS_2(sqdb, TCG_CALL_NO_WG, i64, env, i64)
===================================================================
@@ -3513,21 +3513,21 @@ static ExitStatus op_svc(DisasContext *s
static ExitStatus op_tceb(DisasContext *s, DisasOps *o)
{
- gen_helper_tceb(cc_op, o->in1, o->in2);
+ gen_helper_tceb(cc_op, cpu_env, o->in1, o->in2);
set_cc_static(s);
return NO_EXIT;
}
static ExitStatus op_tcdb(DisasContext *s, DisasOps *o)
{
- gen_helper_tcdb(cc_op, o->in1, o->in2);
+ gen_helper_tcdb(cc_op, cpu_env, o->in1, o->in2);
set_cc_static(s);
return NO_EXIT;
}
static ExitStatus op_tcxb(DisasContext *s, DisasOps *o)
{
- gen_helper_tcxb(cc_op, o->out, o->out2, o->in2);
+ gen_helper_tcxb(cc_op, cpu_env, o->out, o->out2, o->in2);
set_cc_static(s);
return NO_EXIT;
}