From ab0a3efc49493924133e9daf038d877598e03668 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Mon, 29 Oct 2001 02:19:33 +0000 Subject: * sysdeps/unix/sysv/linux/powerpc/sysdep.h (ALIGNARG, ASM_TYPE_DIRECTIVE, ASM_SIZE_DIRECTIVE, CALL_MCOUNT, ENTRY, EALIGN, DO_CALL, JUMPTARGET, PSEUDO, PSEUDO_RET, PSEUDO_END, L, C_TEXT): Move all these assembly-related definitions to ... * sysdeps/powerpc/elf/sysdep.h: ... this new file. * sysdeps/mach/powerpc/machine-lock.h: Assembly code rewritten by Peter Bruin . --- sysdeps/mach/powerpc/machine-lock.h | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'sysdeps/mach/powerpc') diff --git a/sysdeps/mach/powerpc/machine-lock.h b/sysdeps/mach/powerpc/machine-lock.h index 126cd6e0f6..96e833ca15 100644 --- a/sysdeps/mach/powerpc/machine-lock.h +++ b/sysdeps/mach/powerpc/machine-lock.h @@ -38,8 +38,12 @@ typedef __volatile long int __spin_lock_t; _EXTERN_INLINE void __spin_unlock (__spin_lock_t *__lock) { - __asm__ __volatile__ ("sync ; stwcx. %1,0,%0" - : : "r" (__lock), "r" (0) : "cr0"); + long int __locked; + __asm__ __volatile__ ("\ +0: lwarx %0,0,%1 + stwcx. %2,0,%1 + bne- 0b +" : "=&r" (__locked) : "r" (__lock), "r" (0) : "cr0"); } /* Try to lock LOCK; return nonzero if we locked it, zero if another has. */ @@ -48,13 +52,12 @@ _EXTERN_INLINE int __spin_try_lock (register __spin_lock_t *__lock) { long int __rtn; - __asm__ __volatile__ ("\ 0: lwarx %0,0,%1 stwcx. %2,0,%1 bne- 0b -" : "=&r"(__rtn) : "r"(__lock), "r"(1) : "cr0"); - return ~__rtn; +" : "=&r" (__rtn) : "r" (__lock), "r" (1) : "cr0"); + return !__rtn; } /* Return nonzero if LOCK is locked. */ @@ -67,7 +70,7 @@ __spin_lock_locked (__spin_lock_t *__lock) 0: lwarx %0,0,%1 stwcx. %0,0,%1 bne- 0b -" : "=&r"(__rtn) : "r"(__lock) : "cr0"); +" : "=&r" (__rtn) : "r" (__lock) : "cr0"); return __rtn; } -- cgit 1.4.1