From af1516a1466de474c7f8fb5f564219b9323e1c26 Mon Sep 17 00:00:00 2001
From: Merry <MerryMage@users.noreply.github.com>
Date: Sun, 8 Jul 2018 16:41:46 +0100
Subject: [PATCH] ASoftFloat: Fix InvSqrtEstimate for negative values (#233)

---
 ChocolArm64/Instruction/ASoftFloat.cs | 20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

diff --git a/ChocolArm64/Instruction/ASoftFloat.cs b/ChocolArm64/Instruction/ASoftFloat.cs
index 7bee69baea..1bd7166589 100644
--- a/ChocolArm64/Instruction/ASoftFloat.cs
+++ b/ChocolArm64/Instruction/ASoftFloat.cs
@@ -50,14 +50,8 @@ namespace ChocolArm64.Instruction
             long x_exp = (long)((x_bits >> 52) & 0x7FF);
             ulong scaled = x_bits & ((1ul << 52) - 1);
 
-            if (x_exp == 0x7ff)
+            if (x_exp == 0x7FF && scaled != 0)
             {
-                if (scaled == 0)
-                {
-                    // Infinity -> Zero
-                    return BitConverter.Int64BitsToDouble((long)x_sign);
-                }
-
                 // NaN
                 return BitConverter.Int64BitsToDouble((long)(x_bits | 0x0008000000000000));
             }
@@ -79,6 +73,18 @@ namespace ChocolArm64.Instruction
                 scaled <<= 1;
             }
 
+            if (x_sign != 0)
+            {
+                // Negative -> NaN
+                return BitConverter.Int64BitsToDouble((long)0x7ff8000000000000);
+            }
+
+            if (x_exp == 0x7ff && scaled == 0)
+            {
+                // Infinity -> Zero
+                return BitConverter.Int64BitsToDouble((long)x_sign);
+            }
+
             if (((ulong)x_exp & 1) == 1)
             {
                 scaled >>= 45;