From 275550a9c387a69a6d5b2e5824577d3e2e25df57 Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Fri, 31 Mar 2023 14:16:33 +0800 Subject: [RV64_DYNAREC] Added more SS opcodes (#654) * [RV64_DYNAREC] Added F3 0F 5E DIVSS opcode * [RV64_DYNAREC] Small optim for 0F 2E,2F COMISS opcode * [RV64_DYNAREC] Added F3 0F C2 CMPSS opcode * [RV64_DYNAREC] Added 9C PUSHF opcode --- src/dynarec/rv64/dynarec_rv64_00.c | 5 ++++ src/dynarec/rv64/dynarec_rv64_0f.c | 18 ++++++------ src/dynarec/rv64/dynarec_rv64_f30f.c | 53 +++++++++++++++++++++++++++++++++++- 3 files changed, 65 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/dynarec/rv64/dynarec_rv64_00.c b/src/dynarec/rv64/dynarec_rv64_00.c index 61327703..4efb0a97 100644 --- a/src/dynarec/rv64/dynarec_rv64_00.c +++ b/src/dynarec/rv64/dynarec_rv64_00.c @@ -913,6 +913,11 @@ uintptr_t dynarec64_00(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni ZEROUP(xRDX); } break; + case 0x9C: + INST_NAME("PUSHF"); + READFLAGS(X_ALL); + PUSH1(xFlags); + break; case 0xA4: if(rep) { INST_NAME("REP MOVSB"); diff --git a/src/dynarec/rv64/dynarec_rv64_0f.c b/src/dynarec/rv64/dynarec_rv64_0f.c index 84d0b0a6..8198682b 100644 --- a/src/dynarec/rv64/dynarec_rv64_0f.c +++ b/src/dynarec/rv64/dynarec_rv64_0f.c @@ -206,13 +206,12 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni if(opcode==0x2F) {INST_NAME("COMISS Gx, Ex");} else {INST_NAME("UCOMISS Gx, Ex");} SETFLAGS(X_ALL, SF_SET); nextop = F8; - GETGX(x3); + GETGXSS(d0); GETEXSS(v0, 0); CLEAR_FLAGS(); - // if isnan(gd) || isnan(v0) + // if isnan(d0) || isnan(v0) IFX(X_ZF | X_PF | X_CF) { - FLW(gd, x3, 0); - FEQS(x3, gd, gd); + FEQS(x3, d0, d0); FEQS(x2, v0, v0); AND(x2, x2, x3); XORI(x2, x2, 1); @@ -221,21 +220,20 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni B_NEXT_nocond; } MARK; - // else if isless(gd, v0) + // else if isless(d0, v0) IFX(X_CF) { - FLTS(x2, gd, v0); + FLTS(x2, d0, v0); BEQ_MARK2(x2, xZR); ORI(xFlags, xFlags, 1<