summaryrefslogtreecommitdiff
path: root/src/arch/arm
diff options
context:
space:
mode:
authorAli Saidi <Ali.Saidi@ARM.com>2013-02-15 17:40:08 -0500
committerAli Saidi <Ali.Saidi@ARM.com>2013-02-15 17:40:08 -0500
commitdb5c478e707ba5c7ffe8713ece5534924208500a (patch)
tree2b9534a2915e78032cd15d529e0158324d12791f /src/arch/arm
parent44120460411b97bf084fb24a669bd5e600601cb5 (diff)
downloadgem5-db5c478e707ba5c7ffe8713ece5534924208500a.tar.xz
arm: fix some fp comparisons that worked by accident.
The explict tests in the follwing fp comparison operations were incorrect as they checked for only signaling NaNs and not quite-NaNs as well. When compiled with gcc, the comparison generates a fp exception that causes the FE_INVALID flag to be set and we check for it, so even though the check was incorrect, the correct exception was set. With clang this behavior seems to not occur. The checks are updated to test for nans and the behavior is now correct with both clang and gcc.
Diffstat (limited to 'src/arch/arm')
-rw-r--r--src/arch/arm/isa/insts/neon.isa12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/arch/arm/isa/insts/neon.isa b/src/arch/arm/isa/insts/neon.isa
index b1ad1eeb3..3296b3b55 100644
--- a/src/arch/arm/isa/insts/neon.isa
+++ b/src/arch/arm/isa/insts/neon.isa
@@ -565,7 +565,7 @@ output exec {{
static float
vcgtFunc(float op1, float op2)
{
- if (isSnan(op1) || isSnan(op2))
+ if (std::isnan(op1) || std::isnan(op2))
return 2.0;
return (op1 > op2) ? 0.0 : 1.0;
}
@@ -573,7 +573,7 @@ output exec {{
static float
vcgeFunc(float op1, float op2)
{
- if (isSnan(op1) || isSnan(op2))
+ if (std::isnan(op1) || std::isnan(op2))
return 2.0;
return (op1 >= op2) ? 0.0 : 1.0;
}
@@ -589,7 +589,7 @@ output exec {{
static float
vcleFunc(float op1, float op2)
{
- if (isSnan(op1) || isSnan(op2))
+ if (std::isnan(op1) || std::isnan(op2))
return 2.0;
return (op1 <= op2) ? 0.0 : 1.0;
}
@@ -597,7 +597,7 @@ output exec {{
static float
vcltFunc(float op1, float op2)
{
- if (isSnan(op1) || isSnan(op2))
+ if (std::isnan(op1) || std::isnan(op2))
return 2.0;
return (op1 < op2) ? 0.0 : 1.0;
}
@@ -605,7 +605,7 @@ output exec {{
static float
vacgtFunc(float op1, float op2)
{
- if (isSnan(op1) || isSnan(op2))
+ if (std::isnan(op1) || std::isnan(op2))
return 2.0;
return (fabsf(op1) > fabsf(op2)) ? 0.0 : 1.0;
}
@@ -613,7 +613,7 @@ output exec {{
static float
vacgeFunc(float op1, float op2)
{
- if (isSnan(op1) || isSnan(op2))
+ if (std::isnan(op1) || std::isnan(op2))
return 2.0;
return (fabsf(op1) >= fabsf(op2)) ? 0.0 : 1.0;
}