diff options
Diffstat (limited to 'include/asm-ppc/atomic.h')
-rw-r--r-- | include/asm-ppc/atomic.h | 80 |
1 files changed, 26 insertions, 54 deletions
diff --git a/include/asm-ppc/atomic.h b/include/asm-ppc/atomic.h index c9103a393..c3c5133d6 100644 --- a/include/asm-ppc/atomic.h +++ b/include/asm-ppc/atomic.h @@ -18,94 +18,60 @@ typedef struct { int counter; } atomic_t; #define atomic_read(v) ((v)->counter) #define atomic_set(v,i) (((v)->counter) = (i)) -extern void atomic_add(int a, atomic_t *v); -extern int atomic_add_return(int a, atomic_t *v); -extern void atomic_sub(int a, atomic_t *v); -extern void atomic_inc(atomic_t *v); -extern int atomic_inc_return(atomic_t *v); -extern void atomic_dec(atomic_t *v); -extern int atomic_dec_return(atomic_t *v); -extern int atomic_dec_and_test(atomic_t *v); - extern void atomic_clear_mask(unsigned long mask, unsigned long *addr); extern void atomic_set_mask(unsigned long mask, unsigned long *addr); -#if 0 /* for now */ -extern __inline__ void atomic_add(atomic_t a, atomic_t *v) +extern __inline__ int atomic_add_return(int a, atomic_t *v) { - atomic_t t; + int t; __asm__ __volatile__("\n\ 1: lwarx %0,0,%3\n\ add %0,%2,%0\n\ stwcx. %0,0,%3\n\ - bne 1b" + bne- 1b" : "=&r" (t), "=m" (*v) - : "r" (a), "r" (v) + : "r" (a), "r" (v), "m" (*v) : "cc"); -} -extern __inline__ void atomic_sub(atomic_t a, atomic_t *v) -{ - atomic_t t; - - __asm__ __volatile__("\n\ -1: lwarx %0,0,%3\n\ - subf %0,%2,%0\n\ - stwcx. %0,0,%3\n\ - bne 1b" - : "=&r" (t), "=m" (*v) - : "r" (a), "r" (v) - : "cc"); + return t; } -extern __inline__ int atomic_sub_and_test(atomic_t a, atomic_t *v) +extern __inline__ int atomic_sub_return(int a, atomic_t *v) { - atomic_t t; + int t; __asm__ __volatile__("\n\ 1: lwarx %0,0,%3\n\ subf %0,%2,%0\n\ stwcx. %0,0,%3\n\ - bne 1b" + bne- 1b" : "=&r" (t), "=m" (*v) - : "r" (a), "r" (v) + : "r" (a), "r" (v), "m" (*v) : "cc"); - return t == 0; + return t; } -extern __inline__ void atomic_inc(atomic_t *v) +extern __inline__ int atomic_inc_return(atomic_t *v) { - atomic_t t; + int t; __asm__ __volatile__("\n\ 1: lwarx %0,0,%2\n\ addic %0,%0,1\n\ stwcx. %0,0,%2\n\ - bne 1b" + bne- 1b" : "=&r" (t), "=m" (*v) - : "r" (v) + : "r" (v), "m" (*v) : "cc"); -} - -extern __inline__ void atomic_dec(atomic_t *v) -{ - atomic_t t; - __asm__ __volatile__("\n\ -1: lwarx %0,0,%2\n\ - addic %0,%0,-1\n\ - stwcx. %0,0,%2\n\ - bne 1b" - : "=&r" (t), "=m" (*v) - : "r" (v) - : "cc"); + return t; } -extern __inline__ int atomic_dec_and_test(atomic_t *v) +extern __inline__ int atomic_dec_return(atomic_t *v) { - atomic_t t; + int t; __asm__ __volatile__("\n\ 1: lwarx %0,0,%2\n\ @@ -113,11 +79,17 @@ extern __inline__ int atomic_dec_and_test(atomic_t *v) stwcx. %0,0,%2\n\ bne 1b" : "=&r" (t), "=m" (*v) - : "r" (v) + : "r" (v), "m" (*v) : "cc"); - return t == 0; + return t; } -#endif /* 0 */ + +#define atomic_add(a, v) ((void) atomic_add_return((a), (v))) +#define atomic_sub(a, v) ((void) atomic_sub_return((a), (v))) +#define atomic_sub_and_test(a, v) (atomic_sub_return((a), (v)) == 0) +#define atomic_inc(v) ((void) atomic_inc_return((v))) +#define atomic_dec(v) ((void) atomic_dec_return((v))) +#define atomic_dec_and_test(v) (atomic_dec_return((v)) == 0) #endif /* _ASM_PPC_ATOMIC_H_ */ |