about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-05-01 11:13:01 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-05-01 11:13:01 +0200
commit830cc8a4982364cdb4ff8ca2423981b1a3a3d684 (patch)
tree0d66e807bd5ea8208b4fafee27a146e7385fc6ee /src
parent16b0922ec54fe8355b7288f262b5da011320523f (diff)
downloadbox64-830cc8a4982364cdb4ff8ca2423981b1a3a3d684.tar.gz
box64-830cc8a4982364cdb4ff8ca2423981b1a3a3d684.zip
[INTERP] Fixed edge-case for VPERM2[F/I]128 opcodes
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64runavx660f3a.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/emu/x64runavx660f3a.c b/src/emu/x64runavx660f3a.c
index 83f71646..5c4292e9 100644
--- a/src/emu/x64runavx660f3a.c
+++ b/src/emu/x64runavx660f3a.c
@@ -202,14 +202,14 @@ uintptr_t RunAVX_660F3A(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
                 case 1 : GX->u128 = VY->u128; break;
                 case 2 : GX->u128 = EX->u128; break;
                 case 3 : GX->u128 = EY->u128; break;
-                default: GX->u128 = 0; break;
+                default: if(u8&0x08) GX->u128 = 0; break;
             }
             switch((u8>>4)&0x0f) {
                 case 0 : GY->u128 = VX->u128; break;
                 case 1 : GY->u128 = VY->u128; break;
                 case 2 : GY->u128 = EX->u128; break;
                 case 3 : GY->u128 = EY->u128; break;
-                default: GY->u128 = 0; break;
+                default: if(u8&0x80) GY->u128 = 0; break;
             }
             break;
 
@@ -780,14 +780,14 @@ uintptr_t RunAVX_660F3A(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
                 eay2 = *VY;
                 VY = &eay2;
             }
-            switch(u8&0x0f) {
+            switch(u8&0b1011) {
                 case 0 : GX->u128 = VX->u128; break;
                 case 1 : GX->u128 = VY->u128; break;
                 case 2 : GX->u128 = EX->u128; break;
                 case 3 : GX->u128 = EY->u128; break;
                 default: GX->u128 = 0; break;
             }
-            switch((u8>>4)&0x0f) {
+            switch((u8>>4)&0b1011) {
                 case 0 : GY->u128 = VX->u128; break;
                 case 1 : GY->u128 = VY->u128; break;
                 case 2 : GY->u128 = EX->u128; break;