diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-02-24 09:55:26 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-02-24 09:55:26 +0100 |
| commit | be50bbc1497f86c458e7d4f48e724369b44f8728 (patch) | |
| tree | a172da3fd2a959c1f2062a396659a41c64ce2b06 /src | |
| parent | 50c49a1692c16933d4c7f9f13db606ec533b12bf (diff) | |
| download | box64-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.c | 54 |
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 */ |