+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.
{
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;
}
"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
* 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
{
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;
}
{
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
{
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;
}
"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
* 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
{
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;
}
{
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