softfloat: Handle float_muladd_negate_c when product is zero
authorRichard Sandiford <rdsandiford@googlemail.com>
Tue, 22 Jan 2013 17:03:05 +0000 (17:03 +0000)
committerBlue Swirl <blauwirbel@gmail.com>
Sat, 26 Jan 2013 13:22:09 +0000 (13:22 +0000)
Honour float_muladd_negate_c in the case where the product is zero and
c is nonzero.  Previously we would fail to negate c.

Seen in (and tested against) the gfortran testsuite on MIPS.

Signed-off-by: Richard Sandiford <rdsandiford@googlemail.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
fpu/softfloat.c

index ac3d150015e2afdce97f31ccb17a2ad3001bf4f2..83ccc4b8cd31254d449a28e29d88375a8d928aee 100644 (file)
@@ -2234,7 +2234,7 @@ float32 float32_muladd(float32 a, float32 b, float32 c, int flags STATUS_PARAM)
             }
         }
         /* Zero plus something non-zero : just return the something */
-        return make_float32(float32_val(c) ^ (signflip << 31));
+        return packFloat32(cSign ^ signflip, cExp, cSig);
     }
 
     if (aExp == 0) {
@@ -3787,7 +3787,7 @@ float64 float64_muladd(float64 a, float64 b, float64 c, int flags STATUS_PARAM)
             }
         }
         /* Zero plus something non-zero : just return the something */
-        return make_float64(float64_val(c) ^ ((uint64_t)signflip << 63));
+        return packFloat64(cSign ^ signflip, cExp, cSig);
     }
 
     if (aExp == 0) {