about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-06-03 14:43:21 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-06-03 14:43:21 +0200
commit0a8f049ceda923be41e6c527d15c80e6f2201148 (patch)
treeb232388eede8742e31f03dd9836273e24b97e3ef /src
parent890809069ef083a8541f22d8b20cb137a111ccd7 (diff)
downloadbox64-0a8f049ceda923be41e6c527d15c80e6f2201148.tar.gz
box64-0a8f049ceda923be41e6c527d15c80e6f2201148.zip
[ARM64_DYNAREC] Added AVX.66.0F38 19/1A and AVX.66.0F3A 22 opcodes
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c31
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c13
2 files changed, 44 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c
index 12c6e3da..781fbfbc 100644
--- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c
+++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c
@@ -140,6 +140,37 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
                 VDUPQ_32(v0, v1, 0);
             } else YMM0(gd);
             break;
+        case 0x19:
+            INST_NAME("VBROADCASTSD Gx, Ex");
+            nextop = F8;
+            if(MODREG) {
+                v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0);
+            } else {
+                addr = geted(dyn, addr, ninst, nextop, &ed, x3, &fixedaddress, &unscaled, 0xfff<<3, 7, rex, NULL, 0, 0);
+                v1 = fpu_get_scratch(dyn, ninst);
+                VLD64(v1, ed, fixedaddress);
+            }
+            GETGX_empty(v0);
+            VDUPQ_64(v0, v1, 0);
+            if(vex.l) {
+                GETGY_empty(v0, -1, -1, -1);
+                VDUPQ_64(v0, v1, 0);
+            } else YMM0(gd);
+            break;
+        case 0x1A:
+            INST_NAME("VBROADCASTF128 Gx, Ex");
+            nextop = F8;
+            if(MODREG) {
+                v1 = sse_get_reg(dyn, ninst, x1, (nextop&7)+(rex.b<<3), 0);
+                GETGX_empty(v0);
+                VMOVQ(v0, v1);
+            } else {
+                addr = geted(dyn, addr, ninst, nextop, &ed, x3, &fixedaddress, &unscaled, 0xfff<<4, 15, rex, NULL, 0, 0);
+                VLD128(v0, ed, fixedaddress);
+            }
+            GETGY_empty(v1, -1, -1, -1);
+            VMOVQ(v1, v0);
+            break;
 
         case 0x1C:
             INST_NAME("VPABSB Gx, Ex");
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c
index cacffe2f..73c40848 100644
--- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c
+++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c
@@ -343,6 +343,19 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
             }
             YMM0(gd);
             break;
+        case 0x22:
+            INST_NAME("VINSERTD Gx, Vx, Ex, Ib");
+            nextop = F8;
+            GETGX_empty_VX(v0, v2);
+            GETED(1);
+            u8 = F8;
+            if(v0!=v2) VMOVQ(v0, v2);
+            if(rex.w)
+                VMOVQDfrom(v0, u8&1, ed);
+            else
+                VMOVQSfrom(v0, u8&3, ed);
+            YMM0(gd);
+            break;
 
         case 0x44:
             INST_NAME("PCLMULQDQ Gx, Vx, Ex, Ib");