diff options
author | tege <tege@gmplib.org> | 2002-04-23 16:04:33 +0200 |
---|---|---|
committer | tege <tege@gmplib.org> | 2002-04-23 16:04:33 +0200 |
commit | 9927fcd017e83339c4229a7b9f7af881e1ecc384 (patch) | |
tree | 3ad74e386a32fc7151dc599f798fefa34aeb34eb /mpz/fits_s.h | |
parent | 6481760fe9fc81823c4b67744b2682ab276d66b0 (diff) | |
download | gmp-9927fcd017e83339c4229a7b9f7af881e1ecc384.tar.gz |
Rewrite again.
Diffstat (limited to 'mpz/fits_s.h')
-rw-r--r-- | mpz/fits_s.h | 28 |
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; } |