diff options
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_helper.c | 8 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native_functions.c | 23 |
2 files changed, 10 insertions, 21 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_helper.c b/src/dynarec/arm64/dynarec_arm64_helper.c index a0cdc462..d404c6f3 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.c +++ b/src/dynarec/arm64/dynarec_arm64_helper.c @@ -2030,7 +2030,7 @@ static void flagsCacheTransform(dynarec_arm_t* dyn, int ninst, int s1) if(dyn->f.dfnone) // flags are fully known, nothing we can do more return; MESSAGE(LOG_DUMP, "\tFlags fetch ---- ninst=%d -> %d\n", ninst, jmp); - int go = 0; + int go = (dyn->insts[jmp].f_entry.dfnone && !dyn->f.dfnone)?1:0; switch (dyn->insts[jmp].f_entry.pending) { case SF_UNKNOWN: break; case SF_SET: @@ -2048,12 +2048,10 @@ static void flagsCacheTransform(dynarec_arm_t* dyn, int ninst, int s1) && dyn->f.pending!=SF_SET_PENDING && dyn->f.pending!=SF_PENDING) go = 1; - else - go = (dyn->insts[jmp].f_entry.dfnone == dyn->f.dfnone)?0:1; + else if (dyn->insts[jmp].f_entry.dfnone !=dyn->f.dfnone) + go = 1; break; } - if(dyn->insts[jmp].f_entry.dfnone && !dyn->f.dfnone) - go = 1; if(go) { if(dyn->f.pending!=SF_PENDING) { LDRw_U12(s1, xEmu, offsetof(x64emu_t, df)); diff --git a/src/dynarec/dynarec_native_functions.c b/src/dynarec/dynarec_native_functions.c index d70beca9..94a6f521 100644 --- a/src/dynarec/dynarec_native_functions.c +++ b/src/dynarec/dynarec_native_functions.c @@ -394,9 +394,8 @@ static int flagsCacheNeedsTransform(dynarec_native_t* dyn, int ninst) { return 0; if(dyn->insts[ninst].f_exit.dfnone) // flags are fully known, nothing we can do more return 0; -/* if((dyn->f.pending!=SF_SET) - && (dyn->f.pending!=SF_SET_PENDING)) { - if(dyn->f.pending!=SF_PENDING) {*/ + if(dyn->insts[jmp].f_entry.dfnone && !dyn->insts[ninst].f_exit.dfnone) + return 1; switch (dyn->insts[jmp].f_entry.pending) { case SF_UNKNOWN: return 0; case SF_SET: @@ -405,22 +404,14 @@ static int flagsCacheNeedsTransform(dynarec_native_t* dyn, int ninst) { else return 0; case SF_SET_PENDING: - if(dyn->insts[ninst].f_exit.pending!=SF_SET - && dyn->insts[ninst].f_exit.pending!=SF_SET_PENDING - && dyn->insts[ninst].f_exit.pending!=SF_PENDING) - return 1; - else + if(dyn->insts[ninst].f_exit.pending==SF_SET_PENDING) return 0; + return 1; case SF_PENDING: - if(dyn->insts[ninst].f_exit.pending!=SF_SET - && dyn->insts[ninst].f_exit.pending!=SF_SET_PENDING - && dyn->insts[ninst].f_exit.pending!=SF_PENDING) - return 1; - else - return (dyn->insts[jmp].f_entry.dfnone == dyn->insts[ninst].f_exit.dfnone)?0:1; + if(dyn->insts[ninst].f_exit.pending==SF_PENDING || dyn->insts[ninst].f_exit.pending==SF_SET_PENDING) + return 0; + return (dyn->insts[jmp].f_entry.dfnone == dyn->insts[ninst].f_exit.dfnone)?0:1; } - if(dyn->insts[jmp].f_entry.dfnone && !dyn->insts[ninst].f_exit.dfnone) - return 1; return 0; } |