about summary refs log tree commit diff
path: root/sysdeps/i386/i486/bits/atomic.h
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-03-20 09:03:23 +0000
committerUlrich Drepper <drepper@redhat.com>2003-03-20 09:03:23 +0000
commit3dbe0d9517935d549f2630728500b6f275750ec8 (patch)
treec25d29d53b1ca68d311a36bf9a4b54a200157c06 /sysdeps/i386/i486/bits/atomic.h
parent91958edc8459a45bc8c0b6d355ffbfdd245296fb (diff)
downloadglibc-3dbe0d9517935d549f2630728500b6f275750ec8.tar.gz
glibc-3dbe0d9517935d549f2630728500b6f275750ec8.tar.xz
glibc-3dbe0d9517935d549f2630728500b6f275750ec8.zip
Change atomic_exchange_and_add to return the old value.
Diffstat (limited to 'sysdeps/i386/i486/bits/atomic.h')
-rw-r--r--sysdeps/i386/i486/bits/atomic.h33
1 files changed, 12 insertions, 21 deletions
diff --git a/sysdeps/i386/i486/bits/atomic.h b/sysdeps/i386/i486/bits/atomic.h
index 80a49872e1..87739c6cc6 100644
--- a/sysdeps/i386/i486/bits/atomic.h
+++ b/sysdeps/i386/i486/bits/atomic.h
@@ -123,33 +123,24 @@ typedef uintmax_t uatomic_max_t;
   ({ __typeof (*mem) result;						      \
      __typeof (value) addval = (value);					      \
      if (sizeof (*mem) == 1)						      \
-       {								      \
-	 __asm __volatile (LOCK "xaddb %b0, %1"				      \
-			   : "=r" (result), "=m" (*mem)			      \
-			   : "0" (addval), "1" (*mem));			      \
-	 result += addval;						      \
-       }								      \
+       __asm __volatile (LOCK "xaddb %b0, %1"				      \
+			 : "=r" (result), "=m" (*mem)			      \
+			 : "0" (addval), "1" (*mem));			      \
      else if (sizeof (*mem) == 2)					      \
-       {								      \
-	 __asm __volatile (LOCK "xaddw %w0, %1"				      \
-			   : "=r" (result), "=m" (*mem)			      \
-			   : "0" (addval), "1" (*mem));			      \
-	 result += addval;						      \
-       }								      \
+       __asm __volatile (LOCK "xaddw %w0, %1"				      \
+			 : "=r" (result), "=m" (*mem)			      \
+			 : "0" (addval), "1" (*mem));			      \
      else if (sizeof (*mem) == 4)					      \
-       {								      \
-	 __asm __volatile (LOCK "xaddl %0, %1"				      \
-			   : "=r" (result), "=m" (*mem)			      \
-			   : "0" (addval), "1" (*mem));			      \
-	 result += addval;						      \
-       }								      \
+       __asm __volatile (LOCK "xaddl %0, %1"				      \
+			 : "=r" (result), "=m" (*mem)			      \
+			 : "0" (addval), "1" (*mem));			      \
      else								      \
        {								      \
-	 __typeof (*mem) oldval;					      \
 	 __typeof (mem) memp = (mem);					      \
 	 do								      \
-	   result = (oldval = *memp) + addval;				      \
-	 while (__arch_compare_and_exchange_64_acq (memp, result, oldval));   \
+	   result = *memp;						      \
+	 while (__arch_compare_and_exchange_64_acq (memp, result + addval,    \
+						    result));		      \
        }								      \
      result; })