Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | #ifndef _M68K_DIV64_H |
2 | #define _M68K_DIV64_H | |
3 | ||
3927f2e8 SH |
4 | #include <linux/types.h> |
5 | ||
1da177e4 LT |
6 | /* n = n / base; return rem; */ |
7 | ||
8 | #define do_div(n, base) ({ \ | |
9 | union { \ | |
10 | unsigned long n32[2]; \ | |
11 | unsigned long long n64; \ | |
12 | } __n; \ | |
13 | unsigned long __rem, __upper; \ | |
14 | \ | |
15 | __n.n64 = (n); \ | |
16 | if ((__upper = __n.n32[0])) { \ | |
17 | asm ("divul.l %2,%1:%0" \ | |
18 | : "=d" (__n.n32[0]), "=d" (__upper) \ | |
19 | : "d" (base), "0" (__n.n32[0])); \ | |
20 | } \ | |
21 | asm ("divu.l %2,%1:%0" \ | |
22 | : "=d" (__n.n32[1]), "=d" (__rem) \ | |
23 | : "d" (base), "1" (__upper), "0" (__n.n32[1])); \ | |
24 | (n) = __n.n64; \ | |
25 | __rem; \ | |
26 | }) | |
27 | ||
3927f2e8 | 28 | extern uint64_t div64_64(uint64_t dividend, uint64_t divisor); |
1da177e4 | 29 | #endif /* _M68K_DIV64_H */ |