From 365b16029b0a6645fac11ff61de21ca0d23d223f Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Mon, 22 Sep 2003 22:13:36 +0000 Subject: Update. 2003-09-22 Jakub Jelinek * 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. --- nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) (limited to 'nptl/sysdeps') 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" \ -- cgit v1.2.3