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