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