summary refs log tree commit diff stats
path: root/results/scraper/box64/541
diff options
context:
space:
mode:
Diffstat (limited to 'results/scraper/box64/541')
-rw-r--r--results/scraper/box64/54171
1 files changed, 71 insertions, 0 deletions
diff --git a/results/scraper/box64/541 b/results/scraper/box64/541
new file mode 100644
index 000000000..dbae32463
--- /dev/null
+++ b/results/scraper/box64/541
@@ -0,0 +1,71 @@
+[RV64] Write rv64_lock atomic helper for future risc-v dynarec
+Write `rv64_lock.S` based on this `rv64_lock.h` header, and following the guideline of the arm64 conterpart.

+

+```C

+#ifndef __RV64_LOCK__H__

+#define __RV64_LOCK__H__

+#include <stdint.h>

+

+// Atomic read of ADDR

+extern uint8_t rv64_lock_read_b(void* addr);

+// Atomic store for ADDR, return 0 if ok, 1 if not

+extern int rv64_lock_write_b(void* addr, uint8_t val);

+

+// Atomic read of ADDR

+extern uint16_t rv64_lock_read_h(void* addr);

+// Atomic store for ADDR, return 0 if ok, 1 if not

+extern int rv64_lock_write_h(void* addr, uint16_t val);

+

+// Atoomic read of ADDR

+extern uint32_t rv64_lock_read_d(void* addr);

+// Atomic store for ADDR, return 0 if ok, 1 if not

+extern int rv64_lock_write_d(void* addr, uint32_t val);

+

+// Atomic read of ADDR

+extern uint64_t rv64_lock_read_dd(void* addr);

+// Atomic store for ADDR, return 0 if ok, 1 if not

+extern int rv64_lock_write_dd(void* addr, uint64_t val);

+

+// Atomic read of ADDR

+extern void rv64_lock_read_dq(uint64_t * a, uint64_t* b, void* addr);

+// Atomic store for ADDR, return 0 if ok, 1 if not

+extern int rv64_lock_write_dq(uint64_t a, uint64_t b, void* addr);

+

+// Atomicaly exchange value at [p] with val, return old p

+extern uintptr_t rv64_lock_xchg(void* p, uintptr_t val);

+

+// Atomicaly exchange value at [p] with val, return old p

+extern uint32_t rv64_lock_xchg_d(void* p, uint32_t val);

+

+// Atomicaly store value to [p] only if [p] is NULL. Return old [p] value

+extern uint32_t rv64_lock_storeifnull_d(void*p, uint32_t val);

+

+// Atomicaly store value to [p] only if [p] is NULL. Return old [p] value

+extern void* rv64_lock_storeifnull(void*p, void* val);

+

+// Atomicaly store value to [p] only if [p] is ref. Return new [p] value (so val or old)

+extern void* rv64_lock_storeifref(void*p, void* val, void* ref);

+

+// Atomicaly store value to [p] only if [p] is ref. Return new [p] value (so val or old)

+extern uint32_t rv64_lock_storeifref_d(void*p, uint32_t val, uint32_t ref);

+

+// Atomicaly store value to [p] only if [p] is ref. Return new [p] value (so val or old)

+extern uint32_t rv64_lock_storeifref2_d(void*p, uint32_t val, uint32_t ref);

+

+// decrement atomicaly the byte at [p] (but only if p not 0)

+extern void rv64_lock_decifnot0b(void*p);

+

+// atomic store (with memory barrier)

+extern void rv64_lock_storeb(void*p, uint8_t b);

+

+// increment atomicaly the int at [p] only if it was 0. Return the old value of [p]

+extern int rv64_lock_incif0(void*p);

+

+// decrement atomicaly the int at [p] (but only if p not 0)

+extern int rv64_lock_decifnot0(void*p);

+

+// atomic store (with memory barrier)

+extern void rv64_lock_store(void*p, uint32_t v);

+

+#endif  //__RV64_LOCK__H__

+````
\ No newline at end of file