diff --git a/ghc/runtime/gmp/mpz_get_si.c b/ghc/runtime/gmp/mpz_get_si.c
index 9cddf4be7761a122b05e5d4d3272e48978e45e69..b2b87a7bf42acf77a68e490eb49446263eb7927e 100644
--- a/ghc/runtime/gmp/mpz_get_si.c
+++ b/ghc/runtime/gmp/mpz_get_si.c
@@ -34,7 +34,7 @@ mpz_get_si (integer)
   if (size > 0)
     return integer->d[0] % ((mp_limb) 1 << (BITS_PER_MP_LIMB - 1));
   else if (size < 0)
-    return -(integer->d[0] % ((mp_limb) 1 << (BITS_PER_MP_LIMB - 1)));
+    return ~((integer->d[0] - 1) % ((mp_limb) 1 << (BITS_PER_MP_LIMB - 1)));
   else
     return 0;
 }