1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _M68K_DIV64_H 3*4882a593Smuzhiyun #define _M68K_DIV64_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #ifdef CONFIG_CPU_HAS_NO_MULDIV64 6*4882a593Smuzhiyun #include <asm-generic/div64.h> 7*4882a593Smuzhiyun #else 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include <linux/types.h> 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun /* n = n / base; return rem; */ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #define do_div(n, base) ({ \ 14*4882a593Smuzhiyun union { \ 15*4882a593Smuzhiyun unsigned long n32[2]; \ 16*4882a593Smuzhiyun unsigned long long n64; \ 17*4882a593Smuzhiyun } __n; \ 18*4882a593Smuzhiyun unsigned long __rem, __upper; \ 19*4882a593Smuzhiyun unsigned long __base = (base); \ 20*4882a593Smuzhiyun \ 21*4882a593Smuzhiyun __n.n64 = (n); \ 22*4882a593Smuzhiyun if ((__upper = __n.n32[0])) { \ 23*4882a593Smuzhiyun asm ("divul.l %2,%1:%0" \ 24*4882a593Smuzhiyun : "=d" (__n.n32[0]), "=d" (__upper) \ 25*4882a593Smuzhiyun : "d" (__base), "0" (__n.n32[0])); \ 26*4882a593Smuzhiyun } \ 27*4882a593Smuzhiyun asm ("divu.l %2,%1:%0" \ 28*4882a593Smuzhiyun : "=d" (__n.n32[1]), "=d" (__rem) \ 29*4882a593Smuzhiyun : "d" (__base), "1" (__upper), "0" (__n.n32[1])); \ 30*4882a593Smuzhiyun (n) = __n.n64; \ 31*4882a593Smuzhiyun __rem; \ 32*4882a593Smuzhiyun }) 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #endif /* CONFIG_CPU_HAS_NO_MULDIV64 */ 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #endif /* _M68K_DIV64_H */ 37