summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2018-09-14 21:47:14 +0000
committervlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2018-09-14 21:47:14 +0000
commit6ec0b1c3801dc667fce4dbe0615bb4288fa53e1c (patch)
tree2c78fc7151c3bc6e967ae237e6fa3930e4a72ef6
parent5e571c619842bca39f0e12d0b1eee2c1064d9f90 (diff)
parent26b09935e32156a042852307239101d0d99a3c08 (diff)
downloadmpfr-6ec0b1c3801dc667fce4dbe0615bb4288fa53e1c.tar.gz
Merged the latest changes from the trunk (bug fixes).
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/branches/with-mini-gmp@13201 280ebfd0-de03-0410-8827-d642c229c3f4
-rw-r--r--src/add1.c2
-rw-r--r--src/get_si.c48
-rw-r--r--src/mpfr-gmp.h8
-rw-r--r--tests/random2.c5
4 files changed, 26 insertions, 37 deletions
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)
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);
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); \
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
{