summaryrefslogtreecommitdiffstats
path: root/sys/amd64/include/atomic.h
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2005-09-15 19:31:22 +0000
committerjhb <jhb@FreeBSD.org>2005-09-15 19:31:22 +0000
commitb729e912ca61300693d243d104d5956a07be67b3 (patch)
tree3f673839211ac6f986ce60c40b7aab1d6a8b3cea /sys/amd64/include/atomic.h
parentb4bff5a977cedb926687495a528a0d6a2c7c872b (diff)
downloadFreeBSD-src-b729e912ca61300693d243d104d5956a07be67b3.zip
FreeBSD-src-b729e912ca61300693d243d104d5956a07be67b3.tar.gz
Stop using the '+' constraint modifier with inline assembly. The '+'
constraint is actually only allowed for register operands. Instead, use separate input and output memory constraints. Education from: alc Reviewed by: alc Tested on: i386, alpha MFC after: 1 week
Diffstat (limited to 'sys/amd64/include/atomic.h')
-rw-r--r--sys/amd64/include/atomic.h49
1 files changed, 27 insertions, 22 deletions
diff --git a/sys/amd64/include/atomic.h b/sys/amd64/include/atomic.h
index ff9aa8b..2d59167 100644
--- a/sys/amd64/include/atomic.h
+++ b/sys/amd64/include/atomic.h
@@ -99,8 +99,8 @@ static __inline void \
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)); \
} \
struct __hack
@@ -119,15 +119,16 @@ atomic_cmpset_int(volatile u_int *dst, u_int exp, u_int src)
__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");
+ : "+a" (res), /* 0 (result) */
+ "=m" (*dst) /* 1 */
+ : "r" (src), /* 2 */
+ "m" (*dst) /* 3 */
+ : "memory");
return (res);
}
@@ -139,15 +140,16 @@ atomic_cmpset_long(volatile u_long *dst, u_long exp, u_long src)
__asm __volatile (
" " __XSTRING(MPLOCKED) " "
- " cmpxchgq %1,%2 ; "
+ " cmpxchgq %2,%1 ; "
" setz %%al ; "
" movzbq %%al,%0 ; "
"1: "
"# atomic_cmpset_long"
- : "+a" (res) /* 0 (result) */
- : "r" (src), /* 1 */
- "m" (*(dst)) /* 2 */
- : "memory");
+ : "+a" (res), /* 0 (result) */
+ "=m" (*dst) /* 1 */
+ : "r" (src), /* 2 */
+ "m" (*dst) /* 3 */
+ : "memory");
return (res);
}
@@ -185,8 +187,9 @@ atomic_load_acq_##TYPE(volatile u_##TYPE *p) \
\
__asm __volatile(__XSTRING(MPLOCKED) LOP \
: "=a" (res), /* 0 (result) */\
- "+m" (*p) /* 1 */ \
- : : "memory"); \
+ "=m" (*p) /* 1 */ \
+ : "m" (*p) /* 2 */ \
+ : "memory"); \
\
return (res); \
} \
@@ -198,9 +201,9 @@ static __inline void \
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
@@ -246,12 +249,13 @@ atomic_readandclear_int(volatile u_int *addr)
{
u_int result;
+ result = 0;
__asm __volatile (
- " 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));
return (result);
}
@@ -261,12 +265,13 @@ atomic_readandclear_long(volatile u_long *addr)
{
u_long result;
+ result = 0;
__asm __volatile (
- " xorq %0,%0 ; "
" xchgq %1,%0 ; "
"# atomic_readandclear_long"
- : "=&r" (result) /* 0 (result) */
- : "m" (*addr)); /* 1 (addr) */
+ : "+r" (result), /* 0 (result) */
+ "=m" (*addr) /* 1 (addr) */
+ : "m" (*addr));
return (result);
}
OpenPOWER on IntegriCloud