This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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; })


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]