about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-05-02 09:13:21 +0000
committerptitSeb <sebastien.chev@gmail.com>2023-05-02 09:13:21 +0000
commit45a4fc34d1e37a6cb931e5181d9834c5bb1cb4fd (patch)
treebf360c93443d5ef09c6a7ca23f37e3c801b4b8fc /src
parentdc6562745346fdcb5d57e22f1d87677e47c89cc9 (diff)
downloadbox64-45a4fc34d1e37a6cb931e5181d9834c5bb1cb4fd.tar.gz
box64-45a4fc34d1e37a6cb931e5181d9834c5bb1cb4fd.zip
[RV64_DYNAREC] Improved 66 0F 3A 0B opcode
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_660f.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_660f.c b/src/dynarec/rv64/dynarec_rv64_660f.c
index ee89c010..ed0ab0f8 100644
--- a/src/dynarec/rv64/dynarec_rv64_660f.c
+++ b/src/dynarec/rv64/dynarec_rv64_660f.c
@@ -349,27 +349,28 @@ uintptr_t dynarec64_660F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
                     GETEXSD(d0, 0);
                     GETGXSD_empty(v0);
                     d1 = fpu_get_scratch(dyn);
+                    v1 = fpu_get_scratch(dyn);
                     u8 = F8;
                     FEQD(x2, d0, d0);
                     BNEZ_MARK(x2);
-                    FADDD(v0, d0, d0);
+                    if (v0!=d0) FMVD(v0, d0);
                     B_NEXT_nocond;
                     MARK; // d0 is not nan
-                    FABSD(v0, d0);
+                    FABSD(v1, d0);
                     MOV64x(x3, 1ULL << __DBL_MANT_DIG__);
                     FCVTDL(d1, x3, RD_RTZ);
-                    FLTD(x3, v0, d1);
+                    FLTD(x3, v1, d1);
                     BNEZ_MARK2(x3);
                     if (v0!=d0) FMVD(v0, d0);
                     B_NEXT_nocond;
                     MARK2;
                     if(u8&4) {
                         u8 = sse_setround(dyn, ninst, x4, x2);
-                        FCVTLD(x5, d0, RD_DYN);
+                        FCVTLD(x5, v1, RD_DYN);
                         FCVTDL(v0, x5, RD_DYN);
                         x87_restoreround(dyn, ninst, u8);
                     } else {
-                        FCVTLD(x5, d0, round_round[u8&3]);
+                        FCVTLD(x5, v1, round_round[u8&3]);
                         FCVTDL(v0, x5, round_round[u8&3]);
                     }
                     FSGNJD(v0, v0, d0);