xref: /openbmc/linux/include/vdso/math64.h (revision ead5d1f4d877e92c051e1a1ade623d0d30e71619)
1*b874b835SVincenzo Frascino /* SPDX-License-Identifier: GPL-2.0 */
2*b874b835SVincenzo Frascino #ifndef __VDSO_MATH64_H
3*b874b835SVincenzo Frascino #define __VDSO_MATH64_H
4*b874b835SVincenzo Frascino 
5*b874b835SVincenzo Frascino static __always_inline u32
__iter_div_u64_rem(u64 dividend,u32 divisor,u64 * remainder)6*b874b835SVincenzo Frascino __iter_div_u64_rem(u64 dividend, u32 divisor, u64 *remainder)
7*b874b835SVincenzo Frascino {
8*b874b835SVincenzo Frascino 	u32 ret = 0;
9*b874b835SVincenzo Frascino 
10*b874b835SVincenzo Frascino 	while (dividend >= divisor) {
11*b874b835SVincenzo Frascino 		/* The following asm() prevents the compiler from
12*b874b835SVincenzo Frascino 		   optimising this loop into a modulo operation.  */
13*b874b835SVincenzo Frascino 		asm("" : "+rm"(dividend));
14*b874b835SVincenzo Frascino 
15*b874b835SVincenzo Frascino 		dividend -= divisor;
16*b874b835SVincenzo Frascino 		ret++;
17*b874b835SVincenzo Frascino 	}
18*b874b835SVincenzo Frascino 
19*b874b835SVincenzo Frascino 	*remainder = dividend;
20*b874b835SVincenzo Frascino 
21*b874b835SVincenzo Frascino 	return ret;
22*b874b835SVincenzo Frascino }
23*b874b835SVincenzo Frascino 
24*b874b835SVincenzo Frascino #endif /* __VDSO_MATH64_H */
25