/* -*-c-*-
*
- * $Id: mpx.c,v 1.6 1999/11/20 22:43:44 mdw Exp $
+ * $Id: mpx.c,v 1.9 2000/06/26 07:52:50 mdw Exp $
*
* Low-level multiprecision arithmetic
*
/*----- Revision history --------------------------------------------------*
*
* $Log: mpx.c,v $
+ * Revision 1.9 2000/06/26 07:52:50 mdw
+ * Portability fix for the bug fix.
+ *
+ * Revision 1.8 2000/06/25 12:59:02 mdw
+ * (mpx_udiv): Fix bug in quotient digit estimation.
+ *
+ * Revision 1.7 1999/12/22 15:49:07 mdw
+ * New function for division by a small integer.
+ *
* Revision 1.6 1999/11/20 22:43:44 mdw
* Integrate testing for MPX routines.
*
{
mpd yh = (mpd)d * q;
- mpd yl = (mpd)dd * q;
+ mpd yy = (mpd)dd * q;
+ mpw yl;
- if (yl > MPW_MAX) {
- yh += yl >> MPW_BITS;
- yl &= MPW_MAX;
- }
+ if (yy > MPW_MAX)
+ yh += yy >> MPW_BITS;
+ yl = MPW(yy);
while (yh > rh || (yh == rh && yl > rrr)) {
q--;
yh -= d;
- if (yl < dd) {
- yh++;
- yl += MPW_MAX;
- }
- yl -= dd;
+ if (yl < dd)
+ yh--;
+ yl = MPW(yl - dd);
}
}
mpx_lsr(rv, rvl, rv, rvl, norm);
}
+/* --- @mpx_udivn@ --- *
+ *
+ * Arguments: @mpw *qv, *qvl@ = storage for the quotient (may overlap
+ * dividend)
+ * @const mpw *rv, *rvl@ = dividend
+ * @mpw d@ = single-precision divisor
+ *
+ * Returns: Remainder after divison.
+ *
+ * Use: Performs a single-precision division operation.
+ */
+
+mpw mpx_udivn(mpw *qv, mpw *qvl, const mpw *rv, const mpw *rvl, mpw d)
+{
+ size_t i;
+ size_t ql = qvl - qv;
+ mpd r = 0;
+
+ i = rvl - rv;
+ while (i > 0) {
+ i--;
+ r = (r << MPW_BITS) | rv[i];
+ if (i < ql)
+ qv[i] = r / d;
+ r %= d;
+ }
+ return (MPW(r));
+}
+
/*----- Test rig ----------------------------------------------------------*/
#ifdef TEST_RIG