^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #ifndef __VDSO_MATH64_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define __VDSO_MATH64_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) static __always_inline u32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) __iter_div_u64_rem(u64 dividend, u32 divisor, u64 *remainder)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) u32 ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) while (dividend >= divisor) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) /* The following asm() prevents the compiler from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) optimising this loop into a modulo operation. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) asm("" : "+rm"(dividend));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) dividend -= divisor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) ret++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) *remainder = dividend;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #endif /* __VDSO_MATH64_H */