summaryrefslogtreecommitdiff
path: root/mpz/fits_s.h
diff options
context:
space:
mode:
authortege <tege@gmplib.org>2002-04-23 16:04:33 +0200
committertege <tege@gmplib.org>2002-04-23 16:04:33 +0200
commit9927fcd017e83339c4229a7b9f7af881e1ecc384 (patch)
tree3ad74e386a32fc7151dc599f798fefa34aeb34eb /mpz/fits_s.h
parent6481760fe9fc81823c4b67744b2682ab276d66b0 (diff)
downloadgmp-9927fcd017e83339c4229a7b9f7af881e1ecc384.tar.gz
Rewrite again.
Diffstat (limited to 'mpz/fits_s.h')
-rw-r--r--mpz/fits_s.h28
1 files changed, 20 insertions, 8 deletions
diff --git a/mpz/fits_s.h b/mpz/fits_s.h
index 4d8e18723..4fc0848bc 100644
--- a/mpz/fits_s.h
+++ b/mpz/fits_s.h
@@ -28,13 +28,25 @@ FUNCTION (mpz_srcptr z)
{
mp_size_t n = SIZ(z);
mp_ptr p = PTR(z);
-
- return (n == 0
- || (n == 1 && p[0] <= MAXIMUM)
- || (n == -1 && p[0] <= - (mp_limb_t) MINIMUM)
-#if GMP_NAIL_BITS != 0 /* too broad, better compare MAXIMUM to GMP_NUMB_MAX */
- || (n == 2 && p[1] <= (MAXIMUM >> GMP_NUMB_BITS))
- || (n == -2 && p[1] <= (- (mp_limb_t) MINIMUM) >> GMP_NUMB_BITS)
+ mp_limb_t limb = p[0];
+
+ if (n == 0)
+ return 1;
+ if (n == 1)
+ return limb <= MAXIMUM;
+ if (n == -1)
+ return limb <= - (mp_limb_t) MINIMUM;
+#if GMP_NAIL_BITS != 0
+ {
+ if ((p[1] >> GMP_NAIL_BITS) == 0)
+ {
+ limb += p[1] << GMP_NUMB_BITS;
+ if (n == 2)
+ return limb <= MAXIMUM;
+ if (n == -2)
+ return limb <= - (mp_limb_t) MINIMUM;
+ }
+ }
#endif
- );
+ return 0;
}