about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-08-08 05:15:47 +0800
committerGitHub <noreply@github.com>2025-08-07 23:15:47 +0200
commitc59b9f2686190e7e0e8063929393928be952d299 (patch)
tree4fb884836ece3e7f0e09a33c87d72641e62d5ab3 /src
parent98431d8cf577dc00050b51103165c448cd9fea21 (diff)
downloadbox64-c59b9f2686190e7e0e8063929393928be952d299.tar.gz
box64-c59b9f2686190e7e0e8063929393928be952d299.zip
[LA64_DYNAREC] Refined F3 0F 5D/5F MINSS/MAXSS opcodes (#2912)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/la64/dynarec_la64_f30f.c34
1 files changed, 16 insertions, 18 deletions
diff --git a/src/dynarec/la64/dynarec_la64_f30f.c b/src/dynarec/la64/dynarec_la64_f30f.c
index daad35f4..0c113ddd 100644
--- a/src/dynarec/la64/dynarec_la64_f30f.c
+++ b/src/dynarec/la64/dynarec_la64_f30f.c
@@ -271,15 +271,14 @@ uintptr_t dynarec64_F30F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int
             nextop = F8;
             GETGX(d0, 1);
             GETEXSS(d1, 0, 0);
-            FCMP_S(fcc0, d0, d1, cUN);
-            BCNEZ_MARK(fcc0);
-            FCMP_S(fcc1, d1, d0, cLT);
-            BCEQZ_MARK2(fcc1);
-            MARK;
-            v1 = fpu_get_scratch(dyn);
-            FMOV_S(v1, d1);
-            VEXTRINS_W(d0, v1, 0);
-            MARK2;
+            q0 = fpu_get_scratch(dyn);
+            if (BOX64ENV(dynarec_fastnan)) {
+                FMIN_S(q0, d0, d1);
+            } else {
+                FCMP_S(fcc0, d1, d0, cULE);
+                FSEL(q0, d0, d1, fcc0);
+            }
+            VEXTRINS_W(d0, q0, 0);
             break;
         case 0x5E:
             INST_NAME("DIVSS Gx, Ex");
@@ -295,15 +294,14 @@ uintptr_t dynarec64_F30F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int
             nextop = F8;
             GETGX(d0, 1);
             GETEXSS(d1, 0, 0);
-            FCMP_S(fcc0, d0, d1, cUN);
-            BCNEZ_MARK(fcc0);
-            FCMP_S(fcc1, d0, d1, cLT);
-            BCEQZ_MARK2(fcc1);
-            MARK;
-            v1 = fpu_get_scratch(dyn);
-            FMOV_S(v1, d1);
-            VEXTRINS_W(d0, v1, 0);
-            MARK2;
+            q0 = fpu_get_scratch(dyn);
+            if (BOX64ENV(dynarec_fastnan)) {
+                FMAX_S(q0, d0, d1);
+            } else {
+                FCMP_S(fcc0, d1, d0, cLT);
+                FSEL(q0, d1, d0, fcc0);
+            }
+            VEXTRINS_W(d0, q0, 0);
             break;
         case 0x6F:
             INST_NAME("MOVDQU Gx, Ex");