diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-12-03 18:26:11 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-12-03 18:26:11 +0100 |
| commit | b67975a820d481577f8ea7515858b2f35450b0d0 (patch) | |
| tree | 4b9e322c9e2fa04267dbe2046539b12b2af7af6d /tests | |
| parent | fa175e7d2405d0b521cfd98d549a94252b697bf6 (diff) | |
| download | box64-b67975a820d481577f8ea7515858b2f35450b0d0.tar.gz box64-b67975a820d481577f8ea7515858b2f35450b0d0.zip | |
[ARM64_DYNAREC] More work on LOCK prefixed opcodes (Atomic still disabled)
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/ref29.txt | 2 | ||||
| -rwxr-xr-x | tests/test29 | bin | 0 -> 16024 bytes | |||
| -rw-r--r-- | tests/test29.c | 40 |
3 files changed, 42 insertions, 0 deletions
diff --git a/tests/ref29.txt b/tests/ref29.txt new file mode 100644 index 00000000..6b25f7de --- /dev/null +++ b/tests/ref29.txt @@ -0,0 +1,2 @@ +Lock XADD: Res = 0x456, Ed = 0x579 +Lock XCHG: Res = 0x579, Ed = 0x123 diff --git a/tests/test29 b/tests/test29 new file mode 100755 index 00000000..0c4a63da --- /dev/null +++ b/tests/test29 Binary files differdiff --git a/tests/test29.c b/tests/test29.c new file mode 100644 index 00000000..96384251 --- /dev/null +++ b/tests/test29.c @@ -0,0 +1,40 @@ +#include <stdio.h> +#include <string.h> +#include <stddef.h> +#include <stdint.h> +// Build with `gcc -march=core2 -O0 test29.c -o test29` + +uint64_t lock_xadd(uint64_t Gd, uint64_t volatile* Ed) { +uint64_t Res; +asm( +"lock xadd %[_Gd], (%[_Ed])\n" +"movq %[_Gd], %[_Res]\n" +: [_Res] "+r"(Res) +: [_Gd] "r"(Gd) +, [_Ed] "r"(Ed) +); +return Res; +} + +uint64_t lock_xchg(uint64_t Gd, uint64_t volatile* Ed) { +uint64_t Res; +asm( +"lock xchg %[_Gd], (%[_Ed])\n" +"movq %[_Gd], %[_Res]\n" +: [_Res] "+r"(Res) +: [_Gd] "r"(Gd) +, [_Ed] "r"(Ed) +); +return Res; +} + +int main() { +uint64_t Gd = 0x123; +uint64_t volatile Ed = 0x456; +uint64_t Res = lock_xadd(Gd, &Ed); +printf("Lock XADD: Res = 0x%lx, Ed = 0x%lx\n", Res, Ed); +Gd = 0x123; +Res = lock_xchg(Gd, &Ed); +printf("Lock XCHG: Res = 0x%lx, Ed = 0x%lx\n", Res, Ed); +return 0; +} |