PERFORCE change 72664 for review
John Baldwin
jhb at FreeBSD.org
Mon Mar 7 14:09:05 PST 2005
http://perforce.freebsd.org/chv.cgi?CH=72664
Change 72664 by jhb at 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);
}
More information about the p4-projects
mailing list