diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-09-08 14:18:03 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-09-08 14:18:03 +0200 |
| commit | 8f855f5ddeb4de303085757b7c417b66665e1c3e (patch) | |
| tree | 7adf25ba44a920644543d0ac21a8346af37d6cb6 /src | |
| parent | 6d3fa25d5fc41ad5066b565ade8f24e74cb8e1ae (diff) | |
| download | box64-8f855f5ddeb4de303085757b7c417b66665e1c3e.tar.gz box64-8f855f5ddeb4de303085757b7c417b66665e1c3e.zip | |
[ARM64_DYNAREC] Avoid computing flags if they are just recomputed at jump point
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_helper.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_helper.c b/src/dynarec/arm64/dynarec_arm64_helper.c index c33c9aa2..c332b40a 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.c +++ b/src/dynarec/arm64/dynarec_arm64_helper.c @@ -2332,8 +2332,17 @@ static void flagsCacheTransform(dynarec_arm_t* dyn, int ninst, int s1) case SF_SET_PENDING: if(dyn->f.pending!=SF_SET && dyn->f.pending!=SF_SET_PENDING - && dyn->f.pending!=SF_PENDING) - go = 1; + && 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)); + } + } break; case SF_PENDING: if(dyn->f.pending!=SF_SET |