7 static inline uint32_t atomic_swap(uint32_t val,
ptr_t mem_addr) {
9 __asm__ __volatile__(
"amoswap.w.aqrl %0, %2, %1\n" :
"=r"(ret),
"+A"(*(uint32_t *)mem_addr) :
"r"(val) :
"memory");
13 static inline uint64_t atomic_swap_d(uint64_t val,
ptr_t mem_addr) {
15 __asm__ __volatile__(
"amoswap.d.aqrl %0, %2, %1\n" :
"=r"(ret),
"+A"(*(uint64_t *)mem_addr) :
"r"(val) :
"memory");
19 static inline int fetch_add(
volatile void *obj,
int arg) {
21 __asm__ __volatile__(
"amoadd.w.aqrl %0, %2, %1\n" :
"=r"(ret),
"+A"(*(uint32_t *)obj) :
"r"(arg) :
"memory");
25 static inline uint32_t atomic_load(
volatile uint32_t *obj) {
28 __asm__ __volatile__(
"amoand.w.aqrl %0, %2, %1\n" :
"=r"(ret),
"+A"(*(uint32_t *)obj) :
"r"(arg) :
"memory");
33 static inline uint32_t atomic_cmpxchg(uint32_t old_val, uint32_t new_val,
ptr_t mem_addr) {
35 register unsigned int __rc;
36 __asm__ __volatile__(
"0: lr.w %0, %2\n"
38 " sc.w.rl %1, %z4, %2\n"
42 :
"=&r"(ret),
"=&r"(__rc),
"+A"(*(uint32_t *)mem_addr)
43 :
"rJ"(old_val),
"rJ"(new_val)
49 static inline uint64_t atomic_cmpxchg_d(uint64_t old_val, uint64_t new_val,
ptr_t mem_addr) {
51 register unsigned int __rc;
52 __asm__ __volatile__(
"0: lr.d %0, %2\n"
54 " sc.d.rl %1, %z4, %2\n"
58 :
"=&r"(ret),
"=&r"(__rc),
"+A"(*(uint64_t *)mem_addr)
59 :
"rJ"(old_val),
"rJ"(new_val)
uint64_t ptr_t
Definition: types.h:44
#define UINT32_MAX
Definition: types.h:176