summaryrefslogtreecommitdiff
path: root/mpz/set_si.c
diff options
context:
space:
mode:
authortege <tege@gmplib.org>2002-04-14 03:29:35 +0200
committertege <tege@gmplib.org>2002-04-14 03:29:35 +0200
commitfb3dd1b6ed701065bf082fee7f8cff05e62327ee (patch)
tree4cf03cdcaa57e98cbfe1ef79b4ff184f8a4040c1 /mpz/set_si.c
parenta72a5f7dd3b43c9781d2f88418131827e9808397 (diff)
downloadgmp-fb3dd1b6ed701065bf082fee7f8cff05e62327ee.tar.gz
Nailify.
Diffstat (limited to 'mpz/set_si.c')
-rw-r--r--mpz/set_si.c20
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;
}