Skip to content
Snippets Groups Projects
Commit ceb4f5ea authored by Bruce Momjian's avatar Bruce Momjian
Browse files

> > I'll re-check that with the ppc architecture guy here.

>
> ... he is now about to write an inlined version that can go into
> s_lock.h . I'll send the new patch later on...

OK, here it comes:

An inlined version of tas(), that works for both, powerpc and
powerpc64. The patch is against 7.3b5 and passes the test suite on
both architectures.

Reinhard Max
parent 50e726a2
No related branches found
No related tags found
No related merge requests found
......@@ -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()
......
......@@ -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;
......
......@@ -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)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment