diff options
Diffstat (limited to 'src/dynarec/dynarec_native_functions.c')
| -rw-r--r-- | src/dynarec/dynarec_native_functions.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/dynarec/dynarec_native_functions.c b/src/dynarec/dynarec_native_functions.c index c6ea65b0..f0bf3d08 100644 --- a/src/dynarec/dynarec_native_functions.c +++ b/src/dynarec/dynarec_native_functions.c @@ -513,7 +513,7 @@ 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->insts[jmp].f_entry.dfnone && !dyn->insts[ninst].f_exit.dfnone) + if(dyn->insts[jmp].f_entry.dfnone && !dyn->insts[ninst].f_exit.dfnone && !dyn->insts[jmp].df_notneeded) return 1; switch (dyn->insts[jmp].f_entry.pending) { case SF_UNKNOWN: return 0; @@ -648,3 +648,15 @@ void avx_unmark_zero(dynarec_native_t* dyn, int ninst, int reg) { dyn->ymm_zero &= ~(1<<reg); } + +void propagate_nodf(dynarec_native_t* dyn, int ninst) +{ + while(ninst>=0) { + if(dyn->insts[ninst].df_notneeded) + return; // already flagged + if(dyn->insts[ninst].x64.gen_flags || dyn->insts[ninst].x64.use_flags) + return; // flags are use, so maybe it's needed + dyn->insts[ninst].df_notneeded = 1; + --ninst; + } +} \ No newline at end of file |