[PATCH] [BZ#2505] PPC32 should use lwsync where possible

Segher Boessenkool segher@kernel.crashing.org
Mon Apr 3 23:20:00 GMT 2006


Hi Steven,

I would love to review this, but I'm afraid I have no idea
what any of these macros are supposed to do.  Could you please
explain, preferably in code comments, or just point me to the
documentation (that I searched for, but could not find)?  Thanks.


Segher



On 3-apr-2006, at 22:06, Steven Munroe wrote:

> [BZ#2505]
>
> The currently PPC32 still uses (full) sync for atomic.h and
> lowlevellock.h to insure backward compatibility with older 32-bit PPC
> chips. This is penalizing the performance of 32-bit applications on  
> the
> newer 64-bit processors like 970, POWER4, and POWER5 which do  
> implement
> lwsync.
>
> With gcc-4.1, gcc will define _ARCH_PWR4 when -mcpu=[970, power4,
> power5,power5+]  is specified. This works with the --with-cpu=  
> configure
> option allow builds targeted for 64-bit hardware to include new
> instructions available on power4 and newer architecture levels.
>
> The attached patches will define macros to use lwsync if _ARCH_PWR4 is
> defined.
>
>
> 2006-04-03  Steven Munroe  <sjmunroe@us.ibm.com>
>
> 	[BZ #2505]
> 	* sysdeps/powerpc/powerpc32/bits/atomic.h [_ARCH_PWR4]:
> 	Define atomic_read_barrier and __ARCH_REL_INSTR using lwsync.
>
> diff -urN libc24-cvstip-20060331/sysdeps/powerpc/powerpc32/bits/ 
> atomic.h libc24/sysdeps/powerpc/powerpc32/bits/atomic.h
> --- libc24-cvstip-20060331/sysdeps/powerpc/powerpc32/bits/atomic.h	 
> 2004-09-08 00:16:09.000000000 -0500
> +++ libc24/sysdeps/powerpc/powerpc32/bits/atomic.h	2006-03-31  
> 17:33:32.598312040 -0600
> @@ -89,12 +89,27 @@
>  # define __arch_atomic_decrement_if_positive_64(mem) \
>      ({ abort (); (*mem)--; })
>
> +#ifdef _ARCH_PWR4
> +/*
> + * Newer powerpc64 processors support the new "light weight" sync  
> (lwsync)
> + * So if the build is using -mcpu=[power4,power5,power5+,970] we can
> + * safely use lwsync.
> + */
> +# define atomic_read_barrier()	__asm ("lwsync" ::: "memory")
> +/*
> + * "light weight" sync can also be used for the release barrier.
> + */
> +# ifndef UP
> +#  define __ARCH_REL_INSTR	"lwsync"
> +# endif
> +#else
>  /*
>   * Older powerpc32 processors don't support the new "light weight"
>   * sync (lwsync).  So the only safe option is to use normal sync
>   * for all powerpc32 applications.
>   */
>  # define atomic_read_barrier()	__asm ("sync" ::: "memory")
> +#endif
>
>  /*
>   * Include the rest of the atomic ops macros which are common to both
> 2006-04-03  Steven Munroe  <sjmunroe@us.ibm.com>
>
> 	[BZ #2505]
> 	* sysdeps/unix/sysv/linux/powerpc/lowlevellock.h [_ARCH_PWR4]:
> 	Define __lll_rel_instr using lwsync.
>
> diff -urN libc24-cvstip-20060331/nptl/sysdeps/unix/sysv/linux/ 
> powerpc/lowlevellock.h libc24/nptl/sysdeps/unix/sysv/linux/powerpc/ 
> lowlevellock.h
> --- libc24-cvstip-20060331/nptl/sysdeps/unix/sysv/linux/powerpc/ 
> lowlevellock.h	2006-02-17 12:44:33.000000000 -0600
> +++ libc24/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h	 
> 2006-03-31 17:32:54.997302072 -0600
> @@ -110,7 +110,21 @@
>  # define __lll_rel_instr	""
>  #else
>  # define __lll_acq_instr	"isync"
> -# define __lll_rel_instr	"sync"
> +# ifdef _ARCH_PWR4
> +/*
> + * Newer powerpc64 processors support the new "light weight" sync  
> (lwsync)
> + * So if the build is using -mcpu=[power4,power5,power5+,970] we can
> + * safely use lwsync.
> + */
> +#  define __lll_rel_instr	"lwsync"
> +# else
> +/*
> + * Older powerpc32 processors don't support the new "light weight"
> + * sync (lwsync).  So the only safe option is to use normal sync
> + * for all powerpc32 applications.
> + */
> +#  define __lll_rel_instr	"sync"
> +# endif
>  #endif
>
>  /* Set *futex to ID if it is 0, atomically.  Returns the old value */



More information about the Libc-alpha mailing list