about summary refs log tree commit diff
path: root/nptl
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
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')
-rw-r--r--nptl/Banner2
-rw-r--r--nptl/ChangeLog5
-rw-r--r--nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h22
3 files changed, 20 insertions, 9 deletions
diff --git a/nptl/Banner b/nptl/Banner
index 5d6a6d0445..5f10f81731 100644
--- a/nptl/Banner
+++ b/nptl/Banner
@@ -1 +1 @@
-NPTL 0.59 by Ulrich Drepper
+NPTL 0.60 by Ulrich Drepper
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index eb32fe193e..00bfbf9ad8 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,3 +1,8 @@
+2003-09-22  Ulrich Drepper  <drepper@redhat.com>
+
+	* sysdeps/unix/sysv/linux/x86_64/lowlevellock.h: Adjust for latest
+	recommendation from AMD re avoidance of lock prefix.
+
 2003-09-22  Jakub Jelinek  <jakub@redhat.com>
 
 	* sysdeps/unix/sysv/linux/lowlevellock.c (__lll_timedlock_wait): Use
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"				      \