about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-08-06 23:22:32 +0800
committerGitHub <noreply@github.com>2025-08-06 17:22:32 +0200
commitc2c5d3b8369b6f9945fddccc5a1d945aff11c6ff (patch)
tree83517d9a08d82d334acbc750f0dbe150937fae40 /src
parent87baa884d2aabb356bdd2b20b55f65aa5b87058b (diff)
downloadbox64-c2c5d3b8369b6f9945fddccc5a1d945aff11c6ff.tar.gz
box64-c2c5d3b8369b6f9945fddccc5a1d945aff11c6ff.zip
[ARM64_DYNAREC][INTERP] Fixed AVX VPERM2F128/VPERM2I128 opcodes (#2907)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c8
-rw-r--r--src/emu/x64runavx660f3a.c39
2 files changed, 5 insertions, 42 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c
index 42cdb771..bedb1e87 100644
--- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c
+++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c
@@ -167,12 +167,12 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
             u8 = F8;
             GETVX(v2, 0);
             GETGX_empty(v0);
-            if((v0==v2) && ((u8&0xf0)==0)) {
+            if((v0==v2) && ((u8&0b10110000)==0)) {
                 q0 = fpu_get_scratch(dyn, ninst);
                 VMOVQ(q0, v2);
                 v2 = q0;
             }
-            if((v0==v1) && ((u8&0xf0)==0x20)) {
+            if((v0==v1) && ((u8&0b10110000)==0x20)) {
                 q1 = fpu_get_scratch(dyn, ninst);
                 VMOVQ(q1, v1);
                 v1 = q1;
@@ -184,8 +184,8 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
                 case 3: if(MODREG) { d1 = ymm_get_reg(dyn, ninst, x1, s0, 0, gd, vex.v, -1); VMOVQ(v0, d1); } else { VLDR128_U12(v0, ed, fixedaddress+16); } break;
                 default: VEORQ(v0, v0, v0);
             }
-            if((u8&0xf0)==0x10) { if((u8&0x0f)!=1) d2 = ymm_get_reg(dyn, ninst, x1, vex.v, 0, gd, s0, -1); }
-            if(MODREG && ((u8&0xf0)==0x30)) { if((u8&0x0f)!=3) d1 = ymm_get_reg(dyn, ninst, x1, s0, 0, gd, vex.v, -1); }
+            if((u8&0b10110000)==0x10) { if((u8&0b1011)!=1) d2 = ymm_get_reg(dyn, ninst, x1, vex.v, 0, gd, s0, -1); }
+            if(MODREG && ((u8&0b10110000)==0x30)) { if((u8&0b1011)!=3) d1 = ymm_get_reg(dyn, ninst, x1, s0, 0, gd, vex.v, -1); }
             v0 = ymm_get_reg_empty(dyn, ninst, x1, gd, vex.v, s0, -1);
             switch((u8>>4)&0b1011) {
                 case 0: VMOVQ(v0, v2); break;
diff --git a/src/emu/x64runavx660f3a.c b/src/emu/x64runavx660f3a.c
index 42dcaf79..5c0a9780 100644
--- a/src/emu/x64runavx660f3a.c
+++ b/src/emu/x64runavx660f3a.c
@@ -175,44 +175,6 @@ uintptr_t RunAVX_660F3A(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             } else
                 GY->u128 = 0;
             break;
-        case 0x06:  /* VPERM2F128 Gx, Vx, Ex, Imm8 */
-            nextop = F8;
-            GETEX(1);
-            GETGX;
-            GETVX;
-            GETEY;
-            GETGY;
-            GETVY;
-            u8 = F8;
-            if(!vex.l) EmitSignal(emu, X64_SIGILL, (void*)R_RIP, 0);
-            if(GX==EX) {
-                eax1 = *EX;
-                EX = &eax1;
-                eay1 = *EY;
-                EY = &eay1;
-            }
-            if(GX==VX) {
-                eax2 = *VX;
-                VX = &eax2;
-                eay2 = *VY;
-                VY = &eay2;
-            }
-            switch(u8&0x0f) {
-                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: 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: if(u8&0x80) GY->u128 = 0; break;
-            }
-            break;
-
         case 0x08:          // VROUNDPS Gx, Ex, u8
             nextop = F8;
             GETEX(1);
@@ -758,6 +720,7 @@ uintptr_t RunAVX_660F3A(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
                 GY->u128 = 0;
             break;
 
+        case 0x06:  /* VPERM2F128 Gx, Vx, Ex, Imm8 */
         case 0x46:  /* VPERM2I128 Gx, Vx, Ex, Imm8 */
             nextop = F8;
             GETEX(1);