From ce5e561cf3cfec47521a2b9f9a0c3ab7df4cd8ec Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Wed, 29 Nov 2023 22:50:43 +0800 Subject: [DYNAREC_RV64] Added more opcodes for flatout.exe (#1100) * [DYNAREC_RV64] Added DA E9 FUCOMPP opcode * [DYNAREC_RV64] Added 66 0F B6 MOVZX opcode * [DYNAREC_RV64] Added 0F E7 MOVNTQ opcode * [DYNAREC_RV64] Added D8 /3 FCOMP opcode * [DYANREC_RV64] Added D8 /2 FCOM opcode * typo * x2 is for ed --- src/dynarec/arm64/dynarec_arm64_660f.c | 2 +- src/dynarec/rv64/dynarec_rv64_0f.c | 12 ++++++ src/dynarec/rv64/dynarec_rv64_660f.c | 27 +++++++++++++- src/dynarec/rv64/dynarec_rv64_d8.c | 68 +++++++++++++++------------------- src/dynarec/rv64/dynarec_rv64_da.c | 12 +++++- src/dynarec/rv64/dynarec_rv64_dc.c | 24 +----------- src/dynarec/rv64/dynarec_rv64_helper.h | 27 ++++++++++++++ 7 files changed, 107 insertions(+), 65 deletions(-) diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c index 57ebe1f7..e9c5d466 100644 --- a/src/dynarec/arm64/dynarec_arm64_660f.c +++ b/src/dynarec/arm64/dynarec_arm64_660f.c @@ -2287,7 +2287,7 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n if(MODREG) { if(rex.rex) { eb1 = xRAX+(nextop&7)+(rex.b<<3); - eb2 = 0; \ + eb2 = 0; } else { ed = (nextop&7); eb1 = xRAX+(ed&3); // Ax, Cx, Dx or Bx diff --git a/src/dynarec/rv64/dynarec_rv64_0f.c b/src/dynarec/rv64/dynarec_rv64_0f.c index 0123927c..360cd9dd 100644 --- a/src/dynarec/rv64/dynarec_rv64_0f.c +++ b/src/dynarec/rv64/dynarec_rv64_0f.c @@ -1599,6 +1599,18 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni SH(x3, gback, gdoffset + 2 * i); } break; + case 0xE7: + INST_NAME("MOVNTQ Em, Gm"); + nextop = F8; + gd = (nextop & 0x38) >> 3; + if (MODREG) { + DEFAULT; + } else { + v0 = mmx_get_reg(dyn, ninst, x1, x2, x3, gd); + addr = geted(dyn, addr, ninst, nextop, &ed, x2, x1, &fixedaddress, rex, NULL, 1, 0); + FSD(v0, ed, fixedaddress); + } + break; case 0xED: INST_NAME("PADDSW Gm,Em"); nextop = F8; diff --git a/src/dynarec/rv64/dynarec_rv64_660f.c b/src/dynarec/rv64/dynarec_rv64_660f.c index bfdbbaa5..f7953c56 100644 --- a/src/dynarec/rv64/dynarec_rv64_660f.c +++ b/src/dynarec/rv64/dynarec_rv64_660f.c @@ -2014,7 +2014,32 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ZEXTH(x2, x2); GWBACK; break; - + case 0xB6: + INST_NAME("MOVZX Gw, Eb"); + nextop = F8; + if (MODREG) { + if (rex.rex) { + eb1 = xRAX + (nextop & 7) + (rex.b << 3); + eb2 = 0; + } else { + ed = (nextop & 7); + eb1 = xRAX + (ed & 3); // Ax, Cx, Dx or Bx + eb2 = (ed & 4) >> 2; // L or H + } + if (eb2) { + SRLI(x1, eb1, 8); + eb1 = x1; + } + ANDI(x1, eb1, 0xff); + } else { + SMREAD(); + addr = geted(dyn, addr, ninst, nextop, &ed, x2, x4, &fixedaddress, rex, NULL, 1, 0); + LBU(x1, ed, fixedaddress); + } + LUI(x5, 0xffff0); + AND(gd, gd, x5); + OR(gd, gd, x1); + break; case 0xBE: INST_NAME("MOVSX Gw, Eb"); nextop = F8; diff --git a/src/dynarec/rv64/dynarec_rv64_d8.c b/src/dynarec/rv64/dynarec_rv64_d8.c index f72a7883..c9372ee7 100644 --- a/src/dynarec/rv64/dynarec_rv64_d8.c +++ b/src/dynarec/rv64/dynarec_rv64_d8.c @@ -54,47 +54,12 @@ uintptr_t dynarec64_D8(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 0xD8 ... 0xDF: INST_NAME("FCOMP ST0, STx"); v1 = x87_get_st(dyn, ninst, x1, x2, 0, X87_COMBINE(0, nextop&7)); - v2 = x87_get_st(dyn, ninst, x1, x2, nextop&7, X87_COMBINE(0, nextop&7)); - LHU(x3, xEmu, offsetof(x64emu_t, sw)); - MOV32w(x1, 0b1011100011111111); // mask off c0,c1,c2,c3 - AND(x3, x3, x1); + v2 = x87_get_st(dyn, ninst, x1, x2, nextop & 7, X87_COMBINE(0, nextop & 7)); if(ST_IS_F(0)) { - FEQS(x5, v1, v1); - FEQS(x4, v2, v2); - AND(x5, x5, x4); - BEQZ(x5, 24); // undefined/NaN - FEQS(x5, v1, v2); - BNEZ(x5, 28); // equal - FLTS(x2, v1, v2); // x2 = (v1