diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2023-11-29 02:39:24 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-11-28 19:39:24 +0100 |
| commit | faaeffbd387623f9312613d6e45ff4fc6020ba72 (patch) | |
| tree | d2c7ca5219a0c5014a09bf530f3c597c816425fb | |
| parent | a070066b715bd0185b4a06fe684868803d921567 (diff) | |
| download | box64-faaeffbd387623f9312613d6e45ff4fc6020ba72.tar.gz box64-faaeffbd387623f9312613d6e45ff4fc6020ba72.zip | |
[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
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00_0.c | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00_2.c | 22 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_66.c | 14 | ||||
| -rw-r--r-- | 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 |