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/i386 | |
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/i386')
-rw-r--r-- | sys/i386/include/atomic.h | 49 |
1 files changed, 27 insertions, 22 deletions
diff --git a/sys/i386/include/atomic.h b/sys/i386/include/atomic.h index 6f0c2b7..e574ee7 100644 --- a/sys/i386/include/atomic.h +++ b/sys/i386/include/atomic.h @@ -98,8 +98,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 @@ -121,17 +121,18 @@ atomic_cmpset_int(volatile u_int *dst, u_int exp, u_int src) __asm __volatile( " pushfl ; " " cli ; " - " cmpl %0,%2 ; " + " cmpl %0,%3 ; " " 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 */ + : "+a" (res), /* 0 (result) */ + "=m" (*dst) /* 1 */ + : "r" (src), /* 2 */ + "m" (*dst) /* 3 */ : "memory"); return (res); @@ -146,15 +147,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); } @@ -194,8 +196,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); \ } \ @@ -207,9 +210,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 @@ -263,12 +266,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); } @@ -278,12 +282,13 @@ atomic_readandclear_long(volatile u_long *addr) { u_long result; + result = 0; __asm __volatile ( - " xorl %0,%0 ; " " xchgl %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); } |