shithub: mc

Download patch

ref: c79e884fc2aedd7695d73b1f0e5fe8059cb451d3
parent: 55f06152abf5c462d459acbc33ac2fc09e37fe46
author: S. Gilles <[email protected]>
date: Thu Mar 22 05:56:30 EDT 2018

Correct off-by-one for subnormals when converting flt64 to flt32

--- a/lib/math/fpmath-fma-impl.myr
+++ b/lib/math/fpmath-fma-impl.myr
@@ -44,11 +44,6 @@
 		-> flt32fromflt64(r)
 	;;
 
-	/* We can check if rounding was performed by undoing */
-	if flt32fromflt64(r - prod) == z
-		-> flt32fromflt64(r)
-	;;
-
 	/*
 	   At this point, there's definitely about to be a rounding
 	   error. To figure out what to do, compute prod + z with
@@ -139,7 +134,7 @@
 		;;
 	;;
 
-	if e >= -126
+	if e >= -127
 		/* normal */
 		ts = ((s >> (52 - 23)) : uint32)
 		if need_round_away(0, s, 52 - 23)
--- a/lib/math/test/fpmath-fma-impl.myr
+++ b/lib/math/test/fpmath-fma-impl.myr
@@ -35,6 +35,15 @@
 		(0x3745461a, 0x4db9b736, 0xb6d7deff, 0x458f1cd8),
 		(0xa3ccfd37, 0x7f800000, 0xed328e70, 0xff800000),
 		(0xa3790205, 0x5033a3e6, 0xa001fd11, 0xb42ebbd5),
+		(0xa4932927, 0xc565bc34, 0x316887af, 0x31688bcf),
+		(0x83dd6ede, 0x31ddf8e6, 0x01fea4c8, 0x01fea4c7),
+		(0xa4988128, 0x099a41ad, 0x00800000, 0x00800000),
+		(0x1e0479cd, 0x91d5fcb4, 0x00800000, 0x00800000),
+		(0x2f413021, 0x0a3f5a4e, 0x80800483, 0x80800000),
+		(0x144dcd10, 0x12f4aba0, 0x80800000, 0x80800000),
+		(0x0d580b86, 0x435768a8, 0x966c8d6f, 0x966c5ffd),
+		(0xa19e9a6f, 0xb49af3e3, 0xa2468b59, 0xa2468b57),
+		(0xd119e996, 0x8e5ad0e3, 0x247e0028, 0x247e83b7),
 	][:]
 
 	for (x, y, z, r) : inputs