From 7e14505480721339fe95237d5759d93396f25bfb Mon Sep 17 00:00:00 2001 From: vlefevre Date: Fri, 14 Sep 2018 15:04:09 +0000 Subject: [src/mpfr-gmp.h] Fixed bug in add_ssaaaa / sub_ddmmss from r13081. git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@13197 280ebfd0-de03-0410-8827-d642c229c3f4 --- src/mpfr-gmp.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mpfr-gmp.h b/src/mpfr-gmp.h index 29f5ae0f8..a8a6e17b8 100644 --- a/src/mpfr-gmp.h +++ b/src/mpfr-gmp.h @@ -365,8 +365,8 @@ __MPFR_DECLSPEC void mpfr_tmp_free (struct tmp_marker *); #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ do { \ - unsigned long _a = ((ah) << GMP_NUMB_BITS) + (al); \ - unsigned long _b = ((bh) << GMP_NUMB_BITS) + (bl); \ + unsigned long _a = ((unsigned long) (ah) << GMP_NUMB_BITS) + (al); \ + unsigned long _b = ((unsigned long) (bh) << GMP_NUMB_BITS) + (bl); \ unsigned long _s = _a + _b; \ (sh) = (mp_limb_t) (_s >> GMP_NUMB_BITS); \ (sl) = (mp_limb_t) (_s & MPFR_LIMB_MAX); \ @@ -374,8 +374,8 @@ __MPFR_DECLSPEC void mpfr_tmp_free (struct tmp_marker *); #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ do { \ - unsigned long _a = ((ah) << GMP_NUMB_BITS) + (al); \ - unsigned long _b = ((bh) << GMP_NUMB_BITS) + (bl); \ + unsigned long _a = ((unsigned long) (ah) << GMP_NUMB_BITS) + (al); \ + unsigned long _b = ((unsigned long) (bh) << GMP_NUMB_BITS) + (bl); \ unsigned long _s = _a - _b; \ (sh) = (mp_limb_t) (_s >> GMP_NUMB_BITS); \ (sl) = (mp_limb_t) (_s & MPFR_LIMB_MAX); \ -- cgit v1.2.1 From 2bddaf30197fbc66d6be3efb21f42803f5ce3e66 Mon Sep 17 00:00:00 2001 From: vlefevre Date: Fri, 14 Sep 2018 15:19:38 +0000 Subject: [src/add1.c] Fix for 16-bit limb. git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@13198 280ebfd0-de03-0410-8827-d642c229c3f4 --- src/add1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/add1.c b/src/add1.c index f1419f7f1..dfb62b3c1 100644 --- a/src/add1.c +++ b/src/add1.c @@ -189,7 +189,7 @@ mpfr_add1 (mpfr_ptr a, mpfr_srcptr b, mpfr_srcptr c, mpfr_rnd_t rnd_mode) mask = MPFR_LIMB_MASK (sh); bb = ap[0] & mask; - ap[0] &= (~mask) << 1; + ap[0] &= MPFR_LIMB_LSHIFT (~mask, 1); if (bb == 0) fb = 0; else if (bb == mask) -- cgit v1.2.1 From 3aa0008740f848c5ac60ac05d4983e7e666a3af0 Mon Sep 17 00:00:00 2001 From: vlefevre Date: Fri, 14 Sep 2018 15:28:12 +0000 Subject: [tests/random2.c] Fix for 16-bit limb. git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@13199 280ebfd0-de03-0410-8827-d642c229c3f4 --- tests/random2.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/random2.c b/tests/random2.c index 5e364154c..f7f423291 100644 --- a/tests/random2.c +++ b/tests/random2.c @@ -95,10 +95,11 @@ mpfr_random2 (mpfr_ptr x, mp_size_t size, mpfr_exp_t exp, /* Generate a string of nb ones. */ if (nb > bit_pos) { - xp[ri--] = acc | (((mp_limb_t) 2 << bit_pos) - 1); + xp[ri--] = acc | + (MPFR_LIMB_LSHIFT (MPFR_LIMB_ONE, bit_pos + 1) - 1); bit_pos += GMP_NUMB_BITS; bit_pos -= nb; - acc = (~MPFR_LIMB_ONE) << bit_pos; + acc = MPFR_LIMB_LSHIFT (MPFR_LIMB_MAX, bit_pos + 1); } else { -- cgit v1.2.1 From 26b09935e32156a042852307239101d0d99a3c08 Mon Sep 17 00:00:00 2001 From: vlefevre Date: Fri, 14 Sep 2018 21:46:06 +0000 Subject: [src/get_si.c] Code refactoring/simplification like what has been done for get_ui.c in r13185, fixing also an integer overflow when MPFR_LONG_WITHIN_LIMB is not defined. git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@13200 280ebfd0-de03-0410-8827-d642c229c3f4 --- src/get_si.c | 48 ++++++++++++++++++------------------------------ 1 file changed, 18 insertions(+), 30 deletions(-) diff --git a/src/get_si.c b/src/get_si.c index eff3c33a2..05ccecce6 100644 --- a/src/get_si.c +++ b/src/get_si.c @@ -57,44 +57,32 @@ mpfr_get_si (mpfr_srcptr f, mpfr_rnd_t rnd) MPFR_SAVE_EXPO_UPDATE_FLAGS (expo, __gmpfr_flags); /* warning: if x=0, taking its exponent is illegal */ - if (MPFR_UNLIKELY (MPFR_IS_ZERO(x))) + if (MPFR_IS_ZERO (x)) s = 0; else -#ifdef MPFR_LONG_WITHIN_LIMB { - mp_limb_t a; + unsigned long u = 0; mp_size_t n; mpfr_exp_t exp; - /* now the result is in the most significant limb of x */ - exp = MPFR_GET_EXP (x); /* since |x| >= 1, exp >= 1 */ - n = MPFR_LIMB_SIZE(x); - a = MPFR_MANT(x)[n - 1] >> (GMP_NUMB_BITS - exp); - s = MPFR_IS_POS (f) ? a : a <= LONG_MAX ? - (long) a : LONG_MIN; - } + exp = MPFR_GET_EXP (x); + MPFR_ASSERTD (exp >= 1); /* since |x| >= 1 */ + n = MPFR_LIMB_SIZE (x); +#ifdef MPFR_LONG_WITHIN_LIMB + MPFR_ASSERTD (exp <= GMP_NUMB_BITS); #else - { - mp_size_t n; - mpfr_exp_t exp; - - exp = MPFR_GET_EXP (x); - n = MPFR_LIMB_SIZE(x); - /* invariant: the current word x[n-1] has to be multiplied by - 2^(exp - GMP_NUMB_BITS) */ - s = 0; - while (exp > 0) - { - MPFR_ASSERTD(n > 0); - if (exp <= GMP_NUMB_BITS) - s += MPFR_MANT(x)[n - 1] >> (GMP_NUMB_BITS - exp); - else - s += (unsigned long) MPFR_MANT(x)[n - 1] << (exp - GMP_NUMB_BITS); - n --; - exp -= GMP_NUMB_BITS; - } - s = MPFR_IS_POS (f) ? s : s <= LONG_MAX ? - (long) s : LONG_MIN; - } + while (exp > GMP_NUMB_BITS) + { + MPFR_ASSERTD (n > 0); + u += (unsigned long) MPFR_MANT(x)[n - 1] << (exp - GMP_NUMB_BITS); + n--; + exp -= GMP_NUMB_BITS; + } #endif + MPFR_ASSERTD (n > 0); + u += MPFR_MANT(x)[n - 1] >> (GMP_NUMB_BITS - exp); + s = MPFR_IS_POS (f) ? u : u <= LONG_MAX ? - (long) u : LONG_MIN; + } mpfr_clear (x); -- cgit v1.2.1