diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-11-28 18:50:22 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-11-28 18:50:22 +0100 |
| commit | 994971b08f59c5868ae25333e4421fc12598b6e2 (patch) | |
| tree | 46a1491b830344010f766c607e795a46155e62e3 /src/dynarec/dynarec_native_functions.c | |
| parent | 019c0fabe14df7ca1ca0ef8e8a5670f3fbd5cefe (diff) | |
| download | box64-994971b08f59c5868ae25333e4421fc12598b6e2.tar.gz box64-994971b08f59c5868ae25333e4421fc12598b6e2.zip | |
[ARM64_DYNAREC] Fixes some rare-case of flags not correctly propagated on forward-jump
Diffstat (limited to 'src/dynarec/dynarec_native_functions.c')
| -rw-r--r-- | src/dynarec/dynarec_native_functions.c | 23 |
1 files changed, 7 insertions, 16 deletions
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; } |