summaryrefslogtreecommitdiff
path: root/mpz/fib_ui.c
diff options
context:
space:
mode:
authorMarco Bodrato <bodrato@mail.dm.unipi.it>2014-07-28 22:06:30 +0200
committerMarco Bodrato <bodrato@mail.dm.unipi.it>2014-07-28 22:06:30 +0200
commita5adbd2568fdca96e68e3d0abe187446bd353b28 (patch)
tree7d7cf101ce256f67e84095f6e0dc975c9efb834f /mpz/fib_ui.c
parenta49165944f9f9a02ff33bdeed44a7e3b94c88116 (diff)
downloadgmp-a5adbd2568fdca96e68e3d0abe187446bd353b28.tar.gz
mpz/fib_ui.c: #if HAVE_NATIVE_mpn_addlsh1_n, use it.
Diffstat (limited to 'mpz/fib_ui.c')
-rw-r--r--mpz/fib_ui.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/mpz/fib_ui.c b/mpz/fib_ui.c
index c0f57a0dc..f591c0850 100644
--- a/mpz/fib_ui.c
+++ b/mpz/fib_ui.c
@@ -1,6 +1,6 @@
/* mpz_fib_ui -- calculate Fibonacci numbers.
-Copyright 2000-2002, 2005, 2012 Free Software Foundation, Inc.
+Copyright 2000-2002, 2005, 2012, 2014 Free Software Foundation, Inc.
This file is part of the GNU MP Library.
@@ -60,7 +60,7 @@ mpz_fib_ui (mpz_ptr fn, unsigned long n)
mp_ptr fp, xp, yp;
mp_size_t size, xalloc;
unsigned long n2;
- mp_limb_t c, c2;
+ mp_limb_t c;
TMP_DECL;
if (n <= FIB_TABLE_LIMIT)
@@ -72,7 +72,7 @@ mpz_fib_ui (mpz_ptr fn, unsigned long n)
n2 = n/2;
xalloc = MPN_FIB2_SIZE (n2) + 1;
- fp = MPZ_REALLOC (fn, 2*xalloc+1);
+ fp = MPZ_NEWALLOC (fn, 2 * xalloc);
TMP_MARK;
TMP_ALLOC_LIMBS_2 (xp,xalloc, yp,xalloc);
@@ -93,8 +93,11 @@ mpz_fib_ui (mpz_ptr fn, unsigned long n)
yp[size] = 0;
ASSERT_NOCARRY (mpn_add_n_sub_n (xp, yp, xp, yp, size+1));
xsize = size + (xp[size] != 0);
- ysize = size + (yp[size] != 0);
+ ASSERT (yp[size] <= 1);
+ ysize = size + yp[size];
#else
+ mp_limb_t c2;
+
c2 = mpn_lshift (fp, xp, size, 1);
c = c2 + mpn_add_n (xp, fp, yp, size);
xp[size] = c;
@@ -131,8 +134,12 @@ mpz_fib_ui (mpz_ptr fn, unsigned long n)
/* F[2k] = F[k]*(F[k]+2F[k-1]) */
mp_size_t xsize, ysize;
+#if HAVE_NATIVE_mpn_addlsh1_n
+ c = mpn_addlsh1_n (yp, xp, yp, size);
+#else
c = mpn_lshift (yp, yp, size, 1);
c += mpn_add_n (yp, yp, xp, size);
+#endif
yp[size] = c;
xsize = size;
ysize = size + (c != 0);