[PATCH 1/2] lib: mul_u64_add_u64_div_u64: Fix addition of large constants

From: David Laight

Date: Mon Aug 03 2026 - 06:05:27 EST


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>
---
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));

--
2.39.5