about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-03-08 20:57:21 +0100
committerptitSeb <sebastien.chev@gmail.com>2025-03-08 20:57:21 +0100
commitc2f73e6de014c89c23e6373585d785f3ae4b72b2 (patch)
tree6aaee679107833142e02b8ce8330b39da16c3a58 /src
parent0724f52d5f25ad27b45aa5309eb362ebc2e225ad (diff)
downloadbox64-c2f73e6de014c89c23e6373585d785f3ae4b72b2.tar.gz
box64-c2f73e6de014c89c23e6373585d785f3ae4b72b2.zip
[ARM64_DYNAREC] Fixed a few potential issue with some AVX opcodes
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx_66_0f.c14
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c22
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx_f2_0f.c2
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c2
4 files changed, 20 insertions, 20 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c
index 03150cac..e14225d7 100644
--- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c
@@ -407,7 +407,7 @@ uintptr_t dynarec64_AVX_66_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
         case 0x5A:
             INST_NAME("VCVTPD2PS Gx, Ex");
             nextop = F8;
-            GETEX(v1, 0, 0);
+            GETEX_Y(v1, 0, 0);
             GETGX_empty(v0);
             if(BOX64ENV(dynarec_fastround)==2) {
                 FCVTXN(v0, v1);
@@ -437,7 +437,7 @@ uintptr_t dynarec64_AVX_66_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
                 MOVI_32_lsl(d1, 0x80, 3);
             }
             for(int l=0; l<1+vex.l; ++l) {
-                if(!l) { GETEX(v1, 0, 0); GETGX_empty(v0); } else { GETGY_empty_EY(v0, v1); }
+                if(!l) { GETEX_Y(v1, 0, 0); GETGX_empty(v0); } else { GETGY_empty_EY(v0, v1); }
                 if(BOX64ENV(dynarec_fastround)) {
                     VFRINTISQ(v0, v1);
                     VFCVTZSQS(v0, v0);
@@ -1251,7 +1251,7 @@ uintptr_t dynarec64_AVX_66_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
             nextop = F8;
             GETGD;
             if(MODREG) {
-                GETEX(v0, 0, 1);
+                GETEX(v0, 0, 1);    // no vex.l case
                 u8 = (F8)&7;
                 VMOVHto(gd, v0, u8);
             } else {
@@ -1792,7 +1792,7 @@ uintptr_t dynarec64_AVX_66_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
             nextop = F8;
             q0 = fpu_get_scratch(dyn, ninst);
             q1 = fpu_get_scratch(dyn, ninst);
-            GETEX(v1, 0, 0);
+            GETEX_Y(v1, 0, 0);
             UQXTN_32(q0, v1);
             MOVI_32(q1, 16);
             UMIN_32(q0, q0, q1);    // limit to 0 .. +16 values
@@ -1808,7 +1808,7 @@ uintptr_t dynarec64_AVX_66_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
             nextop = F8;
             q0 = fpu_get_scratch(dyn, ninst);
             q1 = fpu_get_scratch(dyn, ninst);
-            GETEX(v1, 0, 0);
+            GETEX_Y(v1, 0, 0);
             UQXTN_32(q0, v1);
             MOVI_32(q1, 32);
             UMIN_32(q0, q0, q1);    // limit to 0 .. +32 values
@@ -1824,7 +1824,7 @@ uintptr_t dynarec64_AVX_66_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
             nextop = F8;
             q0 = fpu_get_scratch(dyn, ninst);
             q1 = fpu_get_scratch(dyn, ninst);
-            GETEX(v1, 0, 0);
+            GETEX_Y(v1, 0, 0);
             UQXTN_32(q0, v1);
             MOVI_32(q1, 64);
             UMIN_32(q0, q0, q1);    // limit to 0 .. +64 values
@@ -1884,7 +1884,7 @@ uintptr_t dynarec64_AVX_66_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
             INST_NAME("VMASKMOVDQU Gx, Ex");
             nextop = F8;
             GETGX(q0, 1);
-            GETEX(q1, 0, 0);
+            GETEX(q1, 0, 0);    //no vex.l case
             v0 = fpu_get_scratch(dyn, ninst);
             VLDR128_U12(v0, xRDI, 0);
             if(MODREG)
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c
index 541855ff..a62d2e08 100644
--- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c
+++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c
@@ -257,7 +257,7 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
             SETFLAGS(X_ALL, SF_SET);
             nextop = F8;
             GETGX(v0, 0);
-            GETEX(v1, 0, 0);
+            GETEX_Y(v1, 0, 0);
             v2 = fpu_get_scratch(dyn, ninst);
             if(vex.l) {
                 if(!MODREG)
@@ -308,7 +308,7 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
             SETFLAGS(X_ALL, SF_SET);
             nextop = F8;
             GETGX(v0, 0);
-            GETEX(v1, 0, 0);
+            GETEX_Y(v1, 0, 0);
             v2 = fpu_get_scratch(dyn, ninst);
             if(vex.l) {
                 if(!MODREG)
@@ -421,7 +421,7 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
             SETFLAGS(X_ALL, SF_SET);
             nextop = F8;
             GETGX(v0, 0);
-            GETEX(v1, 0, 0);
+            GETEX_Y(v1, 0, 0);
             v2 = fpu_get_scratch(dyn, ninst);
             if(vex.l) {
                 if(!MODREG)
@@ -544,7 +544,7 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
         case 0x20:
             INST_NAME("VPMOVSXBW Gx, Ex");
             nextop = F8;
-            if(vex.l) {GETEX(q1, 0, 0);} else {GETEX64(q1, 0, 0);}
+            if(vex.l) {GETEX(q1, 0, 0);} else {GETEX64(q1, 0, 0);}  //no GETEY
             GETGX_empty(q0);
             if(vex.l) {
                 GETGY_empty(v0, -1, -1, -1);
@@ -583,7 +583,7 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
         case 0x23:
             INST_NAME("VPMOVSXWD Gx, Ex");
             nextop = F8;
-            if(vex.l) {GETEX(q1, 0, 0);} else {GETEX64(q1, 0, 0);}
+            if(vex.l) {GETEX(q1, 0, 0);} else {GETEX64(q1, 0, 0);}  //no GETEY
             GETGX_empty(q0);
             if(vex.l) {
                 GETGY_empty(v0, -1, -1, -1);
@@ -607,7 +607,7 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
         case 0x25:
             INST_NAME("VPMOVSXDQ Gx, Ex");
             nextop = F8;
-            if(vex.l) {GETEX(q1, 0, 0);} else {GETEX64(q1, 0, 0);}
+            if(vex.l) {GETEX(q1, 0, 0);} else {GETEX64(q1, 0, 0);}  //no GETEY
             GETGX_empty(q0);
             if(vex.l) {
                 GETGY_empty(v0, -1, -1, -1);
@@ -910,7 +910,7 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
             INST_NAME("VPMOVZXBW Gx, Ex");
             nextop = F8;
             GETG;
-            if(vex.l) { GETEX(q1, 0, 0); } else { GETEX64(q1, 0, 0); YMM0(gd); }
+            if(vex.l) { GETEX(q1, 0, 0); } else { GETEX64(q1, 0, 0); YMM0(gd); }    //no GETEY
             GETGX_empty(q0);
             if(vex.l) {
                 GETGY_empty(v0, -1, -1, -1);
@@ -952,7 +952,7 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
             INST_NAME("VPMOVZXWD Gx, Ex");
             nextop = F8;
             GETG;
-            if(vex.l) { GETEX(q1, 0, 0); } else { GETEX64(q1, 0, 0); YMM0(gd); }
+            if(vex.l) { GETEX(q1, 0, 0); } else { GETEX64(q1, 0, 0); YMM0(gd); }    //no GETEY
             GETGX_empty(q0);
             if(vex.l) {
                 GETGY_empty(v0, -1, -1, -1);
@@ -978,7 +978,7 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
             INST_NAME("VPMOVZXDQ Gx, Ex");
             nextop = F8;
             GETG;
-            if(vex.l) { GETEX(q1, 0, 0); } else { GETEX64(q1, 0, 0); YMM0(gd); }
+            if(vex.l) { GETEX(q1, 0, 0); } else { GETEX64(q1, 0, 0); YMM0(gd); }    //no GETEY
             GETGX_empty(q0);
             if(vex.l) {
                 GETGY_empty(v0, -1, -1, -1);
@@ -1078,9 +1078,9 @@ uintptr_t dynarec64_AVX_66_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip
             if(!vex.l) YMM0(gd);
             break;
         case 0x41:
-            INST_NAME("PHMINPOSUW Gx, Ex");
+            INST_NAME("VPHMINPOSUW Gx, Ex");
             nextop = F8;
-            GETEX(v1, 0, 0);
+            GETEX(v1, 0, 0);    //no vex.l case
             GETGX_empty(v0);
             q0 = fpu_get_scratch(dyn, ninst);
             q1 = fpu_get_scratch(dyn, ninst);
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_f2_0f.c b/src/dynarec/arm64/dynarec_arm64_avx_f2_0f.c
index 1e204a13..44396561 100644
--- a/src/dynarec/arm64/dynarec_arm64_avx_f2_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_avx_f2_0f.c
@@ -367,7 +367,7 @@ uintptr_t dynarec64_AVX_F2_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
             nextop = F8;
             d0 = fpu_get_scratch(dyn, ninst);
             for(int l=0; l<1+vex.l; ++l) {
-                if(!l) { GETEX(v1, 0, 1); GETGX(v0, 1); u8 = F8; } else { GETGY(v0, 1, MODREG?((nextop&7)+(rex.b<<3)):-1, -1, -1); GETEY(v1); }
+                if(!l) { GETEX_Y(v1, 0, 1); GETGX(v0, 1); u8 = F8; } else { GETGY(v0, 1, MODREG?((nextop&7)+(rex.b<<3)):-1, -1, -1); GETEY(v1); }
                 if(u8==0b00000000 || u8==0b01010101 || u8==0b10101010 || u8==0b11111111) {
                     if(v0==v1) {
                         VMOVQ(d0, v1);
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c b/src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c
index 4202f537..9f3d5f4b 100644
--- a/src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c
@@ -439,7 +439,7 @@ uintptr_t dynarec64_AVX_F3_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip,
             nextop = F8;
             d0 = fpu_get_scratch(dyn, ninst);
             for(int l=0; l<1+vex.l; ++l) {
-                if(!l) { GETEX(v1, 0, 1); GETGX(v0, 1); u8 = F8; } else { GETGY(v0, 1, MODREG?((nextop&7)+(rex.b<<3)):-1, -1, -1); GETEY(v1); }
+                if(!l) { GETEX_Y(v1, 0, 1); GETGX(v0, 1); u8 = F8; } else { GETGY(v0, 1, MODREG?((nextop&7)+(rex.b<<3)):-1, -1, -1); GETEY(v1); }
                 if(u8==0b00000000 || u8==0b01010101 || u8==0b10101010 || u8==0b11111111) {
                     VDUP_16(d0, v1, 4+(u8&3));
                 } else {