summaryrefslogtreecommitdiff
path: root/libpthread/nptl/sysdeps/metag/pthread_spin_trylock.S
diff options
context:
space:
mode:
Diffstat (limited to 'libpthread/nptl/sysdeps/metag/pthread_spin_trylock.S')
-rw-r--r--libpthread/nptl/sysdeps/metag/pthread_spin_trylock.S24
1 files changed, 24 insertions, 0 deletions
diff --git a/libpthread/nptl/sysdeps/metag/pthread_spin_trylock.S b/libpthread/nptl/sysdeps/metag/pthread_spin_trylock.S
new file mode 100644
index 000000000..e0b9b5083
--- /dev/null
+++ b/libpthread/nptl/sysdeps/metag/pthread_spin_trylock.S
@@ -0,0 +1,24 @@
+! Copyright (C) 2013 Imagination Technologies Ltd.
+
+! Licensed under LGPL v2.1 or later, see the file COPYING.LIB in this tarball.
+
+#include <pthread-errnos.h>
+
+ .text
+ .global _pthread_spin_trylock
+ .type _pthread_spin_trylock,function
+_pthread_spin_trylock:
+1: MOVT D0Re0, #HI(#EBUSY)
+ ADD D0Re0, D0Re0, #LO(#EBUSY)
+ LNKGETD D0Ar2, [D1Ar1]
+ CMP D0Ar2, #0
+ ADD D0Ar2, D0Ar2, #1
+ LNKSETDEQ [D1Ar1], D0Ar2
+ BNE 2f
+ DEFR D0Ar2, TXSTAT
+ ANDT D0Ar2, D0Ar2, #HI(0x3f000000)
+ CMPT D0Ar2, #HI(0x02000000)
+ BNZ 1b
+ MOV D0Re0, #0
+2: MOV PC, D1RtP
+ .size _pthread_spin_trylock,.-_pthread_spin_trylock