162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef __VDSO_MATH64_H 362306a36Sopenharmony_ci#define __VDSO_MATH64_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_cistatic __always_inline u32 662306a36Sopenharmony_ci__iter_div_u64_rem(u64 dividend, u32 divisor, u64 *remainder) 762306a36Sopenharmony_ci{ 862306a36Sopenharmony_ci u32 ret = 0; 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci while (dividend >= divisor) { 1162306a36Sopenharmony_ci /* The following asm() prevents the compiler from 1262306a36Sopenharmony_ci optimising this loop into a modulo operation. */ 1362306a36Sopenharmony_ci asm("" : "+rm"(dividend)); 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci dividend -= divisor; 1662306a36Sopenharmony_ci ret++; 1762306a36Sopenharmony_ci } 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci *remainder = dividend; 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci return ret; 2262306a36Sopenharmony_ci} 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#endif /* __VDSO_MATH64_H */ 25