about summary refs log tree commit diff
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)
downloadglibc-365b16029b0a6645fac11ff61de21ca0d23d223f.tar.gz
glibc-365b16029b0a6645fac11ff61de21ca0d23d223f.tar.xz
glibc-365b16029b0a6645fac11ff61de21ca0d23d223f.zip
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"				      \