ARM: Fix an issue with clang generating wrong code.
authorAli Saidi <Ali.Saidi@ARM.com>
Fri, 15 Feb 2013 22:40:08 +0000 (17:40 -0500)
committerAli Saidi <Ali.Saidi@ARM.com>
Fri, 15 Feb 2013 22:40:08 +0000 (17:40 -0500)
Clang generated executables would enter the if condition when it wasn't
supposted to, resulting in the wrong simulated behavior.
Implementing the operation this way is a bit faster anyway.

src/arch/arm/insts/vfp.cc

index f689204d9c79b5de3d49a397739b2d34e0371d9a..6e15282f81c5164ea08753e42e9e4fd1e33045a5 100644 (file)
@@ -993,9 +993,8 @@ FpOp::binaryOp(FPSCR &fpscr, fpType op1, fpType op2,
     fpType dest = func(op1, op2);
     __asm__ __volatile__ ("" : "=m" (dest) : "m" (dest));
 
-    int fpClass = std::fpclassify(dest);
     // Get NAN behavior right. This varies between x86 and ARM.
-    if (fpClass == FP_NAN) {
+    if (std::isnan(dest)) {
         const bool single = (sizeof(fpType) == sizeof(float));
         const uint64_t qnan =
             single ? 0x7fc00000 : ULL(0x7ff8000000000000);
@@ -1065,9 +1064,8 @@ FpOp::unaryOp(FPSCR &fpscr, fpType op1, fpType (*func)(fpType),
     fpType dest = func(op1);
     __asm__ __volatile__ ("" : "=m" (dest) : "m" (dest));
 
-    int fpClass = std::fpclassify(dest);
     // Get NAN behavior right. This varies between x86 and ARM.
-    if (fpClass == FP_NAN) {
+    if (std::isnan(dest)) {
         const bool single = (sizeof(fpType) == sizeof(float));
         const uint64_t qnan =
             single ? 0x7fc00000 : ULL(0x7ff8000000000000);