about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-22 17:35:38 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-22 17:35:38 +0100
commit1405d83a56433080edded7ae59d01aa5eb9324c2 (patch)
treed1e935087650c94791ba2e6d4c062dc396c59754
parent0878acf04c60772493599fa59a3eeada7fcf37c1 (diff)
downloadbox64-1405d83a56433080edded7ae59d01aa5eb9324c2.tar.gz
box64-1405d83a56433080edded7ae59d01aa5eb9324c2.zip
[DYNAREC] Various bugfixes
-rwxr-xr-xsrc/dynarec/dynarec_arm64_00.c13
-rwxr-xr-xsrc/dynarec/dynarec_arm64_f20f.c2
-rwxr-xr-xsrc/dynarec/dynarec_arm64_f30f.c23
3 files changed, 21 insertions, 17 deletions
diff --git a/src/dynarec/dynarec_arm64_00.c b/src/dynarec/dynarec_arm64_00.c
index 714bb92d..e5295b82 100755
--- a/src/dynarec/dynarec_arm64_00.c
+++ b/src/dynarec/dynarec_arm64_00.c
@@ -844,16 +844,12 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 MOVxw_REG(ed, x1);
             } else {
                 GETGD;
-                addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0xfff<<(2+rex.w), (1<<(2+rex.w))-1, rex, 0, 0);
-                if(rex.w) {
-                    TSTx_mask(ed, 1, 0, 2);    // mask=7
-                } else {
-                    TSTw_mask(ed, 0, 1);    // mask=3
-                }
+                addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, 0, 0, rex, 0, 0);
+                TSTx_mask(ed, 1, 0, 1+rex.w);    // mask=3 or 7
                 B_MARK(cNE);
                 MARKLOCK;
-                LDAXRxw(x1, ed);
-                STLXRxw(x3, gd, ed);
+                LDXRxw(x1, ed);
+                STXRxw(x3, gd, ed);
                 CBNZx_MARKLOCK(x3);
                 B_MARK2_nocond;
                 MARK;
@@ -991,7 +987,6 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 STRxw_U12(x1, xRDI, 0);
                 ADDx_REG(xRSI, xRSI, x3);
                 ADDx_REG(xRDI, xRDI, x3);
-                SUBSx_U12(xRCX, xRCX, 1);
             }
             break;
 
diff --git a/src/dynarec/dynarec_arm64_f20f.c b/src/dynarec/dynarec_arm64_f20f.c
index 82388dd4..71e0a049 100755
--- a/src/dynarec/dynarec_arm64_f20f.c
+++ b/src/dynarec/dynarec_arm64_f20f.c
@@ -133,7 +133,7 @@ uintptr_t dynarec64_F20F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
             GETGX(v0);

             GETEX(d0, 0);

             d1 = fpu_get_scratch(dyn);

-            FCVT_D_S(d1, d0);

+            FCVT_S_D(d1, d0);

             VMOVeS(v0, 0, d1, 0);

             break;

 

diff --git a/src/dynarec/dynarec_arm64_f30f.c b/src/dynarec/dynarec_arm64_f30f.c
index 13b8dc70..93c32fbb 100755
--- a/src/dynarec/dynarec_arm64_f30f.c
+++ b/src/dynarec/dynarec_arm64_f30f.c
@@ -29,11 +29,10 @@
     } else {                                                                                        \

         parity = getedparity(dyn, ninst, addr, nextop, 3, D);                                       \

         a = fpu_get_scratch(dyn);                                                                   \

+        addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<2, 3, rex, 0, D);     \

         if(parity) {                                                                                \

-            addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<2, 3, rex, 0, D); \

             VLDR32_U12(a, ed, fixedaddress);                                                        \

         } else {                                                                                    \

-            addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<2, 3, rex, 0, D); \

             LDRw_U12(x2, ed, fixedaddress);                                                         \

             VMOVQSfrom(a, 0, x2);                                                                   \

         }                                                                                           \

@@ -77,10 +76,15 @@ uintptr_t dynarec64_F30F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                 VMOVeS(v0, 0, q0, 0);

             } else {

                 v0 = sse_get_reg_empty(dyn, ninst, x1, gd);

+                parity = getedparity(dyn, ninst, addr, nextop, 3, 0);

                 addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<2, 3, rex, 0, 0);

-                LDRw_U12(x2, ed, fixedaddress);   // to avoid bus errors

-                VEORQ(v0, v0, v0);

-                VMOVQSfrom(v0, 0, x2);

+                if(parity) {

+                    VLDR32_U12(v0, ed, fixedaddress);

+                } else {

+                    LDRw_U12(x2, ed, fixedaddress);   // to avoid bus errors

+                    VEORQ(v0, v0, v0);

+                    VMOVQSfrom(v0, 0, x2);

+                }

             }

             break;

         case 0x11:

@@ -92,9 +96,14 @@ uintptr_t dynarec64_F30F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
                 q0 = sse_get_reg(dyn, ninst, x1, (nextop&7) + (rex.b<<3));

                 VMOVeS(q0, 0, v0, 0);

             } else {

-                VMOVSto(x2, v0, 0);

+                parity = getedparity(dyn, ninst, addr, nextop, 3, 0);

                 addr = geted(dyn, addr, ninst, nextop, &ed, x1, &fixedaddress, 0xfff<<2, 3, rex, 0, 0);

-                STRw_U12(x2, ed, fixedaddress);

+                if(parity) {

+                    VSTR32_U12(v0, ed, fixedaddress);

+                } else {

+                    VMOVSto(x2, v0, 0);

+                    STRw_U12(x2, ed, fixedaddress);

+                }

             }

             break;