about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-05-26 16:11:26 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-05-26 16:11:26 +0200
commit580fbf47b2d42c934fd8125d74fb16326aafc4a3 (patch)
tree2c9343835581171de196c0fc488104a46abe972d /src
parent4bffdce8af8884c7ff4b46cac8f988b3998b5a22 (diff)
downloadbox64-580fbf47b2d42c934fd8125d74fb16326aafc4a3.tar.gz
box64-580fbf47b2d42c934fd8125d74fb16326aafc4a3.zip
[INTERPRETER] Added avx (66 0F) DB opcode and more fixes to some avx opcodes
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64runavx660f.c38
1 files changed, 28 insertions, 10 deletions
diff --git a/src/emu/x64runavx660f.c b/src/emu/x64runavx660f.c
index c94c9315..2051b287 100644
--- a/src/emu/x64runavx660f.c
+++ b/src/emu/x64runavx660f.c
@@ -240,21 +240,39 @@ uintptr_t RunAVX_660F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             }
             break;
 
+        case 0xDB:  /* VPAND Gx,Ex */
+            nextop = F8;
+            GETEX(0);
+            GETGX;
+            GETVX;
+            GX->q[0] = VX->q[0] & EX->q[0];
+            GX->q[1] = VX->q[1] & EX->q[1];
+            GETGY;
+            if(vex.l) {
+                GETEY;
+                GETVY;
+                GY->q[0] = VY->q[0] & EY->q[0];
+                GY->q[1] = VY->q[1] & EY->q[1];
+            } else {
+                GY->q[0] = GY->q[1] = 0;
+            }
+            break;
+
         case 0xEB:  /* VPOR Gx,Ex */
             nextop = F8;
             GETEX(0);
             GETGX;
             GETVX;
-            VX->q[0] = GX->q[0] | EX->q[0];
-            VX->q[1] = GX->q[1] | EX->q[1];
+            GX->q[0] = VX->q[0] | EX->q[0];
+            GX->q[1] = VX->q[1] | EX->q[1];
             GETGY;
-            GETVY;
             if(vex.l) {
                 GETEY;
-                VY->q[0] = GY->q[0] | EY->q[0];
-                VY->q[1] = GY->q[1] | EY->q[1];
+                GETVY;
+                GY->q[0] = VY->q[0] | EY->q[0];
+                GY->q[1] = VY->q[1] | EY->q[1];
             } else {
-                VY->q[0] = VY->q[1] = 0;
+                GY->q[0] = GY->q[1] = 0;
             }
             break;
 
@@ -266,13 +284,13 @@ uintptr_t RunAVX_660F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             VX->q[0] = GX->q[0] ^ EX->q[0];
             VX->q[1] = GX->q[1] ^ EX->q[1];
             GETGY;
-            GETVY;
             if(vex.l) {
                 GETEY;
-                VY->q[0] = GY->q[0] ^ EY->q[0];
-                VY->q[1] = GY->q[1] ^ EY->q[1];
+                GETVY;
+                GY->q[0] = VY->q[0] ^ EY->q[0];
+                GY->q[1] = VY->q[1] ^ EY->q[1];
             } else {
-                VY->q[0] = VY->q[1] = 0;
+                GY->q[0] = GY->q[1] = 0;
             }
 
             break;