about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-04-30 17:17:08 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-04-30 17:17:08 +0200
commiteae608f35c1cc1afd58bb30f7cc779102321763c (patch)
tree2747f36a0a4e8374cc61dfdf665f5637b26f526c /src
parent89dbd81f27bc8a3ad1e27d7073883f27ee15865f (diff)
downloadbox64-eae608f35c1cc1afd58bb30f7cc779102321763c.tar.gz
box64-eae608f35c1cc1afd58bb30f7cc779102321763c.zip
[ARM64_DYNAREC] Small improvment to VPBROADCAST[B/W] opcodes
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c30
1 files changed, 10 insertions, 20 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c
index 91eefba3..05732a8b 100644
--- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c
+++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c
@@ -1224,48 +1224,38 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
             break;
 
         case 0x78:
-            INST_NAME("VBROADCASTB Gx, Ex");
+            INST_NAME("VPBROADCASTB Gx, Ex");
             nextop = F8;
             if(MODREG) {
                 v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0);
                 GETGX_empty(v0);
                 VDUPQ_8(v0, v1, 0);
-                if(vex.l) {
-                    GETGY_empty(v0, -1, -1, -1);
-                    VDUPQ_8(v0, v1, 0);
-                }
             } else {
                 GETGX_empty(v0);
                 addr = geted(dyn, addr, ninst, nextop, &ed, x3, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
                 VLDQ1R_8(v0, ed);
-                if(vex.l) {
-                    GETGY_empty(v0, -1, -1, -1);
-                    VLDQ1R_8(v0, ed);
-                }
             }
-            if(!vex.l) YMM0(gd);
+            if(vex.l) {
+                GETGY_empty(v1, -1, -1, -1);
+                VMOVQ(v0, v1);
+            } else YMM0(gd);
             break;
         case 0x79:
-            INST_NAME("VBROADCASTW Gx, Ex");
+            INST_NAME("VPBROADCASTW Gx, Ex");
             nextop = F8;
             if(MODREG) {
                 v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0);
                 GETGX_empty(v0);
                 VDUPQ_16(v0, v1, 0);
-                if(vex.l) {
-                    GETGY_empty(v0, -1, -1, -1);
-                    VDUPQ_16(v0, v1, 0);
-                }
             } else {
                 GETGX_empty(v0);
                 addr = geted(dyn, addr, ninst, nextop, &ed, x3, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);
                 VLDQ1R_16(v0, ed);
-                if(vex.l) {
-                    GETGY_empty(v0, -1, -1, -1);
-                    VLDQ1R_16(v0, ed);
-                }
             }
-            if(!vex.l) YMM0(gd);
+            if(vex.l) {
+                GETGY_empty(v1, -1, -1, -1);
+                VMOVQ(v0, v1);
+            } else  YMM0(gd);
             break;
 
         case 0x8C: