about summary refs log tree commit diff stats
path: root/src/dynarec
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-10-26 13:48:28 +0200
committerptitSeb <sebastien.chev@gmail.com>2022-10-26 13:48:28 +0200
commitbf75d6496f411bbbacc2d0687a32f0043c704438 (patch)
tree55ef5368d12fcc742758a9cb11321c339719de19 /src/dynarec
parentfb7f134c064b189d3f91606a9257360e7be789c3 (diff)
downloadbox64-bf75d6496f411bbbacc2d0687a32f0043c704438.tar.gz
box64-bf75d6496f411bbbacc2d0687a32f0043c704438.zip
Made a custom implementation of pthread_once
Diffstat (limited to 'src/dynarec')
-rwxr-xr-xsrc/dynarec/arm64/arm64_lock.S12
-rwxr-xr-xsrc/dynarec/arm64/arm64_lock.h3
-rwxr-xr-xsrc/dynarec/native_lock.h1
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)