2010-02-17 Ivan Maidanski <ivmai@mail.ru> (really Patrick Marlier)
authorivmai <ivmai>
Wed, 17 Feb 2010 19:28:28 +0000 (19:28 +0000)
committerIvan Maidanski <ivmai@mail.ru>
Mon, 25 Jul 2011 12:03:25 +0000 (16:03 +0400)
* src/atomic_ops/sysdeps/gcc/x86.h (AO_compare_and_swap_full,
AO_compare_double_and_swap_double_full): Use EAX for the result
since cmpxchg clobbers it.
* src/atomic_ops/sysdeps/sunc/x86.h (AO_compare_and_swap_full,
AO_compare_double_and_swap_double_full): Ditto.
* src/atomic_ops/sysdeps/gcc/x86_64.h (AO_compare_and_swap_full,
AO_compare_double_and_swap_double_full): Ditto.
* src/atomic_ops/sysdeps/sunc/x86_64.h (AO_compare_and_swap_full,
AO_compare_double_and_swap_double_full): Ditto.

ChangeLog
src/atomic_ops/sysdeps/gcc/x86.h
src/atomic_ops/sysdeps/gcc/x86_64.h
src/atomic_ops/sysdeps/sunc/x86.h
src/atomic_ops/sysdeps/sunc/x86_64.h

index cff55b7..4aca48a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2010-02-17  Ivan Maidanski <ivmai@mail.ru> (really Patrick Marlier)
+
+       * src/atomic_ops/sysdeps/gcc/x86.h (AO_compare_and_swap_full,
+       AO_compare_double_and_swap_double_full): Use EAX for the result
+       since cmpxchg clobbers it.
+       * src/atomic_ops/sysdeps/sunc/x86.h (AO_compare_and_swap_full,
+       AO_compare_double_and_swap_double_full): Ditto.
+       * src/atomic_ops/sysdeps/gcc/x86_64.h (AO_compare_and_swap_full,
+       AO_compare_double_and_swap_double_full): Ditto.
+       * src/atomic_ops/sysdeps/sunc/x86_64.h (AO_compare_and_swap_full,
+       AO_compare_double_and_swap_double_full): Ditto.
+
 2010-02-04  Ivan Maidanski <ivmai@mail.ru>
 
        * doc/Makefile.in: Regenerate.
index a82a2f9..faf053b 100644 (file)
@@ -126,7 +126,7 @@ AO_compare_and_swap_full(volatile AO_t *addr,
 {
   char result;
   __asm__ __volatile__("lock; cmpxchgl %3, %0; setz %1"
-                       : "=m"(*addr), "=q"(result)
+                       : "=m"(*addr), "=a"(result)
                        : "m"(*addr), "r" (new_val), "a"(old) : "memory");
   return (int) result;
 }
@@ -149,7 +149,7 @@ AO_compare_double_and_swap_double_full(volatile AO_double_t *addr,
                        "movl %6,%%ebx;" /* move new_val2 to %ebx */
                        "lock; cmpxchg8b %0; setz %1;"
                        "pop %%ebx;"     /* restore %ebx */
-                       : "=m"(*addr), "=q"(result)
+                       : "=m"(*addr), "=a"(result)
                        : "m"(*addr), "d" (old_val2), "a" (old_val1),
                          "c" (new_val2), "m" (new_val1) : "memory");
 #else
@@ -158,7 +158,7 @@ AO_compare_double_and_swap_double_full(volatile AO_double_t *addr,
    * in a clobber, but there's no point doing the push/pop if we don't
    * have to. */
   __asm__ __volatile__("lock; cmpxchg8b %0; setz %1;"
-                       : "=m"(*addr), "=q"(result)
+                       : "=m"(*addr), "=a"(result)
                        : "m"(*addr), "d" (old_val2), "a" (old_val1),
                          "c" (new_val2), "b" (new_val1) : "memory");
 #endif
index 78a4a0f..512667b 100644 (file)
@@ -132,7 +132,7 @@ AO_compare_and_swap_full(volatile AO_t *addr,
 {
   char result;
   __asm__ __volatile__("lock; cmpxchgq %3, %0; setz %1"
-                       : "=m"(*addr), "=q"(result)
+                       : "=m"(*addr), "=a"(result)
                        : "m"(*addr), "r" (new_val), "a"(old) : "memory");
   return (int) result;
 }
@@ -156,12 +156,9 @@ AO_compare_double_and_swap_double_full(volatile AO_double_t *addr,
 {
   char result;
   __asm__ __volatile__("lock; cmpxchg16b %0; setz %1"
-                                : "=m"(*addr), "=q"(result)
-                                        : "m"(*addr),
-                                          "d" (old_val2),
-                                          "a" (old_val1),
-                                          "c" (new_val2),
-                                          "b" (new_val1)  : "memory");
+                       : "=m"(*addr), "=a"(result)
+                       : "m"(*addr), "d" (old_val2), "a" (old_val1),
+                         "c" (new_val2), "b" (new_val1) : "memory");
   return (int) result;
 }
 #define AO_HAVE_compare_double_and_swap_double_full
index 96bbe12..5086e84 100644 (file)
@@ -125,7 +125,7 @@ AO_compare_and_swap_full(volatile AO_t *addr,
 {
   char result;
   __asm__ __volatile__("lock; cmpxchgl %2, %0; setz %1"
-                       : "=m"(*addr), "=q"(result)
+                       : "=m"(*addr), "=a"(result)
                        : "r" (new_val), "a"(old) : "memory");
   return (int) result;
 }
@@ -151,7 +151,7 @@ AO_compare_double_and_swap_double_full(volatile AO_double_t *addr,
                        "movl %6,%%ebx;" /* move new_val2 to %ebx */
                        "lock; cmpxchg8b %0; setz %1;"
                        "pop %%ebx;"     /* restore %ebx */
-                       : "=m"(*addr), "=q"(result)
+                       : "=m"(*addr), "=a"(result)
                        : "m"(*addr), "d" (old_val2), "a" (old_val1),
                          "c" (new_val2), "m" (new_val1) : "memory");
 #else
@@ -160,7 +160,7 @@ AO_compare_double_and_swap_double_full(volatile AO_double_t *addr,
    * in a clobber, but there's no point doing the push/pop if we don't
    * have to. */
   __asm__ __volatile__("lock; cmpxchg8b %0; setz %1;"
-                       : "=m"(*addr), "=q"(result)
+                       : "=m"(*addr), "=a"(result)
                        : /* "m"(*addr), */ "d" (old_val2), "a" (old_val1),
                          "c" (new_val2), "b" (new_val1) : "memory");
 #endif
index ca5995a..ac5f51d 100644 (file)
@@ -126,7 +126,7 @@ AO_compare_and_swap_full(volatile AO_t *addr,
 {
   char result;
   __asm__ __volatile__("lock; cmpxchgq %2, %0; setz %1"
-                       : "=m"(*addr), "=q"(result)
+                       : "=m"(*addr), "=a"(result)
                        : "r" (new_val), "a"(old) : "memory");
   return (int) result;
 }
@@ -150,12 +150,9 @@ AO_compare_double_and_swap_double_full(volatile AO_double_t *addr,
 {
   char result;
   __asm__ __volatile__("lock; cmpxchg16b %0; setz %1"
-                                : "=m"(*addr), "=q"(result)
-                                        : "m"(*addr),
-                                          "d" (old_val2),
-                                          "a" (old_val1),
-                                          "c" (new_val2),
-                                          "b" (new_val1)  : "memory");
+                       : "=m"(*addr), "=a"(result)
+                       : "m"(*addr), "d" (old_val2), "a" (old_val1),
+                         "c" (new_val2), "b" (new_val1) : "memory");
   return (int) result;
 }
 #define AO_HAVE_compare_double_and_swap_double_full