diff options
author | tege <tege@gmplib.org> | 2002-05-06 15:22:19 +0200 |
---|---|---|
committer | tege <tege@gmplib.org> | 2002-05-06 15:22:19 +0200 |
commit | 9080f17b46e75167b7f3bde7c1f0d45f99621db3 (patch) | |
tree | 74c3c0b10276e1ee3f3afc2184523f9594867e63 | |
parent | bd3be8816de78cfeee4881fe50ff0e1f6d7410f2 (diff) | |
download | gmp-9080f17b46e75167b7f3bde7c1f0d45f99621db3.tar.gz |
Nailify.
-rw-r--r-- | mpf/mul_2exp.c | 11 | ||||
-rw-r--r-- | mpf/random2.c | 2 | ||||
-rw-r--r-- | mpf/set_q.c | 3 | ||||
-rw-r--r-- | mpf/set_si.c | 23 | ||||
-rw-r--r-- | mpf/set_str.c | 5 | ||||
-rw-r--r-- | mpf/set_ui.c | 18 | ||||
-rw-r--r-- | mpf/sub.c | 24 | ||||
-rw-r--r-- | mpf/ui_div.c | 35 | ||||
-rw-r--r-- | mpf/ui_sub.c | 18 | ||||
-rw-r--r-- | mpf/urandomb.c | 10 | ||||
-rw-r--r-- | tests/mpf/t-trunc.c | 16 |
11 files changed, 106 insertions, 59 deletions
diff --git a/mpf/mul_2exp.c b/mpf/mul_2exp.c index 16e2ee3f6..00f0e45e7 100644 --- a/mpf/mul_2exp.c +++ b/mpf/mul_2exp.c @@ -44,7 +44,7 @@ mpf_mul_2exp (mpf_ptr r, mpf_srcptr u, unsigned long int exp) abs_usize = ABS (usize); up = u->_mp_d; - if (exp % BITS_PER_MP_LIMB == 0) + if (exp % GMP_NUMB_BITS == 0) { prec++; /* retain more precision here as we don't need to account for carry-out here */ @@ -55,7 +55,7 @@ mpf_mul_2exp (mpf_ptr r, mpf_srcptr u, unsigned long int exp) } if (rp != up) MPN_COPY_INCR (rp, up, abs_usize); - r->_mp_exp = uexp + exp / BITS_PER_MP_LIMB; + r->_mp_exp = uexp + exp / GMP_NUMB_BITS; } else { @@ -68,19 +68,20 @@ mpf_mul_2exp (mpf_ptr r, mpf_srcptr u, unsigned long int exp) /* Use mpn_rshift since mpn_lshift operates downwards, and we therefore would clobber part of U before using that part, in case R is the same variable as U. */ - cy_limb = mpn_rshift (rp + 1, up, abs_usize, (-exp) % BITS_PER_MP_LIMB); + cy_limb = mpn_rshift (rp + 1, up, abs_usize, + GMP_NUMB_BITS - exp % GMP_NUMB_BITS); rp[0] = cy_limb; adj = rp[abs_usize] != 0; } else { - cy_limb = mpn_lshift (rp, up, abs_usize, exp % BITS_PER_MP_LIMB); + cy_limb = mpn_lshift (rp, up, abs_usize, exp % GMP_NUMB_BITS); rp[abs_usize] = cy_limb; adj = cy_limb != 0; } abs_usize += adj; - r->_mp_exp = uexp + exp / BITS_PER_MP_LIMB + adj; + r->_mp_exp = uexp + exp / GMP_NUMB_BITS + adj; } r->_mp_size = usize >= 0 ? abs_usize : -abs_usize; } diff --git a/mpf/random2.c b/mpf/random2.c index 118d62c5c..26e6a2714 100644 --- a/mpf/random2.c +++ b/mpf/random2.c @@ -43,7 +43,7 @@ mpf_random2 (mpf_ptr x, mp_size_t size, mp_exp_t exp) if (exp != 0) { - _gmp_rand (&elimb, RANDS, BITS_PER_MP_LIMB); + _gmp_rand (&elimb, RANDS, GMP_NUMB_BITS); exp = elimb % (2 * exp) - exp; } x->_mp_exp = asize == 0 ? 0 : exp; diff --git a/mpf/set_q.c b/mpf/set_q.c index ef62b832d..f86b788a9 100644 --- a/mpf/set_q.c +++ b/mpf/set_q.c @@ -78,13 +78,14 @@ mpf_set_q (mpf_t r, mpq_srcptr q) /* Normalize the denominator, i.e. make its most significant bit set by shifting it NORMALIZATION_STEPS bits to the left. Also shift the numerator the same number of steps (to keep the quotient the same!). */ - if (! (dp[dsize-1] & MP_LIMB_T_HIGHBIT)) + if ((dp[dsize - 1] & GMP_NUMB_HIGHBIT) == 0) { mp_ptr tp; mp_limb_t nlimb; unsigned normalization_steps; count_leading_zeros (normalization_steps, dp[dsize - 1]); + normalization_steps -= GMP_NAIL_BITS; /* Shift up the denominator setting the most significant bit of the most significant limb. Use temporary storage not to clobber diff --git a/mpf/set_si.c b/mpf/set_si.c index 020d647ac..dd9a594cf 100644 --- a/mpf/set_si.c +++ b/mpf/set_si.c @@ -23,9 +23,24 @@ MA 02111-1307, USA. */ #include "gmp-impl.h" void -mpf_set_si (mpf_ptr f, long n) +mpf_set_si (mpf_ptr dest, long val) { - f->_mp_d[0] = (unsigned long) (n >= 0 ? n : -n); - f->_mp_exp = (n != 0); - f->_mp_size = (n < 0 ? -1 : n != 0); + mp_size_t size; + mp_limb_t vl; + + vl = (mp_limb_t) (unsigned long int) (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) + { + dest->_mp_d[1] = vl >> GMP_NUMB_BITS; + size = 2; + } +#endif + + dest->_mp_exp = size; + dest->_mp_size = val >= 0 ? size : -size; } diff --git a/mpf/set_str.c b/mpf/set_str.c index 7e2becfd4..306dd27db 100644 --- a/mpf/set_str.c +++ b/mpf/set_str.c @@ -244,7 +244,7 @@ mpf_set_str (mpf_ptr x, const char *str, int base) rp[0] = base; rsize = 1; count_leading_zeros (cnt, exp_in_base); - for (i = BITS_PER_MP_LIMB - cnt - 2; i >= 0; i--) + for (i = GMP_LIMB_BITS - cnt - 2; i >= 0; i--) { mpn_sqr_n (tp, rp, rsize); rsize = 2 * rsize; @@ -290,10 +290,11 @@ mpf_set_str (mpf_ptr x, const char *str, int base) madj -= rsize - msize; msize = rsize; } - if (! (rp[rsize-1] & MP_LIMB_T_HIGHBIT)) + if ((rp[rsize - 1] & GMP_NUMB_HIGHBIT) == 0) { mp_limb_t cy; count_leading_zeros (cnt, rp[rsize - 1]); + cnt -= GMP_NAIL_BITS; mpn_lshift (rp, rp, rsize, cnt); cy = mpn_lshift (mp, mp, msize, cnt); if (cy) diff --git a/mpf/set_ui.c b/mpf/set_ui.c index 8f10bd9b1..8c530f617 100644 --- a/mpf/set_ui.c +++ b/mpf/set_ui.c @@ -23,8 +23,20 @@ MA 02111-1307, USA. */ #include "gmp-impl.h" void -mpf_set_ui (mpf_ptr f, unsigned long n) +mpf_set_ui (mpf_ptr f, unsigned long val) { - f->_mp_d[0] = n; - f->_mp_exp = f->_mp_size = (n != 0); + mp_size_t size; + + f->_mp_d[0] = val & GMP_NUMB_MASK; + size = val != 0; + +#if GMP_NAIL_BITS != 0 + if (val > GMP_NUMB_MAX) + { + f->_mp_d[1] = val >> GMP_NUMB_BITS; + size = 2; + } +#endif + + f->_mp_exp = f->_mp_size = size; } @@ -156,7 +156,7 @@ mpf_sub (mpf_ptr r, mpf_srcptr u, mpf_srcptr v) 1 00000000 ... 0 ffffffff ... */ - if (up[usize - 1] != 1 || vp[vsize - 1] != ~(mp_limb_t) 0 + if (up[usize - 1] != 1 || vp[vsize - 1] != GMP_NUMB_MAX || (usize >= 2 && up[usize - 2] != 0)) goto general_case; @@ -166,7 +166,7 @@ mpf_sub (mpf_ptr r, mpf_srcptr u, mpf_srcptr v) /* Skip sequences of 00000000/ffffffff */ while (vsize != 0 && usize != 0 && up[usize - 1] == 0 - && vp[vsize - 1] == ~(mp_limb_t) 0) + && vp[vsize - 1] == GMP_NUMB_MAX) { usize--; vsize--; @@ -175,7 +175,7 @@ mpf_sub (mpf_ptr r, mpf_srcptr u, mpf_srcptr v) if (usize == 0) { - while (vsize != 0 && vp[vsize - 1] == ~(mp_limb_t) 0) + while (vsize != 0 && vp[vsize - 1] == GMP_NUMB_MAX) { vsize--; exp--; @@ -212,7 +212,7 @@ mpf_sub (mpf_ptr r, mpf_srcptr u, mpf_srcptr v) mp_size_t size, i; size = vsize; for (i = 0; i < size; i++) - tp[i] = ~vp[i]; + tp[i] = ~vp[i] & GMP_NUMB_MASK; cy_limb = 1 - mpn_add_1 (tp, tp, vsize, (mp_limb_t) 1); rsize = vsize; if (cy_limb == 0) @@ -240,7 +240,7 @@ mpf_sub (mpf_ptr r, mpf_srcptr u, mpf_srcptr v) mp_size_t size, i; size = vsize - usize; for (i = 0; i < size; i++) - tp[i] = ~vp[i]; + tp[i] = ~vp[i] & GMP_NUMB_MASK; cy_limb = mpn_sub_n (tp + size, up, vp + size, usize); cy_limb+= mpn_sub_1 (tp + size, tp + size, usize, (mp_limb_t) 1); cy_limb-= mpn_add_1 (tp, tp, vsize, (mp_limb_t) 1); @@ -339,9 +339,9 @@ general_case: /* vvvvvvv */ mp_size_t size, i; size = vsize - usize; - tp[0] = -vp[0]; + tp[0] = -vp[0] & GMP_NUMB_MASK; for (i = 1; i < size; i++) - tp[i] = ~vp[i]; + tp[i] = ~vp[i] & GMP_NUMB_MASK; mpn_sub_n (tp + size, up, vp + size, usize); mpn_sub_1 (tp + size, tp + size, usize, (mp_limb_t) 1); rsize = vsize; @@ -365,9 +365,9 @@ general_case: /* vvvvv */ mp_size_t size, i; size = vsize + ediff - usize; - tp[0] = -vp[0]; + tp[0] = -vp[0] & GMP_NUMB_MASK; for (i = 1; i < size; i++) - tp[i] = ~vp[i]; + tp[i] = ~vp[i] & GMP_NUMB_MASK; mpn_sub (tp + size, up, usize, vp + size, usize - ediff); mpn_sub_1 (tp + size, tp + size, usize, (mp_limb_t) 1); rsize = vsize + ediff; @@ -380,11 +380,11 @@ general_case: /* vv */ mp_size_t size, i; size = vsize + ediff - usize; - tp[0] = -vp[0]; + tp[0] = -vp[0] & GMP_NUMB_MASK; for (i = 1; i < vsize; i++) - tp[i] = ~vp[i]; + tp[i] = ~vp[i] & GMP_NUMB_MASK; for (i = vsize; i < size; i++) - tp[i] = ~(mp_limb_t) 0; + tp[i] = GMP_NUMB_MAX; mpn_sub_1 (tp + size, up, usize, (mp_limb_t) 1); rsize = size + usize; } diff --git a/mpf/ui_div.c b/mpf/ui_div.c index 330668ad7..e2056ba05 100644 --- a/mpf/ui_div.c +++ b/mpf/ui_div.c @@ -67,15 +67,15 @@ mpf_ui_div (mpf_ptr r, unsigned long int u, mpf_srcptr v) tp = (mp_ptr) TMP_ALLOC ((tsize + 1) * BYTES_PER_MP_LIMB); MPN_ZERO (tp, tsize); - /* Normalize the divisor and the dividend. */ - if (! (vp[vsize - 1] & MP_LIMB_T_HIGHBIT)) + if ((vp[vsize - 1] & GMP_NUMB_HIGHBIT) == 0) { mp_ptr tmp; mp_limb_t dividend_high, dividend_low; unsigned normalization_steps; count_leading_zeros (normalization_steps, vp[vsize - 1]); + normalization_steps -= GMP_NAIL_BITS; /* Shift up the divisor setting the most significant bit of the most significant limb. Use temporary storage not to clobber @@ -86,15 +86,26 @@ mpf_ui_div (mpf_ptr r, unsigned long int u, mpf_srcptr v) /* Shift up the dividend, possibly introducing a new most significant word. */ - dividend_high = (mp_limb_t) u >> (BITS_PER_MP_LIMB - normalization_steps); - dividend_low = (mp_limb_t) u << normalization_steps; + dividend_high = (mp_limb_t) u >> (GMP_NUMB_BITS - normalization_steps); + dividend_low = ((mp_limb_t) u << normalization_steps) & GMP_NUMB_MASK; tp[tsize - 1] = dividend_low; if (dividend_high != 0) { - tp[tsize] = dividend_high; - tsize++; - rexp++; + if (GMP_NAIL_BITS != 0 && dividend_high > vp[vsize - 1]) + { + tp[tsize - 2] = dividend_low; + tp[tsize - 1] = dividend_high & GMP_NUMB_MASK; + tp[tsize] = dividend_high >> GMP_NUMB_BITS; + tsize++; + rexp += 2; + } + else + { + tp[tsize] = dividend_high; + tsize++; + rexp++; + } } } else @@ -108,7 +119,15 @@ mpf_ui_div (mpf_ptr r, unsigned long int u, mpf_srcptr v) vp = (mp_srcptr) tmp; } - tp[tsize - 1] = u; + tp[tsize - 1] = u & GMP_NUMB_MASK; +#if GMP_NAIL_BITS != 0 + if (u > GMP_NUMB_MAX) + { + tp[tsize] = u >> GMP_NUMB_BITS; + tsize++; + rexp++; + } +#endif } q_limb = mpn_divmod (rp, tp, tsize, vp, vsize); diff --git a/mpf/ui_sub.c b/mpf/ui_sub.c index ae34a28bd..e6a65d968 100644 --- a/mpf/ui_sub.c +++ b/mpf/ui_sub.c @@ -210,9 +210,9 @@ mpf_ui_sub (mpf_ptr r, unsigned long int u, mpf_srcptr v) /* uuuu */ mp_size_t size, i; size = usize - vsize; - tp[0] = -up[0]; + tp[0] = -up[0] & GMP_NUMB_MASK; for (i = 1; i < size; i++) - tp[i] = ~up[i]; + tp[i] = ~up[i] & GMP_NUMB_MASK; mpn_sub_n (tp + size, vp, up + size, vsize); mpn_sub_1 (tp + size, tp + size, vsize, (mp_limb_t) 1); negate ^= 1; @@ -229,9 +229,9 @@ mpf_ui_sub (mpf_ptr r, unsigned long int u, mpf_srcptr v) { mp_size_t size, i; size = vsize - usize; - tp[0] = -vp[0]; + tp[0] = -vp[0] & GMP_NUMB_MASK; for (i = 1; i < size; i++) - tp[i] = ~vp[i]; + tp[i] = ~vp[i] & GMP_NUMB_MASK; mpn_sub_n (tp + size, up, vp + size, usize); mpn_sub_1 (tp + size, tp + size, usize, (mp_limb_t) 1); rsize = vsize; @@ -287,9 +287,9 @@ mpf_ui_sub (mpf_ptr r, unsigned long int u, mpf_srcptr v) /* vvvvv */ mp_size_t size, i; size = vsize + ediff - usize; - tp[0] = -vp[0]; + tp[0] = -vp[0] & GMP_NUMB_MASK; for (i = 1; i < size; i++) - tp[i] = ~vp[i]; + tp[i] = ~vp[i] & GMP_NUMB_MASK; mpn_sub (tp + size, up, usize, vp + size, usize - ediff); mpn_sub_1 (tp + size, tp + size, usize, (mp_limb_t) 1); rsize = vsize + ediff; @@ -302,11 +302,11 @@ mpf_ui_sub (mpf_ptr r, unsigned long int u, mpf_srcptr v) /* vv */ mp_size_t size, i; size = vsize + ediff - usize; - tp[0] = -vp[0]; + tp[0] = -vp[0] & GMP_NUMB_MASK; for (i = 1; i < vsize; i++) - tp[i] = ~vp[i]; + tp[i] = ~vp[i] & GMP_NUMB_MASK; for (i = vsize; i < size; i++) - tp[i] = ~(mp_limb_t) 0; + tp[i] = GMP_NUMB_MAX; mpn_sub_1 (tp + size, up, usize, (mp_limb_t) 1); rsize = size + usize; } diff --git a/mpf/urandomb.c b/mpf/urandomb.c index e428d0e3a..7102c23b0 100644 --- a/mpf/urandomb.c +++ b/mpf/urandomb.c @@ -33,16 +33,15 @@ mpf_urandomb (mpf_t rop, gmp_randstate_t rstate, unsigned long int nbits) mp_exp_t exp; rp = PTR (rop); - nlimbs = (nbits + BITS_PER_MP_LIMB - 1) / BITS_PER_MP_LIMB; + nlimbs = (nbits + GMP_NUMB_BITS - 1) / GMP_NUMB_BITS; _gmp_rand (rp, rstate, nbits); - /* If nbits isn't a multiple of BITS_PER_MP_LIMB, shift up. */ + /* If nbits isn't a multiple of GMP_NUMB_BITS, shift up. */ if (nlimbs != 0) { - if (nbits % BITS_PER_MP_LIMB != 0) - mpn_lshift (rp, rp, nlimbs, - BITS_PER_MP_LIMB - nbits % BITS_PER_MP_LIMB); + if (nbits % GMP_NUMB_BITS != 0) + mpn_lshift (rp, rp, nlimbs, GMP_NUMB_BITS - nbits % GMP_NUMB_BITS); } exp = 0; @@ -53,5 +52,4 @@ mpf_urandomb (mpf_t rop, gmp_randstate_t rstate, unsigned long int nbits) } EXP (rop) = exp; SIZ (rop) = nlimbs; - } diff --git a/tests/mpf/t-trunc.c b/tests/mpf/t-trunc.c index 2da62b399..235f26f14 100644 --- a/tests/mpf/t-trunc.c +++ b/tests/mpf/t-trunc.c @@ -228,11 +228,11 @@ check_various (void) /* F.F, carry out of ceil */ EXP(src) = 1; SIZ(src) = 2; - PTR(src)[0] = MP_LIMB_T_MAX; - PTR(src)[1] = MP_LIMB_T_MAX; + PTR(src)[0] = GMP_NUMB_MAX; + PTR(src)[1] = GMP_NUMB_MAX; EXP(trunc) = 1; SIZ(trunc) = 1; - PTR(trunc)[0] = MP_LIMB_T_MAX; + PTR(trunc)[0] = GMP_NUMB_MAX; mpf_set (floor, trunc); EXP(ceil) = 2; SIZ(ceil) = 1; @@ -242,13 +242,13 @@ check_various (void) /* FF.F, carry out of ceil */ EXP(src) = 2; SIZ(src) = 3; - PTR(src)[0] = MP_LIMB_T_MAX; - PTR(src)[1] = MP_LIMB_T_MAX; - PTR(src)[2] = MP_LIMB_T_MAX; + PTR(src)[0] = GMP_NUMB_MAX; + PTR(src)[1] = GMP_NUMB_MAX; + PTR(src)[2] = GMP_NUMB_MAX; EXP(trunc) = 2; SIZ(trunc) = 2; - PTR(trunc)[0] = MP_LIMB_T_MAX; - PTR(trunc)[1] = MP_LIMB_T_MAX; + PTR(trunc)[0] = GMP_NUMB_MAX; + PTR(trunc)[1] = GMP_NUMB_MAX; mpf_set (floor, trunc); EXP(ceil) = 3; SIZ(ceil) = 1; |