diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-04-29 15:58:28 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-04-29 15:58:28 +0200 |
| commit | 313e16d2bc91a7ed84f3efa17db074e8b534902e (patch) | |
| tree | 211ce879f6af062a41284d509031a68e490d7419 /src | |
| parent | ae8b5b42392c98f514e728c24ead7097a258c6f0 (diff) | |
| download | box64-313e16d2bc91a7ed84f3efa17db074e8b534902e.tar.gz box64-313e16d2bc91a7ed84f3efa17db074e8b534902e.zip | |
[ARM64_DYNAREC] Small optim on PTEST opcode
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_660f.c | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c index 64f356bc..31ca06ea 100644 --- a/src/dynarec/arm64/dynarec_arm64_660f.c +++ b/src/dynarec/arm64/dynarec_arm64_660f.c @@ -500,24 +500,28 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n INST_NAME("PTEST Gx, Ex"); nextop = F8; SETFLAGS(X_ALL, SF_SET); - GETGX(q0, 0); - GETEX(q1, 0, 0); - v1 = fpu_get_scratch(dyn, ninst); - IFX(X_ZF) { - VANDQ(v1, q1, q0); - CMEQQ_0_64(v1, v1); - UADDLVQ_32(v1, v1); - VMOVQDto(x1, v1, 0); - UBFXx(x1, x1, 33, 1); // bit33 will only be set if all bits are 1 - BFIw(xFlags, x1, F_ZF, 1); - } + GETGX(v0, 0); + GETEX(v1, 0, 0); + q0 = fpu_get_scratch(dyn, ninst); IFX(X_CF) { - VBICQ(v1, q1, q0); - CMEQQ_0_64(v1, v1); - UADDLVQ_32(v1, v1); - VMOVQDto(x1, v1, 0); - UBFXx(x1, x1, 33, 1); - BFIw(xFlags, x1, F_CF, 1); + VBICQ(q0, v1, v0); + CMEQQ_0_64(q0, q0); + UQXTN_32(q0, q0); + VMOVQDto(x2, q0, 0); + ADDSx_U12(xZR, x2, 1); + CSETw(x2, cEQ); + BFIw(xFlags, x2, F_CF, 1); + } + IFX(X_ZF) { + VANDQ(q0, v0, v1); + CMEQQ_0_64(q0, q0); + UQXTN_32(q0, q0); + VMOVQDto(x2, q0, 0); + ADDSx_U12(xZR, x2, 1); + IFNATIVE(NF_EQ) {} else { + CSETw(x2, cEQ); + BFIw(xFlags, x2, F_ZF, 1); + } } IFX(X_PF|X_AF|X_OF|X_SF) { MOV32w(x1, (1<<F_PF)|(1<<F_AF)|(1<<F_OF)|(1<<F_SF)); |