about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-08-10 09:58:42 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-08-10 09:58:42 +0200
commit67af8c2badb80e10f3efd4d07b7e1d75d987e72e (patch)
tree3ce24062d1faa200b5e7d27d4d0d1b21504a04ed /src
parent92531929f379543a0705ff250811c778e759ebf1 (diff)
downloadbox64-67af8c2badb80e10f3efd4d07b7e1d75d987e72e.tar.gz
box64-67af8c2badb80e10f3efd4d07b7e1d75d987e72e.zip
Added 67.AVX.0F.66 D6 opcode ([ARM64_DYNAREC] too)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_67_avx.c21
-rw-r--r--src/emu/x64run67avx.c20
2 files changed, 39 insertions, 2 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_67_avx.c b/src/dynarec/arm64/dynarec_arm64_67_avx.c
index 1e1e5926..4c3f147f 100644
--- a/src/dynarec/arm64/dynarec_arm64_67_avx.c
+++ b/src/dynarec/arm64/dynarec_arm64_67_avx.c
@@ -103,6 +103,27 @@ uintptr_t dynarec64_67_AVX(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int
         }
         
     }
+    else if((vex.m==VEX_M_0F) && (vex.p==VEX_P_66)) {
+        switch(opcode) {
+            case 0xD6:
+                INST_NAME("VMOVQ Ex, Gx");
+                nextop = F8;
+                GETG;
+                v0 = sse_get_reg(dyn, ninst, x1, gd, 0);
+                if(MODREG) {
+                    v1 = sse_get_reg_empty(dyn, ninst, x1, (nextop&7)+(rex.b<<3));
+                    VMOV(v1, v0);
+                    YMM0((nextop&7)+(rex.b<<3));
+                } else {
+                    addr = geted32(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, NULL, 0xfff<<3, 7, rex, NULL, 0, 0);
+                    VSTR64_U12(v0, ed, fixedaddress);
+                }
+                break;
+
+            default:
+                DEFAULT;
+        }
+    }
     else {DEFAULT;}
 
     if((*ok==-1) && (box64_dynarec_log>=LOG_INFO || box64_dynarec_dump || box64_dynarec_missing)) {
diff --git a/src/emu/x64run67avx.c b/src/emu/x64run67avx.c
index c19a22f7..bfc99e9c 100644
--- a/src/emu/x64run67avx.c
+++ b/src/emu/x64run67avx.c
@@ -76,7 +76,7 @@ uintptr_t Run67AVX(x64emu_t *emu, vex_t vex, uintptr_t addr)
 
     rex_t rex = vex.rex;
 
-    if( (vex.m==VEX_M_0F38) && (vex.p==VEX_P_F2))
+    if( (vex.m==VEX_M_0F38) && (vex.p==VEX_P_F2)) {
         switch(opcode) {
 
             case 0xF6:  /* MULX Gd, Vd, Ed (,RDX) */
@@ -97,7 +97,23 @@ uintptr_t Run67AVX(x64emu_t *emu, vex_t vex, uintptr_t addr)
 
             default: addr = 0;
         }
-    else addr = 0;
+    } else if ((vex.m==VEX_M_0F) && (vex.p==VEX_P_66)) {
+        switch(opcode) {
+            case 0xD6:  /* VMOVQ Ex, Gx */
+                nextop = F8;
+                GETEX32(0);
+                GETGX;
+                EX->q[0] = GX->q[0];
+                if(MODREG) {
+                    EX->q[1] = 0;
+                    GETEY;
+                    EY->u128 = 0;
+                }
+                break;
+
+            default: addr = 0;
+        }
+    } else addr = 0;
 
     if(!addr)
         printf_log(LOG_INFO, "Unimplemented 67 AVX opcode size %d prefix %s map %s opcode %02X ", 128<<vex.l, avx_prefix_string(vex.p), avx_map_string(vex.m), opcode);