diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-04-01 17:22:02 +0000 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-04-01 17:22:02 +0000 |
| commit | f810fa262d48108e107604ce38c78ee0ae4e8961 (patch) | |
| tree | 7f53a0e938c96ccabefa1d3753ef6252fbdd1897 /src | |
| parent | a847f46edcde2bb1da714284506025de1542f2ec (diff) | |
| download | box64-f810fa262d48108e107604ce38c78ee0ae4e8961.tar.gz box64-f810fa262d48108e107604ce38c78ee0ae4e8961.zip | |
[RV64_DYNAREC] Some more fixes to float operations (fixes regression in WorldOfGoo)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_0f.c | 4 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_660f.c | 4 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_df.c | 1 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.c | 6 |
4 files changed, 10 insertions, 5 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_0f.c b/src/dynarec/rv64/dynarec_rv64_0f.c index d373bab1..f080581d 100644 --- a/src/dynarec/rv64/dynarec_rv64_0f.c +++ b/src/dynarec/rv64/dynarec_rv64_0f.c @@ -220,6 +220,7 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 0x2F: if(opcode==0x2F) {INST_NAME("COMISS Gx, Ex");} else {INST_NAME("UCOMISS Gx, Ex");} SETFLAGS(X_ALL, SF_SET); + SET_DFNONE(); nextop = F8; GETGXSS(d0); GETEXSS(v0, 0); @@ -229,8 +230,7 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni FEQS(x3, d0, d0); FEQS(x2, v0, v0); AND(x2, x2, x3); - XORI(x2, x2, 1); - BEQ_MARK(x2, xZR); + BNE_MARK(x2, xZR); ORI(xFlags, xFlags, (1<<F_ZF) | (1<<F_PF) | (1<<F_CF)); B_NEXT_nocond; } diff --git a/src/dynarec/rv64/dynarec_rv64_660f.c b/src/dynarec/rv64/dynarec_rv64_660f.c index 44da6083..3e084330 100644 --- a/src/dynarec/rv64/dynarec_rv64_660f.c +++ b/src/dynarec/rv64/dynarec_rv64_660f.c @@ -91,6 +91,7 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int case 0x2F: if(opcode==0x2F) {INST_NAME("COMISD Gx, Ex");} else {INST_NAME("UCOMISD Gx, Ex");} SETFLAGS(X_ALL, SF_SET); + SET_DFNONE(); nextop = F8; GETGXSD(d0); GETEXSD(v0, 0); @@ -100,8 +101,7 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int FEQD(x3, d0, d0); FEQD(x2, v0, v0); AND(x2, x2, x3); - XORI(x2, x2, 1); - BEQ_MARK(x2, xZR); + BNE_MARK(x2, xZR); ORI(xFlags, xFlags, (1<<F_ZF) | (1<<F_PF) | (1<<F_CF)); B_NEXT_nocond; } diff --git a/src/dynarec/rv64/dynarec_rv64_df.c b/src/dynarec/rv64/dynarec_rv64_df.c index 9c063df0..9eb96ad1 100644 --- a/src/dynarec/rv64/dynarec_rv64_df.c +++ b/src/dynarec/rv64/dynarec_rv64_df.c @@ -51,6 +51,7 @@ uintptr_t dynarec64_DF(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni case 0xF0 ... 0xF7: INST_NAME("FCOMIP ST0, STx"); SETFLAGS(X_ALL, SF_SET); + SET_DFNONE(); 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)); CLEAR_FLAGS(); diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c index e164e497..211e49cd 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.c +++ b/src/dynarec/rv64/dynarec_rv64_helper.c @@ -1134,8 +1134,12 @@ int sse_get_reg(dynarec_rv64_t* dyn, int ninst, int s1, int a, int single) 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) { + // 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); + } dyn->e.ssecache[a].single = single; - dyn->e.extcache[dyn->e.ssecache[a].reg].t = single?EXT_CACHE_SS:EXT_CACHE_SD; + dyn->e.extcache[EXTIDX(dyn->e.ssecache[a].reg)].t = single?EXT_CACHE_SS:EXT_CACHE_SD; return dyn->e.ssecache[a].reg; } dyn->e.ssecache[a].reg = fpu_get_reg_xmm(dyn, single?EXT_CACHE_SS:EXT_CACHE_SD, a); |