All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] x86: Use "er" asm constriant for add/sub
@ 2026-08-03  9:47 David Laight
  2026-08-03  9:47 ` [PATCH 1/2] lib: mul_u64_add_u64_div_u64: Fix addition of large constants David Laight
                   ` (3 more replies)
  0 siblings, 4 replies; 11+ messages in thread
From: David Laight @ 2026-08-03  9:47 UTC (permalink / raw)
  To: Borislav Betkov, Ingo Molnar, Thomas Gleinxer, Dave Hansen, x86,
	Andrew Morton, linux-kernel
  Cc: David Laight, Nicolas Pitre, H. Peter Anvin, Peter Zijlstra,
	Uwe Kleine-König, rodrigo.alencar, jic23

The x86 instruction set only supports 32bit signed immediate values
for add/sub.
Replace the "ir" constraint with "er" to avoid build errors.

Found by a patch that added used mul_u64_add_u64_div_u64() to
do a rounding divide by 2^32 (perhaps not the best way to do this).

A quick grep only found one other affected file.

David Laight (2):
  lib: mul_u64_add_u64_div_u64: Fix addition of large constants
  x86/local: local_add/local_sub: Support large immediate values

 arch/x86/include/asm/div64.h | 2 +-
 arch/x86/include/asm/local.h | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

-- 
2.39.5


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/2] lib: mul_u64_add_u64_div_u64: Fix addition of large constants
  2026-08-03  9:47 [PATCH 0/2] x86: Use "er" asm constriant for add/sub David Laight
@ 2026-08-03  9:47 ` David Laight
  2026-08-03 10:08   ` H. Peter Anvin
  2026-08-03  9:47 ` [PATCH 2/2] x86/local: local_add/local_sub: Support large immediate values David Laight
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 11+ messages in thread
From: David Laight @ 2026-08-03  9:47 UTC (permalink / raw)
  To: Borislav Betkov, Ingo Molnar, Thomas Gleinxer, Dave Hansen, x86,
	Andrew Morton, linux-kernel
  Cc: David Laight, Nicolas Pitre, H. Peter Anvin, Peter Zijlstra,
	Uwe Kleine-König, rodrigo.alencar, jic23

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@gmail.com>
---
 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


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 2/2] x86/local: local_add/local_sub: Support large immediate values
  2026-08-03  9:47 [PATCH 0/2] x86: Use "er" asm constriant for add/sub David Laight
  2026-08-03  9:47 ` [PATCH 1/2] lib: mul_u64_add_u64_div_u64: Fix addition of large constants David Laight
@ 2026-08-03  9:47 ` David Laight
  2026-08-03 10:01   ` Peter Zijlstra
  2026-08-03 10:07   ` H. Peter Anvin
  2026-08-03  9:59 ` [PATCH 0/2] x86: Use "er" asm constriant for add/sub Peter Zijlstra
  2026-08-03 14:49 ` Nicolas Pitre
  3 siblings, 2 replies; 11+ messages in thread
From: David Laight @ 2026-08-03  9:47 UTC (permalink / raw)
  To: Borislav Betkov, Ingo Molnar, Thomas Gleinxer, Dave Hansen, x86,
	Andrew Morton, linux-kernel
  Cc: David Laight, Nicolas Pitre, H. Peter Anvin, Peter Zijlstra,
	Uwe Kleine-König, rodrigo.alencar, jic23

Replace the "ir" constraint with "er" so that constants over 2^31
get loaded into a register.

Signed-off-by: David Laight <david.laight.linux@gmail.com>
---
 arch/x86/include/asm/local.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/include/asm/local.h b/arch/x86/include/asm/local.h
index 4957018fef3e..68af7b74450a 100644
--- a/arch/x86/include/asm/local.h
+++ b/arch/x86/include/asm/local.h
@@ -32,14 +32,14 @@ static inline void local_add(long i, local_t *l)
 {
 	asm volatile(_ASM_ADD "%1,%0"
 		     : "+m" (l->a.counter)
-		     : "ir" (i));
+		     : "er" (i));
 }
 
 static inline void local_sub(long i, local_t *l)
 {
 	asm volatile(_ASM_SUB "%1,%0"
 		     : "+m" (l->a.counter)
-		     : "ir" (i));
+		     : "er" (i));
 }
 
 /**
-- 
2.39.5


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 0/2] x86: Use "er" asm constriant for add/sub
  2026-08-03  9:47 [PATCH 0/2] x86: Use "er" asm constriant for add/sub David Laight
  2026-08-03  9:47 ` [PATCH 1/2] lib: mul_u64_add_u64_div_u64: Fix addition of large constants David Laight
  2026-08-03  9:47 ` [PATCH 2/2] x86/local: local_add/local_sub: Support large immediate values David Laight
@ 2026-08-03  9:59 ` Peter Zijlstra
  2026-08-03 14:49 ` Nicolas Pitre
  3 siblings, 0 replies; 11+ messages in thread
From: Peter Zijlstra @ 2026-08-03  9:59 UTC (permalink / raw)
  To: David Laight
  Cc: Borislav Betkov, Ingo Molnar, Thomas Gleinxer, Dave Hansen, x86,
	Andrew Morton, linux-kernel, Nicolas Pitre, H. Peter Anvin,
	Uwe Kleine-König, rodrigo.alencar, jic23

On Mon, Aug 03, 2026 at 10:47:00AM +0100, David Laight wrote:
> The x86 instruction set only supports 32bit signed immediate values
> for add/sub.
> Replace the "ir" constraint with "er" to avoid build errors.
> 
> Found by a patch that added used mul_u64_add_u64_div_u64() to
> do a rounding divide by 2^32 (perhaps not the best way to do this).
> 
> A quick grep only found one other affected file.

I suppose the percpu stuff works because of __pcpu_cast_4 truncating the
value to u32 and then ignoring the whole signed/unsigned business. And
__pcpu_reg_imm_8 has "re".

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/2] x86/local: local_add/local_sub: Support large immediate values
  2026-08-03  9:47 ` [PATCH 2/2] x86/local: local_add/local_sub: Support large immediate values David Laight
@ 2026-08-03 10:01   ` Peter Zijlstra
  2026-08-03 10:07   ` H. Peter Anvin
  1 sibling, 0 replies; 11+ messages in thread
From: Peter Zijlstra @ 2026-08-03 10:01 UTC (permalink / raw)
  To: David Laight
  Cc: Borislav Betkov, Ingo Molnar, Thomas Gleinxer, Dave Hansen, x86,
	Andrew Morton, linux-kernel, Nicolas Pitre, H. Peter Anvin,
	Uwe Kleine-König, rodrigo.alencar, jic23

On Mon, Aug 03, 2026 at 10:47:02AM +0100, David Laight wrote:
> Replace the "ir" constraint with "er" so that constants over 2^31
> get loaded into a register.
> 
> Signed-off-by: David Laight <david.laight.linux@gmail.com>
> ---
>  arch/x86/include/asm/local.h | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/x86/include/asm/local.h b/arch/x86/include/asm/local.h
> index 4957018fef3e..68af7b74450a 100644
> --- a/arch/x86/include/asm/local.h
> +++ b/arch/x86/include/asm/local.h
> @@ -32,14 +32,14 @@ static inline void local_add(long i, local_t *l)
>  {
>  	asm volatile(_ASM_ADD "%1,%0"
>  		     : "+m" (l->a.counter)
> -		     : "ir" (i));
> +		     : "er" (i));
>  }
>  
>  static inline void local_sub(long i, local_t *l)
>  {
>  	asm volatile(_ASM_SUB "%1,%0"
>  		     : "+m" (l->a.counter)
> -		     : "ir" (i));
> +		     : "er" (i));
>  }

And the other two sites already have "er", how inconsistent :/

Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/2] x86/local: local_add/local_sub: Support large immediate values
  2026-08-03  9:47 ` [PATCH 2/2] x86/local: local_add/local_sub: Support large immediate values David Laight
  2026-08-03 10:01   ` Peter Zijlstra
@ 2026-08-03 10:07   ` H. Peter Anvin
  1 sibling, 0 replies; 11+ messages in thread
From: H. Peter Anvin @ 2026-08-03 10:07 UTC (permalink / raw)
  To: David Laight, Borislav Betkov, Ingo Molnar, Thomas Gleinxer,
	Dave Hansen, x86, Andrew Morton, linux-kernel
  Cc: Nicolas Pitre, Peter Zijlstra, Uwe Kleine-König,
	rodrigo.alencar, jic23

On 2026-08-03 02:47, David Laight wrote:
> Replace the "ir" constraint with "er" so that constants over 2^31
> get loaded into a register.
> 
> Signed-off-by: David Laight <david.laight.linux@gmail.com>

Yep, that's right.

Reviewed-by: H. Peter Anvin <hpa@zytor.com>

> ---
>  arch/x86/include/asm/local.h | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/x86/include/asm/local.h b/arch/x86/include/asm/local.h
> index 4957018fef3e..68af7b74450a 100644
> --- a/arch/x86/include/asm/local.h
> +++ b/arch/x86/include/asm/local.h
> @@ -32,14 +32,14 @@ static inline void local_add(long i, local_t *l)
>  {
>  	asm volatile(_ASM_ADD "%1,%0"
>  		     : "+m" (l->a.counter)
> -		     : "ir" (i));
> +		     : "er" (i));
>  }
>  
>  static inline void local_sub(long i, local_t *l)
>  {
>  	asm volatile(_ASM_SUB "%1,%0"
>  		     : "+m" (l->a.counter)
> -		     : "ir" (i));
> +		     : "er" (i));
>  }
>  
>  /**


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/2] lib: mul_u64_add_u64_div_u64: Fix addition of large constants
  2026-08-03  9:47 ` [PATCH 1/2] lib: mul_u64_add_u64_div_u64: Fix addition of large constants David Laight
@ 2026-08-03 10:08   ` H. Peter Anvin
  0 siblings, 0 replies; 11+ messages in thread
From: H. Peter Anvin @ 2026-08-03 10:08 UTC (permalink / raw)
  To: David Laight, Borislav Betkov, Ingo Molnar, Thomas Gleinxer,
	Dave Hansen, x86, Andrew Morton, linux-kernel
  Cc: Nicolas Pitre, Peter Zijlstra, Uwe Kleine-König,
	rodrigo.alencar, jic23

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@gmail.com>

So it is.

Reviewed-by: H. Peter Anvin <hpa@zytor.com>

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


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 0/2] x86: Use "er" asm constriant for add/sub
  2026-08-03  9:47 [PATCH 0/2] x86: Use "er" asm constriant for add/sub David Laight
                   ` (2 preceding siblings ...)
  2026-08-03  9:59 ` [PATCH 0/2] x86: Use "er" asm constriant for add/sub Peter Zijlstra
@ 2026-08-03 14:49 ` Nicolas Pitre
  2026-08-03 15:39   ` David Laight
  3 siblings, 1 reply; 11+ messages in thread
From: Nicolas Pitre @ 2026-08-03 14:49 UTC (permalink / raw)
  To: David Laight
  Cc: Borislav Betkov, Ingo Molnar, Thomas Gleinxer, Dave Hansen, x86,
	Andrew Morton, linux-kernel, H. Peter Anvin, Peter Zijlstra,
	Uwe Kleine-König, rodrigo.alencar, jic23

On Mon, 3 Aug 2026, David Laight wrote:

> The x86 instruction set only supports 32bit signed immediate values
> for add/sub.
> Replace the "ir" constraint with "er" to avoid build errors.
> 
> Found by a patch that added used mul_u64_add_u64_div_u64() to
> do a rounding divide by 2^32 (perhaps not the best way to do this).
> 
> A quick grep only found one other affected file.

Would be a good idea adding those cases to the test module.


Nicolas

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 0/2] x86: Use "er" asm constriant for add/sub
  2026-08-03 14:49 ` Nicolas Pitre
@ 2026-08-03 15:39   ` David Laight
  2026-08-23 22:35     ` Jonathan Cameron
  0 siblings, 1 reply; 11+ messages in thread
From: David Laight @ 2026-08-03 15:39 UTC (permalink / raw)
  To: Nicolas Pitre
  Cc: Borislav Betkov, Ingo Molnar, Thomas Gleinxer, Dave Hansen, x86,
	Andrew Morton, linux-kernel, H. Peter Anvin, Peter Zijlstra,
	Uwe Kleine-König, rodrigo.alencar, jic23

On Mon, 3 Aug 2026 10:49:40 -0400 (EDT)
Nicolas Pitre <nico@fluxnic.net> wrote:

> On Mon, 3 Aug 2026, David Laight wrote:
> 
> > The x86 instruction set only supports 32bit signed immediate values
> > for add/sub.
> > Replace the "ir" constraint with "er" to avoid build errors.
> > 
> > Found by a patch that added used mul_u64_add_u64_div_u64() to
> > do a rounding divide by 2^32 (perhaps not the best way to do this).
> > 
> > A quick grep only found one other affected file.  
> 
> Would be a good idea adding those cases to the test module.

They fail to compile so it isn't a big deal.

	David

> 
> 
> Nicolas


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 0/2] x86: Use "er" asm constriant for add/sub
  2026-08-03 15:39   ` David Laight
@ 2026-08-23 22:35     ` Jonathan Cameron
  2026-09-01 16:51       ` Jonathan Cameron
  0 siblings, 1 reply; 11+ messages in thread
From: Jonathan Cameron @ 2026-08-23 22:35 UTC (permalink / raw)
  To: David Laight
  Cc: Nicolas Pitre, Borislav Betkov, Ingo Molnar, Thomas Gleinxer,
	Dave Hansen, x86, Andrew Morton, linux-kernel, H. Peter Anvin,
	Peter Zijlstra, Uwe Kleine-König, rodrigo.alencar

On Mon, 3 Aug 2026 16:39:55 +0100
David Laight <david.laight.linux@gmail.com> wrote:

> On Mon, 3 Aug 2026 10:49:40 -0400 (EDT)
> Nicolas Pitre <nico@fluxnic.net> wrote:
> 
> > On Mon, 3 Aug 2026, David Laight wrote:
> >   
> > > The x86 instruction set only supports 32bit signed immediate values
> > > for add/sub.
> > > Replace the "ir" constraint with "er" to avoid build errors.
> > > 
> > > Found by a patch that added used mul_u64_add_u64_div_u64() to
> > > do a rounding divide by 2^32 (perhaps not the best way to do this).
> > > 
> > > A quick grep only found one other affected file.    
> > 
> > Would be a good idea adding those cases to the test module.  
> 
> They fail to compile so it isn't a big deal.
> 
David, thanks for sorting this (and all for reviewing)

Seems like everyone is happy.  What route is this taking upstream?

I held Rodrigo's driver to avoid the build breakage and would like to
get it queued up early in next cycle.  So not that urgent but nice
to be able to tick it off the list!

Thanks,

Jonathan

> 	David
> 
> > 
> > 
> > Nicolas  
> 


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 0/2] x86: Use "er" asm constriant for add/sub
  2026-08-23 22:35     ` Jonathan Cameron
@ 2026-09-01 16:51       ` Jonathan Cameron
  0 siblings, 0 replies; 11+ messages in thread
From: Jonathan Cameron @ 2026-09-01 16:51 UTC (permalink / raw)
  To: David Laight, linux-iio
  Cc: Nicolas Pitre, Borislav Betkov, Ingo Molnar, Thomas Gleinxer,
	Dave Hansen, x86, Andrew Morton, linux-kernel, H. Peter Anvin,
	Peter Zijlstra, Uwe Kleine-König, rodrigo.alencar

On Sun, 23 Aug 2026 23:35:36 +0100
Jonathan Cameron <jonathan.cameron@oss.qualcomm.com> wrote:

> On Mon, 3 Aug 2026 16:39:55 +0100
> David Laight <david.laight.linux@gmail.com> wrote:
> 
> > On Mon, 3 Aug 2026 10:49:40 -0400 (EDT)
> > Nicolas Pitre <nico@fluxnic.net> wrote:
> >   
> > > On Mon, 3 Aug 2026, David Laight wrote:
> > >     
> > > > The x86 instruction set only supports 32bit signed immediate values
> > > > for add/sub.
> > > > Replace the "ir" constraint with "er" to avoid build errors.
> > > > 
> > > > Found by a patch that added used mul_u64_add_u64_div_u64() to
> > > > do a rounding divide by 2^32 (perhaps not the best way to do this).
> > > > 
> > > > A quick grep only found one other affected file.      
> > > 
> > > Would be a good idea adding those cases to the test module.    
> > 
> > They fail to compile so it isn't a big deal.
> >   
> David, thanks for sorting this (and all for reviewing)
> 
> Seems like everyone is happy.  What route is this taking upstream?
> 
> I held Rodrigo's driver to avoid the build breakage and would like to
> get it queued up early in next cycle.  So not that urgent but nice
> to be able to tick it off the list!
> 

Given I have a driver queued up behind this, shall I just take it through
the drivers/iio tree?

I can do an immutable branch just in case anyone else needs it this cycle.

Jonathan


> Thanks,
> 
> Jonathan
> 
> > 	David
> >   
> > > 
> > > 
> > > Nicolas    
> >   
> 


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2026-09-01 16:51 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-03  9:47 [PATCH 0/2] x86: Use "er" asm constriant for add/sub David Laight
2026-08-03  9:47 ` [PATCH 1/2] lib: mul_u64_add_u64_div_u64: Fix addition of large constants David Laight
2026-08-03 10:08   ` H. Peter Anvin
2026-08-03  9:47 ` [PATCH 2/2] x86/local: local_add/local_sub: Support large immediate values David Laight
2026-08-03 10:01   ` Peter Zijlstra
2026-08-03 10:07   ` H. Peter Anvin
2026-08-03  9:59 ` [PATCH 0/2] x86: Use "er" asm constriant for add/sub Peter Zijlstra
2026-08-03 14:49 ` Nicolas Pitre
2026-08-03 15:39   ` David Laight
2026-08-23 22:35     ` Jonathan Cameron
2026-09-01 16:51       ` Jonathan Cameron

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.