diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-04-25 16:10:16 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-04-25 16:10:16 +0200 |
| commit | c6f0872e50ce05820becffc27815908a6cba96c6 (patch) | |
| tree | 1d09b5e48ce86a81472e067693db785cbfd8078c /src | |
| parent | 71dc02e06f7c99d947dcfc1a5b222413615578cf (diff) | |
| download | box64-c6f0872e50ce05820becffc27815908a6cba96c6.tar.gz box64-c6f0872e50ce05820becffc27815908a6cba96c6.zip | |
[ARM64_DYNAREC] Minor change, (V)PMOVMSKB is only valid on register, not memory
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_660f.c | 38 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_66_0f.c | 48 |
2 files changed, 47 insertions, 39 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c index 5eeba96f..50100d12 100644 --- a/src/dynarec/arm64/dynarec_arm64_660f.c +++ b/src/dynarec/arm64/dynarec_arm64_660f.c @@ -2972,23 +2972,27 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n break; case 0xD7: nextop = F8; - INST_NAME("PMOVMSKB Gd, Ex"); - v0 = fpu_get_scratch(dyn, ninst); - v1 = fpu_get_scratch(dyn, ninst); - q1 = fpu_get_scratch(dyn, ninst); - GETEX(q0, 0, 0); - GETGD; - TABLE64(x2, 0x0706050403020100LL); - VDUPQD(v0, x2); - VSHRQ_8(q1, q0, 7); - USHLQ_8(q1, q1, v0); // shift - UADDLV_8(v1, q1); // accumalte - VMOVBto(gd, v1, 0); - // and now the high part - VMOVeD(q1, 0, q1, 1); - UADDLV_8(q1, q1); // accumalte - VMOVBto(x2, q1, 0); - BFIw(gd, x2, 8, 8); + if(MODREG) { + INST_NAME("PMOVMSKB Gd, Ex"); + v0 = fpu_get_scratch(dyn, ninst); + v1 = fpu_get_scratch(dyn, ninst); + q1 = fpu_get_scratch(dyn, ninst); + GETEX(q0, 0, 0); + GETGD; + TABLE64(x2, 0x0706050403020100LL); + VDUPQD(v0, x2); + VSHRQ_8(q1, q0, 7); + USHLQ_8(q1, q1, v0); // shift + UADDLV_8(v1, q1); // accumalte + VMOVBto(gd, v1, 0); + // and now the high part + VMOVeD(q1, 0, q1, 1); + UADDLV_8(q1, q1); // accumalte + VMOVBto(x2, q1, 0); + BFIw(gd, x2, 8, 8); + } else { + DEFAULT; + } break; case 0xD8: INST_NAME("PSUBUSB Gx, Ex"); diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c index 5fa954c0..7f33f8d3 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c @@ -1420,35 +1420,39 @@ uintptr_t dynarec64_AVX_66_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, break; case 0xD7: nextop = F8; - INST_NAME("VPMOVMSKB Gd, Ex"); - v0 = fpu_get_scratch(dyn, ninst); - v1 = fpu_get_scratch(dyn, ninst); - q1 = fpu_get_scratch(dyn, ninst); - GETEX_Y(q0, 0, 0); - GETGD; - TABLE64(x2, 0x0706050403020100LL); - VDUPQD(v0, x2); - VSHRQ_8(q1, q0, 7); - USHLQ_8(q1, q1, v0); // shift - UADDLV_8(v1, q1); // accumalte - VMOVBto(gd, v1, 0); - // and now the high part - VMOVeD(q1, 0, q1, 1); - UADDLV_8(q1, q1); // accumalte - VMOVBto(x2, q1, 0); - BFIw(gd, x2, 8, 8); - if(vex.l) { - GETEY(q0); + if(MODREG) { + INST_NAME("VPMOVMSKB Gd, Ex"); + v0 = fpu_get_scratch(dyn, ninst); + v1 = fpu_get_scratch(dyn, ninst); + q1 = fpu_get_scratch(dyn, ninst); + GETEX_Y(q0, 0, 0); + GETGD; + TABLE64(x2, 0x0706050403020100LL); + VDUPQD(v0, x2); VSHRQ_8(q1, q0, 7); USHLQ_8(q1, q1, v0); // shift UADDLV_8(v1, q1); // accumalte - VMOVBto(x2, v1, 0); - BFIw(gd, x2, 16, 8); + VMOVBto(gd, v1, 0); // and now the high part VMOVeD(q1, 0, q1, 1); UADDLV_8(q1, q1); // accumalte VMOVBto(x2, q1, 0); - BFIw(gd, x2, 24, 8); + BFIw(gd, x2, 8, 8); + if(vex.l) { + GETEY(q0); + VSHRQ_8(q1, q0, 7); + USHLQ_8(q1, q1, v0); // shift + UADDLV_8(v1, q1); // accumalte + VMOVBto(x2, v1, 0); + BFIw(gd, x2, 16, 8); + // and now the high part + VMOVeD(q1, 0, q1, 1); + UADDLV_8(q1, q1); // accumalte + VMOVBto(x2, q1, 0); + BFIw(gd, x2, 24, 8); + } + } else { + DEFAULT; } break; case 0xD8: |