summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortege <tege@gmplib.org>2002-05-06 15:22:19 +0200
committertege <tege@gmplib.org>2002-05-06 15:22:19 +0200
commit9080f17b46e75167b7f3bde7c1f0d45f99621db3 (patch)
tree74c3c0b10276e1ee3f3afc2184523f9594867e63
parentbd3be8816de78cfeee4881fe50ff0e1f6d7410f2 (diff)
downloadgmp-9080f17b46e75167b7f3bde7c1f0d45f99621db3.tar.gz
Nailify.
-rw-r--r--mpf/mul_2exp.c11
-rw-r--r--mpf/random2.c2
-rw-r--r--mpf/set_q.c3
-rw-r--r--mpf/set_si.c23
-rw-r--r--mpf/set_str.c5
-rw-r--r--mpf/set_ui.c18
-rw-r--r--mpf/sub.c24
-rw-r--r--mpf/ui_div.c35
-rw-r--r--mpf/ui_sub.c18
-rw-r--r--mpf/urandomb.c10
-rw-r--r--tests/mpf/t-trunc.c16
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;
}
diff --git a/mpf/sub.c b/mpf/sub.c
index c0077a2aa..fde3809c0 100644
--- a/mpf/sub.c
+++ b/mpf/sub.c
@@ -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;