]> git.proxmox.com Git - qemu.git/commitdiff
softfloat: Correctly handle NaNs in float16_to_float32()
authorPeter Maydell <peter.maydell@linaro.org>
Thu, 10 Feb 2011 11:28:59 +0000 (11:28 +0000)
committerAurelien Jarno <aurelien@aurel32.net>
Thu, 10 Feb 2011 17:28:29 +0000 (18:28 +0100)
Correctly handle NaNs in float16_to_float32(), by defining and
using a float16ToCommonNaN() function, as we do with the other formats.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
fpu/softfloat-specialize.h
fpu/softfloat.c

index 1c0b12b573d13d3e7ff943ad4da8ec178109452d..2d025bfa36fc5e7283a0d885b6a5884028ea8fce 100644 (file)
@@ -119,6 +119,23 @@ float16 float16_maybe_silence_nan(float16 a_)
     return a_;
 }
 
+/*----------------------------------------------------------------------------
+| Returns the result of converting the half-precision floating-point NaN
+| `a' to the canonical NaN format.  If `a' is a signaling NaN, the invalid
+| exception is raised.
+*----------------------------------------------------------------------------*/
+
+static commonNaNT float16ToCommonNaN( float16 a STATUS_PARAM )
+{
+    commonNaNT z;
+
+    if ( float16_is_signaling_nan( a ) ) float_raise( float_flag_invalid STATUS_VAR );
+    z.sign = float16_val(a) >> 15;
+    z.low = 0;
+    z.high = ((bits64) float16_val(a))<<54;
+    return z;
+}
+
 /*----------------------------------------------------------------------------
 | Returns the result of converting the canonical NaN `a' to the half-
 | precision floating-point format.
index 80d8cc489454bab39bfeb6e57793e678946c477e..3abd1708e47b35db3863e9ac50dae66400908c30 100644 (file)
@@ -2761,9 +2761,7 @@ float32 float16_to_float32(float16 a, flag ieee STATUS_PARAM)
 
     if (aExp == 0x1f && ieee) {
         if (aSig) {
-            /* Make sure correct exceptions are raised.  */
-            float32ToCommonNaN(a STATUS_VAR);
-            aSig |= 0x200;
+            return commonNaNToFloat32(float16ToCommonNaN(a STATUS_VAR) STATUS_VAR);
         }
         return packFloat32(aSign, 0xff, aSig << 13);
     }