diff options
-rw-r--r-- | sys/alpha/include/atomic.h | 72 | ||||
-rw-r--r-- | sys/amd64/include/atomic.h | 49 | ||||
-rw-r--r-- | sys/i386/include/atomic.h | 49 | ||||
-rw-r--r-- | sys/powerpc/include/atomic.h | 24 |
4 files changed, 102 insertions, 92 deletions
diff --git a/sys/alpha/include/atomic.h b/sys/alpha/include/atomic.h index 296069b..7277600 100644 --- a/sys/alpha/include/atomic.h +++ b/sys/alpha/include/atomic.h @@ -56,12 +56,12 @@ static __inline void atomic_set_32(volatile u_int32_t *p, u_int32_t v) #ifdef __GNUCLIKE_ASM __asm __volatile ( - "1:\tldl_l %0, %2\n\t" /* load old value */ - "bis %0, %3, %0\n\t" /* calculate new value */ + "1:\tldl_l %0, %3\n\t" /* load old value */ + "bis %0, %2, %0\n\t" /* calculate new value */ "stl_c %0, %1\n\t" /* attempt to store */ "beq %0, 1b\n" /* spin if failed */ : "=&r" (temp), "=m" (*p) - : "m" (*p), "r" (v) + : "r" (v), "m" (*p) : "memory"); #endif } @@ -72,12 +72,12 @@ static __inline void atomic_clear_32(volatile u_int32_t *p, u_int32_t v) #ifdef __GNUCLIKE_ASM __asm __volatile ( - "1:\tldl_l %0, %1\n\t" /* load old value */ + "1:\tldl_l %0, %3\n\t" /* load old value */ "bic %0, %2, %0\n\t" /* calculate new value */ "stl_c %0, %1\n\t" /* attempt to store */ "beq %0, 1b\n" /* spin if failed */ - : "=&r" (temp), "+m" (*p) - : "r" (v) + : "=&r" (temp), "=m" (*p) + : "r" (v), "m" (*p) : "memory"); #endif } @@ -88,12 +88,12 @@ static __inline void atomic_add_32(volatile u_int32_t *p, u_int32_t v) #ifdef __GNUCLIKE_ASM __asm __volatile ( - "1:\tldl_l %0, %1\n\t" /* load old value */ + "1:\tldl_l %0, %3\n\t" /* load old value */ "addl %0, %2, %0\n\t" /* calculate new value */ "stl_c %0, %1\n\t" /* attempt to store */ "beq %0, 1b\n" /* spin if failed */ - : "=&r" (temp), "+m" (*p) - : "r" (v) + : "=&r" (temp), "=m" (*p) + : "r" (v), "m" (*p) : "memory"); #endif } @@ -104,12 +104,12 @@ static __inline void atomic_subtract_32(volatile u_int32_t *p, u_int32_t v) #ifdef __GNUCLIKE_ASM __asm __volatile ( - "1:\tldl_l %0, %1\n\t" /* load old value */ + "1:\tldl_l %0, %3\n\t" /* load old value */ "subl %0, %2, %0\n\t" /* calculate new value */ "stl_c %0, %1\n\t" /* attempt to store */ "beq %0, 1b\n" /* spin if failed */ - : "=&r" (temp), "+m" (*p) - : "r" (v) + : "=&r" (temp), "=m" (*p) + : "r" (v), "m" (*p) : "memory"); #endif } @@ -121,12 +121,12 @@ static __inline u_int32_t atomic_readandclear_32(volatile u_int32_t *addr) #ifdef __GNUCLIKE_ASM __asm __volatile ( "wmb\n" /* ensure pending writes have drained */ - "1:\tldl_l %0,%2\n\t" /* load current value, asserting lock */ + "1:\tldl_l %0,%3\n\t" /* load current value, asserting lock */ "ldiq %1,0\n\t" /* value to store */ "stl_c %1,%2\n\t" /* attempt to store */ "beq %1,1b\n" /* if the store failed, spin */ - : "=&r"(result), "=&r"(temp), "+m" (*addr) - : + : "=&r"(result), "=&r"(temp), "=m" (*addr) + : "m" (*addr) : "memory"); #endif @@ -139,12 +139,12 @@ static __inline void atomic_set_64(volatile u_int64_t *p, u_int64_t v) #ifdef __GNUCLIKE_ASM __asm __volatile ( - "1:\tldq_l %0, %1\n\t" /* load old value */ + "1:\tldq_l %0, %3\n\t" /* load old value */ "bis %0, %2, %0\n\t" /* calculate new value */ "stq_c %0, %1\n\t" /* attempt to store */ "beq %0, 1b\n" /* spin if failed */ - : "=&r" (temp), "+m" (*p) - : "r" (v) + : "=&r" (temp), "=m" (*p) + : "r" (v), "m" (*p) : "memory"); #endif } @@ -155,12 +155,12 @@ static __inline void atomic_clear_64(volatile u_int64_t *p, u_int64_t v) #ifdef __GNUCLIKE_ASM __asm __volatile ( - "1:\tldq_l %0, %1\n\t" /* load old value */ + "1:\tldq_l %0, %3\n\t" /* load old value */ "bic %0, %2, %0\n\t" /* calculate new value */ "stq_c %0, %1\n\t" /* attempt to store */ "beq %0, 1b\n" /* spin if failed */ - : "=&r" (temp), "+m" (*p) - : "r" (v) + : "=&r" (temp), "=m" (*p) + : "r" (v), "m" (*p) : "memory"); #endif } @@ -171,12 +171,12 @@ static __inline void atomic_add_64(volatile u_int64_t *p, u_int64_t v) #ifdef __GNUCLIKE_ASM __asm __volatile ( - "1:\tldq_l %0, %1\n\t" /* load old value */ + "1:\tldq_l %0, %3\n\t" /* load old value */ "addq %0, %2, %0\n\t" /* calculate new value */ "stq_c %0, %1\n\t" /* attempt to store */ "beq %0, 1b\n" /* spin if failed */ - : "=&r" (temp), "+m" (*p) - : "r" (v) + : "=&r" (temp), "=m" (*p) + : "r" (v), "m" (*p) : "memory"); #endif } @@ -187,12 +187,12 @@ static __inline void atomic_subtract_64(volatile u_int64_t *p, u_int64_t v) #ifdef __GNUCLIKE_ASM __asm __volatile ( - "1:\tldq_l %0, %1\n\t" /* load old value */ + "1:\tldq_l %0, %3\n\t" /* load old value */ "subq %0, %2, %0\n\t" /* calculate new value */ "stq_c %0, %1\n\t" /* attempt to store */ "beq %0, 1b\n" /* spin if failed */ - : "=&r" (temp), "+m" (*p) - : "r" (v) + : "=&r" (temp), "=m" (*p) + : "r" (v), "m" (*p) : "memory"); #endif } @@ -204,12 +204,12 @@ static __inline u_int64_t atomic_readandclear_64(volatile u_int64_t *addr) #ifdef __GNUCLIKE_ASM __asm __volatile ( "wmb\n" /* ensure pending writes have drained */ - "1:\tldq_l %0,%2\n\t" /* load current value, asserting lock */ + "1:\tldq_l %0,%3\n\t" /* load current value, asserting lock */ "ldiq %1,0\n\t" /* value to store */ "stq_c %1,%2\n\t" /* attempt to store */ "beq %1,1b\n" /* if the store failed, spin */ - : "=&r"(result), "=&r"(temp), "+m" (*addr) - : + : "=&r"(result), "=&r"(temp), "=m" (*addr) + : "m" (*addr) : "memory"); #endif @@ -289,15 +289,15 @@ atomic_cmpset_32(volatile u_int32_t* p, u_int32_t cmpval, u_int32_t newval) #ifdef __GNUCLIKE_ASM __asm __volatile ( - "1:\tldl_l %0, %1\n\t" /* load old value */ + "1:\tldl_l %0, %4\n\t" /* load old value */ "cmpeq %0, %2, %0\n\t" /* compare */ "beq %0, 2f\n\t" /* exit if not equal */ "mov %3, %0\n\t" /* value to store */ "stl_c %0, %1\n\t" /* attempt to store */ "beq %0, 1b\n\t" /* if it failed, spin */ "2:\n" - : "=&r" (ret), "+m" (*p) - : "r" ((long)(int)cmpval), "r" (newval) + : "=&r" (ret), "=m" (*p) + : "r" ((long)(int)cmpval), "r" (newval), "m" (*p) : "memory"); #endif @@ -316,15 +316,15 @@ atomic_cmpset_64(volatile u_int64_t* p, u_int64_t cmpval, u_int64_t newval) #ifdef __GNUCLIKE_ASM __asm __volatile ( - "1:\tldq_l %0, %1\n\t" /* load old value */ + "1:\tldq_l %0, %4\n\t" /* load old value */ "cmpeq %0, %2, %0\n\t" /* compare */ "beq %0, 2f\n\t" /* exit if not equal */ "mov %3, %0\n\t" /* value to store */ "stq_c %0, %1\n\t" /* attempt to store */ "beq %0, 1b\n\t" /* if it failed, spin */ "2:\n" - : "=&r" (ret), "+m" (*p) - : "r" (cmpval), "r" (newval) + : "=&r" (ret), "=m" (*p) + : "r" (cmpval), "r" (newval), "m" (*p) : "memory"); #endif 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); } 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); } diff --git a/sys/powerpc/include/atomic.h b/sys/powerpc/include/atomic.h index af7bb95..0bc8f21 100644 --- a/sys/powerpc/include/atomic.h +++ b/sys/powerpc/include/atomic.h @@ -63,8 +63,8 @@ atomic_set_32(volatile uint32_t *p, uint32_t v) "or %0, %3, %0\n\t" /* calculate new value */ "stwcx. %0, 0, %2\n\t" /* attempt to store */ "bne- 1b\n\t" /* spin if failed */ - : "=&r" (temp), "+m" (*p) - : "r" (p), "r" (v) + : "=&r" (temp), "=m" (*p) + : "r" (p), "r" (v), "m" (*p) : "cc", "memory"); #endif } @@ -80,8 +80,8 @@ atomic_clear_32(volatile uint32_t *p, uint32_t v) "andc %0, %0, %3\n\t" /* calculate new value */ "stwcx. %0, 0, %2\n\t" /* attempt to store */ "bne- 1b\n\t" /* spin if failed */ - : "=&r" (temp), "+m" (*p) - : "r" (p), "r" (v) + : "=&r" (temp), "=m" (*p) + : "r" (p), "r" (v), "m" (*p) : "cc", "memory"); #endif } @@ -97,8 +97,8 @@ atomic_add_32(volatile uint32_t *p, uint32_t v) "add %0, %3, %0\n\t" /* calculate new value */ "stwcx. %0, 0, %2\n\t" /* attempt to store */ "bne- 1b\n\t" /* spin if failed */ - : "=&r" (temp), "+m" (*p) - : "r" (p), "r" (v) + : "=&r" (temp), "=m" (*p) + : "r" (p), "r" (v), "m" (*p) : "cc", "memory"); #endif } @@ -114,8 +114,8 @@ atomic_subtract_32(volatile uint32_t *p, uint32_t v) "subf %0, %3, %0\n\t" /* calculate new value */ "stwcx. %0, 0, %2\n\t" /* attempt to store */ "bne- 1b\n\t" /* spin if failed */ - : "=&r" (temp), "+m" (*p) - : "r" (p), "r" (v) + : "=&r" (temp), "=m" (*p) + : "r" (p), "r" (v), "m" (*p) : "cc", "memory"); #endif } @@ -132,8 +132,8 @@ atomic_readandclear_32(volatile uint32_t *addr) "li %1, 0\n\t" /* load new value */ "stwcx. %1, 0, %3\n\t" /* attempt to store */ "bne- 1b\n\t" /* spin if failed */ - : "=&r"(result), "=&r"(temp), "+m" (*addr) - : "r" (addr) + : "=&r"(result), "=&r"(temp), "=m" (*addr) + : "r" (addr), "m" (*addr) : "cc", "memory"); #endif @@ -382,8 +382,8 @@ atomic_cmpset_32(volatile uint32_t* p, uint32_t cmpval, uint32_t newval) "stwcx. %0, 0, %2\n\t" /* clear reservation (74xx) */ "li %0, 0\n\t" /* failure - retval = 0 */ "3:\n\t" - : "=&r" (ret), "+m" (*p) - : "r" (p), "r" (cmpval), "r" (newval) + : "=&r" (ret), "=m" (*p) + : "r" (p), "r" (cmpval), "r" (newval), "m" (*p) : "cc", "memory"); #endif |