diff options
Diffstat (limited to 'src/dynarec/arm64/dynarec_arm64_helper.c')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_helper.c | 34 |
1 files changed, 8 insertions, 26 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_helper.c b/src/dynarec/arm64/dynarec_arm64_helper.c index 88ea9846..c8f242d3 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.c +++ b/src/dynarec/arm64/dynarec_arm64_helper.c @@ -2498,39 +2498,21 @@ 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 && !dyn->insts[jmp].x64.use_flags)) // flags are fully known, nothing we can do more + if(dyn->f.dfnone || ((dyn->insts[jmp].f_exit.dfnone && !dyn->insts[jmp].f_entry.dfnone) && !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 && !dyn->insts[jmp].df_notneeded)?1:0; switch (dyn->insts[jmp].f_entry.pending) { - case SF_UNKNOWN: break; - case SF_SET: - if(dyn->f.pending!=SF_SET && dyn->f.pending!=SF_SET_PENDING) - go = 1; + case SF_UNKNOWN: + go = 0; break; - case SF_SET_PENDING: - if(dyn->f.pending!=SF_SET - && dyn->f.pending!=SF_SET_PENDING - && dyn->f.pending!=SF_PENDING - ) { - // only sync if some previous flags are used or if all flags are not regenerated at the instuction - if(dyn->insts[jmp].x64.use_flags || (dyn->insts[jmp].x64.set_flags!=X_ALL)) - go = 1; - else if(go) { - // just clear df flags - go = 0; - STRw_U12(xZR, xEmu, offsetof(x64emu_t, df)); - } + default: + if(go && !(dyn->insts[jmp].x64.need_before&X_PEND) && (dyn->f.pending!=SF_UNKNOWN)) { + // just clear df flags + go = 0; + STRw_U12(xZR, xEmu, offsetof(x64emu_t, df)); } break; - case SF_PENDING: - if(dyn->f.pending!=SF_SET - && dyn->f.pending!=SF_SET_PENDING - && dyn->f.pending!=SF_PENDING) - go = 1; - else if (dyn->insts[jmp].f_entry.dfnone !=dyn->f.dfnone) - go = 1; - break; } if(go) { if(dyn->f.pending!=SF_PENDING) { |