summaryrefslogtreecommitdiff
path: root/lib/sbi/riscv_atomic.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sbi/riscv_atomic.c')
-rw-r--r--lib/sbi/riscv_atomic.c18
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) \