target-arm: Implement correct NaN propagation rules

Implement the correct NaN propagation rules for ARM targets by
providing an appropriate pickNaN function.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
Peter Maydell 2010-12-16 11:51:18 +00:00 committed by Aurelien Jarno
parent 354f211b1a
commit 011da610ba
1 changed files with 23 additions and 0 deletions

View File

@ -168,6 +168,28 @@ static float32 commonNaNToFloat32( commonNaNT a )
| tie-break rule.
*----------------------------------------------------------------------------*/
#if defined(TARGET_ARM)
static int pickNaN(flag aIsQNaN, flag aIsSNaN, flag bIsQNaN, flag bIsSNaN,
flag aIsLargerSignificand)
{
/* ARM mandated NaN propagation rules: take the first of:
* 1. A if it is signaling
* 2. B if it is signaling
* 3. A (quiet)
* 4. B (quiet)
* A signaling NaN is always quietened before returning it.
*/
if (aIsSNaN) {
return 0;
} else if (bIsSNaN) {
return 1;
} else if (aIsQNaN) {
return 0;
} else {
return 1;
}
}
#else
static int pickNaN(flag aIsQNaN, flag aIsSNaN, flag bIsQNaN, flag bIsSNaN,
flag aIsLargerSignificand)
{
@ -197,6 +219,7 @@ static int pickNaN(flag aIsQNaN, flag aIsSNaN, flag bIsQNaN, flag bIsSNaN,
return 1;
}
}
#endif
/*----------------------------------------------------------------------------
| Takes two single-precision floating-point values `a' and `b', one of which