diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-02-22 19:58:58 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-02-22 19:59:09 +0100 |
| commit | 3a6df996dc85257a5496ecb28a72579df225a176 (patch) | |
| tree | c0665cff00588c817f524495b80f4fd30a3f95d6 /src | |
| parent | 61413769775bb9428c6f2b89037d32ea580d5a75 (diff) | |
| download | box64-3a6df996dc85257a5496ecb28a72579df225a176.tar.gz box64-3a6df996dc85257a5496ecb28a72579df225a176.zip | |
Added 67 FF /2 opcode ([ARM64_DYNAREC] too)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_67.c | 48 | ||||
| -rw-r--r-- | src/emu/x64run67.c | 15 |
2 files changed, 62 insertions, 1 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_67.c b/src/dynarec/arm64/dynarec_arm64_67.c index ea093b0a..82dd7a27 100644 --- a/src/dynarec/arm64/dynarec_arm64_67.c +++ b/src/dynarec/arm64/dynarec_arm64_67.c @@ -15,6 +15,7 @@ #include "emu/x64run_private.h" #include "x64trace.h" #include "dynarec_native.h" +#include "custommem.h" #include "arm64_printer.h" #include "dynarec_arm64_private.h" @@ -1237,6 +1238,53 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; } break; + case 0xFF: + nextop = F8; + switch((nextop>>3)&7) { + case 2: // CALL Ed + INST_NAME("CALL Ed"); + PASS2IF((box64_dynarec_safeflags>1) || + ((ninst && dyn->insts[ninst-1].x64.set_flags) + || ((ninst>1) && dyn->insts[ninst-2].x64.set_flags)), 1) + { + READFLAGS(X_PEND); // that's suspicious + } else { + SETFLAGS(X_ALL, SF_SET); //Hack to put flag in "don't care" state + } + GETED32(0); + if(box64_dynarec_callret && box64_dynarec_bigblock>1) { + BARRIER(BARRIER_FULL); + BARRIER_NEXT(BARRIER_FULL); + } else { + BARRIER(BARRIER_FLOAT); + *need_epilog = 0; + *ok = 0; + } + GETIP_(addr); + if(box64_dynarec_callret) { + SET_HASCALLRET(); + // Push actual return address + if(addr < (dyn->start+dyn->isize)) { + // there is a next... + j64 = (dyn->insts)?(dyn->insts[ninst].epilog-(dyn->native_size)):0; + ADR_S20(x4, j64); + MESSAGE(LOG_NONE, "\tCALLRET set return to +%di\n", j64>>2); + } else { + MESSAGE(LOG_NONE, "\tCALLRET set return to Jmptable(%p)\n", (void*)addr); + j64 = getJumpTableAddress64(addr); + TABLE64(x4, j64); + LDRx_U12(x4, x4, 0); + } + STPx_S7_preindex(x4, xRIP, xSP, -16); + } + PUSH1z(xRIP); + jump_to_next(dyn, 0, ed, ninst, rex.is32bits); + break; + default: + DEFAULT; + return addr; + } + break; default: DEFAULT; diff --git a/src/emu/x64run67.c b/src/emu/x64run67.c index 6a5b2143..842d6740 100644 --- a/src/emu/x64run67.c +++ b/src/emu/x64run67.c @@ -449,7 +449,20 @@ uintptr_t Run67(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr) } } break; - + + case 0xFF: + nextop = F8; + switch((nextop>>3)&7) { + case 2: /* CALL NEAR Ed */ + GETED32(0); + tmp64u = (uintptr_t)getAlternate((void*)ED->q[0]); + Push64(emu, addr); + addr = tmp64u; + break; + default: + return 0; + } + break; default: return 0; } |