18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef _M68K_DIV64_H
38c2ecf20Sopenharmony_ci#define _M68K_DIV64_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_HAS_NO_MULDIV64
68c2ecf20Sopenharmony_ci#include <asm-generic/div64.h>
78c2ecf20Sopenharmony_ci#else
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include <linux/types.h>
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci/* n = n / base; return rem; */
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#define do_div(n, base) ({					\
148c2ecf20Sopenharmony_ci	union {							\
158c2ecf20Sopenharmony_ci		unsigned long n32[2];				\
168c2ecf20Sopenharmony_ci		unsigned long long n64;				\
178c2ecf20Sopenharmony_ci	} __n;							\
188c2ecf20Sopenharmony_ci	unsigned long __rem, __upper;				\
198c2ecf20Sopenharmony_ci	unsigned long __base = (base);				\
208c2ecf20Sopenharmony_ci								\
218c2ecf20Sopenharmony_ci	__n.n64 = (n);						\
228c2ecf20Sopenharmony_ci	if ((__upper = __n.n32[0])) {				\
238c2ecf20Sopenharmony_ci		asm ("divul.l %2,%1:%0"				\
248c2ecf20Sopenharmony_ci		     : "=d" (__n.n32[0]), "=d" (__upper)	\
258c2ecf20Sopenharmony_ci		     : "d" (__base), "0" (__n.n32[0]));		\
268c2ecf20Sopenharmony_ci	}							\
278c2ecf20Sopenharmony_ci	asm ("divu.l %2,%1:%0"					\
288c2ecf20Sopenharmony_ci	     : "=d" (__n.n32[1]), "=d" (__rem)			\
298c2ecf20Sopenharmony_ci	     : "d" (__base), "1" (__upper), "0" (__n.n32[1]));	\
308c2ecf20Sopenharmony_ci	(n) = __n.n64;						\
318c2ecf20Sopenharmony_ci	__rem;							\
328c2ecf20Sopenharmony_ci})
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci#endif /* CONFIG_CPU_HAS_NO_MULDIV64 */
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci#endif /* _M68K_DIV64_H */
37