summaryrefslogtreecommitdiff
path: root/mpz/tdiv_ui.c
diff options
context:
space:
mode:
authortege <tege@gmplib.org>2002-04-20 17:21:17 +0200
committertege <tege@gmplib.org>2002-04-20 17:21:17 +0200
commit7e0bc4359feb5387487493297aeaef08aec7ca4d (patch)
treef6e8a569141e1b761bd40726b67f7ec316bdc89e /mpz/tdiv_ui.c
parentdfe034b1281f69427c33105855512598a1ada89d (diff)
downloadgmp-7e0bc4359feb5387487493297aeaef08aec7ca4d.tar.gz
Rewrite nails code.
Diffstat (limited to 'mpz/tdiv_ui.c')
-rw-r--r--mpz/tdiv_ui.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/mpz/tdiv_ui.c b/mpz/tdiv_ui.c
index 72858e930..406fbc4b2 100644
--- a/mpz/tdiv_ui.c
+++ b/mpz/tdiv_ui.c
@@ -29,11 +29,17 @@ mpz_tdiv_ui (mpz_srcptr dividend, unsigned long int divisor)
{
mp_size_t ns, nn;
mp_ptr np;
+ mp_limb_t rl;
if (divisor == 0)
DIVIDE_BY_ZERO;
ns = SIZ(dividend);
+ if (ns == 0)
+ {
+ return 0;
+ }
+
nn = ABS(ns);
np = PTR(dividend);
@@ -42,17 +48,29 @@ mpz_tdiv_ui (mpz_srcptr dividend, unsigned long int divisor)
{
mp_limb_t dp[2], rp[2];
mp_ptr qp;
+ mp_size_t rn;
TMP_DECL (mark);
+ if (nn == 1) /* tdiv_qr requirements; tested above for 0 */
+ {
+ rl = np[0];
+ return rl;
+ }
+
TMP_MARK (mark);
dp[0] = divisor & GMP_NUMB_MASK;
dp[1] = divisor >> GMP_NUMB_BITS;
qp = TMP_ALLOC_LIMBS (nn - 2 + 1);
mpn_tdiv_qr (qp, rp, (mp_size_t) 0, np, nn, dp, (mp_size_t) 2);
TMP_FREE (mark);
- return rp[0] + (rp[1] << GMP_NUMB_BITS);
+ rl = rp[0] + (rp[1] << GMP_NUMB_BITS);
+ rn = 2 - (rp[1] == 0); rn -= (rp[rn - 1] == 0);
}
+ else
#endif
+ {
+ rl = mpn_mod_1 (np, nn, (mp_limb_t) divisor);
+ }
- return mpn_mod_1 (np, nn, (mp_limb_t) divisor);
+ return rl;
}