From 45450900aaa35e71d19eec7a1ecf39b8f5482be4 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sun, 7 May 2017 15:00:53 +0300 Subject: [PATCH] Softfloat fix. --- softfloat/softfloat-specialize.h | 14 ++++++++++---- softfloat/softfloat.cpp | 5 ++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/softfloat/softfloat-specialize.h b/softfloat/softfloat-specialize.h index 391e8a84..4dd65a20 100644 --- a/softfloat/softfloat-specialize.h +++ b/softfloat/softfloat-specialize.h @@ -303,8 +303,11 @@ static inline commonNaNT floatx80ToCommonNaN( floatx80 a, float_status *status ) static inline floatx80 commonNaNToFloatx80(commonNaNT a, float_status *status) { floatx80 z; +#ifdef SOFTFLOAT_68K + z.low = LIT64( 0x4000000000000000 ) | ( a.high>>1 ); +#else z.low = LIT64( 0xC000000000000000 ) | ( a.high>>1 ); - z.high = ( ( (int16_t) a.sign )<<15 ) | 0x7FFF; +#endif z.high = ( ( (int16_t) a.sign )<<15 ) | 0x7FFF; return z; } @@ -316,11 +319,13 @@ static inline floatx80 commonNaNToFloatx80(commonNaNT a, float_status *status) static inline floatx80 propagateFloatx80NaN( floatx80 a, floatx80 b, float_status *status ) { - flag aIsNaN, aIsSignalingNaN, bIsNaN, bIsSignalingNaN; + flag aIsNaN, aIsSignalingNaN, bIsSignalingNaN; +#ifndef SOFTFLOAT_68K + flag bIsNaN; +#endif - aIsNaN = floatx80_is_nan( a ); + aIsNaN = floatx80_is_nan( a ); aIsSignalingNaN = floatx80_is_signaling_nan( a ); - bIsNaN = floatx80_is_nan( b ); bIsSignalingNaN = floatx80_is_signaling_nan( b ); #ifdef SOFTFLOAT_68K a.low |= LIT64( 0x4000000000000000 ); @@ -328,6 +333,7 @@ static inline floatx80 propagateFloatx80NaN( floatx80 a, floatx80 b, float_statu if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_signaling, status ); return aIsNaN ? a : b; #else + bIsNaN = floatx80_is_nan( b ); a.low |= LIT64( 0xC000000000000000 ); b.low |= LIT64( 0xC000000000000000 ); if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_signaling, status ); diff --git a/softfloat/softfloat.cpp b/softfloat/softfloat.cpp index ed717cad..ae7b9d84 100644 --- a/softfloat/softfloat.cpp +++ b/softfloat/softfloat.cpp @@ -1679,7 +1679,6 @@ floatx80 float32_to_floatx80_allowunnormal(float32 a , float_status *status) aExp = extractFloat32Exp(a); aSign = extractFloat32Sign(a); if (aExp == 0xFF) { - aSig |= 0x00800000; return packFloatx80( aSign, 0x7FFF, ( (uint64_t) aSig )<<40 ); } if (aExp == 0) { @@ -1733,11 +1732,11 @@ floatx80 float64_to_floatx80_allowunnormal( float64 a, float_status *status ) aExp = extractFloat64Exp( a ); aSign = extractFloat64Sign( a ); if ( aExp == 0x7FF ) { - return packFloatx80( aSign, 0x7FFF, ( aSig | LIT64( 0x0010000000000000 ) )<<11 ); + return packFloatx80( aSign, 0x7FFF, aSig<<11 ); } if ( aExp == 0 ) { if ( aSig == 0 ) return packFloatx80( aSign, 0, 0 ); - return packFloatx80( aSign, 0x3C01, aSig<<11); + return packFloatx80( aSign, 0x3C01, aSig<<11 ); } return packFloatx80( -- 2.47.3