36 #include <sys/cdefs.h>
37 #if defined(LIBC_SCCS) && !defined(lint)
39 static char sccsid[] =
"@(#)muldi3.c 8.1 (Berkeley) 6/4/93";
104 static quad_t
__lmulq(u_int, u_int);
110 union uu u, v, low, prod;
111 u_int high, mid, udiff, vdiff;
126 u.
q = -a, negall = 1;
130 v.
q = -b, negall ^= 1;
132 if (
u1 == 0 &&
v1 == 0) {
149 negmid = 0, udiff =
u1 -
u0;
151 negmid = 1, udiff = u0 -
u1;
155 vdiff = v1 -
v0, negmid ^= 1;
163 prod.
ul[
H] = high + (negmid ? -mid : mid) + low.
ul[
L] +
167 return (negall ? -prod.
q : prod.
q);
194 u_int
u1,
u0,
v1,
v0, udiff, vdiff, high, mid, low;
195 u_int prodh, prodl, was;
207 if (u1 == 0 && v1 == 0)
211 udiff = u1 -
u0, neg = 0;
213 udiff = u0 -
u1, neg = 1;
217 vdiff = v1 -
v0, neg ^= 1;
223 prodh = high +
HHALF(high);
230 prodh -=
HHALF(mid) + (prodl > was);
234 prodh +=
HHALF(mid) + (prodl < was);
240 prodh +=
HHALF(low) + (prodl < was);
242 if ((prodl += low) < low)
static quad_t __lmulq(u_int, u_int)
quad_t __muldi3(quad_t, quad_t)