diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-04-23 18:43:13 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-04-23 18:43:13 +0200 |
| commit | 69127efae94678801e0069fc29b49732a06211db (patch) | |
| tree | d0c3f77b1001aaf11629d64a83e7dfd34ace862a /src | |
| parent | 6f0db360a430c7c8fc8526b79166501e2337c5d7 (diff) | |
| download | box64-69127efae94678801e0069fc29b49732a06211db.tar.gz box64-69127efae94678801e0069fc29b49732a06211db.zip | |
[ARM64_DYNAREC] Small fixes and improvments to (V)MOVMSKP[S/D] opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_0f.c | 9 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_660f.c | 2 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_0f.c | 9 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_66_0f.c | 7 |
4 files changed, 12 insertions, 15 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c index 4cc1dffd..33a9abb5 100644 --- a/src/dynarec/arm64/dynarec_arm64_0f.c +++ b/src/dynarec/arm64/dynarec_arm64_0f.c @@ -1025,7 +1025,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin GOCOND(0x40, "CMOV", "Gd, Ed"); #undef GO case 0x50: - INST_NAME("MOVMSPKPS Gd, Ex"); + INST_NAME("MOVMSKPS Gd, Ex"); nextop = F8; GETGD; MOV32w(gd, 0); @@ -1046,14 +1046,13 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } else { // EX is memory SMREAD(); - addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, (0xfff<<3)-8, 7, rex, NULL, 0, 0); - LDRx_U12(x1, ed, fixedaddress+0); + addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, 0x3f<<3, 7, rex, NULL, 1, 0); + LDPx_S7_offset(x1, x2, ed, fixedaddress); LSRx(x1, x1, 31); BFIx(gd, x1, 0, 1); LSRx(x1, x1, 32); BFIx(gd, x1, 1, 1); - LDRx_U12(x1, ed, fixedaddress+8); - LSRx(x1, x1, 31); + LSRx(x1, x2, 31); BFIx(gd, x1, 2, 1); LSRx(x1, x1, 32); BFIx(gd, x1, 3, 1); diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c index 88fbe3ac..452dd65c 100644 --- a/src/dynarec/arm64/dynarec_arm64_660f.c +++ b/src/dynarec/arm64/dynarec_arm64_660f.c @@ -1649,7 +1649,7 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n case 0x50: nextop = F8; - INST_NAME("PMOVMSKD Gd, Ex"); + INST_NAME("MOVMSKPD Gd, Ex"); GETEX(q0, 0, 0); GETGD; VMOVQDto(x1, q0, 0); diff --git a/src/dynarec/arm64/dynarec_arm64_avx_0f.c b/src/dynarec/arm64/dynarec_arm64_avx_0f.c index e37a9221..9dda9b02 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_0f.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_0f.c @@ -302,7 +302,7 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int break; case 0x50: - INST_NAME("VMOVMSPKPS Gd, Ex"); + INST_NAME("VMOVMSKPS Gd, Ex"); nextop = F8; GETGD; MOV32w(gd, 0); @@ -325,15 +325,14 @@ uintptr_t dynarec64_AVX_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int } else { // EX is memory SMREAD(); - addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, (0xfff<<3)-24, 7, rex, NULL, 0, 0); + addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, (0x3f<<3)-16, 7, rex, NULL, 1, 0); for(int l=0; l<1+vex.l; ++l) { - LDRx_U12(x1, ed, fixedaddress+16*l); + LDPx_S7_offset(x1, x2, ed, fixedaddress+16*l); LSRx(x1, x1, 31); BFIx(gd, x1, 0+(l*4), 1); LSRx(x1, x1, 32); BFIx(gd, x1, 1+(l*4), 1); - LDRx_U12(x1, ed, fixedaddress+8+16*l); - LSRx(x1, x1, 31); + LSRx(x1, x2, 31); BFIx(gd, x1, 2+(l*4), 1); LSRx(x1, x1, 32); BFIx(gd, x1, 3+(l*4), 1); diff --git a/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c b/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c index 520adbf2..2d80f5b6 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c @@ -291,10 +291,9 @@ uintptr_t dynarec64_AVX_66_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, GETEY(q0); VMOVQDto(x1, q0, 0); VMOVQDto(x2, q0, 1); - LSRx(x1, x1, 63); - LSRx(x2, x2, 63); - BFIx(gd, x1, 2, 1); - BFIx(gd, x2, 3, 1); + BFIx(x1, x2, 63, 1); + RORx(x2, x1, 63); + BFIx(gd, x2, 2, 2); } break; case 0x51: |