From f5fadea30e6d71046293f382d98f9f570bd31321 Mon Sep 17 00:00:00 2001 From: xctan Date: Fri, 28 Jul 2023 17:31:46 +0000 Subject: [RV64_DYNAREC] Added more opcodes for Yuzu (#911) * [RV64_DYNAREC] Fixed PTEST opcode * [RV64_DYNAREC] Added 64 66 89 MOV opcode * [RV64_DYNAREC] Added 66 87 XCHG opcode --- src/dynarec/rv64/dynarec_rv64_66.c | 61 ++++++++++++++++++++++++++++++++++++ src/dynarec/rv64/dynarec_rv64_660f.c | 2 +- src/dynarec/rv64/dynarec_rv64_6664.c | 30 +++++++++++++++++- 3 files changed, 91 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/dynarec/rv64/dynarec_rv64_66.c b/src/dynarec/rv64/dynarec_rv64_66.c index 49a7ef65..66a9f1c1 100644 --- a/src/dynarec/rv64/dynarec_rv64_66.c +++ b/src/dynarec/rv64/dynarec_rv64_66.c @@ -427,6 +427,67 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni GETGW(x2); emit_test16(dyn, ninst, x1, x2, x3, x4, x5); break; + case 0x87: + INST_NAME("(LOCK)XCHG Ew, Gw"); + nextop = F8; + if(MODREG) { + GETGD; + GETED(0); + ADDI(x1, gd, 0); + LUI(x3, 0xffff0); + AND(gd, gd, x3); + ZEXTH(x4, ed); + OR(gd, gd, x4); + AND(ed, ed, x3); + ZEXTH(x4, x1); + OR(ed, ed, x4); + } else { + GETGD; + addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, LOCK_LOCK, 0, 0); + SMDMB(); + + ANDI(x3, ed, 1); + BNEZ_MARK(x3); + + ANDI(x3, ed, 0b10); + LUI(x5, 0xffff0); + ZEXTH(x6, gd); + BNEZ_MARK3(x3); + + MARKLOCK; + LR_W(x1, ed, 1, 0); + AND(x3, x1, x5); + OR(x3, x3, x6); + SC_W(x3, x3, ed, 0, 1); + BNEZ_MARKLOCK(x3); + ZEXTH(x1, x1); + B_MARK2_nocond; + + MARK3; + NOT(x5, x5); + SLLI(x5, x5, 16); + SLLI(x6, x6, 16); + NOT(x5, x5); + LR_W(x1, ed, 1, 0); + AND(x3, x1, x5); + OR(x3, x3, x6); + SC_W(x3, x3, ed, 0, 1); + BNEZ(x3, -4 * 4); + SRLI(x1, x1, 16); + ZEXTH(x1, x1); + B_MARK2_nocond; + + MARK; + LHU(x1, ed, 0); + SH(gd, ed, 0); + + MARK2; + SMDMB(); + LUI(x5, 0xffff0); + AND(gd, gd, x5); + OR(gd, gd, x1); + } + break; case 0x89: INST_NAME("MOV Ew, Gw"); nextop = F8; diff --git a/src/dynarec/rv64/dynarec_rv64_660f.c b/src/dynarec/rv64/dynarec_rv64_660f.c index 3f51289e..86bf0dbe 100644 --- a/src/dynarec/rv64/dynarec_rv64_660f.c +++ b/src/dynarec/rv64/dynarec_rv64_660f.c @@ -411,7 +411,7 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int AND(x4, x4, x6); OR(x3, x3, x4); BNEZ(x3, 8); - ORI(xFlags, xFlags, 1<