summaryrefslogtreecommitdiff
path: root/rts
diff options
context:
space:
mode:
authorHerbert Valerio Riedel <hvr@gnu.org>2014-11-19 11:09:33 +0100
committerHerbert Valerio Riedel <hvr@gnu.org>2014-11-19 11:37:07 +0100
commite2af452cd533778c5447719c59429d72bb1fe00d (patch)
tree5b8961b0a7ad233f861d160f2830067c399619cd /rts
parent42244668af6d8c1dd6a2d64af90ed57d8ecd8d88 (diff)
downloadhaskell-e2af452cd533778c5447719c59429d72bb1fe00d.tar.gz
Restore exact old semantics of `decodeFloat`
`integer-gmp2` uses the new 64bit-based IEEE deconstructing primop introduced in b62bd5ecf3be421778e4835010b6b334e95c5a56. However, the returned values differ for exceptional IEEE values: Previous (expected) semantics: > decodeFloat (-1/0) (-4503599627370496,972) > decodeFloat (1/0) (4503599627370496,972) > decodeFloat (0/0) (-6755399441055744,972) Currently (broken) semantics: > decodeFloat (-1/0 :: Double) (-9223372036854775808,-53) > decodeFloat (1/0 :: Double) (-9223372036854775808,-53) > decodeFloat (0/0 :: Double) (-9223372036854775808,-53) This patch reverts to the old expected semantics. I plan to revisit the implementation during GHC 7.11 development. This should address #9810 Reviewed By: austin, ekmett, luite Differential Revision: https://phabricator.haskell.org/D486
Diffstat (limited to 'rts')
-rw-r--r--rts/StgPrimFloat.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/rts/StgPrimFloat.c b/rts/StgPrimFloat.c
index 72a251b33e..e2eeee5c92 100644
--- a/rts/StgPrimFloat.c
+++ b/rts/StgPrimFloat.c
@@ -166,6 +166,8 @@ __decodeDouble_2Int (I_ *man_sign, W_ *man_high, W_ *man_low, I_ *exp, StgDouble
StgInt
__decodeDouble_Int64 (StgInt64 *const mantissa, const StgDouble dbl)
{
+#if 0
+ // We can't use this yet as-is, see ticket #9810
if (dbl) {
int exp = 0;
*mantissa = (StgInt64)scalbn(frexp(dbl, &exp), DBL_MANT_DIG);
@@ -174,6 +176,17 @@ __decodeDouble_Int64 (StgInt64 *const mantissa, const StgDouble dbl)
*mantissa = 0;
return 0;
}
+#else
+ I_ man_sign = 0;
+ W_ man_high = 0, man_low = 0;
+ I_ exp = 0;
+
+ __decodeDouble_2Int (&man_sign, &man_high, &man_low, &exp, dbl);
+
+ *mantissa = ((((StgInt64)man_high << 32) | (StgInt64)man_low)
+ * (StgInt64)man_sign);
+ return exp;
+#endif
}
/* Convenient union types for checking the layout of IEEE 754 types -