This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
PATCH: Fix atomic.h for i486
- From: "H. J. Lu" <hjl at lucon dot org>
- To: GNU C Library <libc-alpha at sources dot redhat dot com>
- Date: Mon, 24 Mar 2003 14:41:05 -0800
- Subject: PATCH: Fix atomic.h for i486
I think this patch fixes atomic.h for i486. "make check" passes for me
on i686.
H.J.
---
2003-03-24 H.J. Lu <hjl at gnu dot org>
* sysdeps/i386/i486/bits/atomic.h (__arch_atomic_add_size_condition): New.
(atomic_add_negative): Use it.
(atomic_add_zero): Likewise.
--- sysdeps/i386/i486/bits/atomic.h.exchange 2003-03-24 12:42:07.000000000 -0800
+++ sysdeps/i386/i486/bits/atomic.h 2003-03-24 14:28:27.000000000 -0800
@@ -196,20 +196,20 @@ typedef uintmax_t uatomic_max_t;
})
+#define __arch_atomic_add_size_condition(mem, value, temp, size, cond) \
+ __asm __volatile (LOCK "xadd" #size " %0, %1; test" #size " %0, %0; set" #cond " %2" \
+ : "=r" (__temp), "=m" (*mem), "=qm" (__result) \
+ : "0" (value), "m" (*mem))
+
#define atomic_add_negative(mem, value) \
({ unsigned char __result; \
+ __typeof (*mem) __temp; \
if (sizeof (*mem) == 1) \
- __asm __volatile (LOCK "addb %b2, %0; sets %1" \
- : "=m" (*mem), "=qm" (__result) \
- : "iq" (value), "m" (*mem)); \
+ __arch_atomic_add_size_condition ((mem), (value), __temp, b, s); \
else if (sizeof (*mem) == 2) \
- __asm __volatile (LOCK "addw %w2, %0; sets %1" \
- : "=m" (*mem), "=qm" (__result) \
- : "ir" (value), "m" (*mem)); \
+ __arch_atomic_add_size_condition ((mem), (value), __temp, w, s); \
else if (sizeof (*mem) == 4) \
- __asm __volatile (LOCK "addl %2, %0; sets %1" \
- : "=m" (*mem), "=qm" (__result) \
- : "ir" (value), "m" (*mem)); \
+ __arch_atomic_add_size_condition ((mem), (value), __temp, l, s); \
else \
abort (); \
__result; })
@@ -217,18 +217,13 @@ typedef uintmax_t uatomic_max_t;
#define atomic_add_zero(mem, value) \
({ unsigned char __result; \
+ __typeof (*mem) __temp; \
if (sizeof (*mem) == 1) \
- __asm __volatile (LOCK "addb %b2, %0; setz %1" \
- : "=m" (*mem), "=qm" (__result) \
- : "ir" (value), "m" (*mem)); \
+ __arch_atomic_add_size_condition ((mem), (value), __temp, b, z); \
else if (sizeof (*mem) == 2) \
- __asm __volatile (LOCK "addw %w2, %0; setz %1" \
- : "=m" (*mem), "=qm" (__result) \
- : "ir" (value), "m" (*mem)); \
+ __arch_atomic_add_size_condition ((mem), (value), __temp, w, z); \
else if (sizeof (*mem) == 4) \
- __asm __volatile (LOCK "addl %2, %0; setz %1" \
- : "=m" (*mem), "=qm" (__result) \
- : "ir" (value), "m" (*mem)); \
+ __arch_atomic_add_size_condition ((mem), (value), __temp, l, z); \
else \
abort (); \
__result; })