1#ifndef _M68K_DIV64_H 2#define _M68K_DIV64_H 3 4#include <linux/types.h> 5 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 28extern uint64_t div64_64(uint64_t dividend, uint64_t divisor); 29#endif /* _M68K_DIV64_H */ 30