diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-04-25 17:28:28 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-04-25 17:28:28 +0200 |
| commit | b6b069cf8d854467e8fa3d2ebf7f60e975988e6a (patch) | |
| tree | df50565b5fa747b9469bdec271698f1f80fa8e9c /src | |
| parent | f9475aa540d4cdb6cc54a58ed9589449c72d8995 (diff) | |
| download | box64-b6b069cf8d854467e8fa3d2ebf7f60e975988e6a.tar.gz box64-b6b069cf8d854467e8fa3d2ebf7f60e975988e6a.zip | |
[ARM64_DYNAREC] Small optim on some 256bits VPMOV[S/Z]X* opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c | 36 |
1 files changed, 14 insertions, 22 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c index cbd7ea1a..5338c53a 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c @@ -554,12 +554,11 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip nextop = F8; if(vex.l) {GETEX64(q1, 0, 0);} else {GETEX32(q1, 0, 0);} GETGX_empty(q0); + SXTL_8(q0, q1); if(vex.l) { GETGY_empty(v0, -1, -1, -1); - SXTL_8(v0, q1); - SXTL2_16(v0, v0); + SXTL2_16(v0, q0); } else YMM0(gd); - SXTL_8(q0, q1); SXTL_16(q0, q0); break; case 0x22: @@ -567,14 +566,12 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip nextop = F8; if(vex.l) {GETEX32(q1, 0, 0);} else {GETEX16(q1, 0, 0);} GETGX_empty(q0); + SXTL_8(q0, q1); + SXTL_16(q0, q0); if(vex.l) { GETGY_empty(v0, -1, -1, -1); - SXTL_8(v0, q1); - SXTL_16(v0, v0); - SXTL2_32(v0, v0); + SXTL2_32(v0, q0); } else YMM0(gd); - SXTL_8(q0, q1); - SXTL_16(q0, q0); SXTL_32(q0, q0); break; case 0x23: @@ -593,12 +590,11 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip nextop = F8; if(vex.l) {GETEX64(q1, 0, 0);} else {GETEX32(q1, 0, 0);} GETGX_empty(q0); + SXTL_16(q0, q1); if(vex.l) { GETGY_empty(v0, -1, -1, -1); - SXTL_16(v0, q1); - SXTL2_32(v0, v0); + SXTL2_32(v0, q0); } else YMM0(gd); - SXTL_16(q0, q1); SXTL_32(q0, q0); break; case 0x25: @@ -928,12 +924,11 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip GETG; if(vex.l) { GETEX64(q1, 0, 0); } else { GETEX32(q1, 0, 0); YMM0(gd); } GETGX_empty(q0); + UXTL_8(q0, q1); if(vex.l) { GETGY_empty(v0, -1, -1, -1); - UXTL_8(v0, q1); - UXTL2_16(v0, v0); + UXTL2_16(v0, q0); } - UXTL_8(q0, q1); UXTL_16(q0, q0); break; case 0x32: @@ -942,14 +937,12 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip GETG; if(vex.l) { GETEX32(q1, 0, 0); } else { GETEX16(q1, 0, 0); YMM0(gd); } GETGX_empty(q0); + UXTL_8(q0, q1); + UXTL_16(q0, q0); if(vex.l) { GETGY_empty(v0, -1, -1, -1); - UXTL_8(v0, q1); - UXTL_16(v0, v0); - UXTL2_32(v0, v0); + UXTL2_32(v0, q0); } - UXTL_8(q0, q1); - UXTL_16(q0, q0); UXTL_32(q0, q0); break; case 0x33: @@ -970,12 +963,11 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip GETG; if(vex.l) { GETEX64(q1, 0, 0); } else { GETEX32(q1, 0, 0); YMM0(gd); } GETGX_empty(q0); + UXTL_16(q0, q1); if(vex.l) { GETGY_empty(v0, -1, -1, -1); - UXTL_16(v0, q1); - UXTL2_32(v0, v0); + UXTL2_32(v0, q0); } - UXTL_16(q0, q1); UXTL_32(q0, q0); break; case 0x35: |