diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-03-08 20:57:21 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-03-08 20:57:21 +0100 |
| commit | c2f73e6de014c89c23e6373585d785f3ae4b72b2 (patch) | |
| tree | 6aaee679107833142e02b8ce8330b39da16c3a58 /src | |
| parent | 0724f52d5f25ad27b45aa5309eb362ebc2e225ad (diff) | |
| download | box64-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.c | 14 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c | 22 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_f2_0f.c | 2 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c | 2 |
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 { |