aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/storage/lmgr/s_lock.c27
-rw-r--r--src/include/port/linux.h5
-rw-r--r--src/include/storage/s_lock.h31
3 files changed, 36 insertions, 27 deletions
diff --git a/src/backend/storage/lmgr/s_lock.c b/src/backend/storage/lmgr/s_lock.c
index 0d30203a5f3..f767863b2a2 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 d4da17da45c..283799c14d6 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 1174b13694e..16457507a51 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)