diff options
| author | phorcys <phorcys@126.com> | 2025-04-04 01:13:12 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-03 19:13:12 +0200 |
| commit | 8da0fab6749c7a9191d07aa83e9d745d8a89d0bc (patch) | |
| tree | db916682aaf196cf781a858d50463ac47ad61644 /src | |
| parent | fb955a39752a82c219fa401415892bd4facb5845 (diff) | |
| download | box64-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.c | 6 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_660f.c | 6 |
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); } |