diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-03-19 15:51:04 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-03-19 08:51:04 +0100 |
| commit | 14569db74dd50d1b143893c7c0c0adf5b17fa53e (patch) | |
| tree | 269350b31f063cf754ce38f71fef74a7c39dbc26 /src | |
| parent | c519556962efc341119839f6b642331ef6e9bdee (diff) | |
| download | box64-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.c | 4 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_f0.c | 18 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_f0.c | 22 |
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 { |