summaryrefslogtreecommitdiff
path: root/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-09-22 22:13:36 +0000
committerUlrich Drepper <drepper@redhat.com>2003-09-22 22:13:36 +0000
commit365b16029b0a6645fac11ff61de21ca0d23d223f (patch)
tree0444dee2969e20b14d203fe8d96b51014221347f /nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h
parent39358e8b2bbf78b3ee50027abcd12837473b5f9f (diff)
Update.
2003-09-22 Jakub Jelinek <jakub@redhat.com> * include/atomic.h (atomic_compare_and_exchange_val_rel, atomic_compare_and_exchange_bool_rel): Swap oldval/newval arguments to avoid confusion. * sysdeps/unix/opendir.c: Include string.h.
Diffstat (limited to 'nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h')
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h22
1 files changed, 14 insertions, 8 deletions
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h
index 900c9cd5b1..8b084d069e 100644
--- a/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h
+++ b/nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h
@@ -184,10 +184,7 @@ extern int lll_unlock_wake_cb (int *__futex) attribute_hidden;
2 - taken by more users */
-//#if defined NOT_IN_libc || defined UP
-/* According to AMD it is not necessary to play tricks with avoiding the
- lock instruction. */
-#if 1
+#if defined NOT_IN_libc || defined UP
# define lll_trylock(futex) lll_mutex_trylock (futex)
# define lll_lock(futex) lll_mutex_lock (futex)
# define lll_unlock(futex) lll_mutex_unlock (futex)
@@ -195,14 +192,19 @@ extern int lll_unlock_wake_cb (int *__futex) attribute_hidden;
/* Special versions of the macros for use in libc itself. They avoid
the lock prefix when the thread library is not used.
+ The code sequence to avoid unnecessary lock prefixes is what the AMD
+ guys suggested. If you do not like it, bring it up with AMD.
+
XXX In future we might even want to avoid it on UP machines. */
# define lll_trylock(futex) \
({ unsigned char ret; \
__asm __volatile ("cmpl $0, __libc_multiple_threads(%%rip)\n\t" \
"je 0f\n\t" \
- "lock\n" \
- "0:\tcmpxchgl %2, %1; setne %0" \
+ "lock; cmpxchgl %2, %1\n\t" \
+ "jmp 1f\n" \
+ "0:\tcmpxchgl %2, %1\n\t" \
+ "1:setne %0" \
: "=a" (ret), "=m" (futex) \
: "r" (LLL_MUTEX_LOCK_INITIALIZER_LOCKED), "m" (futex),\
"0" (LLL_MUTEX_LOCK_INITIALIZER) \
@@ -214,7 +216,9 @@ extern int lll_unlock_wake_cb (int *__futex) attribute_hidden;
(void) ({ int ignore1, ignore2, ignore3; \
__asm __volatile ("cmpl $0, __libc_multiple_threads(%%rip)\n\t" \
"je 0f\n\t" \
- "lock\n" \
+ "lock; cmpxchgl %0, %2\n\t" \
+ "jnz 1f\n\t" \
+ "jmp 2f\n" \
"0:\tcmpxchgl %0, %2\n\t" \
"jnz 1f\n\t" \
".subsection 1\n" \
@@ -235,7 +239,9 @@ extern int lll_unlock_wake_cb (int *__futex) attribute_hidden;
(void) ({ int ignore; \
__asm __volatile ("cmpl $0, __libc_multiple_threads(%%rip)\n\t" \
"je 0f\n\t" \
- "lock\n" \
+ "lock; decl %0\n\t" \
+ "jne 1f\n\t" \
+ "jmp 2f\n" \
"0:\tdecl %0\n\t" \
"jne 1f\n\t" \
".subsection 1\n" \