diff --git a/src/backend/storage/lmgr/s_lock.c b/src/backend/storage/lmgr/s_lock.c index 0d30203a5f..f767863b2a 100644 --- a/src/backend/storage/lmgr/s_lock.c +++ b/src/backend/storage/lmgr/s_lock.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/s_lock.c,v 1.9 2002/09/21 00:14:05 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/s_lock.c,v 1.10 2002/11/10 00:33:43 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -144,31 +144,6 @@ success: \n\ } #endif /* __APPLE__ && __ppc__ */ -#if defined(__powerpc__) -/* Note: need a nice gcc constrained asm version so it can be inlined */ -static void -tas_dummy() -{ - __asm__ __volatile__( - "\ -.global tas \n\ -tas: \n\ - lwarx 5,0,3 \n\ - cmpwi 5,0 \n\ - bne fail \n\ - addi 5,5,1 \n\ - stwcx. 5,0,3 \n\ - beq success \n\ -fail: li 3,1 \n\ - blr \n\ -success: \n\ - isync \n\ - li 3,0 \n\ - blr \n\ -"); -} -#endif /* __powerpc__ */ - #if defined(__mips__) && !defined(__sgi) static void tas_dummy() diff --git a/src/include/port/linux.h b/src/include/port/linux.h index d4da17da45..283799c14d 100644 --- a/src/include/port/linux.h +++ b/src/include/port/linux.h @@ -14,6 +14,11 @@ typedef unsigned char slock_t; #define HAS_TEST_AND_SET +#elif defined(__powerpc64__) +typedef unsigned long slock_t; + +#define HAS_TEST_AND_SET + #elif defined(__powerpc__) typedef unsigned int slock_t; diff --git a/src/include/storage/s_lock.h b/src/include/storage/s_lock.h index 1174b13694..16457507a5 100644 --- a/src/include/storage/s_lock.h +++ b/src/include/storage/s_lock.h @@ -63,7 +63,7 @@ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: s_lock.h,v 1.101 2002/09/21 00:14:05 tgl Exp $ + * $Id: s_lock.h,v 1.102 2002/11/10 00:33:43 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -194,6 +194,35 @@ tas(volatile slock_t *lock) #endif /* __sparc__ */ +#if defined(__powerpc__) || defined(__powerpc64__) +static __inline__ int +tas(volatile slock_t *lock) +{ + slock_t _t; + int _res; + + __asm__ __volatile__( +" lwarx %0,0,%3 \n" +" cmpwi %0,0 \n" +" bne 1f \n" +" addi %0,%0,1 \n" +" stwcx. %0,0,%3 \n" +" isync \n" +" beq 2f \n" +"1: li %2,1 \n" +" b 3f \n" +"2: \n" +" li %2,0 \n" +"3: \n" + +: "=&r" (_t), "=m" (lock), "=r" (_res) +: "r" (lock) +: "cc", "memory" + ); + return _res; +} +#endif + #if defined(__mc68000__) && defined(__linux__) #define TAS(lock) tas(lock)