summaryrefslogtreecommitdiff
path: root/mpf/div.c
diff options
context:
space:
mode:
authortege <tege@gmplib.org>1996-05-08 09:42:34 +0200
committertege <tege@gmplib.org>1996-05-08 09:42:34 +0200
commit1b3800a70cb14a22a458594f31c896f7b7a42f93 (patch)
tree0ebf847260f4765d5411fded355fe7673fc0f571 /mpf/div.c
parent3dacca0bd7a2b73ff2d074ce18cdd3a78336ddf4 (diff)
downloadgmp-1b3800a70cb14a22a458594f31c896f7b7a42f93.tar.gz
Changes from tiny.
Diffstat (limited to 'mpf/div.c')
-rw-r--r--mpf/div.c73
1 files changed, 37 insertions, 36 deletions
diff --git a/mpf/div.c b/mpf/div.c
index bd2d04dba..9ba6922cd 100644
--- a/mpf/div.c
+++ b/mpf/div.c
@@ -34,20 +34,22 @@ mpf_div (r, u, v)
#endif
{
mp_srcptr up, vp;
- mp_ptr qp, rp, rrp;
- mp_size_t usize = u->_mp_size;
- mp_size_t vsize = v->_mp_size;
- mp_size_t qsize, rsize;
- mp_size_t sign_quotient = usize ^ vsize;
+ mp_ptr rp, tp, rtp;
+ mp_size_t usize, vsize;
+ mp_size_t rsize, tsize;
+ mp_size_t sign_quotient;
+ mp_size_t prec;
unsigned normalization_steps;
mp_limb_t q_limb;
- mp_size_t prec;
mp_exp_t rexp;
TMP_DECL (marker);
- prec = r->_mp_prec;
+ usize = u->_mp_size;
+ vsize = v->_mp_size;
+ sign_quotient = usize ^ vsize;
usize = ABS (usize);
vsize = ABS (vsize);
+ prec = r->_mp_prec;
if (vsize == 0)
vsize = 1 / vsize; /* divide by zero as directed */
@@ -61,7 +63,7 @@ mpf_div (r, u, v)
TMP_MARK (marker);
rexp = u->_mp_exp - v->_mp_exp;
- qp = r->_mp_d;
+ rp = r->_mp_d;
up = u->_mp_d;
vp = v->_mp_d;
@@ -71,20 +73,19 @@ mpf_div (r, u, v)
vsize = prec;
}
- rsize = vsize + prec;
-
- rp = (mp_ptr) TMP_ALLOC ((rsize + 1) * BYTES_PER_MP_LIMB);
+ tsize = vsize + prec;
+ tp = (mp_ptr) TMP_ALLOC ((tsize + 1) * BYTES_PER_MP_LIMB);
- if (usize > rsize)
+ if (usize > tsize)
{
- up += usize - rsize;
- usize = rsize;
- rrp = rp;
+ up += usize - tsize;
+ usize = tsize;
+ rtp = tp;
}
else
{
- MPN_ZERO (rp, rsize - usize);
- rrp = rp + (rsize - usize);
+ MPN_ZERO (tp, tsize - usize);
+ rtp = tp + (tsize - usize);
}
count_leading_zeros (normalization_steps, vp[vsize - 1]);
@@ -92,24 +93,24 @@ mpf_div (r, u, v)
/* Normalize the divisor and the dividend. */
if (normalization_steps != 0)
{
- mp_ptr tp;
+ mp_ptr tmp;
mp_limb_t nlimb;
/* Shift up the divisor setting the most significant bit of
- the most significant word. Use temporary storage not to clobber
+ the most significant limb. Use temporary storage not to clobber
the original contents of the divisor. */
- tp = (mp_ptr) TMP_ALLOC (vsize * BYTES_PER_MP_LIMB);
- mpn_lshift (tp, vp, vsize, normalization_steps);
- vp = tp;
+ tmp = (mp_ptr) TMP_ALLOC (vsize * BYTES_PER_MP_LIMB);
+ mpn_lshift (tmp, vp, vsize, normalization_steps);
+ vp = tmp;
/* Shift up the dividend, possibly introducing a new most
significant word. Move the shifted dividend in the remainder
- meanwhile. */
- nlimb = mpn_lshift (rrp, up, usize, normalization_steps);
+ at the same time. */
+ nlimb = mpn_lshift (rtp, up, usize, normalization_steps);
if (nlimb != 0)
{
- rrp[usize] = nlimb;
- rsize++;
+ rtp[usize] = nlimb;
+ tsize++;
rexp++;
}
}
@@ -117,27 +118,27 @@ mpf_div (r, u, v)
{
/* The divisor is already normalized, as required.
Copy it to temporary space if it overlaps with the quotient. */
- if (vp == qp)
+ if (vp - rp <= tsize - vsize)
{
- vp = (mp_ptr) TMP_ALLOC (vsize * BYTES_PER_MP_LIMB);
- MPN_COPY ((mp_ptr) vp, qp, vsize);
+ mp_ptr tmp = (mp_ptr) TMP_ALLOC (vsize * BYTES_PER_MP_LIMB);
+ MPN_COPY (tmp, vp, vsize);
+ vp = (mp_srcptr) tmp;
}
/* Move the dividend to the remainder. */
- MPN_COPY (rrp, up, usize);
+ MPN_COPY (rtp, up, usize);
}
- q_limb = mpn_divmod (qp, rp, rsize, vp, vsize);
-
- qsize = rsize - vsize;
+ q_limb = mpn_divmod (rp, tp, tsize, vp, vsize);
+ rsize = tsize - vsize;
if (q_limb)
{
- qp[qsize] = q_limb;
- qsize++;
+ rp[rsize] = q_limb;
+ rsize++;
rexp++;
}
- r->_mp_size = sign_quotient >= 0 ? qsize : -qsize;
+ r->_mp_size = sign_quotient >= 0 ? rsize : -rsize;
r->_mp_exp = rexp;
TMP_FREE (marker);
}