diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_f30f.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_f30f.c b/src/dynarec/arm64/dynarec_arm64_f30f.c index e223f321..c13079f0 100644 --- a/src/dynarec/arm64/dynarec_arm64_f30f.c +++ b/src/dynarec/arm64/dynarec_arm64_f30f.c @@ -480,10 +480,18 @@ uintptr_t dynarec64_F30F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n UADDLV_8(v1, v1); VMOVQDto(gd, v1, 0); IFX(X_ALL) { - MOV32w(x1, (1<<F_OF) | (1<<F_SF) | (1<<F_ZF) | (1<<F_AF) | (1<<F_CF) | (1<<F_PF)); - BICw(xFlags, xFlags, x1); - CBNZx(gd, 4+4); - BFIw(xFlags, xFlags, F_ZF, 1); + IFX(X_AF|X_PF|X_SF|X_OF|X_CF) { + MOV32w(x1, (1<<F_OF) | (1<<F_SF) | (1<<F_ZF) | (1<<F_AF) | (1<<F_CF) | (1<<F_PF)); + BICw(xFlags, xFlags, x1); + } + IFX(X_ZF) { + CMPSw_U12(gd, 0); + IFNATIVE(NF_EQ) {} + else { + CSETw(x1, cEQ); + BFIw(xFlags, x1, F_ZF, 1); + } + } } break; |