about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-02-01 18:42:37 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-02-01 18:42:37 +0100
commita2be60cce825bf83b4754a6fbcbf384273542115 (patch)
treeb5eda6b301fad836f80b1db4b03e1972698874de /src
parent1344b1837909da6d91153cf686557a4a10bcb468 (diff)
downloadbox64-a2be60cce825bf83b4754a6fbcbf384273542115.tar.gz
box64-a2be60cce825bf83b4754a6fbcbf384273542115.zip
[32BITS] Added 67 64 A1 opcode ([ARM64_DYNAREC] too)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_6764_32.c14
-rw-r--r--src/emu/x64run6764_32.c11
2 files changed, 25 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_6764_32.c b/src/dynarec/arm64/dynarec_arm64_6764_32.c
index f9342181..c62b239a 100644
--- a/src/dynarec/arm64/dynarec_arm64_6764_32.c
+++ b/src/dynarec/arm64/dynarec_arm64_6764_32.c
@@ -61,6 +61,20 @@ uintptr_t dynarec64_6764_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, in
 
     switch(opcode) {
 
+        case 0xA1:
+            INST_NAME("MOV EAX, Seg:[Od]");
+            i32 = F16;
+            grab_segdata(dyn, addr, ninst, x4, seg);
+            if(i32<4096 && !(i32&3)) {
+                LDRw_U12(xRAX, x4, i32);
+            } else if(i32<256) {
+                LDURw_I9(xRAX, x4, i32);
+            } else {
+                MOV32w(x1, i32);
+                LDRw_REG(xRAX, x4, x1);
+            }
+            break;
+
         case 0xA3:
             INST_NAME("MOV Seg:[Od], EAX");
             i32 = F16;
diff --git a/src/emu/x64run6764_32.c b/src/emu/x64run6764_32.c
index 4b4b667c..5ac96a47 100644
--- a/src/emu/x64run6764_32.c
+++ b/src/emu/x64run6764_32.c
@@ -61,6 +61,17 @@ uintptr_t Run6764_32(x64emu_t *emu, rex_t rex, int rep, int seg, uintptr_t addr)
             GW->word[0] = EW->word[0];
             break;
 
+        case 0xA1:                      /* MOV EAX, FS:Od */
+            tmp32u = F16;
+            #ifdef TEST_INTERPRETER
+            test->memaddr = tlsdata + tmp32u;
+            test->memsize = 4;
+            R_EAX = *(uint32_t*)(test->mem);
+            #else
+            R_EAX = *(uint32_t*)(tlsdata + tmp32u);
+            #endif
+            break;
+
         case 0xA3:                      /* MOV FS:Od,EAX */
             tmp32u = F16;
             #ifdef TEST_INTERPRETER