about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-04-14 14:50:20 +0000
committerptitSeb <sebastien.chev@gmail.com>2023-04-14 14:50:20 +0000
commitf042fe4713f2c560ee64cbd180eec9747158e085 (patch)
tree9dd27436f0f578550afe166f259f0b5767ccca07
parent27f3ba941f32586160f55aa3f2082c864e78d5f2 (diff)
downloadbox64-f042fe4713f2c560ee64cbd180eec9747158e085.tar.gz
box64-f042fe4713f2c560ee64cbd180eec9747158e085.zip
[RV64_DYNAREC] Fixed C1/1 and 6B opcode, plus some slight adjustment to sse_get_reg_empty helper function
-rw-r--r--src/dynarec/rv64/dynarec_rv64_00_1.c4
-rw-r--r--src/dynarec/rv64/dynarec_rv64_00_3.c1
-rw-r--r--src/dynarec/rv64/dynarec_rv64_emit_tests.c4
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.c4
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;