about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-03-19 15:51:04 +0800
committerGitHub <noreply@github.com>2025-03-19 08:51:04 +0100
commit14569db74dd50d1b143893c7c0c0adf5b17fa53e (patch)
tree269350b31f063cf754ce38f71fef74a7c39dbc26 /src
parentc519556962efc341119839f6b642331ef6e9bdee (diff)
downloadbox64-14569db74dd50d1b143893c7c0c0adf5b17fa53e.tar.gz
box64-14569db74dd50d1b143893c7c0c0adf5b17fa53e.zip
[DYNAREC] Fixed minor issues for F0 0F B0/B1 LOCK CMPXCHG opcodes (#2448)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_f0.c4
-rw-r--r--src/dynarec/la64/dynarec_la64_f0.c18
-rw-r--r--src/dynarec/rv64/dynarec_rv64_f0.c22
3 files changed, 20 insertions, 24 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_f0.c b/src/dynarec/arm64/dynarec_arm64_f0.c
index d5a81fef..a38b051e 100644
--- a/src/dynarec/arm64/dynarec_arm64_f0.c
+++ b/src/dynarec/arm64/dynarec_arm64_f0.c
@@ -285,11 +285,9 @@ uintptr_t dynarec64_F0(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                                 UFLAG_IF {emit_cmp8(dyn, ninst, x6, ed, x3, x4, x5);}
                                 SUBxw_REG(x6, x6, x2);
                                 CBNZxw_MARK2(x6);
-                                BFIx(wback, x2, wb2, 8);
-                                MOVxw_REG(ed, gd);
+                                BFIx(wback, gd, wb2, 8);
                                 MARK2;
                                 BFIx(xRAX, x2, 0, 8);
-                                B_NEXT_nocond;
                             } else {
                                 addr = geted(dyn, addr, ninst, nextop, &wback, x3, &fixedaddress, NULL, 0, 0, rex, LOCK_LOCK, 0, 0);
                                 if(arm64_atomics) {
diff --git a/src/dynarec/la64/dynarec_la64_f0.c b/src/dynarec/la64/dynarec_la64_f0.c
index d4786552..f35df09d 100644
--- a/src/dynarec/la64/dynarec_la64_f0.c
+++ b/src/dynarec/la64/dynarec_la64_f0.c
@@ -106,7 +106,6 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                             SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_NOFUSION);
                             nextop = F8;
                             ANDI(x6, xRAX, 0xff); // AL
-                            SMDMB();
                             if (MODREG) {
                                 if (rex.rex) {
                                     wback = TO_NAT((nextop & 7) + (rex.b << 3));
@@ -123,13 +122,12 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                     emit_cmp8(dyn, ninst, x6, ed, x3, x4, x5, x1);
                                 }
                                 BNE_MARK2(x6, x2);
-                                BSTRPICK_D(wback, x2, wb2 + 7, wb2);
                                 GETGB(x1);
-                                MV(ed, gd);
+                                BSTRINS_D(wback, gd, wb2 + 7, wb2);
                                 MARK2;
                                 BSTRINS_D(xRAX, x2, 7, 0);
-                                B_NEXT_nocond;
                             } else {
+                                SMDMB();
                                 if (rex.rex) {
                                     gb1 = TO_NAT(((nextop & 0x38) >> 3) + (rex.r << 3));
                                     gb2 = 0;
@@ -144,8 +142,8 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                 MARKLOCK;
                                 ADDI_D(x7, xZR, ~0b11);
                                 AND(x7, wback, x7); // align to 32bit
-                                LD_WU(x1, x7, 0);
                                 LL_W(x4, x7, 0);
+                                MV(x1, x4);
                                 SRL_D(x4, x4, x5);
                                 ANDI(x4, x4, 0xff);
                                 BNE_MARK(x6, x4); // compare AL with m8
@@ -163,8 +161,8 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                 MARK;
                                 UFLAG_IF { emit_cmp8(dyn, ninst, x6, x4, x1, x2, x3, x5); }
                                 BSTRINS_D(xRAX, x4, 7, 0);
+                                SMDMB();
                             }
-                            SMDMB();
                             break;
                         default:
                             DEFAULT;
@@ -182,9 +180,9 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                 wback = 0;
                                 UFLAG_IF { emit_cmp32(dyn, ninst, rex, xRAX, ed, x3, x4, x5, x6); }
                                 MV(x1, ed); // save value
-                                SUB_D(x2, x1, xRAX);
+                                SUBxw(x2, x1, xRAX);
                                 BNE_MARK2(x2, xZR);
-                                MV(ed, gd);
+                                MVxw(ed, gd);
                                 MARK2;
                                 MVxw(xRAX, x1);
                             } else {
@@ -206,14 +204,14 @@ uintptr_t dynarec64_F0(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                 // Unaligned
                                 ADDI_D(x5, xZR, -(1 << (rex.w + 2)));
                                 AND(x5, x5, wback);
-                                MARK2;
+                                MARKLOCK2;
                                 LDxw(x1, wback, 0);
                                 LLxw(x6, x5, 0);
                                 SUBxw(x3, x1, xRAX);
                                 BNEZ_MARK(x3);
                                 // EAX == Ed
                                 SCxw(x6, x5, 0);
-                                BEQZ_MARK2(x6);
+                                BEQZ_MARKLOCK2(x6);
                                 SDxw(gd, wback, 0);
                                 MARK;
                                 UFLAG_IF { emit_cmp32(dyn, ninst, rex, xRAX, x1, x3, x4, x5, x6); }
diff --git a/src/dynarec/rv64/dynarec_rv64_f0.c b/src/dynarec/rv64/dynarec_rv64_f0.c
index 83c67c1c..adac3d17 100644
--- a/src/dynarec/rv64/dynarec_rv64_f0.c
+++ b/src/dynarec/rv64/dynarec_rv64_f0.c
@@ -139,7 +139,6 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                             SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_NOFUSION);
                             nextop = F8;
                             ANDI(x6, xRAX, 0xff); // AL
-                            SMDMB();
                             if (MODREG) {
                                 if (rex.rex) {
                                     wback = TO_NAT((nextop & 7) + (rex.b << 3));
@@ -161,19 +160,20 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                     emit_cmp8(dyn, ninst, x6, ed, x3, x4, x5, x1);
                                 }
                                 BNE_MARK2(x6, x2);
+                                GETGB(x5);
                                 if (wb2) {
-                                    SRLI(wback, x2, wb2);
-                                    ANDI(wback, wback, 0xff);
+                                    MOV64x(x4, ~0xff00);
+                                    AND(wback, wback, x4);
+                                    SLLI(gd, gd, 8);
                                 } else {
-                                    ANDI(wback, x2, 0xff);
+                                    ANDI(wback, wback, ~0xff);
                                 }
-                                GETGB(x5);
-                                MV(ed, gd);
+                                OR(wback, wback, gd);
                                 MARK2;
                                 ANDI(xRAX, xRAX, ~0xff);
                                 OR(xRAX, xRAX, x2);
-                                B_NEXT_nocond;
                             } else {
+                                SMDMB();
                                 if (rex.rex) {
                                     gb1 = TO_NAT(((nextop & 0x38) >> 3) + (rex.r << 3));
                                     gb2 = 0;
@@ -187,8 +187,8 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                 SLLI(x5, x5, 3); // shamt
                                 MARKLOCK;
                                 ANDI(x2, wback, ~0b11); // align to 32bit
-                                LWU(x1, x2, 0);
                                 LR_W(x4, x2, 1, 1);
+                                MV(x1, x4);
                                 SRL(x4, x4, x5);
                                 ANDI(x4, x4, 0xff);
                                 BNE_MARK(x6, x4); // compare AL with m8
@@ -214,8 +214,8 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                 // load m8 into AL
                                 ANDI(xRAX, xRAX, ~0xff);
                                 OR(xRAX, xRAX, x4);
+                                SMDMB();
                             }
-                            SMDMB();
                             break;
                         default:
                             DEFAULT;
@@ -233,9 +233,9 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
                                 wback = 0;
                                 UFLAG_IF { emit_cmp32(dyn, ninst, rex, xRAX, ed, x3, x4, x5, x6); }
                                 MV(x1, ed); // save value
-                                SUB(x2, x1, xRAX);
+                                SUBxw(x2, ed, xRAX);
                                 BNE_MARK2(x2, xZR);
-                                MV(ed, gd);
+                                MVxw(ed, gd);
                                 MARK2;
                                 MVxw(xRAX, x1);
                             } else {