diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-11-15 14:27:43 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-11-15 14:27:43 +0100 |
| commit | 64b213fe425e335171ba04839fdd94460b3bf205 (patch) | |
| tree | dc0a8e38b1ec62bbf15050dce5d6f810895c4d31 /src/dynarec/dynarec_native_functions.c | |
| parent | eaca84e9ba632e9ae22a95e3271db2febb1c3c5f (diff) | |
| download | box64-64b213fe425e335171ba04839fdd94460b3bf205.tar.gz box64-64b213fe425e335171ba04839fdd94460b3bf205.zip | |
[ARM64_DYNAREC] Try to not call UpdateFlags when switching to a DFNONE state but dfnone is not needed
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 |