diff options
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00_1.c | 4 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00_3.c | 1 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_emit_tests.c | 4 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.c | 4 |
4 files changed, 9 insertions, 4 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_00_1.c b/src/dynarec/rv64/dynarec_rv64_00_1.c index f15ef4d7..e30c75bd 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_1.c +++ b/src/dynarec/rv64/dynarec_rv64_00_1.c @@ -165,11 +165,11 @@ uintptr_t dynarec64_00_1(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int PUSH1(x3); break; case 0x6B: - INST_NAME("IMUL Gd, Ed, Id"); + INST_NAME("IMUL Gd, Ed, Ib"); SETFLAGS(X_ALL, SF_PENDING); nextop = F8; GETGD; - GETED(4); + GETED(1); i64 = F8S; MOV64xw(x4, i64); if(rex.w) { diff --git a/src/dynarec/rv64/dynarec_rv64_00_3.c b/src/dynarec/rv64/dynarec_rv64_00_3.c index 2b25db74..70e73582 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_3.c +++ b/src/dynarec/rv64/dynarec_rv64_00_3.c @@ -148,6 +148,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int u8 = (F8)&(rex.w?0x3f:0x1f); emit_ror32c(dyn, ninst, rex, ed, u8, x3, x4); if(u8) { WBACK; } + if(!wback && !rex.w) ZEROUP(ed); break; case 4: case 6: diff --git a/src/dynarec/rv64/dynarec_rv64_emit_tests.c b/src/dynarec/rv64/dynarec_rv64_emit_tests.c index e60ff103..5d346059 100644 --- a/src/dynarec/rv64/dynarec_rv64_emit_tests.c +++ b/src/dynarec/rv64/dynarec_rv64_emit_tests.c @@ -297,8 +297,10 @@ void emit_test32(dynarec_rv64_t* dyn, int ninst, rex_t rex, int s1, int s2, int IFX_PENDOR0 { SDxw(s3, xEmu, offsetof(x64emu_t, res)); } - IFX(X_SF) { + IFX(X_SF|X_ZF) { if (!rex.w) ZEROUP(s3); + } + IFX(X_SF) { SRLI(s4, s3, rex.w?63:31); BEQZ(s4, 8); ORI(xFlags, xFlags, 1 << F_SF); diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c index 211e49cd..a5fe8bc1 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.c +++ b/src/dynarec/rv64/dynarec_rv64_helper.c @@ -1135,8 +1135,10 @@ int sse_get_reg_empty(dynarec_rv64_t* dyn, int ninst, int s1, int a, int single) { if(dyn->e.ssecache[a].v!=-1) { if(dyn->e.ssecache[a].single!=single && single) { + // writting back the double + FSD(dyn->e.ssecache[a].reg, xEmu, offsetof(x64emu_t, xmm[a])); // need to wipe the half high 32bits of old Double because we now have a single - SW(xZR, xEmu, offsetof(x64emu_t, xmm[a])+4); + //SW(xZR, xEmu, offsetof(x64emu_t, xmm[a])+4); } dyn->e.ssecache[a].single = single; dyn->e.extcache[EXTIDX(dyn->e.ssecache[a].reg)].t = single?EXT_CACHE_SS:EXT_CACHE_SD; |