diff options
author | jhb <jhb@FreeBSD.org> | 2005-09-15 19:31:22 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2005-09-15 19:31:22 +0000 |
commit | b729e912ca61300693d243d104d5956a07be67b3 (patch) | |
tree | 3f673839211ac6f986ce60c40b7aab1d6a8b3cea /sys/amd64/include/atomic.h | |
parent | b4bff5a977cedb926687495a528a0d6a2c7c872b (diff) | |
download | FreeBSD-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.h | 49 |
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); } |