about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-04-25 17:28:28 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-04-25 17:28:28 +0200
commitb6b069cf8d854467e8fa3d2ebf7f60e975988e6a (patch)
treedf50565b5fa747b9469bdec271698f1f80fa8e9c /src
parentf9475aa540d4cdb6cc54a58ed9589449c72d8995 (diff)
downloadbox64-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.c36
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: