about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-04-23 18:43:13 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-04-23 18:43:13 +0200
commit69127efae94678801e0069fc29b49732a06211db (patch)
treed0c3f77b1001aaf11629d64a83e7dfd34ace862a /src
parent6f0db360a430c7c8fc8526b79166501e2337c5d7 (diff)
downloadbox64-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.c9
-rw-r--r--src/dynarec/arm64/dynarec_arm64_660f.c2
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx_0f.c9
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx_66_0f.c7
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: