about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-02-24 09:55:26 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-02-24 09:55:26 +0100
commitbe50bbc1497f86c458e7d4f48e724369b44f8728 (patch)
treea172da3fd2a959c1f2062a396659a41c64ce2b06 /src
parent50c49a1692c16933d4c7f9f13db606ec533b12bf (diff)
downloadbox64-be50bbc1497f86c458e7d4f48e724369b44f8728.tar.gz
box64-be50bbc1497f86c458e7d4f48e724369b44f8728.zip
[ARM64_DYNAREC] Handling of EB FF hacky jump
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_00.c54
1 files changed, 30 insertions, 24 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index b9f31523..706d78ae 100644
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -2977,35 +2977,41 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
         case 0xE9:
         case 0xEB:
             BARRIER(BARRIER_MAYBE);
-            if(opcode==0xE9) {
-                INST_NAME("JMP Id");
-                i32 = F32S;
+            if(opcode==0xEB && PK(0)==0xFF) {
+                INST_NAME("JMP ib");
+                MESSAGE(LOG_DEBUG, "Hack for EB FF opcode");
+                NOP;
             } else {
-                INST_NAME("JMP Ib");
-                i32 = F8S;
-            }
-            if(rex.is32bits)
-                j64 = (uint32_t)(addr+i32);
-            else
-                j64 = addr+i32;
+                if(opcode==0xE9) {
+                    INST_NAME("JMP Id");
+                    i32 = F32S;
+                } else {
+                    INST_NAME("JMP Ib");
+                    i32 = F8S;
+                }
+                if(rex.is32bits)
+                    j64 = (uint32_t)(addr+i32);
+                else
+                    j64 = addr+i32;
 
-            JUMP((uintptr_t)getAlternate((void*)j64), 0);
-            if(dyn->insts[ninst].x64.jmp_insts==-1) {
-                // out of the block
-                fpu_purgecache(dyn, ninst, 1, x1, x2, x3);
-                jump_to_next(dyn, (uintptr_t)getAlternate((void*)j64), 0, ninst, rex.is32bits);
-            } else {
-                // inside the block
-                CacheTransform(dyn, ninst, CHECK_CACHE(), x1, x2, x3);
-                tmp = dyn->insts[dyn->insts[ninst].x64.jmp_insts].address-(dyn->native_size);
-                if(tmp==4) {
-                    NOP;
+                JUMP((uintptr_t)getAlternate((void*)j64), 0);
+                if(dyn->insts[ninst].x64.jmp_insts==-1) {
+                    // out of the block
+                    fpu_purgecache(dyn, ninst, 1, x1, x2, x3);
+                    jump_to_next(dyn, (uintptr_t)getAlternate((void*)j64), 0, ninst, rex.is32bits);
                 } else {
-                    B(tmp);
+                    // inside the block
+                    CacheTransform(dyn, ninst, CHECK_CACHE(), x1, x2, x3);
+                    tmp = dyn->insts[dyn->insts[ninst].x64.jmp_insts].address-(dyn->native_size);
+                    if(tmp==4) {
+                        NOP;
+                    } else {
+                        B(tmp);
+                    }
                 }
+                *need_epilog = 0;
+                *ok = 0;
             }
-            *need_epilog = 0;
-            *ok = 0;
             break;
 
         case 0xEC:                      /* IN AL, DX */