diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2023-04-07 19:30:19 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-07 13:30:19 +0200 |
| commit | aa7ee8e65db1e07a875a882b0b43edf5b413152a (patch) | |
| tree | 4faabf31818da4e421c717a89d7801b87b5b2194 /src | |
| parent | 64a6a28c3090f87a2c666906bd25c5fca9a436d6 (diff) | |
| download | box64-aa7ee8e65db1e07a875a882b0b43edf5b413152a.tar.gz box64-aa7ee8e65db1e07a875a882b0b43edf5b413152a.zip | |
[RV64_DYNAREC] Added more opcodes for Stardew Valley and some fixes (#673)
* [RV64_DYNAREC] Added 66 0F D6 MOVQ opcode * [RV64_DYNAREC] Added 66 0F 56 ORPD opcode * [RV64_DYNAREC] Fixed emit_or32c * [RV64_DYNAREC] Added 0F BA /7 BTC opcode
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_0f.c | 18 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_660f.c | 19 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_emit_logic.c | 1 |
3 files changed, 38 insertions, 0 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_0f.c b/src/dynarec/rv64/dynarec_rv64_0f.c index ef988fd1..a1ef5734 100644 --- a/src/dynarec/rv64/dynarec_rv64_0f.c +++ b/src/dynarec/rv64/dynarec_rv64_0f.c @@ -521,6 +521,24 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni ANDI(xFlags, xFlags, ~1); OR(xFlags, xFlags, x3); break; + case 7: + INST_NAME("BTC Ed, Ib"); + SETFLAGS(X_CF, SF_SUBSET); + SET_DFNONE(); + GETED(1); + u8 = F8; + u8&=rex.w?0x3f:0x1f; + SRLIxw(x3, ed, u8); + ANDI(x3, x3, 1); // F_CF is 1 + ANDI(xFlags, xFlags, ~1); + OR(xFlags, xFlags, x3); + if (u8 <= 10) { + XORI(ed, ed, (1LL << u8)); + } else { + MOV64xw(x3, (1LL << u8)); + XOR(ed, ed, x3); + } + break; default: DEFAULT; } diff --git a/src/dynarec/rv64/dynarec_rv64_660f.c b/src/dynarec/rv64/dynarec_rv64_660f.c index 246371f1..0de4e4eb 100644 --- a/src/dynarec/rv64/dynarec_rv64_660f.c +++ b/src/dynarec/rv64/dynarec_rv64_660f.c @@ -141,6 +141,13 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int GETGX(x2); SSE_LOOP_Q(x3, x4, NOT(x3, x3); AND(x3, x3, x4)); break; + case 0x56: + INST_NAME("ORPD Gx, Ex"); + nextop = F8; + GETEX(x1, 0); + GETGX(x2); + SSE_LOOP_Q(x3, x4, OR(x3, x3, x4)); + break; case 0x57: INST_NAME("XORPD Gx, Ex"); nextop = F8; @@ -433,6 +440,18 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int GETEX(x2, 0); SSE_LOOP_Q(x3, x4, ADD(x3, x3, x4)); break; + case 0xD6: + INST_NAME("MOVQ Ex, Gx"); + nextop = F8; + GETGXSD(d0); + GETEX(x2, 0); + FSD(d0, wback, fixedaddress+0); + if (MODREG) { + SD(xZR, wback, fixedaddress+8); + } else { + SMWRITE2(); + } + break; case 0xDB: INST_NAME("PAND Gx,Ex"); nextop = F8; diff --git a/src/dynarec/rv64/dynarec_rv64_emit_logic.c b/src/dynarec/rv64/dynarec_rv64_emit_logic.c index 9ee739bb..693a15c1 100644 --- a/src/dynarec/rv64/dynarec_rv64_emit_logic.c +++ b/src/dynarec/rv64/dynarec_rv64_emit_logic.c @@ -269,6 +269,7 @@ void emit_or32c(dynarec_rv64_t* dyn, int ninst, rex_t rex, int s1, int64_t c, in // test sign bit before zeroup. IFX(X_SF) { + if (!rex.w) SEXT_W(s1, s1); BGE(s1, xZR, 8); ORI(xFlags, xFlags, 1 << F_SF); } |