|
Revision 1, 1.3 kB
(checked in by dkaplan1, 7 years ago)
|
Initial import
|
| Line | |
|---|
| 1 |
|
|---|
| 2 |
|
|---|
| 3 |
|
|---|
| 4 |
|
|---|
| 5 |
|
|---|
| 6 |
|
|---|
| 7 |
|
|---|
| 8 |
|
|---|
| 9 |
|
|---|
| 10 |
|
|---|
| 11 |
|
|---|
| 12 |
|
|---|
| 13 |
|
|---|
| 14 |
|
|---|
| 15 |
|
|---|
| 16 |
|
|---|
| 17 |
|
|---|
| 18 |
|
|---|
| 19 |
#include <linux/types.h> |
|---|
| 20 |
#include <linux/module.h> |
|---|
| 21 |
#include <asm/div64.h> |
|---|
| 22 |
|
|---|
| 23 |
|
|---|
| 24 |
#if BITS_PER_LONG == 32 |
|---|
| 25 |
|
|---|
| 26 |
uint32_t __div64_32(uint64_t *n, uint32_t base) |
|---|
| 27 |
{ |
|---|
| 28 |
uint64_t rem = *n; |
|---|
| 29 |
uint64_t b = base; |
|---|
| 30 |
uint64_t res, d = 1; |
|---|
| 31 |
uint32_t high = rem >> 32; |
|---|
| 32 |
|
|---|
| 33 |
|
|---|
| 34 |
res = 0; |
|---|
| 35 |
if (high >= base) { |
|---|
| 36 |
high /= base; |
|---|
| 37 |
res = (uint64_t) high << 32; |
|---|
| 38 |
rem -= (uint64_t) (high*base) << 32; |
|---|
| 39 |
} |
|---|
| 40 |
|
|---|
| 41 |
while ((int64_t)b > 0 && b < rem) { |
|---|
| 42 |
b = b+b; |
|---|
| 43 |
d = d+d; |
|---|
| 44 |
} |
|---|
| 45 |
|
|---|
| 46 |
do { |
|---|
| 47 |
if (rem >= b) { |
|---|
| 48 |
rem -= b; |
|---|
| 49 |
res += d; |
|---|
| 50 |
} |
|---|
| 51 |
b >>= 1; |
|---|
| 52 |
d >>= 1; |
|---|
| 53 |
} while (d); |
|---|
| 54 |
|
|---|
| 55 |
*n = res; |
|---|
| 56 |
return rem; |
|---|
| 57 |
} |
|---|
| 58 |
|
|---|
| 59 |
EXPORT_SYMBOL(__div64_32); |
|---|
| 60 |
|
|---|
| 61 |
#endif |
|---|