about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/powerpc/lowlevellock.h')
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/lowlevellock.h19
1 files changed, 17 insertions, 2 deletions
diff --git a/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h b/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h
index d7e1e38cc6..a651d23c50 100644
--- a/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h
+++ b/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h
@@ -190,13 +190,28 @@
 # endif
 #endif
 
+/* Set *futex to ID if it is 0, atomically.  Returns the old value */
+#define __lll_base_trylock(futex, id) \
+  ({ int __val;								      \
+     __asm __volatile ("1:	lwarx	%0,0,%2" MUTEX_HINT_ACQ "\n"	      \
+		       "	cmpwi	0,%0,0\n"			      \
+		       "	bne	2f\n"				      \
+		       "	stwcx.	%3,0,%2\n"			      \
+		       "	bne-	1b\n"				      \
+		       "2:	" __lll_acq_instr			      \
+		       : "=&r" (__val), "=m" (*futex)			      \
+		       : "r" (futex), "r" (id), "m" (*futex)		      \
+		       : "cr0", "memory");				      \
+     __val;								      \
+  })
+
 /* Set *futex to 1 if it is 0, atomically.  Returns the old value */
-#define __lll_trylock(futex) __lll_robust_trylock (futex, 1)
+#define __lll_trylock(futex) __lll_base_trylock (futex, 1)
 
 #define lll_trylock(lock)	__lll_trylock (&(lock))
 
 /* Set *futex to 2 if it is 0, atomically.  Returns the old value */
-#define __lll_cond_trylock(futex) __lll_robust_trylock (futex, 2)
+#define __lll_cond_trylock(futex) __lll_base_trylock (futex, 2)
 
 #define lll_cond_trylock(lock)	__lll_cond_trylock (&(lock))