=================================================================== RCS file: /home/cvs/OpenXM_contrib/gmp/mpf/Attic/ui_div.c,v retrieving revision 1.1.1.2 retrieving revision 1.1.1.3 diff -u -p -r1.1.1.2 -r1.1.1.3 --- OpenXM_contrib/gmp/mpf/Attic/ui_div.c 2000/09/09 14:13:15 1.1.1.2 +++ OpenXM_contrib/gmp/mpf/Attic/ui_div.c 2003/08/25 16:06:35 1.1.1.3 @@ -1,6 +1,7 @@ /* mpf_ui_div -- Divide an unsigned integer with a float. -Copyright (C) 1993, 1994, 1995, 1996, 2000 Free Software Foundation, Inc. +Copyright 1993, 1994, 1995, 1996, 2000, 2001, 2002 Free Software Foundation, +Inc. This file is part of the GNU MP Library. @@ -24,14 +25,7 @@ MA 02111-1307, USA. */ #include "longlong.h" void -#if __STDC__ mpf_ui_div (mpf_ptr r, unsigned long int u, mpf_srcptr v) -#else -mpf_ui_div (r, u, v) - mpf_ptr r; - unsigned long int u; - mpf_srcptr v; -#endif { mp_srcptr vp; mp_ptr rp, tp; @@ -39,7 +33,6 @@ mpf_ui_div (r, u, v) mp_size_t rsize, tsize; mp_size_t sign_quotient; mp_size_t prec; - unsigned normalization_steps; mp_limb_t q_limb; mp_exp_t rexp; TMP_DECL (marker); @@ -75,14 +68,16 @@ mpf_ui_div (r, u, v) tp = (mp_ptr) TMP_ALLOC ((tsize + 1) * BYTES_PER_MP_LIMB); MPN_ZERO (tp, tsize); - count_leading_zeros (normalization_steps, vp[vsize - 1]); - /* Normalize the divisor and the dividend. */ - if (normalization_steps != 0) + 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 the original contents of the divisor. */ @@ -92,15 +87,28 @@ mpf_ui_div (r, u, 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 + if (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 +#endif + { + tp[tsize] = dividend_high; + tsize++; + rexp++; + } } } else @@ -114,7 +122,15 @@ mpf_ui_div (r, u, 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);