svn commit: r253904 - in projects/atomic64/sys: amd64/include i386/include

Jung-uk Kim jkim at FreeBSD.org
Sat Aug 3 00:19:27 UTC 2013


Author: jkim
Date: Sat Aug  3 00:19:26 2013
New Revision: 253904
URL: http://svnweb.freebsd.org/changeset/base/253904

Log:
  Redo r253891.  It seems compilers generate better code with this change.

Modified:
  projects/atomic64/sys/amd64/include/atomic.h
  projects/atomic64/sys/i386/include/atomic.h

Modified: projects/atomic64/sys/amd64/include/atomic.h
==============================================================================
--- projects/atomic64/sys/amd64/include/atomic.h	Fri Aug  2 23:33:40 2013	(r253903)
+++ projects/atomic64/sys/amd64/include/atomic.h	Sat Aug  3 00:19:26 2013	(r253904)
@@ -82,8 +82,8 @@ int	atomic_cmpset_int(volatile u_int *ds
 int	atomic_cmpset_long(volatile u_long *dst, u_long expect, u_long src);
 u_int	atomic_fetchadd_int(volatile u_int *p, u_int v);
 u_long	atomic_fetchadd_long(volatile u_long *p, u_long v);
-int	atomic_testandset_int(volatile u_int *p, int v);
-int	atomic_testandset_long(volatile u_long *p, int v);
+int	atomic_testandset_int(volatile u_int *p, u_int v);
+int	atomic_testandset_long(volatile u_long *p, u_int v);
 
 #define	ATOMIC_LOAD(TYPE, LOP)					\
 u_##TYPE	atomic_load_acq_##TYPE(volatile u_##TYPE *p)
@@ -214,7 +214,7 @@ atomic_fetchadd_long(volatile u_long *p,
 }
 
 static __inline int
-atomic_testandset_int(volatile u_int *p, int v)
+atomic_testandset_int(volatile u_int *p, u_int v)
 {
 	u_char res;
 
@@ -225,14 +225,14 @@ atomic_testandset_int(volatile u_int *p,
 	"# atomic_testandset_int"
 	: "=r" (res),			/* 0 */
 	  "=m" (*p)			/* 1 */
-	: "ir" (v),			/* 2 */
+	: "Ir" (v & 0x1f),		/* 2 */
 	  "m" (*p)			/* 3 */
 	: "cc");
 	return (res);
 }
 
 static __inline int
-atomic_testandset_long(volatile u_long *p, int v)
+atomic_testandset_long(volatile u_long *p, u_int v)
 {
 	u_char res;
 
@@ -243,7 +243,7 @@ atomic_testandset_long(volatile u_long *
 	"# atomic_testandset_long"
 	: "=r" (res),			/* 0 */
 	  "=m" (*p)			/* 1 */
-	: "ir" ((u_long)v),		/* 2 */
+	: "Jr" ((u_long)(v & 0x3f)),	/* 2 */
 	  "m" (*p)			/* 3 */
 	: "cc");
 	return (res);

Modified: projects/atomic64/sys/i386/include/atomic.h
==============================================================================
--- projects/atomic64/sys/i386/include/atomic.h	Fri Aug  2 23:33:40 2013	(r253903)
+++ projects/atomic64/sys/i386/include/atomic.h	Sat Aug  3 00:19:26 2013	(r253904)
@@ -80,7 +80,7 @@ void atomic_##NAME##_barr_##TYPE(volatil
 
 int	atomic_cmpset_int(volatile u_int *dst, u_int expect, u_int src);
 u_int	atomic_fetchadd_int(volatile u_int *p, u_int v);
-int	atomic_testandset_int(volatile u_int *p, int v);
+int	atomic_testandset_int(volatile u_int *p, u_int v);
 
 #define	ATOMIC_LOAD(TYPE, LOP)					\
 u_##TYPE	atomic_load_acq_##TYPE(volatile u_##TYPE *p)
@@ -184,9 +184,9 @@ atomic_swap_64_i386(volatile uint64_t *p
 }
 
 static __inline int
-atomic_testandset_64_i386(volatile uint64_t *p, int v)
+atomic_testandset_64_i386(volatile uint64_t *p, u_int v)
 {
-	const uint64_t s = 1ULL << v % 64;
+	const uint64_t s = 1ULL << (v & 0x3f);
 	int res;
 	register_t lock;
 
@@ -269,9 +269,9 @@ atomic_swap_64_i586(volatile uint64_t *p
 }
 
 static __inline int
-atomic_testandset_64_i586(volatile uint64_t *p, int v)
+atomic_testandset_64_i586(volatile uint64_t *p, u_int v)
 {
-	const uint64_t s = 1ULL << v % 64;
+	const uint64_t s = 1ULL << (v & 0x3f);
 	uint64_t n;
 
 	do {
@@ -355,7 +355,7 @@ atomic_fetchadd_int(volatile u_int *p, u
 }
 
 static __inline int
-atomic_testandset_int(volatile u_int *p, int v)
+atomic_testandset_int(volatile u_int *p, u_int v)
 {
 	u_char res;
 
@@ -366,7 +366,7 @@ atomic_testandset_int(volatile u_int *p,
 	"# atomic_testandset_int"
 	: "=r" (res),			/* 0 */
 	  "=m" (*p)			/* 1 */
-	: "ir" (v),			/* 2 */
+	: "Ir" (v & 0x1f),		/* 2 */
 	  "m" (*p)			/* 3 */
 	: "cc");
 	return (res);
@@ -469,7 +469,7 @@ extern int (*atomic_cmpset_64)(volatile 
 extern uint64_t (*atomic_load_acq_64)(volatile uint64_t *);
 extern void (*atomic_store_rel_64)(volatile uint64_t *, uint64_t);
 extern uint64_t (*atomic_swap_64)(volatile uint64_t *, uint64_t);
-extern int (*atomic_testandset_64)(volatile uint64_t *, int);
+extern int (*atomic_testandset_64)(volatile uint64_t *, u_int);
 #endif
 
 static __inline int
@@ -488,7 +488,7 @@ atomic_fetchadd_long(volatile u_long *p,
 }
 
 static __inline int
-atomic_testandset_long(volatile u_long *p, int v)
+atomic_testandset_long(volatile u_long *p, u_int v)
 {
 
 	return (atomic_testandset_int((volatile u_int *)p, v));


More information about the svn-src-projects mailing list