diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-11-17 11:02:21 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-11-17 11:02:21 +0100 |
| commit | 8a180e3892b31417c6bdec0355788605b0dca0e6 (patch) | |
| tree | 4f9c4344d4cb41cc397a762993fc99c94ab98958 /src | |
| parent | c4d3d734b1a625ab5142a3f43ff955945a783faa (diff) | |
| download | box64-8a180e3892b31417c6bdec0355788605b0dca0e6.tar.gz box64-8a180e3892b31417c6bdec0355788605b0dca0e6.zip | |
[ARM64_DYNAREC] Cancel native flags when an opcode use native flags not fully covered by the generated ones
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_functions.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_functions.c b/src/dynarec/arm64/dynarec_arm64_functions.c index 96a17c21..a37434d0 100644 --- a/src/dynarec/arm64/dynarec_arm64_functions.c +++ b/src/dynarec/arm64/dynarec_arm64_functions.c @@ -884,13 +884,10 @@ static uint8_t getNativeFlagsUsed(dynarec_arm_t* dyn, int start, uint8_t flags) if(ninst!=start && dyn->insts[ninst].x64.use_flags) { if((flag2native(dyn->insts[ninst].x64.use_flags)&~(dyn->insts[ninst].use_nat_flags))&used_flags) return 0; + // also check if the gen flags are compatible + if((dyn->insts[ninst].use_nat_flags)&~flags) + return 0; } - // check if flags are still needed - if(!(flag2native(dyn->insts[ninst].x64.need_after)&flags)) - return used_flags; - // check if flags are destroyed, cancel the use then - if(dyn->insts[ninst].nat_flags_op && (start!=ninst)) - return 0; // check if flags are generated without native option if((start!=ninst) && dyn->insts[ninst].x64.gen_flags && (flag2native(dyn->insts[ninst].x64.gen_flags&dyn->insts[ninst].x64.need_after)&used_flags)) { if(used_flags&~flag2native(dyn->insts[ninst].x64.gen_flags&dyn->insts[ninst].x64.need_after)) @@ -898,6 +895,12 @@ static uint8_t getNativeFlagsUsed(dynarec_arm_t* dyn, int start, uint8_t flags) else return used_flags; // full covert... End of propagation } + // check if flags are still needed + if(!(flag2native(dyn->insts[ninst].x64.need_after)&flags)) + return used_flags; + // check if flags are destroyed, cancel the use then + if(dyn->insts[ninst].nat_flags_op && (start!=ninst)) + return 0; // update used flags used_flags |= (flag2native(dyn->insts[ninst].x64.need_after)&flags); // go next |