[PATCH 5/8] atomic: Switch sh to builtin atomics

Adhemerval Zanella Netto adhemerval.zanella@linaro.org
Tue Sep 9 13:04:06 GMT 2025



On 09/09/25 08:18, Wilco Dijkstra wrote:
> 
> Switch m68k to builtin atomics.

s/m68k/sh

> 
> Passes buildmanyglibc, OK for commit?

LGTM, thanks.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

> 
> ---
> 
> diff --git a/sysdeps/unix/sysv/linux/sh/atomic-machine.h b/sysdeps/unix/sysv/linux/sh/atomic-machine.h
> index fc37d6d6ce4de66057712ef206b1e907d0d29e40..95d6561bb902c4b4ca3ee726b1bfd098b1d9d018 100644
> --- a/sysdeps/unix/sysv/linux/sh/atomic-machine.h
> +++ b/sysdeps/unix/sysv/linux/sh/atomic-machine.h
> @@ -17,381 +17,7 @@
>     <https://www.gnu.org/licenses/>.  */
>  
>  #define __HAVE_64B_ATOMICS 0
> -#define USE_ATOMIC_COMPILER_BUILTINS 0
> +#define USE_ATOMIC_COMPILER_BUILTINS 1
>  
>  /* XXX Is this actually correct?  */
>  #define ATOMIC_EXCHANGE_USES_CAS 1
> -
> -/* SH kernel has implemented a gUSA ("g" User Space Atomicity) support
> -   for the user space atomicity. The atomicity macros use this scheme.
> -
> -  Reference:
> -    Niibe Yutaka, "gUSA: Simple and Efficient User Space Atomicity
> -    Emulation with Little Kernel Modification", Linux Conference 2002,
> -    Japan. http://lc.linux.or.jp/lc2002/papers/niibe0919h.pdf (in
> -    Japanese).
> -
> -    B.N. Bershad, D. Redell, and J. Ellis, "Fast Mutual Exclusion for
> -    Uniprocessors",  Proceedings of the Fifth Architectural Support for
> -    Programming Languages and Operating Systems (ASPLOS), pp. 223-233,
> -    October 1992. http://www.cs.washington.edu/homes/bershad/Papers/Rcs.ps
> -
> -  SuperH ABI:
> -      r15:    -(size of atomic instruction sequence) < 0
> -      r0:     end point
> -      r1:     saved stack pointer
> -*/
> -
> -#define __arch_compare_and_exchange_val_8_acq(mem, newval, oldval) \
> -  ({ __typeof (*(mem)) __result; \
> -     __asm __volatile ("\
> -	mova 1f,r0\n\
> -	.align 2\n\
> -	mov r15,r1\n\
> -	mov #(0f-1f),r15\n\
> -     0: mov.b @%1,%0\n\
> -	cmp/eq %0,%3\n\
> -	bf 1f\n\
> -	mov.b %2,@%1\n\
> -     1: mov r1,r15"\
> -	: "=&r" (__result) : "u" (mem), "u" (newval), "u" (oldval) \
> -	: "r0", "r1", "t", "memory"); \
> -     __result; })
> -
> -#define __arch_compare_and_exchange_val_16_acq(mem, newval, oldval) \
> -  ({ __typeof (*(mem)) __result; \
> -     __asm __volatile ("\
> -	mova 1f,r0\n\
> -	mov r15,r1\n\
> -	.align 2\n\
> -	mov #(0f-1f),r15\n\
> -	mov #-8,r15\n\
> -     0: mov.w @%1,%0\n\
> -	cmp/eq %0,%3\n\
> -	bf 1f\n\
> -	mov.w %2,@%1\n\
> -     1: mov r1,r15"\
> -	: "=&r" (__result) : "u" (mem), "u" (newval), "u" (oldval) \
> -	: "r0", "r1", "t", "memory"); \
> -     __result; })
> -
> -#define __arch_compare_and_exchange_val_32_acq(mem, newval, oldval) \
> -  ({ __typeof (*(mem)) __result; \
> -     __asm __volatile ("\
> -	mova 1f,r0\n\
> -	.align 2\n\
> -	mov r15,r1\n\
> -	mov #(0f-1f),r15\n\
> -     0: mov.l @%1,%0\n\
> -	cmp/eq %0,%3\n\
> -	bf 1f\n\
> -	mov.l %2,@%1\n\
> -     1: mov r1,r15"\
> -	: "=&r" (__result) : "u" (mem), "u" (newval), "u" (oldval) \
> -	: "r0", "r1", "t", "memory"); \
> -     __result; })
> -
> -/* XXX We do not really need 64-bit compare-and-exchange.  At least
> -   not in the moment.  Using it would mean causing portability
> -   problems since not many other 32-bit architectures have support for
> -   such an operation.  So don't define any code for now.  */
> -
> -# define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \
> -  (abort (), (__typeof (*mem)) 0)
> -
> -#define atomic_exchange_and_add(mem, value) \
> -  ({ __typeof (*(mem)) __result, __tmp, __value = (value); \
> -     if (sizeof (*(mem)) == 1) \
> -       __asm __volatile ("\
> -	  mova 1f,r0\n\
> -	  .align 2\n\
> -	  mov r15,r1\n\
> -	  mov #(0f-1f),r15\n\
> -       0: mov.b @%2,%0\n\
> -	  mov %1,r2\n\
> -	  add %0,r2\n\
> -	  mov.b r2,@%2\n\
> -       1: mov r1,r15"\
> -	: "=&r" (__result), "=&r" (__tmp) : "u" (mem), "1" (__value) \
> -	: "r0", "r1", "r2", "memory");		       \
> -     else if (sizeof (*(mem)) == 2) \
> -       __asm __volatile ("\
> -	  mova 1f,r0\n\
> -	  .align 2\n\
> -	  mov r15,r1\n\
> -	  mov #(0f-1f),r15\n\
> -       0: mov.w @%2,%0\n\
> -	  mov %1,r2\n\
> -	  add %0,r2\n\
> -	  mov.w r2,@%2\n\
> -       1: mov r1,r15"\
> -	: "=&r" (__result), "=&r" (__tmp) : "u" (mem), "1" (__value) \
> -	: "r0", "r1", "r2", "memory"); \
> -     else if (sizeof (*(mem)) == 4) \
> -       __asm __volatile ("\
> -	  mova 1f,r0\n\
> -	  .align 2\n\
> -	  mov r15,r1\n\
> -	  mov #(0f-1f),r15\n\
> -       0: mov.l @%2,%0\n\
> -	  mov %1,r2\n\
> -	  add %0,r2\n\
> -	  mov.l r2,@%2\n\
> -       1: mov r1,r15"\
> -	: "=&r" (__result), "=&r" (__tmp) : "u" (mem), "1" (__value) \
> -	: "r0", "r1", "r2", "memory"); \
> -     else \
> -       { \
> -	 __typeof (mem) memp = (mem); \
> -	 do \
> -	   __result = *memp; \
> -	 while (__arch_compare_and_exchange_val_64_acq \
> -		 (memp,	__result + __value, __result) == __result); \
> -	 (void) __value; \
> -       } \
> -     __result; })
> -
> -#define atomic_add(mem, value) \
> -  (void) ({ __typeof (*(mem)) __tmp, __value = (value); \
> -	    if (sizeof (*(mem)) == 1) \
> -	      __asm __volatile ("\
> -		mova 1f,r0\n\
> -		mov r15,r1\n\
> -		.align 2\n\
> -		mov #(0f-1f),r15\n\
> -	     0: mov.b @%1,r2\n\
> -		add %0,r2\n\
> -		mov.b r2,@%1\n\
> -	     1: mov r1,r15"\
> -		: "=&r" (__tmp) : "u" (mem), "0" (__value) \
> -		: "r0", "r1", "r2", "memory"); \
> -	    else if (sizeof (*(mem)) == 2) \
> -	      __asm __volatile ("\
> -		mova 1f,r0\n\
> -		mov r15,r1\n\
> -		.align 2\n\
> -		mov #(0f-1f),r15\n\
> -	     0: mov.w @%1,r2\n\
> -		add %0,r2\n\
> -		mov.w r2,@%1\n\
> -	     1: mov r1,r15"\
> -		: "=&r" (__tmp) : "u" (mem), "0" (__value) \
> -		: "r0", "r1", "r2", "memory"); \
> -	    else if (sizeof (*(mem)) == 4) \
> -	      __asm __volatile ("\
> -		mova 1f,r0\n\
> -		mov r15,r1\n\
> -		.align 2\n\
> -		mov #(0f-1f),r15\n\
> -	     0: mov.l @%1,r2\n\
> -		add %0,r2\n\
> -		mov.l r2,@%1\n\
> -	     1: mov r1,r15"\
> -		: "=&r" (__tmp) : "u" (mem), "0" (__value) \
> -		: "r0", "r1", "r2", "memory"); \
> -	    else \
> -	      { \
> -		__typeof (*(mem)) oldval; \
> -		__typeof (mem) memp = (mem); \
> -		do \
> -		  oldval = *memp; \
> -		while (__arch_compare_and_exchange_val_64_acq \
> -			(memp, oldval + __value, oldval) == oldval); \
> -		(void) __value; \
> -	      } \
> -	    })
> -
> -#define atomic_add_negative(mem, value) \
> -  ({ unsigned char __result; \
> -     __typeof (*(mem)) __tmp, __value = (value); \
> -     if (sizeof (*(mem)) == 1) \
> -       __asm __volatile ("\
> -	  mova 1f,r0\n\
> -	  mov r15,r1\n\
> -	  .align 2\n\
> -	  mov #(0f-1f),r15\n\
> -       0: mov.b @%2,r2\n\
> -	  add %1,r2\n\
> -	  mov.b r2,@%2\n\
> -       1: mov r1,r15\n\
> -	  shal r2\n\
> -	  movt %0"\
> -	: "=r" (__result), "=&r" (__tmp) : "u" (mem), "1" (__value) \
> -	: "r0", "r1", "r2", "t", "memory"); \
> -     else if (sizeof (*(mem)) == 2) \
> -       __asm __volatile ("\
> -	  mova 1f,r0\n\
> -	  mov r15,r1\n\
> -	  .align 2\n\
> -	  mov #(0f-1f),r15\n\
> -       0: mov.w @%2,r2\n\
> -	  add %1,r2\n\
> -	  mov.w r2,@%2\n\
> -       1: mov r1,r15\n\
> -	  shal r2\n\
> -	  movt %0"\
> -	: "=r" (__result), "=&r" (__tmp) : "u" (mem), "1" (__value) \
> -	: "r0", "r1", "r2", "t", "memory"); \
> -     else if (sizeof (*(mem)) == 4) \
> -       __asm __volatile ("\
> -	  mova 1f,r0\n\
> -	  mov r15,r1\n\
> -	  .align 2\n\
> -	  mov #(0f-1f),r15\n\
> -       0: mov.l @%2,r2\n\
> -	  add %1,r2\n\
> -	  mov.l r2,@%2\n\
> -       1: mov r1,r15\n\
> -	  shal r2\n\
> -	  movt %0"\
> -	: "=r" (__result), "=&r" (__tmp) : "u" (mem), "1" (__value) \
> -	: "r0", "r1", "r2", "t", "memory"); \
> -     else \
> -       abort (); \
> -     __result; })
> -
> -#define atomic_add_zero(mem, value) \
> -  ({ unsigned char __result; \
> -     __typeof (*(mem)) __tmp, __value = (value); \
> -     if (sizeof (*(mem)) == 1) \
> -       __asm __volatile ("\
> -	  mova 1f,r0\n\
> -	  mov r15,r1\n\
> -	  .align 2\n\
> -	  mov #(0f-1f),r15\n\
> -       0: mov.b @%2,r2\n\
> -	  add %1,r2\n\
> -	  mov.b r2,@%2\n\
> -       1: mov r1,r15\n\
> -	  tst r2,r2\n\
> -	  movt %0"\
> -	: "=r" (__result), "=&r" (__tmp) : "u" (mem), "1" (__value) \
> -	: "r0", "r1", "r2", "t", "memory"); \
> -     else if (sizeof (*(mem)) == 2) \
> -       __asm __volatile ("\
> -	  mova 1f,r0\n\
> -	  mov r15,r1\n\
> -	  .align 2\n\
> -	  mov #(0f-1f),r15\n\
> -       0: mov.w @%2,r2\n\
> -	  add %1,r2\n\
> -	  mov.w r2,@%2\n\
> -       1: mov r1,r15\n\
> -	  tst r2,r2\n\
> -	  movt %0"\
> -	: "=r" (__result), "=&r" (__tmp) : "u" (mem), "1" (__value) \
> -	: "r0", "r1", "r2", "t", "memory"); \
> -     else if (sizeof (*(mem)) == 4) \
> -       __asm __volatile ("\
> -	  mova 1f,r0\n\
> -	  mov r15,r1\n\
> -	  .align 2\n\
> -	  mov #(0f-1f),r15\n\
> -       0: mov.l @%2,r2\n\
> -	  add %1,r2\n\
> -	  mov.l r2,@%2\n\
> -       1: mov r1,r15\n\
> -	  tst r2,r2\n\
> -	  movt %0"\
> -	: "=r" (__result), "=&r" (__tmp) : "u" (mem), "1" (__value) \
> -	: "r0", "r1", "r2", "t", "memory"); \
> -     else \
> -       abort (); \
> -     __result; })
> -
> -#define atomic_increment_and_test(mem) atomic_add_zero((mem), 1)
> -#define atomic_decrement_and_test(mem) atomic_add_zero((mem), -1)
> -
> -#define atomic_bit_set(mem, bit) \
> -  (void) ({ unsigned int __mask = 1 << (bit); \
> -	    if (sizeof (*(mem)) == 1) \
> -	      __asm __volatile ("\
> -		mova 1f,r0\n\
> -		mov r15,r1\n\
> -		.align 2\n\
> -		mov #(0f-1f),r15\n\
> -	     0: mov.b @%0,r2\n\
> -		or %1,r2\n\
> -		mov.b r2,@%0\n\
> -	     1: mov r1,r15"\
> -		: : "u" (mem), "u" (__mask) \
> -		: "r0", "r1", "r2", "memory"); \
> -	    else if (sizeof (*(mem)) == 2) \
> -	      __asm __volatile ("\
> -		mova 1f,r0\n\
> -		mov r15,r1\n\
> -		.align 2\n\
> -		mov #(0f-1f),r15\n\
> -	     0: mov.w @%0,r2\n\
> -		or %1,r2\n\
> -		mov.w r2,@%0\n\
> -	     1: mov r1,r15"\
> -		: : "u" (mem), "u" (__mask) \
> -		: "r0", "r1", "r2", "memory"); \
> -	    else if (sizeof (*(mem)) == 4) \
> -	      __asm __volatile ("\
> -		mova 1f,r0\n\
> -		mov r15,r1\n\
> -		.align 2\n\
> -		mov #(0f-1f),r15\n\
> -	     0: mov.l @%0,r2\n\
> -		or %1,r2\n\
> -		mov.l r2,@%0\n\
> -	     1: mov r1,r15"\
> -		: : "u" (mem), "u" (__mask) \
> -		: "r0", "r1", "r2", "memory"); \
> -	    else \
> -	      abort (); \
> -	    })
> -
> -#define atomic_bit_test_set(mem, bit) \
> -  ({ unsigned int __mask = 1 << (bit); \
> -     unsigned int __result = __mask; \
> -     if (sizeof (*(mem)) == 1) \
> -       __asm __volatile ("\
> -	  mova 1f,r0\n\
> -	  .align 2\n\
> -	  mov r15,r1\n\
> -	  mov #(0f-1f),r15\n\
> -       0: mov.b @%2,r2\n\
> -	  mov r2,r3\n\
> -	  or %1,r2\n\
> -	  mov.b r2,@%2\n\
> -       1: mov r1,r15\n\
> -	  and r3,%0"\
> -	: "=&r" (__result), "=&r" (__mask) \
> -	: "u" (mem), "0" (__result), "1" (__mask) \
> -	: "r0", "r1", "r2", "r3", "memory");	\
> -     else if (sizeof (*(mem)) == 2) \
> -       __asm __volatile ("\
> -	  mova 1f,r0\n\
> -	  .align 2\n\
> -	  mov r15,r1\n\
> -	  mov #(0f-1f),r15\n\
> -       0: mov.w @%2,r2\n\
> -	  mov r2,r3\n\
> -	  or %1,r2\n\
> -	  mov.w %1,@%2\n\
> -       1: mov r1,r15\n\
> -	  and r3,%0"\
> -	: "=&r" (__result), "=&r" (__mask) \
> -	: "u" (mem), "0" (__result), "1" (__mask) \
> -	: "r0", "r1", "r2", "r3", "memory"); \
> -     else if (sizeof (*(mem)) == 4) \
> -       __asm __volatile ("\
> -	  mova 1f,r0\n\
> -	  .align 2\n\
> -	  mov r15,r1\n\
> -	  mov #(0f-1f),r15\n\
> -       0: mov.l @%2,r2\n\
> -	  mov r2,r3\n\
> -	  or r2,%1\n\
> -	  mov.l %1,@%2\n\
> -       1: mov r1,r15\n\
> -	  and r3,%0"\
> -	: "=&r" (__result), "=&r" (__mask) \
> -	: "u" (mem), "0" (__result), "1" (__mask) \
> -	: "r0", "r1", "r2", "r3", "memory"); \
> -     else \
> -       abort (); \
> -     __result; })
> 
> 



More information about the Libc-alpha mailing list