1#ifndef _M68K_DIV64_H
2#define _M68K_DIV64_H
3
4#ifdef CONFIG_CPU_HAS_NO_MULDIV64
5#include <asm-generic/div64.h>
6#else
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;				\
18	unsigned long __base = (base);				\
19								\
20	__n.n64 = (n);						\
21	if ((__upper = __n.n32[0])) {				\
22		asm ("divul.l %2,%1:%0"				\
23		     : "=d" (__n.n32[0]), "=d" (__upper)	\
24		     : "d" (__base), "0" (__n.n32[0]));		\
25	}							\
26	asm ("divu.l %2,%1:%0"					\
27	     : "=d" (__n.n32[1]), "=d" (__rem)			\
28	     : "d" (__base), "1" (__upper), "0" (__n.n32[1]));	\
29	(n) = __n.n64;						\
30	__rem;							\
31})
32
33#endif /* CONFIG_CPU_HAS_NO_MULDIV64 */
34
35#endif /* _M68K_DIV64_H */
36