diff options
Diffstat (limited to 'lib/sbi/riscv_atomic.c')
-rw-r--r-- | lib/sbi/riscv_atomic.c | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/lib/sbi/riscv_atomic.c b/lib/sbi/riscv_atomic.c index 558bca8..528686f 100644 --- a/lib/sbi/riscv_atomic.c +++ b/lib/sbi/riscv_atomic.c @@ -28,25 +28,23 @@ void atomic_write(atomic_t *atom, long value) long atomic_add_return(atomic_t *atom, long value) { long ret; - +#if __SIZEOF_LONG__ == 4 __asm__ __volatile__(" amoadd.w.aqrl %1, %2, %0" : "+A"(atom->counter), "=r"(ret) : "r"(value) : "memory"); - +#elif __SIZEOF_LONG__ == 8 + __asm__ __volatile__(" amoadd.d.aqrl %1, %2, %0" + : "+A"(atom->counter), "=r"(ret) + : "r"(value) + : "memory"); +#endif return ret + value; } long atomic_sub_return(atomic_t *atom, long value) { - long ret; - - __asm__ __volatile__(" amoadd.w.aqrl %1, %2, %0" - : "+A"(atom->counter), "=r"(ret) - : "r"(-value) - : "memory"); - - return ret - value; + return atomic_add_return(atom, -value); } #define __axchg(ptr, new, size) \ |