diff options
Diffstat (limited to 'src/dynarec')
| -rwxr-xr-x | src/dynarec/arm64/arm64_lock.S | 12 | ||||
| -rwxr-xr-x | src/dynarec/arm64/arm64_lock.h | 3 | ||||
| -rwxr-xr-x | src/dynarec/native_lock.h | 1 |
3 files changed, 16 insertions, 0 deletions
diff --git a/src/dynarec/arm64/arm64_lock.S b/src/dynarec/arm64/arm64_lock.S index 9d097ff5..92132bad 100755 --- a/src/dynarec/arm64/arm64_lock.S +++ b/src/dynarec/arm64/arm64_lock.S @@ -16,6 +16,7 @@ .global arm64_lock_read_dq .global arm64_lock_write_dq .global arm64_lock_xchg +.global arm64_lock_xchg_d .global arm64_lock_storeifnull .global arm64_lock_storeifref @@ -100,6 +101,17 @@ arm64_lock_xchg_0: mov x0, x2 ret +arm64_lock_xchg_d: + dmb ish +arm64_lock_xchg_d_0: + // address is x0, value is x1, return old value in x0 + ldaxr w2, [x0] + stlxr w3, w1, [x0] + cbnz w3, arm64_lock_xchg_d_0 + dmb ish + mov w0, w2 + ret + arm64_lock_storeifnull: dmb ish arm64_lock_storeifnull_0: diff --git a/src/dynarec/arm64/arm64_lock.h b/src/dynarec/arm64/arm64_lock.h index 8f6bd14d..76a1551c 100755 --- a/src/dynarec/arm64/arm64_lock.h +++ b/src/dynarec/arm64/arm64_lock.h @@ -30,6 +30,9 @@ extern int arm64_lock_write_dq(uint64_t a, uint64_t b, void* addr); // Atomicaly exchange value at [p] with val, return old p extern uintptr_t arm64_lock_xchg(void* p, uintptr_t val); +// Atomicaly exchange value at [p] with val, return old p +extern uint32_t arm64_lock_xchg_d(void* p, uint32_t val); + // Atomicaly store value to [p] only if [p] is NULL. Return new [p] value (so val or old) extern void* arm64_lock_storeifnull(void*p, void* val); diff --git a/src/dynarec/native_lock.h b/src/dynarec/native_lock.h index 056947fd..e2070901 100755 --- a/src/dynarec/native_lock.h +++ b/src/dynarec/native_lock.h @@ -15,6 +15,7 @@ #define native_lock_read_dq(A, B, C) arm64_lock_read_dq(A, B, C) #define native_lock_write_dq(A, B, C) arm64_lock_write_dq(A, B, C) #define native_lock_xchg(A, B) arm64_lock_xchg(A, B) +#define native_lock_xchg_d(A, B) arm64_lock_xchg_d(A, B) #define native_lock_storeifref(A, B, C) arm64_lock_storeifref(A, B, C) #define native_lock_storeifnull(A, B) arm64_lock_storeifnull(A, B) |