aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/x86_64/nptl/pthread_spin_trylock.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/x86_64/nptl/pthread_spin_trylock.S')
-rw-r--r--sysdeps/x86_64/nptl/pthread_spin_trylock.S18
1 files changed, 13 insertions, 5 deletions
diff --git a/sysdeps/x86_64/nptl/pthread_spin_trylock.S b/sysdeps/x86_64/nptl/pthread_spin_trylock.S
index fffdb27dd9..a1f97cb420 100644
--- a/sysdeps/x86_64/nptl/pthread_spin_trylock.S
+++ b/sysdeps/x86_64/nptl/pthread_spin_trylock.S
@@ -20,13 +20,21 @@
#include <shlib-compat.h>
ENTRY(__pthread_spin_trylock)
- movl $1, %eax
xorl %ecx, %ecx
- lock
- cmpxchgl %ecx, (%rdi)
+ /* xchg has implicit LOCK prefix. */
+ xchgl %ecx, (%rdi)
+
+ /* Branch on result. Expectation is the use of trylock will be
+ branching on success/failure so this branch can be used to
+ to predict the coming branch. It has the benefit of
+ breaking the likely expensive memory dependency on (%rdi). */
+ cmpl $1, %ecx
+ jnz 1f
+ xorl %eax, %eax
+ ret
+1:
movl $EBUSY, %eax
- cmovel %ecx, %eax
- retq
+ ret
END(__pthread_spin_trylock)
versioned_symbol (libc, __pthread_spin_trylock, pthread_spin_trylock,
GLIBC_2_34)