Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 7 Mar 2005 22:09:03 GMT
From:      John Baldwin <jhb@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 72664 for review
Message-ID:  <200503072209.j27M93kD026257@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=72664

Change 72664 by jhb@jhb_slimer on 2005/03/07 22:08:18

	- Stop using +m constraint.
	- Remove "memory" clobber from atomic_cmpset() and instead add the
	  clobber to all of the various acq variants.

Affected files ...

.. //depot/projects/smpng/sys/i386/include/atomic.h#22 edit

Differences ...

==== //depot/projects/smpng/sys/i386/include/atomic.h#22 (text+ko) ====

@@ -96,15 +96,17 @@
 atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\
 {							\
 	__asm __volatile(__XSTRING(MPLOCKED) OP		\
-			 : "+m" (*p)			\
-			 : CONS (V));			\
+			 : "=m" (*p)			\
+			 : CONS (V), "m" (*p));		\
 }							\
+ATOMIC_ACQ(NAME, TYPE);					\
 struct __hack
 
 #else /* !(__GNUC__ || __INTEL_COMPILER) */
 
 #define ATOMIC_ASM(NAME, TYPE, OP, CONS, V)				\
-extern void atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v)
+extern void atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v);	\
+ATOMIC_ACQ(NAME, TYPE)
 
 #endif /* __GNUC__ || __INTEL_COMPILER */
 
@@ -130,16 +132,16 @@
 	"	cli ;			"
 	"	cmpl	%0,%2 ;		"
 	"	jne	1f ;		"
-	"	movl	%1,%2 ;		"
+	"	movl	%2,%1 ;		"
 	"1:				"
 	"       sete	%%al;		"
 	"	movzbl	%%al,%0 ;	"
 	"	popfl ;			"
 	"# atomic_cmpset_int"
 	: "+a" (res)			/* 0 (result) */
-	: "r" (src),			/* 1 */
-	  "m" (*(dst))			/* 2 */
-	: "memory");
+	  "=m" (*dst)			/* 1 */
+	: "r" (src),			/* 2 */
+	  "m" (*dst));			/* 3 */
 
 	return (res);
 }
@@ -153,25 +155,21 @@
 
 	__asm __volatile (
 	"	" __XSTRING(MPLOCKED) "	"
-	"	cmpxchgl %1,%2 ;	"
+	"	cmpxchgl %2,%1 ;	"
 	"       setz	%%al ;		"
 	"	movzbl	%%al,%0 ;	"
 	"1:				"
 	"# atomic_cmpset_int"
 	: "+a" (res)			/* 0 (result) */
-	: "r" (src),			/* 1 */
-	  "m" (*(dst))			/* 2 */
-	: "memory");				 
+	  "=m" (*dst)			/* 1 */
+	: "r" (src),			/* 2 */
+	  "m" (*dst));			/* 3 */
 
 	return (res);
 }
 
 #endif /* defined(CPU_DISABLE_CMPXCHG) */
 
-#endif /* defined(__GNUC__) || defined(__INTEL_COMPILER) */
-
-#if defined(__GNUC__) || defined(__INTEL_COMPILER)
-
 #if defined(_KERNEL) && !defined(SMP)
 
 /*
@@ -205,8 +203,9 @@
 							\
 	__asm __volatile(__XSTRING(MPLOCKED) LOP	\
 	: "=a" (res),			/* 0 (result) */\
-	  "+m" (*p)			/* 1 */		\
-	: : "memory");				 	\
+	  "=m" (*p)			/* 1 */		\
+	: "m" (*p)			/* 2 */		\
+	: "memory");					\
 							\
 	return (res);					\
 }							\
@@ -218,9 +217,9 @@
 atomic_store_rel_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\
 {							\
 	__asm __volatile(SOP				\
-	: "+m" (*p),			/* 0 */		\
+	: "=m" (*p),			/* 0 */		\
 	  "+r" (v)			/* 1 */		\
-	: : "memory");				 	\
+	: "m" (*p));			/* 2 */		\
 }							\
 struct __hack
 
@@ -238,6 +237,15 @@
 
 #endif /* KLD_MODULE */
 
+#define	ATOMIC_ACQ(NAME, TYPE)				\
+static __inline void					\
+atomic_##NAME##_##TYPE##_acq(volatile u_##TYPE *p, u_##TYPE v)\
+{							\
+	atomic_##NAME##_##TYPE(p, v);			\
+	__asm __volatile("" ::: "memory");		\
+}							\
+struct __hack
+      
 ATOMIC_ASM(set,	     char,  "orb %b1,%0",  "iq",  v);
 ATOMIC_ASM(clear,    char,  "andb %b1,%0", "iq", ~v);
 ATOMIC_ASM(add,	     char,  "addb %b1,%0", "iq",  v);
@@ -266,48 +274,30 @@
 #undef ATOMIC_ASM
 #undef ATOMIC_STORE_LOAD
 
-#define	atomic_set_acq_char		atomic_set_char
 #define	atomic_set_rel_char		atomic_set_char
-#define	atomic_clear_acq_char		atomic_clear_char
 #define	atomic_clear_rel_char		atomic_clear_char
-#define	atomic_add_acq_char		atomic_add_char
 #define	atomic_add_rel_char		atomic_add_char
-#define	atomic_subtract_acq_char	atomic_subtract_char
 #define	atomic_subtract_rel_char	atomic_subtract_char
 
-#define	atomic_set_acq_short		atomic_set_short
 #define	atomic_set_rel_short		atomic_set_short
-#define	atomic_clear_acq_short		atomic_clear_short
 #define	atomic_clear_rel_short		atomic_clear_short
-#define	atomic_add_acq_short		atomic_add_short
 #define	atomic_add_rel_short		atomic_add_short
-#define	atomic_subtract_acq_short	atomic_subtract_short
 #define	atomic_subtract_rel_short	atomic_subtract_short
 
-#define	atomic_set_acq_int		atomic_set_int
 #define	atomic_set_rel_int		atomic_set_int
-#define	atomic_clear_acq_int		atomic_clear_int
 #define	atomic_clear_rel_int		atomic_clear_int
-#define	atomic_add_acq_int		atomic_add_int
 #define	atomic_add_rel_int		atomic_add_int
-#define	atomic_subtract_acq_int		atomic_subtract_int
 #define	atomic_subtract_rel_int		atomic_subtract_int
-#define atomic_cmpset_acq_int		atomic_cmpset_int
 #define atomic_cmpset_rel_int		atomic_cmpset_int
 
-#define	atomic_set_acq_long		atomic_set_long
 #define	atomic_set_rel_long		atomic_set_long
-#define	atomic_clear_acq_long		atomic_clear_long
 #define	atomic_clear_rel_long		atomic_clear_long
-#define	atomic_add_acq_long		atomic_add_long
 #define	atomic_add_rel_long		atomic_add_long
-#define	atomic_subtract_acq_long	atomic_subtract_long
 #define	atomic_subtract_rel_long	atomic_subtract_long
 #define	atomic_cmpset_long		atomic_cmpset_int
 #define	atomic_cmpset_acq_long		atomic_cmpset_acq_int
 #define	atomic_cmpset_rel_long		atomic_cmpset_rel_int
 
-#define atomic_cmpset_acq_ptr		atomic_cmpset_ptr
 #define atomic_cmpset_rel_ptr		atomic_cmpset_ptr
 
 #define	atomic_set_8		atomic_set_char
@@ -361,6 +351,16 @@
 
 #if !defined(WANT_FUNCTIONS)
 static __inline int
+atomic_cmpset_acq_int(volatile u_int *dst, u_int exp, u_int src)
+{
+	int retval;
+
+	retval = atomic_cmpset_int(dst, exp, src);
+	__asm __volatile("" ::: "memory");
+	return (retval);
+}
+
+static __inline int
 atomic_cmpset_ptr(volatile void *dst, void *exp, void *src)
 {
 
@@ -368,6 +368,14 @@
 	    (u_int)src));
 }
 
+static __inline int
+atomic_cmpset_acq_ptr(volatile void *dst, void *exp, void *src)
+{
+
+	return (atomic_cmpset_acq_int((volatile u_int *)dst, (u_int)exp,
+	    (u_int)src));
+}
+
 static __inline void *
 atomic_load_acq_ptr(volatile void *p)
 {
@@ -421,8 +429,9 @@
 	"	xorl	%0,%0 ;		"
 	"	xchgl	%1,%0 ;		"
 	"# atomic_readandclear_int"
-	: "=&r" (result)		/* 0 (result) */
-	: "m" (*addr));			/* 1 (addr) */
+	: "=&r" (result),		/* 0 (result) */
+	  "=m" (*addr)			/* 1 (addr) */
+	: "m" (*addr));			/* 2 (addr) */
 
 	return (result);
 }
@@ -436,8 +445,9 @@
 	"	xorl	%0,%0 ;		"
 	"	xchgl	%1,%0 ;		"
 	"# atomic_readandclear_int"
-	: "=&r" (result)		/* 0 (result) */
-	: "m" (*addr));			/* 1 (addr) */
+	: "=&r" (result),		/* 0 (result) */
+	  "=m" (*addr)			/* 1 (addr) */
+	: "m" (*addr));			/* 2 (addr) */
 
 	return (result);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200503072209.j27M93kD026257>