From faaeffbd387623f9312613d6e45ff4fc6020ba72 Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Wed, 29 Nov 2023 02:39:24 +0800 Subject: [DYNAREC_RV64] Added more opcodes for flatout.exe (#1099) * [DYNAREC_RV64] Added 66 AD LODSW opcode * [DYNAREC_RV64] Added AD LODSD opcode * [DYNAREC_RV64] Added AC LODSB opcode --- src/dynarec/rv64/dynarec_rv64_00_0.c | 2 +- src/dynarec/rv64/dynarec_rv64_00_2.c | 22 ++++++++++++++++++++++ src/dynarec/rv64/dynarec_rv64_66.c | 14 +++++++++++++- src/dynarec/rv64/dynarec_rv64_f0.c | 2 +- 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/dynarec/rv64/dynarec_rv64_00_0.c b/src/dynarec/rv64/dynarec_rv64_00_0.c index 4971849c..8674eca1 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_0.c +++ b/src/dynarec/rv64/dynarec_rv64_00_0.c @@ -213,7 +213,7 @@ uintptr_t dynarec64_00_0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int u8 = F8; ANDI(x1, xRAX, 0xff); emit_adc8c(dyn, ninst, x1, u8, x3, x4, x5, x6); - ANDI(xRAX, xRAX, -256); + ANDI(xRAX, xRAX, ~0xff); OR(xRAX, xRAX, x1); break; case 0x15: diff --git a/src/dynarec/rv64/dynarec_rv64_00_2.c b/src/dynarec/rv64/dynarec_rv64_00_2.c index 11c24bc8..998795e3 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_2.c +++ b/src/dynarec/rv64/dynarec_rv64_00_2.c @@ -709,6 +709,28 @@ uintptr_t dynarec64_00_2(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ADD(xRDI, xRDI, x3); } break; + case 0xAC: + if (rep) { + DEFAULT; + } else { + INST_NAME("LODSB"); + GETDIR(x1, x2, 1); + LBU(x2, xRSI, 0); + ADD(xRSI, xRSI, x1); + ANDI(xRAX, xRAX, ~0xff); + OR(xRAX, xRAX, x2); + } + break; + case 0xAD: + if (rep) { + DEFAULT; + } else { + INST_NAME("LODSD"); + GETDIR(x1, x2, rex.w ? 8 : 4); + LDxw(xRAX, xRSI, 0); + ADD(xRSI, xRSI, x1); + } + break; case 0xAE: switch (rep) { case 1: diff --git a/src/dynarec/rv64/dynarec_rv64_66.c b/src/dynarec/rv64/dynarec_rv64_66.c index b4e7ad3e..6e13c867 100644 --- a/src/dynarec/rv64/dynarec_rv64_66.c +++ b/src/dynarec/rv64/dynarec_rv64_66.c @@ -685,7 +685,19 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni ADD(xRDI, xRDI, x3); } break; - + case 0xAD: + if (rep) { + DEFAULT; + } else { + INST_NAME("LODSW"); + GETDIR(x1, x2, 2); + LHU(x2, xRSI, 0); + ADD(xRSI, xRSI, x1); + LUI(x1, 0xffff0); + AND(xRAX, xRAX, x1); + OR(xRAX, xRAX, x2); + } + break; case 0xAF: switch (rep) { case 1: diff --git a/src/dynarec/rv64/dynarec_rv64_f0.c b/src/dynarec/rv64/dynarec_rv64_f0.c index bb5c78c5..c4373c44 100644 --- a/src/dynarec/rv64/dynarec_rv64_f0.c +++ b/src/dynarec/rv64/dynarec_rv64_f0.c @@ -371,7 +371,7 @@ uintptr_t dynarec64_F0(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni MARKLOCK; LR_W(x5, wback, 1, 1); ANDI(x4, x5, 0xff); // x4 = Ed.b[0] - ANDI(x5, x5, -256); // x5 = clear Ed.b[0] + ANDI(x5, x5, ~0xff); // x5 = clear Ed.b[0] ADDW(x6, x4, x2); ANDI(x9, xFlags, 1 << F_CF); ADDW(x6, x6, x9); // x6 = adc -- cgit 1.4.1