diff -r bdc4d718bef7 extras/mini-os/lib/math.c --- a/extras/mini-os/lib/math.c Tue Feb 19 16:19:51 2008 +0800 +++ b/extras/mini-os/lib/math.c Tue Feb 19 17:00:34 2008 +0800 @@ -388,6 +388,23 @@ __umoddi3(u_quad_t a, u_quad_t b) return (r); } +/* + * Remainder of signed quad division. + * Truncates towards zero, as required by C99: + * 11 % 5 = 1 + * -11 % 5 = -1 + * 11 % -5 = 1 + * -11 % -5 = 1 + */ +s64 __moddi3(s64 a, s64 b) +{ + u64 ua, ub, urem; + int neg = (a < 0); + ua = neg ? -(u64)a : a; + ub = (b < 0) ? -(u64)b : b; + __qdivrem(ua, ub, &urem); + return (neg ? -urem : urem); +} #endif /* !defined(__ia64__) */ #ifndef HAVE_LIBC