From 260eeacbebe48f162cbbb53736a6a6f605877c19 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Thu, 30 Mar 2023 17:50:14 +0000 Subject: [DYNAREC] Better handling of forward blocks with unused opcode in between --- src/dynarec/dynarec_native_pass.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c index be9ebd7e..0c9ddfbc 100755 --- a/src/dynarec/dynarec_native_pass.c +++ b/src/dynarec/dynarec_native_pass.c @@ -147,8 +147,18 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr) ok = 1; // we use the 1st predecessor here int ii = ninst+1; - while(iisize && !dyn->insts[ii].pred_sz) - ++ii; + if(iisize && !dyn->insts[ii].pred_sz) { + while(iisize && (!dyn->insts[ii].pred_sz || (dyn->insts[ii].pred_sz==1 && dyn->insts[ii].pred[0]==ii-1))) { + // may need to skip opcodes to advance + ++ninst; + NEW_INST; + MESSAGE(LOG_DEBUG, "Skipping unused opcode\n"); + INST_NAME("Skipped opcode"); + INST_EPILOG; + addr += dyn->insts[ii].x64.size; + ++ii; + } + } if((dyn->insts[ii].x64.barrier&BARRIER_FULL)==BARRIER_FULL) reset_n = -2; // hack to say Barrier! else { -- cgit 1.4.1