about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorphorcys <phorcys@126.com>2025-07-09 14:10:41 +0800
committerGitHub <noreply@github.com>2025-07-09 08:10:41 +0200
commit614d142205241a06733fa49f438c47a6906a5ab2 (patch)
tree63451a032d08a6e48336262e91df6759a4a63d96 /src
parentaeec79ec008e373fa9797f3fabb0a03261526fe6 (diff)
downloadbox64-614d142205241a06733fa49f438c47a6906a5ab2.tar.gz
box64-614d142205241a06733fa49f438c47a6906a5ab2.zip
[LA64_DYNAREC] Opt/fix la64 avx mov ops. (#2800)
*  opt VEX.66.0F.D6 VMOVD
  *  opt VEX.F2.0F.10 VMOSD
  *  opt VEX.F3.0F.10 VMOVSS
  *  opt/fix VEX.F3.0F.7E VMOVD
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/la64/dynarec_la64_avx_66_0f.c3
-rw-r--r--src/dynarec/la64/dynarec_la64_avx_f2_0f.c3
-rw-r--r--src/dynarec/la64/dynarec_la64_avx_f3_0f.c15
3 files changed, 6 insertions, 15 deletions
diff --git a/src/dynarec/la64/dynarec_la64_avx_66_0f.c b/src/dynarec/la64/dynarec_la64_avx_66_0f.c
index 3f04d192..4fff9660 100644
--- a/src/dynarec/la64/dynarec_la64_avx_66_0f.c
+++ b/src/dynarec/la64/dynarec_la64_avx_66_0f.c
@@ -333,8 +333,7 @@ uintptr_t dynarec64_AVX_66_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip,
             GETGYx(q0, 0);
             if (MODREG) {
                 GETEYx_empty(q1, 0);
-                XVXOR_V(q1, q1, q1);
-                XVINSVE0_D(q1, q0, 0);
+                XVPICKVE_D(q1, q0, 0);
                 YMM_UNMARK_UPPER_ZERO(q1);
             } else {
                 addr = geted(dyn, addr, ninst, nextop, &ed, x4, x5, &fixedaddress, rex, NULL, 1, 0);
diff --git a/src/dynarec/la64/dynarec_la64_avx_f2_0f.c b/src/dynarec/la64/dynarec_la64_avx_f2_0f.c
index f97e9890..ad42f029 100644
--- a/src/dynarec/la64/dynarec_la64_avx_f2_0f.c
+++ b/src/dynarec/la64/dynarec_la64_avx_f2_0f.c
@@ -70,8 +70,7 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip,
             } else {
                 GETEYSD(q2, 0, 0);
                 GETGYx_empty(q0);
-                XVXOR_V(q0, q0, q0);
-                XVINSVE0_D(q0, q2, 0);
+                XVPICKVE_D(q0, q2, 0);
                 YMM_UNMARK_UPPER_ZERO(q0);
             }
             break;
diff --git a/src/dynarec/la64/dynarec_la64_avx_f3_0f.c b/src/dynarec/la64/dynarec_la64_avx_f3_0f.c
index f6f4535d..2415e6a5 100644
--- a/src/dynarec/la64/dynarec_la64_avx_f3_0f.c
+++ b/src/dynarec/la64/dynarec_la64_avx_f3_0f.c
@@ -56,8 +56,7 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip,
             } else {
                 GETEYSS(q2, 0, 0);
                 GETGYx_empty(q0);
-                XVXOR_V(q0, q0, q0);
-                XVINSVE0_W(q0, q2, 0);
+                XVPICKVE_W(q0, q2, 0);
                 YMM_UNMARK_UPPER_ZERO(q0);
             }
             break;
@@ -125,15 +124,9 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip,
         case 0x7E:
             INST_NAME("VMOVD Gx, Ex");
             nextop = F8;
-            if (MODREG) {
-                GETEYx(q1, 0, 0);
-                GETGYx_empty(q0);
-            } else {
-                GETEYSD(q1, 0, 0);
-                GETGYx_empty(q0);
-            }
-            XVXOR_V(q0, q0, q0);
-            XVINSVE0_D(q0, q1, 0);
+            GETEYSD(q1, 0, 0);
+            GETGYx_empty(q0);
+            XVPICKVE_D(q0, q1, 0);
             YMM_UNMARK_UPPER_ZERO(q0);
             break;
         case 0x7F: