--- src/atomic_ops/sysdeps/gcc/powerpc.h.orig 2006-03-28 22:49:14.000000000 +0000 +++ src/atomic_ops/sysdeps/gcc/powerpc.h 2007-06-08 23:10:07.000000000 +0000 @@ -63,6 +63,8 @@ /* seems to be that a data dependent branch followed by an isync is */ /* cheaper. And the documentation is fairly explicit that this also */ /* has acquire semantics. */ +/* ppc64 uses ld not lwz */ +#if defined(__powerpc64__) || defined(__ppc64__) || defined(__64BIT__) AO_INLINE AO_t AO_load_acquire(volatile AO_t *addr) { @@ -72,7 +74,7 @@ /* registers. I always got "impossible constraint" when I */ /* tried the "y" constraint. */ __asm__ __volatile__ ( - "lwz %0,%1\n" + "ld %0,%1\n" "cmpw cr7,%0,%0\n" "bne- cr7,1f\n" "1: isync\n" @@ -80,7 +82,25 @@ : "m"(*addr) : "memory", "cc"); return result; } +#else +AO_INLINE AO_t +AO_load_acquire(volatile AO_t *addr) +{ + AO_t result; + /* FIXME: We should get gcc to allocate one of the condition */ + /* registers. I always got "impossible constraint" when I */ + /* tried the "y" constraint. */ + __asm__ __volatile__ ( + "lwz %0,%1\n" + "cmpw cr7,%0,%0\n" + "bne- cr7,1f\n" + "1: isync\n" + : "=r" (result) + : "m"(*addr) : "memory", "cc"); + return result; +} +#endif #define AO_HAVE_load_acquire /* We explicitly specify store_release, since it relies */