about summary refs log tree commit diff stats
path: root/src/dynarec
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-06-28 10:35:11 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-06-28 10:35:11 +0200
commit013643782f14b8545d30157cb33b13d405d29f7c (patch)
tree403ea6d98eab0c8f83f344d0bd55a20655c82eba /src/dynarec
parentcb064f9e5aa57b4ef6ffc5b79104e1df8d4f3b74 (diff)
downloadbox64-013643782f14b8545d30157cb33b13d405d29f7c.tar.gz
box64-013643782f14b8545d30157cb33b13d405d29f7c.zip
[ARM64_DYNAREC] Fixed AVX.66.0F3A 06/46/21 opcodes
Diffstat (limited to 'src/dynarec')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c46
1 files changed, 6 insertions, 40 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c
index a79c95a0..69a58b58 100644
--- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c
+++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c
@@ -148,12 +148,13 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
             if(!vex.l) YMM0(gd);
             break;
         case 0x06:
-            INST_NAME("VPERM2F128 Gx, Vx, Ex, Imm8");
+        case 0x46:
+            if(opcode==0x06) { INST_NAME("VPERM2F128 Gx, Vx, Ex, Imm8"); } else { INST_NAME("VPERM2I128 Gx, Vx, Ex, Imm8"); }
             nextop = F8;
             if(!vex.l) UDF(0);
             if(MODREG) {
                 s0 = (nextop&7)+(rex.b<<3);
-                v1 = sse_get_reg_empty(dyn, ninst, x1, s0);
+                v1 = sse_get_reg(dyn, ninst, x1, s0, 0);
             } else {
                 s0 = -1;
                 v1 = fpu_get_scratch(dyn, ninst);
@@ -543,9 +544,8 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
         case 0x21:
             INST_NAME("VINSERTPS Gx, Vx, Ex, Ib");
             nextop = F8;
-            GETGX_empty_VX(v0, v2);
             if (MODREG) {
-                v1 = sse_get_reg(dyn, ninst, x1, (nextop & 7) + (rex.b << 3), 0);
+                GETGX_empty_VXEX(v0, v2, v1, 1);
                 u8 = F8;
                 if(v0==v1) {
                     d0 = fpu_get_scratch(dyn, ninst);
@@ -557,6 +557,7 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
                     VMOVeS(v0, (u8>>4)&3, v1, (u8>>6)&3);
                 }
             } else {
+                GETGX_empty_VX(v0, v2);
                 if(v0!=v2) VMOVQ(v0, v2);
                 SMREAD();
                 addr = geted(dyn, addr, ninst, nextop, &wback, x1, &fixedaddress, &unscaled, 0xfff<<2, 3, rex, NULL, 0, 1);
@@ -680,42 +681,7 @@ uintptr_t dynarec64_AVX_66_0F3A(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
             if(!vex.l) YMM0(gd);
             break;
 
-        case 0x46:
-            INST_NAME("VPERM2I128 Gx, Vx, Ex, Imm8");
-            if(!vex.l) { UDF(0); }
-            nextop = F8;
-            GETGX_empty_VX(v0, v2);
-            if(MODREG) {GETEX(v1, 0, 1);} else {addr = geted(dyn, addr, ninst, nextop, &ed, x3, &fixedaddress, NULL, 0xffe<<4, 15, rex, NULL, 0, 1); v1=-1;}
-            u8 = F8;
-            // make some qopies in case g==v or g==e
-            if((v0==v2) && ((u8&0xf0)==0x00)) {
-                d2 = fpu_get_scratch(dyn, ninst);
-                VMOVQ(d2, v2);
-            } else d2 = v2;
-            if(MODREG && (v0==v1) && ((u8&0xf0)==0x20)) {
-                d1 = fpu_get_scratch(dyn, ninst);
-                VMOVQ(d1, v1);
-            } else d1 = v1;
-            // grab the needed Y only
-            if(((u8&0xf)==1) || ((u8>>4)&0xf)==1) {q2 = ymm_get_reg(dyn, ninst, x2, vex.v, 0, gd, (MODREG)?((nextop&7)+(rex.b<<3)):-1, -1);}
-            if(MODREG && (((u8&0xf)==3) || ((u8>>4)&0xf)==3)) {q1 = ymm_get_reg(dyn, ninst, x2, (nextop&7)+(rex.b<<3), 0, gd, vex.v, -1);}
-            // go
-            switch(u8&0xf) {
-                case 0: if(v0!=v2) VMOVQ(v0, v2); break;
-                case 1: VMOVQ(v0, q2); break;
-                case 2: if(MODREG) {if(v0!=v1) VMOVQ(v0, v1);} else {VLDR128_U12(v0, ed, fixedaddress);} break;
-                case 3: if(MODREG) {VMOVQ(v0, q1);} else {VLDR128_U12(v0, ed, fixedaddress+16);} break;
-                default: VEORQ(v0, v0, v0); break;
-            }
-            GETGY_empty(v0, vex.v, (MODREG)?((nextop&7)+(rex.b<<3)):-1, -1);
-            switch((u8>>4)&0xf) {
-                case 0: if(v0!=d2) VMOVQ(v0, d2); break;
-                case 1: VMOVQ(v0, q2); break;
-                case 2: if(MODREG) {if(v0!=d1) VMOVQ(v0, d1);} else {VLDR128_U12(v0, ed, fixedaddress);} break;
-                case 3: if(MODREG) {VMOVQ(v0, q1);} else {VLDR128_U12(v0, ed, fixedaddress+16);} break;
-                default: VEORQ(v0, v0, v0); break;
-            }
-            break;
+        //case 0x46:    // see 0x06
 
         case 0x4A:
             INST_NAME("VBLENDVPS Gx, Vx, Ex, XMMImm8");