#line 2 "../src/kernel/none/mulll.h"
#undef LOCAL_HIREMAINDER
#define LOCAL_HIREMAINDER
extern ulong hiremainder;
#if !defined(INLINE)
extern long mulll(ulong x, ulong y);
extern long addmul(ulong x, ulong y);
#else
#if defined(__GNUC__) && !defined(DISABLE_INLINE)
#undef LOCAL_HIREMAINDER
#define LOCAL_HIREMAINDER register ulong hiremainder
#define mulll(x, y) \
__extension__ ({ \
const ulong __x = (x), __y = (y);\
const ulong __xlo = LOWWORD(__x), __xhi = HIGHWORD(__x); \
const ulong __ylo = LOWWORD(__y), __yhi = HIGHWORD(__y); \
ulong __xylo,__xymid,__xyhi,__xymidhi,__xymidlo; \
ulong __xhl,__yhl; \
\
__xylo = __xlo*__ylo; __xyhi = __xhi*__yhi; \
__xhl = __xhi+__xlo; __yhl = __yhi+__ylo; \
__xymid = __xhl*__yhl - (__xyhi+__xylo); \
\
__xymidhi = HIGHWORD(__xymid); \
__xymidlo = __xymid << BITS_IN_HALFULONG; \
\
__xylo += __xymidlo; \
hiremainder = __xyhi + __xymidhi + (__xylo < __xymidlo) \
+ ((((__xhl + __yhl) >> 1) - __xymidhi) & HIGHMASK); \
\
__xylo; \
})
#define addmul(x, y) \
__extension__ ({ \
const ulong __x = (x), __y = (y);\
const ulong __xlo = LOWWORD(__x), __xhi = HIGHWORD(__x); \
const ulong __ylo = LOWWORD(__y), __yhi = HIGHWORD(__y); \
ulong __xylo,__xymid,__xyhi,__xymidhi,__xymidlo; \
ulong __xhl,__yhl; \
\
__xylo = __xlo*__ylo; __xyhi = __xhi*__yhi; \
__xhl = __xhi+__xlo; __yhl = __yhi+__ylo; \
__xymid = __xhl*__yhl - (__xyhi+__xylo); \
\
__xylo += hiremainder; __xyhi += (__xylo < hiremainder); \
\
__xymidhi = HIGHWORD(__xymid); \
__xymidlo = __xymid << BITS_IN_HALFULONG; \
\
__xylo += __xymidlo; \
hiremainder = __xyhi + __xymidhi + (__xylo < __xymidlo) \
+ ((((__xhl + __yhl) >> 1) - __xymidhi) & HIGHMASK); \
\
__xylo; \
})
#else
INLINE long
mulll(ulong x, ulong y)
{
const ulong xlo = LOWWORD(x), xhi = HIGHWORD(x);
const ulong ylo = LOWWORD(y), yhi = HIGHWORD(y);
ulong xylo,xymid,xyhi,xymidhi,xymidlo;
ulong xhl,yhl;
xylo = xlo*ylo; xyhi = xhi*yhi;
xhl = xhi+xlo; yhl = yhi+ylo;
xymid = xhl*yhl - (xyhi+xylo);
xymidhi = HIGHWORD(xymid);
xymidlo = xymid << BITS_IN_HALFULONG;
xylo += xymidlo;
hiremainder = xyhi + xymidhi + (xylo < xymidlo)
+ ((((xhl + yhl) >> 1) - xymidhi) & HIGHMASK);
return xylo;
}
INLINE long
addmul(ulong x, ulong y)
{
const ulong xlo = LOWWORD(x), xhi = HIGHWORD(x);
const ulong ylo = LOWWORD(y), yhi = HIGHWORD(y);
ulong xylo,xymid,xyhi,xymidhi,xymidlo;
ulong xhl,yhl;
xylo = xlo*ylo; xyhi = xhi*yhi;
xhl = xhi+xlo; yhl = yhi+ylo;
xymid = xhl*yhl - (xyhi+xylo);
xylo += hiremainder; xyhi += (xylo < hiremainder);
xymidhi = HIGHWORD(xymid);
xymidlo = xymid << BITS_IN_HALFULONG;
xylo += xymidlo;
hiremainder = xyhi + xymidhi + (xylo < xymidlo)
+ ((((xhl + yhl) >> 1) - xymidhi) & HIGHMASK);
return xylo;
}
#endif
#endif