diff options
author | tege <tege@gmplib.org> | 2002-04-14 03:29:35 +0200 |
---|---|---|
committer | tege <tege@gmplib.org> | 2002-04-14 03:29:35 +0200 |
commit | fb3dd1b6ed701065bf082fee7f8cff05e62327ee (patch) | |
tree | 4cf03cdcaa57e98cbfe1ef79b4ff184f8a4040c1 /mpz/set_si.c | |
parent | a72a5f7dd3b43c9781d2f88418131827e9808397 (diff) | |
download | gmp-fb3dd1b6ed701065bf082fee7f8cff05e62327ee.tar.gz |
Nailify.
Diffstat (limited to 'mpz/set_si.c')
-rw-r--r-- | mpz/set_si.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/mpz/set_si.c b/mpz/set_si.c index c16901619..351d8a544 100644 --- a/mpz/set_si.c +++ b/mpz/set_si.c @@ -26,6 +26,22 @@ MA 02111-1307, USA. */ void mpz_set_si (mpz_ptr dest, signed long int val) { - dest->_mp_d[0] = (unsigned long) (val >= 0 ? val : -val); - dest->_mp_size = (val > 0 ? 1 : val == 0 ? 0 : -1); + mp_size_t size; + mp_limb_t vl; + + vl = val >= 0 ? val : -val; + + dest->_mp_d[0] = vl & GMP_NUMB_MASK; + size = vl != 0; + +#if GMP_NAIL_BITS != 0 + if (vl > GMP_NUMB_MAX) + { + MPZ_REALLOC (dest, 2); + dest->_mp_d[1] = vl >> GMP_NUMB_BITS; + size = 2; + } +#endif + + dest->_mp_size = val >= 0 ? size : -size; } |