Re: [PATCH 1/2] lib: mul_u64_add_u64_div_u64: Fix addition of large constants
From: H. Peter Anvin
Date: Mon Aug 03 2026 - 06:24:38 EST
On 2026-08-03 02:47, David Laight wrote:
> Adding constants over 2^31 fails to compile because the ADD instruction
> only supports 32bit signed immediates.
>
> Replace the "irm" constraint with "erm" so that the compiler loads
> large constants into a register.
>
> Found by a patch to drivers/iio/frequency/ad9910.c
>
> Fixes: 6480241f31f5 ("lib: add mul_u64_add_u64_div_u64() and mul_u64_u64_div_u64_roundup()")
> Signed-off-by: David Laight <david.laight.linux@xxxxxxxxx>
So it is.
Reviewed-by: H. Peter Anvin <hpa@xxxxxxxxx>
> ---
> arch/x86/include/asm/div64.h | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/arch/x86/include/asm/div64.h b/arch/x86/include/asm/div64.h
> index 30fd06ede751..8a2d343f977e 100644
> --- a/arch/x86/include/asm/div64.h
> +++ b/arch/x86/include/asm/div64.h
> @@ -111,7 +111,7 @@ static inline u64 mul_u64_add_u64_div_u64(u64 rax, u64 mul, u64 add, u64 div)
>
> if (!statically_true(!add))
> asm ("addq %[add], %[lo]; adcq $0, %[hi]" :
> - [lo] "+r" (rax), [hi] "+r" (rdx) : [add] "irm" (add));
> + [lo] "+r" (rax), [hi] "+r" (rdx) : [add] "erm" (add));
>
> asm ("divq %[div]" : "+a" (rax), "+d" (rdx) : [div] "rm" (div));
>