diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-04-08 15:43:48 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-04-08 15:43:48 +0200 |
| commit | 6f3d70c69f2b3ebd013a36bded8efe61e9dbc463 (patch) | |
| tree | e821df6f02f6b489ebe2fa79bdd337f1e92507e6 | |
| parent | 99948b601b25ff830be84fca0c3da9d605abb061 (diff) | |
| download | box64-6f3d70c69f2b3ebd013a36bded8efe61e9dbc463.tar.gz box64-6f3d70c69f2b3ebd013a36bded8efe61e9dbc463.zip | |
[ARM64_DYNAREC] Optimized 66 0F 05/06/07 opcodes
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_660f.c | 45 |
1 files changed, 9 insertions, 36 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c index c32c35e7..1bb2a389 100755 --- a/src/dynarec/arm64/dynarec_arm64_660f.c +++ b/src/dynarec/arm64/dynarec_arm64_660f.c @@ -268,17 +268,9 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n GETGX(q0, 1); GETEX(q1, 0, 0); v0 = fpu_get_scratch(dyn); - VTRNQ2_16(v0, q0, q0); // v0 have all odd elements (in double) - NEGQ_16(v0, v0); - VTRNQ1_16(q0, q0, v0); // re-inject negged element to q0 - if(q0==q1) - v0 = q1; - else { - VTRNQ2_16(v0, q1, q1); - NEGQ_16(v0, v0); - VTRNQ1_16(v0, q1, v0); - } - VADDPQ_16(q0, q0, v0); + VUZP2Q_16(v0, q0, q1); + VUZP1Q_16(q0, q0, q1); + VSUBQ_16(q0, q0, v0); break; case 0x06: INST_NAME("PHSUBD Gx, Ex"); @@ -286,17 +278,9 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n GETGX(q0, 1); GETEX(q1, 0, 0); v0 = fpu_get_scratch(dyn); - VTRNQ2_32(v0, q0, q0); // v0 have all odd elements (in double) - NEGQ_32(v0, v0); - VTRNQ1_32(q0, q0, v0); // re-inject negged element to q0 - if(q0==q1) - v0 = q1; - else { - VTRNQ2_32(v0, q1, q1); - NEGQ_32(v0, v0); - VTRNQ1_32(v0, q1, v0); - } - VADDPQ_32(q0, q0, v0); + VUZP2Q_32(v0, q0, q1); + VUZP1Q_32(q0, q0, q1); + VSUBQ_32(q0, q0, v0); break; case 0x07: INST_NAME("PHSUBSW Gx, Ex"); @@ -304,20 +288,9 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n GETGX(q0, 1); GETEX(q1, 0, 0); v0 = fpu_get_scratch(dyn); - VTRNQ2_16(v0, q0, q0); // v0 have all odd elements (in double) - NEGQ_16(v0, v0); - VTRNQ1_16(q0, q0, v0); // re-inject negged element to q0 - SADDLPQ_16(q0, q0); // there is no Add Pair with saturation... - SQXTN_16(q0, q0); - if(q0!=q1) { - VTRNQ2_16(v0, q1, q1); - NEGQ_16(v0, v0); - VTRNQ1_16(v0, q1, v0); - SADDLPQ_16(v0, v0); - SQXTN2_16(q0, v0); - } else { - VMOVeD(q0, 1, q0, 0); - } + VUZP2Q_16(v0, q0, q1); + VUZP1Q_16(q0, q0, q1); + SQSUBQ_16(q0, q0, v0); break; case 0x08: INST_NAME("PSIGNB Gx, Ex"); |