1 #ifndef _M68K_DIV64_H
2 #define _M68K_DIV64_H
3 
4 /* n = n / base; return rem; */
5 
6 #if 1
7 #define do_div(n, base) ({					\
8 	union {							\
9 		unsigned long n32[2];				\
10 		unsigned long long n64;				\
11 	} __n;							\
12 	unsigned long __rem, __upper;				\
13 								\
14 	__n.n64 = (n);						\
15 	if ((__upper = __n.n32[0])) {				\
16 		asm ("divul.l %2,%1:%0"				\
17 			: "=d" (__n.n32[0]), "=d" (__upper)	\
18 			: "d" (base), "0" (__n.n32[0]));	\
19 	}							\
20 	asm ("divu.l %2,%1:%0"					\
21 		: "=d" (__n.n32[1]), "=d" (__rem)		\
22 		: "d" (base), "1" (__upper), "0" (__n.n32[1]));	\
23 	(n) = __n.n64;						\
24 	__rem;							\
25 })
26 #else
27 #define do_div(n,base) ({					\
28 	int __res;						\
29 	__res = ((unsigned long) n) % (unsigned) base;		\
30 	n = ((unsigned long) n) / (unsigned) base;		\
31 	__res;							\
32 })
33 #endif
34 
35 #endif /* _M68K_DIV64_H */
36