about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2023-04-09 14:41:36 +0800
committerGitHub <noreply@github.com>2023-04-09 08:41:36 +0200
commit24f2720df43c4570ab9d344a688e0a36d0a8fa88 (patch)
tree04e3028d83969421887e29468106f46b416b9144 /src
parentd9c30c8942888d609d89df5b8ea29071d2663b46 (diff)
downloadbox64-24f2720df43c4570ab9d344a688e0a36d0a8fa88.tar.gz
box64-24f2720df43c4570ab9d344a688e0a36d0a8fa88.zip
[TESTS] Disable compiler optimizations for test17 and some related fixes (#677)
* [TESTS] Disable compiler optimizations for test17

* [INTERP] Fixed MAXSD/MINSD when both sources are 0

* [RV64_DYNAREC] Fixed F2 0F 5D MINSD opcode
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/rv64/dynarec_rv64_f20f.c8
-rw-r--r--src/emu/x64runf20f.c4
2 files changed, 11 insertions, 1 deletions
diff --git a/src/dynarec/rv64/dynarec_rv64_f20f.c b/src/dynarec/rv64/dynarec_rv64_f20f.c
index 6cb62e3c..2a8089a1 100644
--- a/src/dynarec/rv64/dynarec_rv64_f20f.c
+++ b/src/dynarec/rv64/dynarec_rv64_f20f.c
@@ -161,7 +161,13 @@ uintptr_t dynarec64_F20F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int
             INST_NAME("MINSD Gx, Ex");
             nextop = F8;
             GETGXSD(v0);
-            GETEXSD(v1, 0);        
+            GETEXSD(v1, 0);
+            d0 = sse_get_reg_empty(dyn, ninst, x1, x4, 0);
+            FMVDX(d0, xZR);
+            FEQD(x2, v0, d0);
+            FEQD(x3, v1, d0);
+            AND(x2, x2, x3);
+            BNE_MARK(x2, xZR);
             FEQD(x2, v0, v0);
             FEQD(x3, v1, v1);
             AND(x2, x2, x3);
diff --git a/src/emu/x64runf20f.c b/src/emu/x64runf20f.c
index 10da2f09..33750318 100644
--- a/src/emu/x64runf20f.c
+++ b/src/emu/x64runf20f.c
@@ -205,6 +205,8 @@ uintptr_t RunF20F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
         nextop = F8;

         GETEX(0);

         GETGX;

+        if (GX->d[0] == 0.0 && EX->d[0]  == 0.0)

+            GX->d[0] = EX->d[0];

         if (isnan(GX->d[0]) || isnan(EX->d[0]) || isless(EX->d[0], GX->d[0]))

             GX->d[0] = EX->d[0];

         break;

@@ -225,6 +227,8 @@ uintptr_t RunF20F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
         nextop = F8;

         GETEX(0);

         GETGX;

+        if (GX->d[0] == 0.0 && EX->d[0]  == 0.0)

+            GX->d[0] = EX->d[0];

         if (isnan(GX->d[0]) || isnan(EX->d[0]) || isgreater(EX->d[0], GX->d[0]))

             GX->d[0] = EX->d[0];

         break;