about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-04-01 17:22:02 +0000
committerptitSeb <sebastien.chev@gmail.com>2023-04-01 17:22:02 +0000
commitf810fa262d48108e107604ce38c78ee0ae4e8961 (patch)
tree7f53a0e938c96ccabefa1d3753ef6252fbdd1897 /src
parenta847f46edcde2bb1da714284506025de1542f2ec (diff)
downloadbox64-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.c4
-rw-r--r--src/dynarec/rv64/dynarec_rv64_660f.c4
-rw-r--r--src/dynarec/rv64/dynarec_rv64_df.c1
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.c6
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);