diff -u -p -r1.1 div64.c --- linux.org/lib/div64.c 29 Jul 2003 17:02:19 -0000 1.1 +++ linux/lib/div64.c 24 Oct 2003 04:10:59 -0000 @@ -25,25 +25,27 @@ uint32_t __div64_32(uint64_t *n, uint32_t base) { - uint32_t low, low2, high, rem; + uint64_t rem = *n; + uint64_t b = base; + uint64_t res = 0, d = 1; - low = *n & 0xffffffff; - high = *n >> 32; - rem = high % (uint32_t)base; - high = high / (uint32_t)base; - low2 = low >> 16; - low2 += rem << 16; - rem = low2 % (uint32_t)base; - low2 = low2 / (uint32_t)base; - low = low & 0xffff; - low += rem << 16; - rem = low % (uint32_t)base; - low = low / (uint32_t)base; + if (b > 0) { + while (b < rem) { + b <<= 1; + d <<= 1; + } + } - *n = low + - ((uint64_t)low2 << 16) + - ((uint64_t)high << 32); + do { + if (rem >= b) { + rem -= b; + res += d; + } + b >>= 1; + d >>= 1; + } while (d); + *n = res; return rem; }