34 #include <sys/cdefs.h>
44 #define B (1 << HALF_BITS)
47 #define COMBINE(a, b) (((u_long)(a) << HALF_BITS) | (b))
50 #if ULONG_MAX == 0xffffffff && USHRT_MAX >= 0xffff
51 typedef unsigned short digit;
62 __shl(
register digit *p,
register int len,
register int sh)
66 for (i = 0; i < len; i++)
68 p[i] =
LHALF(p[i] << sh);
81 u_quad_t uq, vq, *arq;
88 digit uspace[5], vspace[5], qspace[5];
95 static volatile const unsigned int zero = 0;
97 tmp.
ul[
H] = tmp.
ul[
L] = 1 / zero;
135 for (n = 4; v[1] == 0; v++) {
138 digit q1, q2, q3, q4;
169 for (m = 4 - n; u[1] == 0; u++)
171 for (i = 4 - m; --i >= 0;)
182 for (t = v[1]; t <
B / 2; t <<= 1)
185 __shl(&u[0], m + n, d);
186 __shl(&v[1], n - 1, d);
195 register digit uj0, uj1, uj2;
217 while (v2 * qhat >
COMBINE(rhat, uj2)) {
220 if ((rhat += v1) >=
B)
229 for (t = 0, i = n; i > 0; i--) {
230 t = u[i + j] - v[i] * qhat - t;
244 for (t = 0, i = n; i > 0; i--) {
245 t += u[i + j] + v[i];
249 u[j] =
LHALF(u[j] + t);
261 for (i = m + n; i > m; --i)
static void __shl(register digit *p, register int len, register int sh)
u_quad_t __qdivrem(u_quad_t uq, u_quad_t vq, u_quad_t *arq)