about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <seebastien.chev@gmail.com>2023-08-15 16:14:57 +0200
committerptitSeb <seebastien.chev@gmail.com>2023-08-15 16:14:57 +0200
commit48317e07888f8c0a3e5bbc644bb3771c1c679a6e (patch)
treeae1fcab7b87c49293ff807e4078f2464649f74ce /src
parent6c77c8f1aa35a6f4f9bd90584b8c627ddc91a7cc (diff)
downloadbox64-48317e07888f8c0a3e5bbc644bb3771c1c679a6e.tar.gz
box64-48317e07888f8c0a3e5bbc644bb3771c1c679a6e.zip
[ARM64_DYNAREC] Fixes 66 AD opcode and tweaked A0/A1 and 66 A1 opcodes
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_00.c2
-rw-r--r--src/dynarec/arm64/dynarec_arm64_66.c14
2 files changed, 11 insertions, 5 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index 63aee428..c434dbd2 100644
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -1324,6 +1324,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             else
                 u64 = F64;
             MOV64z(x1, u64);
+            SMREAD();
             LDRB_U12(x2, x1, 0);
             BFIx(xRAX, x2, 0, 8);
             break;
@@ -1334,6 +1335,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             else
                 u64 = F64;
             MOV64z(x1, u64);
+            SMREAD();
             LDRxw_U12(xRAX, x1, 0);
             break;
         case 0xA2:
diff --git a/src/dynarec/arm64/dynarec_arm64_66.c b/src/dynarec/arm64/dynarec_arm64_66.c
index 3ca6dd3e..f646a284 100644
--- a/src/dynarec/arm64/dynarec_arm64_66.c
+++ b/src/dynarec/arm64/dynarec_arm64_66.c
@@ -665,6 +665,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             else

                 u64 = F64;

             MOV64z(x1, u64);

+            SMREAD();

             LDRH_U12(x2, x1, 0);

             BFIx(xRAX, x2, 0, 16);

             break;

@@ -785,20 +786,23 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 CBZx_NEXT(xRCX);

                 TBNZ_MARK2(xFlags, F_DF);

                 MARK;   // Part with DF==0

-                LDRH_S9_postindex(xRAX, xRSI, 2);

+                LDRH_S9_postindex(x2, xRSI, 2);

                 SUBx_U12(xRCX, xRCX, 1);

                 CBNZx_MARK(xRCX);

-                B_NEXT_nocond;

+                B_MARK3_nocond;

                 MARK2;  // Part with DF==1

-                LDRH_S9_postindex(xRAX, xRSI, -2);

+                LDRH_S9_postindex(x2, xRSI, -2);

                 SUBx_U12(xRCX, xRCX, 1);

                 CBNZx_MARK2(xRCX);

+                MARK3;

+                BFIx(xRAX, x2, 0, 16);

                 // done

             } else {

-                INST_NAME("STOSW");

+                INST_NAME("LODSW");

                 GETDIR(x3, 2);

-                LDRH_U12(xRAX, xRSI, 0);

+                LDRH_U12(x2, xRSI, 0);

                 ADDx_REG(xRSI, xRSI, x3);

+                BFIx(xRAX, x2, 0, 16);

             }

             break;