From 5c48c72b56628515f3d5bbbd7461d0316d22e87b Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Mon, 20 Mar 2023 20:24:42 +0800 Subject: [RV64_DYNAREC] Added 66 89 MOV opcode (#599) --- src/dynarec/rv64/dynarec_rv64_66.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/dynarec/rv64/dynarec_rv64_66.c b/src/dynarec/rv64/dynarec_rv64_66.c index 9aaf4e2f..efa69ca8 100644 --- a/src/dynarec/rv64/dynarec_rv64_66.c +++ b/src/dynarec/rv64/dynarec_rv64_66.c @@ -71,7 +71,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni SETFLAGS(X_ALL, SF_SET_PENDING); i32 = F16; SLLI(x1, xRAX, 48); - SRLI(x1, xRAX, 48); + SRLI(x1, x1, 48); if(i32) { MOV32w(x2, i32); emit_cmp16(dyn, ninst, x1, x2, x3, x4, x5, x6); @@ -115,6 +115,26 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni DEFAULT; } break; + case 0x89: + INST_NAME("MOV Ew, Gw"); + nextop = F8; + GETGD; + if(MODREG) { + ed = xRAX+(nextop&7)+(rex.b<<3); + if(ed!=gd) { + // we don't use GETGW above, so we need let gd & 0xffff. + LUI(x1, 0xffff0); + AND(ed, ed, x1); + SLLI(x2, gd, 48); + SRLI(x2, x2, 48); + OR(ed, ed, x2); + } + } else { + addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, &lock, 0, 0); + SH(gd, ed, fixedaddress); + SMWRITELOCK(lock); + } + break; case 0xC1: nextop = F8; switch((nextop>>3)&7) { -- cgit 1.4.1