From d6e2fa6a606a6592c9bcb2c7675b5eb9f1a2371e Mon Sep 17 00:00:00 2001
From: "Christoph M. Wintersteiger" <cwinter@microsoft.com>
Date: Mon, 14 Sep 2015 14:07:11 +0100
Subject: [PATCH] Bugfix for MPF fma.

---
 src/util/mpf.cpp | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/util/mpf.cpp b/src/util/mpf.cpp
index 36974519c..6d51b68ce 100644
--- a/src/util/mpf.cpp
+++ b/src/util/mpf.cpp
@@ -877,10 +877,11 @@ void mpf_manager::fma(mpf_rounding_mode rm, mpf const & x, mpf const & y, mpf co
 
         // Remove the extra bits, keeping a sticky bit. 
         m_mpz_manager.set(sticky_rem, 0);
-        if (o.sbits >= (4+extra))
-            m_mpz_manager.machine_div_rem(o.significand, m_powers2(4+extra), o.significand, sticky_rem);
+        unsigned minbits = (4 + extra);
+        if (o.sbits >= minbits)
+            m_mpz_manager.machine_div_rem(o.significand, m_powers2(o.sbits - minbits), o.significand, sticky_rem);
         else
-            m_mpz_manager.mul2k(o.significand, (4+extra) - o.sbits, o.significand);
+            m_mpz_manager.mul2k(o.significand, minbits - o.sbits, o.significand);
         
         if (!m_mpz_manager.is_zero(sticky_rem) && m_mpz_manager.is_even(o.significand))
             m_mpz_manager.inc(o.significand);