Commit | Line | Data |
---|---|---|
d20f5aa3 GU |
1 | #ifndef _M68K_DIV64_H |
2 | #define _M68K_DIV64_H | |
3 | ||
84f3fb7a GU |
4 | #ifdef CONFIG_CPU_HAS_NO_MULDIV64 |
5 | #include <asm-generic/div64.h> | |
6 | #else | |
d20f5aa3 GU |
7 | |
8 | #include <linux/types.h> | |
9 | ||
10 | /* n = n / base; return rem; */ | |
11 | ||
12 | #define do_div(n, base) ({ \ | |
13 | union { \ | |
14 | unsigned long n32[2]; \ | |
15 | unsigned long long n64; \ | |
16 | } __n; \ | |
17 | unsigned long __rem, __upper; \ | |
ea077b1b | 18 | unsigned long __base = (base); \ |
d20f5aa3 GU |
19 | \ |
20 | __n.n64 = (n); \ | |
21 | if ((__upper = __n.n32[0])) { \ | |
22 | asm ("divul.l %2,%1:%0" \ | |
ea077b1b AS |
23 | : "=d" (__n.n32[0]), "=d" (__upper) \ |
24 | : "d" (__base), "0" (__n.n32[0])); \ | |
d20f5aa3 GU |
25 | } \ |
26 | asm ("divu.l %2,%1:%0" \ | |
ea077b1b AS |
27 | : "=d" (__n.n32[1]), "=d" (__rem) \ |
28 | : "d" (__base), "1" (__upper), "0" (__n.n32[1])); \ | |
d20f5aa3 GU |
29 | (n) = __n.n64; \ |
30 | __rem; \ | |
31 | }) | |
32 | ||
84f3fb7a | 33 | #endif /* CONFIG_CPU_HAS_NO_MULDIV64 */ |
d20f5aa3 GU |
34 | |
35 | #endif /* _M68K_DIV64_H */ |