[DYNAREC] Fixed 16-bit XADD register clobbering (#4094)

This commit is contained in:
Yang Liu authored and GitHub committed 2026-07-23 08:08:29 +02:00
1 parent 38df9afcf2
commit 654e36622f
2 files changed
+7 -3

No files matched your search

+4 -2
View File
@@ -2058,7 +2058,7 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
} else {
SMREAD();
addr = geted(dyn, addr, ninst, nextop, &wback, x1, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 1);
v1 = fpu_get_scratch(dyn, ninst);
v1 = fpu_get_scratch(dyn, ninst);
}
u8 = F8;
GETGX_empty(v0);
@@ -2923,9 +2923,11 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
nextop = F8;
GETGW(x1);
GETEW(x2, 0);
BFIx(TO_NAT(((nextop & 0x38) >> 3) + (rex.r << 3)), ed, 0, 16);
u8 = TO_NAT(((nextop & 0x38) >> 3) + (rex.r << 3));
if (!(MODREG && wback == u8)) MOVx_REG(x6, ed);
emit_add16(dyn, ninst, ed, gd, x4, x5);
EWBACK;
if (!(MODREG && wback == u8)) BFIx(u8, x6, 0, 16);
break;
case 0xC2:
INST_NAME("CMPPD Gx, Ex, Ib");
+3 -1
View File
@@ -2689,9 +2689,11 @@ uintptr_t dynarec64_660F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int
SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION);
nextop = F8;
GETGWEW(x1, x2, 0);
BSTRINS_D(TO_NAT(((nextop & 0x38) >> 3) + (rex.r << 3)), ed, 15, 0);
u8 = TO_NAT(((nextop & 0x38) >> 3) + (rex.r << 3));
if (!(MODREG && wback == u8)) MV(x7, ed);
emit_add16(dyn, ninst, ed, gd, x4, x5, x6);
EWBACK;
if (!(MODREG && wback == u8)) BSTRINS_D(u8, x7, 15, 0);
break;
case 0xC2:
INST_NAME("CMPPD Gx, Ex, Ib");