about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorphorcys <phorcys@126.com>2025-04-04 01:13:12 +0800
committerGitHub <noreply@github.com>2025-04-03 19:13:12 +0200
commit8da0fab6749c7a9191d07aa83e9d745d8a89d0bc (patch)
treedb916682aaf196cf781a858d50463ac47ad61644 /src
parentfb955a39752a82c219fa401415892bd4facb5845 (diff)
downloadbox64-8da0fab6749c7a9191d07aa83e9d745d8a89d0bc.tar.gz
box64-8da0fab6749c7a9191d07aa83e9d745d8a89d0bc.zip
[LA64_DYNAREC] Optimize la64 MAXPD/MAXPS. (#2499)
Co-authored-by: phorcys <phorcys02@126.com>
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/la64/dynarec_la64_0f.c6
-rw-r--r--src/dynarec/la64/dynarec_la64_660f.c6
2 files changed, 4 insertions, 8 deletions
diff --git a/src/dynarec/la64/dynarec_la64_0f.c b/src/dynarec/la64/dynarec_la64_0f.c
index cdaef719..4d0ea75e 100644
--- a/src/dynarec/la64/dynarec_la64_0f.c
+++ b/src/dynarec/la64/dynarec_la64_0f.c
@@ -686,10 +686,8 @@ uintptr_t dynarec64_0F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni
             if (!BOX64ENV(dynarec_fastnan) && v0 != v1) {
                 q0 = fpu_get_scratch(dyn);
                 q1 = fpu_get_scratch(dyn);
-                VFCMP_S(q0, v1, v0, cUEQ); // un eq , if either v0/v1=nan ,choose v1. if eq either is ok,but when +0.0 == -0.0 x86 sse choose v1
-                VFCMP_S(q1, v0, v1, cLT);
-                VOR_V(q0, q0, q1);
-                VBITSEL_V(v0, v0, v1, q0);
+                VFCMP_S(q0, v1, v0, cLT);  // ~cLT = un ge eq, if either v0/v1=nan ,choose v1. if eq either is ok,but when +0.0 == -0.0 x86 sse choose v1
+                VBITSEL_V(v0, v1, v0, q0); // swap v0 v1 => v1 v0 for ~cLT
             } else {
                 VFMAX_S(v0, v0, v1);
             }
diff --git a/src/dynarec/la64/dynarec_la64_660f.c b/src/dynarec/la64/dynarec_la64_660f.c
index c32abbc0..8fe3981a 100644
--- a/src/dynarec/la64/dynarec_la64_660f.c
+++ b/src/dynarec/la64/dynarec_la64_660f.c
@@ -1388,10 +1388,8 @@ uintptr_t dynarec64_660F(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int
             if (!BOX64ENV(dynarec_fastnan) && v0 != v1) {
                 q0 = fpu_get_scratch(dyn);
                 q1 = fpu_get_scratch(dyn);
-                VFCMP_D(q0, v1, v0, cUEQ); // un eq , if either v0/v1=nan ,choose v1. if eq either is ok,but when +0.0 == -0.0 x86 sse choose v1
-                VFCMP_D(q1, v0, v1, cLT);
-                VOR_V(q0, q0, q1);
-                VBITSEL_V(v0, v0, v1, q0);
+                VFCMP_D(q0, v1, v0, cLT);  // ~cLT = un ge eq, if either v0/v1=nan ,choose v1. if eq either is ok,but when +0.0 == -0.0 x86 sse choose v1
+                VBITSEL_V(v0, v1, v0, q0); // swap v0 v1 => v1 v0 for ~cLT
             } else {
                 VFMAX_D(v0, v0, v1);
             }