From 0329d5fcc269397ecb87869c9559aed3a3bbbb93 Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Wed, 25 Dec 2024 22:40:21 +0800 Subject: [RV64_DYNAREC] Added more opcodes ([LA64_DYNAREC] too) (#2205) * [RV64_DYNAREC] Added 66 8E MOV opcode ([LA64_DYNAREC] too) * Added more opcodes --- src/dynarec/la64/dynarec_la64_00.c | 12 ++++++++++++ src/dynarec/la64/dynarec_la64_66.c | 15 +++++++++++++++ src/dynarec/rv64/dynarec_rv64_66.c | 15 +++++++++++++++ 3 files changed, 42 insertions(+) (limited to 'src') diff --git a/src/dynarec/la64/dynarec_la64_00.c b/src/dynarec/la64/dynarec_la64_00.c index 88eb8211..adf19f34 100644 --- a/src/dynarec/la64/dynarec_la64_00.c +++ b/src/dynarec/la64/dynarec_la64_00.c @@ -1137,6 +1137,18 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni LDxw(gd, ed, fixedaddress); } break; + case 0x8C: + INST_NAME("MOV Ed, Seg"); + nextop = F8; + if ((nextop & 0xC0) == 0xC0) { // reg <= seg + LD_HU(TO_NAT((nextop & 7) + (rex.b << 3)), xEmu, offsetof(x64emu_t, segs[(nextop & 0x38) >> 3])); + } else { // mem <= seg + addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0); + LD_HU(x3, xEmu, offsetof(x64emu_t, segs[(nextop & 0x38) >> 3])); + ST_H(x3, ed, fixedaddress); + SMWRITE2(); + } + break; case 0x8D: INST_NAME("LEA Gd, Ed"); nextop = F8; diff --git a/src/dynarec/la64/dynarec_la64_66.c b/src/dynarec/la64/dynarec_la64_66.c index 18322121..70973167 100644 --- a/src/dynarec/la64/dynarec_la64_66.c +++ b/src/dynarec/la64/dynarec_la64_66.c @@ -497,6 +497,21 @@ uintptr_t dynarec64_66(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni BSTRINSz(gd, x1, 15, 0); } break; + case 0x8E: + INST_NAME("MOV Seg, Ew"); + nextop = F8; + u8 = (nextop & 0x38) >> 3; + if ((nextop & 0xC0) == 0xC0) { + ed = TO_NAT((nextop & 7) + (rex.b << 3)); + } else { + SMREAD(); + addr = geted(dyn, addr, ninst, nextop, &wback, x2, x1, &fixedaddress, rex, NULL, 1, 0); + LD_HU(x1, wback, fixedaddress); + ed = x1; + } + ST_H(ed, xEmu, offsetof(x64emu_t, segs[u8])); + ST_H(xZR, xEmu, offsetof(x64emu_t, segs_serial[u8])); + break; case 0x90: case 0x91: case 0x92: diff --git a/src/dynarec/rv64/dynarec_rv64_66.c b/src/dynarec/rv64/dynarec_rv64_66.c index f3fe90c9..6c7f98d4 100644 --- a/src/dynarec/rv64/dynarec_rv64_66.c +++ b/src/dynarec/rv64/dynarec_rv64_66.c @@ -718,6 +718,21 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni SMWRITE2(); } break; + case 0x8E: + INST_NAME("MOV Seg, Ew"); + nextop = F8; + u8 = (nextop & 0x38) >> 3; + if ((nextop & 0xC0) == 0xC0) { + ed = TO_NAT((nextop & 7) + (rex.b << 3)); + } else { + SMREAD(); + addr = geted(dyn, addr, ninst, nextop, &wback, x2, x1, &fixedaddress, rex, NULL, 1, 0); + LHU(x1, wback, fixedaddress); + ed = x1; + } + SH(ed, xEmu, offsetof(x64emu_t, segs[u8])); + SH(xZR, xEmu, offsetof(x64emu_t, segs_serial[u8])); + break; case 0x90: case 0x91: case 0x92: -- cgit 1.4.1