diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-07-01 10:33:41 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-07-01 10:33:41 +0200 |
| commit | 01568f8fd30e9b0c2b56fc3262bb0fe5680fea4c (patch) | |
| tree | 1649b89f82a2efbb81408656c225a2dbda02c691 /src | |
| parent | 1ee4d5aaf45ad9ecc590fcf7d6841f0089c12e75 (diff) | |
| download | box64-01568f8fd30e9b0c2b56fc3262bb0fe5680fea4c.tar.gz box64-01568f8fd30e9b0c2b56fc3262bb0fe5680fea4c.zip | |
[ARM64_DYNAREC] Fixed some regression on internal jumps
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_helper.c | 2 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native_pass.c | 2 |
2 files changed, 2 insertions, 2 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_helper.c b/src/dynarec/arm64/dynarec_arm64_helper.c index db317039..b333e5b9 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.c +++ b/src/dynarec/arm64/dynarec_arm64_helper.c @@ -2323,7 +2323,7 @@ static void flagsCacheTransform(dynarec_arm_t* dyn, int ninst, int s1) int jmp = dyn->insts[ninst].x64.jmp_insts; if(jmp<0) return; - if(dyn->f.dfnone || dyn->insts[jmp].f_exit.dfnone_here) // flags are fully known, nothing we can do more + if(dyn->f.dfnone || (dyn->insts[jmp].f_exit.dfnone_here && !dyn->insts[jmp].x64.use_flags)) // flags are fully known, nothing we can do more return; MESSAGE(LOG_DUMP, "\tFlags fetch ---- ninst=%d -> %d\n", ninst, jmp); int go = (dyn->insts[jmp].f_entry.dfnone && !dyn->f.dfnone)?1:0; diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c index a36e0014..f665fc4c 100644 --- a/src/dynarec/dynarec_native_pass.c +++ b/src/dynarec/dynarec_native_pass.c @@ -229,7 +229,7 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int if(dyn->forward) { if(dyn->forward_to == addr && !need_epilog && ok>=0) { // we made it! - reset_n = dyn->forward_ninst; + reset_n = get_first_jump(dyn, addr); if(box64_dynarec_dump) dynarec_log(LOG_NONE, "Forward extend block for %d bytes %s%p -> %p (ninst %d - %d)\n", dyn->forward_to-dyn->forward, dyn->insts[dyn->forward_ninst].x64.has_callret?"(opt. call) ":"", (void*)dyn->forward, (void*)dyn->forward_to, reset_n, ninst); if(dyn->insts[dyn->forward_ninst].x64.has_callret && !dyn->insts[dyn->forward_ninst].x64.has_next) dyn->insts[dyn->forward_ninst].x64.has_next = 1; // this block actually continue |