about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-03-26 18:29:53 +0100
committerptitSeb <sebastien.chev@gmail.com>2025-03-26 18:29:53 +0100
commit443fe043e4aeea3f3c17e0dd6f79f56e4d172721 (patch)
tree8851aaeed1a1f91637466ca057b4bbbf553eb4ef /src
parent6d9560870d6976d9aa84c693af29286627f4a062 (diff)
downloadbox64-443fe043e4aeea3f3c17e0dd6f79f56e4d172721.tar.gz
box64-443fe043e4aeea3f3c17e0dd6f79f56e4d172721.zip
[ARM64_DYNAREC] Added fastnan=0 path for HSUBPS opcode
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_f20f.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_f20f.c b/src/dynarec/arm64/dynarec_arm64_f20f.c
index b4bdc963..b8682735 100644
--- a/src/dynarec/arm64/dynarec_arm64_f20f.c
+++ b/src/dynarec/arm64/dynarec_arm64_f20f.c
@@ -433,7 +433,20 @@ uintptr_t dynarec64_F20F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n
             d0 = fpu_get_scratch(dyn, ninst);

             VUZP1Q_32(d0, v0, v1);

             VUZP2Q_32(v0, v0, v1);

+            if(!BOX64ENV(dynarec_fastnan)) {

+                d1 = fpu_get_scratch(dyn, ninst);

+                // check if any input value was NAN

+                // but need to mix low/high part

+                VFMAXQS(d1, v0, d0);    // propagate NAN

+                VFCMEQQS(d1, d1, d1);    // 0 if NAN, 1 if not NAN

+            }

             VFSUBQS(v0, d0, v0);

+            if(!BOX64ENV(dynarec_fastnan)) {

+                VFCMEQQS(d0, v0, v0);    // 0 => out is NAN

+                VBICQ(d1, d1, d0);      // forget it in any input was a NAN already

+                VSHLQ_32(d1, d1, 31);   // only keep the sign bit

+                VORRQ(v0, v0, d1);      // NAN -> -NAN

+            }

             break;

 

         #define GO(GETFLAGS, NO, YES, F)   \