svn commit: r254612 - in head/sys: amd64/include i386/include

Jung-uk Kim jkim at FreeBSD.org
Wed Aug 21 21:14:17 UTC 2013


Author: jkim
Date: Wed Aug 21 21:14:16 2013
New Revision: 254612
URL: http://svnweb.freebsd.org/changeset/base/254612

Log:
  Use '+' modifier for a memory operand that is both an input and an output.
  It was actually done in r86301 but reverted in r150182 because GCC 3.x was
  not able to handle it for a memory operand.  Apparently, this problem was
  fixed in GCC 4.1+ and several contrib sources already rely on this feature.

Modified:
  head/sys/amd64/include/atomic.h
  head/sys/i386/include/atomic.h

Modified: head/sys/amd64/include/atomic.h
==============================================================================
--- head/sys/amd64/include/atomic.h	Wed Aug 21 20:49:46 2013	(r254611)
+++ head/sys/amd64/include/atomic.h	Wed Aug 21 21:14:16 2013	(r254612)
@@ -108,8 +108,8 @@ static __inline void					\
 atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\
 {							\
 	__asm __volatile(MPLOCKED OP			\
-	: "=m" (*p)					\
-	: CONS (V), "m" (*p)				\
+	: "+m" (*p)					\
+	: CONS (V)					\
 	: "cc");					\
 }							\
 							\
@@ -117,8 +117,8 @@ static __inline void					\
 atomic_##NAME##_barr_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\
 {							\
 	__asm __volatile(MPLOCKED OP			\
-	: "=m" (*p)					\
-	: CONS (V), "m" (*p)				\
+	: "+m" (*p)					\
+	: CONS (V)					\
 	: "memory", "cc");				\
 }							\
 struct __hack
@@ -142,10 +142,9 @@ atomic_cmpset_int(volatile u_int *dst, u
 	"       sete	%0 ;		"
 	"# atomic_cmpset_int"
 	: "=a" (res),			/* 0 */
-	  "=m" (*dst)			/* 1 */
+	  "+m" (*dst)			/* 1 */
 	: "r" (src),			/* 2 */
-	  "a" (expect),			/* 3 */
-	  "m" (*dst)			/* 4 */
+	  "a" (expect)			/* 3 */
 	: "memory", "cc");
 
 	return (res);
@@ -162,10 +161,9 @@ atomic_cmpset_long(volatile u_long *dst,
 	"       sete	%0 ;		"
 	"# atomic_cmpset_long"
 	: "=a" (res),			/* 0 */
-	  "=m" (*dst)			/* 1 */
+	  "+m" (*dst)			/* 1 */
 	: "r" (src),			/* 2 */
-	  "a" (expect),			/* 3 */
-	  "m" (*dst)			/* 4 */
+	  "a" (expect)			/* 3 */
 	: "memory", "cc");
 
 	return (res);
@@ -184,9 +182,8 @@ atomic_fetchadd_int(volatile u_int *p, u
 	"	xaddl	%0,%1 ;		"
 	"# atomic_fetchadd_int"
 	: "+r" (v),			/* 0 */
-	  "=m" (*p)			/* 1 */
-	: "m" (*p)			/* 2 */
-	: "cc");
+	  "+m" (*p)			/* 1 */
+	: : "cc");
 	return (v);
 }
 
@@ -203,9 +200,8 @@ atomic_fetchadd_long(volatile u_long *p,
 	"	xaddq	%0,%1 ;		"
 	"# atomic_fetchadd_long"
 	: "+r" (v),			/* 0 */
-	  "=m" (*p)			/* 1 */
-	: "m" (*p)			/* 2 */
-	: "cc");
+	  "+m" (*p)			/* 1 */
+	: : "cc");
 	return (v);
 }
 
@@ -253,9 +249,8 @@ atomic_load_acq_##TYPE(volatile u_##TYPE
 							\
 	__asm __volatile(MPLOCKED LOP			\
 	: "=a" (res),			/* 0 */		\
-	  "=m" (*p)			/* 1 */		\
-	: "m" (*p)			/* 2 */		\
-	: "memory", "cc");				\
+	  "+m" (*p)			/* 1 */		\
+	: : "memory", "cc");				\
 							\
 	return (res);					\
 }							\
@@ -314,8 +309,7 @@ atomic_readandclear_int(volatile u_int *
 	"	xchgl	%1,%0 ;		"
 	"# atomic_readandclear_int"
 	: "+r" (res),			/* 0 */
-	  "=m" (*p)			/* 1 */
-	: "m" (*p));
+	  "+m" (*p));			/* 1 */
 
 	return (res);
 }
@@ -330,8 +324,7 @@ atomic_readandclear_long(volatile u_long
 	"	xchgq	%1,%0 ;		"
 	"# atomic_readandclear_long"
 	: "+r" (res),			/* 0 */
-	  "=m" (*p)			/* 1 */
-	: "m" (*p));
+	  "+m" (*p));			/* 1 */
 
 	return (res);
 }

Modified: head/sys/i386/include/atomic.h
==============================================================================
--- head/sys/i386/include/atomic.h	Wed Aug 21 20:49:46 2013	(r254611)
+++ head/sys/i386/include/atomic.h	Wed Aug 21 21:14:16 2013	(r254612)
@@ -106,8 +106,8 @@ static __inline void					\
 atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\
 {							\
 	__asm __volatile(MPLOCKED OP			\
-	: "=m" (*p)					\
-	: CONS (V), "m" (*p)				\
+	: "+m" (*p)					\
+	: CONS (V)					\
 	: "cc");					\
 }							\
 							\
@@ -115,8 +115,8 @@ static __inline void					\
 atomic_##NAME##_barr_##TYPE(volatile u_##TYPE *p, u_##TYPE v)\
 {							\
 	__asm __volatile(MPLOCKED OP			\
-	: "=m" (*p)					\
-	: CONS (V), "m" (*p)				\
+	: "+m" (*p)					\
+	: CONS (V)					\
 	: "memory", "cc");				\
 }							\
 struct __hack
@@ -174,11 +174,10 @@ atomic_load_acq_64_i586(volatile uint64_
 	"	movl %%ebx,%%eax ;	"
 	"	movl %%ecx,%%edx ;	"
 	"	" MPLOCKED "		"
-	"	cmpxchg8b %2"
+	"	cmpxchg8b %1"
 	: "=&A" (res),			/* 0 */
-	  "=m" (*p)			/* 1 */
-	: "m" (*p)			/* 2 */
-	: "memory", "cc");
+	  "+m" (*p)			/* 1 */
+	: : "memory", "cc");
 
 	return (res);
 }
@@ -192,12 +191,11 @@ atomic_store_rel_64_i586(volatile uint64
 	"	movl %%edx,%%ecx ;	"
 	"1:				"
 	"	" MPLOCKED "		"
-	"	cmpxchg8b %2 ;		"
+	"	cmpxchg8b %0 ;		"
 	"	jne 1b"
-	: "=m" (*p),			/* 0 */
+	: "+m" (*p),			/* 0 */
 	  "+A" (v)			/* 1 */
-	: "m" (*p)			/* 2 */
-	: "ebx", "ecx", "memory", "cc");
+	: : "ebx", "ecx", "memory", "cc");
 }
 
 #endif /* _KERNEL && !WANT_FUNCTIONS */
@@ -220,7 +218,7 @@ atomic_cmpset_int(volatile u_int *dst, u
 	__asm __volatile(
 	"	pushfl ;		"
 	"	cli ;			"
-	"	cmpl	%3,%4 ;		"
+	"	cmpl	%3,%1 ;		"
 	"	jne	1f ;		"
 	"	movl	%2,%1 ;		"
 	"1:				"
@@ -228,10 +226,9 @@ atomic_cmpset_int(volatile u_int *dst, u
 	"	popfl ;			"
 	"# atomic_cmpset_int"
 	: "=q" (res),			/* 0 */
-	  "=m" (*dst)			/* 1 */
+	  "+m" (*dst)			/* 1 */
 	: "r" (src),			/* 2 */
-	  "r" (expect),			/* 3 */
-	  "m" (*dst)			/* 4 */
+	  "r" (expect)			/* 3 */
 	: "memory");
 
 	return (res);
@@ -250,10 +247,9 @@ atomic_cmpset_int(volatile u_int *dst, u
 	"       sete	%0 ;		"
 	"# atomic_cmpset_int"
 	: "=a" (res),			/* 0 */
-	  "=m" (*dst)			/* 1 */
+	  "+m" (*dst)			/* 1 */
 	: "r" (src),			/* 2 */
-	  "a" (expect),			/* 3 */
-	  "m" (*dst)			/* 4 */
+	  "a" (expect)			/* 3 */
 	: "memory", "cc");
 
 	return (res);
@@ -274,9 +270,8 @@ atomic_fetchadd_int(volatile u_int *p, u
 	"	xaddl	%0,%1 ;		"
 	"# atomic_fetchadd_int"
 	: "+r" (v),			/* 0 */
-	  "=m" (*p)			/* 1 */
-	: "m" (*p)			/* 2 */
-	: "cc");
+	  "+m" (*p)			/* 1 */
+	: : "cc");
 	return (v);
 }
 
@@ -324,9 +319,8 @@ atomic_load_acq_##TYPE(volatile u_##TYPE
 							\
 	__asm __volatile(MPLOCKED LOP			\
 	: "=a" (res),			/* 0 */		\
-	  "=m" (*p)			/* 1 */		\
-	: "m" (*p)			/* 2 */		\
-	: "memory", "cc");				\
+	  "+m" (*p)			/* 1 */		\
+	: : "memory", "cc");				\
 							\
 	return (res);					\
 }							\
@@ -405,8 +399,7 @@ atomic_readandclear_int(volatile u_int *
 	"	xchgl	%1,%0 ;		"
 	"# atomic_readandclear_int"
 	: "+r" (res),			/* 0 */
-	  "=m" (*p)			/* 1 */
-	: "m" (*p));
+	  "+m" (*p));			/* 1 */
 
 	return (res);
 }
@@ -421,8 +414,7 @@ atomic_readandclear_long(volatile u_long
 	"	xchgl	%1,%0 ;		"
 	"# atomic_readandclear_long"
 	: "+r" (res),			/* 0 */
-	  "=m" (*p)			/* 1 */
-	: "m" (*p));
+	  "+m" (*p));			/* 1 */
 
 	return (res);
 }


More information about the svn-src-all mailing list