]>
Commit | Line | Data |
---|---|---|
07a6aa79 | 1 | diff -u -p -r1.1 div64.c |
2 | --- linux.org/lib/div64.c 29 Jul 2003 17:02:19 -0000 1.1 | |
3 | +++ linux/lib/div64.c 24 Oct 2003 04:10:59 -0000 | |
4 | @@ -25,25 +25,27 @@ | |
5 | ||
6 | uint32_t __div64_32(uint64_t *n, uint32_t base) | |
7 | { | |
8 | - uint32_t low, low2, high, rem; | |
9 | + uint64_t rem = *n; | |
10 | + uint64_t b = base; | |
11 | + uint64_t res = 0, d = 1; | |
12 | ||
13 | - low = *n & 0xffffffff; | |
14 | - high = *n >> 32; | |
15 | - rem = high % (uint32_t)base; | |
16 | - high = high / (uint32_t)base; | |
17 | - low2 = low >> 16; | |
18 | - low2 += rem << 16; | |
19 | - rem = low2 % (uint32_t)base; | |
20 | - low2 = low2 / (uint32_t)base; | |
21 | - low = low & 0xffff; | |
22 | - low += rem << 16; | |
23 | - rem = low % (uint32_t)base; | |
24 | - low = low / (uint32_t)base; | |
25 | + if (b > 0) { | |
26 | + while (b < rem) { | |
27 | + b <<= 1; | |
28 | + d <<= 1; | |
29 | + } | |
30 | + } | |
31 | ||
32 | - *n = low + | |
33 | - ((uint64_t)low2 << 16) + | |
34 | - ((uint64_t)high << 32); | |
35 | + do { | |
36 | + if (rem >= b) { | |
37 | + rem -= b; | |
38 | + res += d; | |
39 | + } | |
40 | + b >>= 1; | |
41 | + d >>= 1; | |
42 | + } while (d); | |
43 | ||
44 | + *n = res; | |
45 | return rem; | |
46 | } | |
47 |