From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:43201) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QCUOX-0008Ri-E9 for qemu-devel@nongnu.org; Wed, 20 Apr 2011 06:12:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QCUOW-0004R9-Dy for qemu-devel@nongnu.org; Wed, 20 Apr 2011 06:12:25 -0400 Received: from hall.aurel32.net ([88.191.126.93]:43734) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QCUOW-0004Qg-8P for qemu-devel@nongnu.org; Wed, 20 Apr 2011 06:12:24 -0400 From: Aurelien Jarno Date: Wed, 20 Apr 2011 12:11:50 +0200 Message-Id: <1303294329-22634-2-git-send-email-aurelien@aurel32.net> In-Reply-To: <1303294329-22634-1-git-send-email-aurelien@aurel32.net> References: <1303294329-22634-1-git-send-email-aurelien@aurel32.net> Subject: [Qemu-devel] [PATCH v2 01/20] softfloat: fix floatx80 handling of NaN List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Aurelien Jarno The floatx80 format uses an explicit bit that should be taken into account when converting to and from commonNaN format. When converting to commonNaN, the explicit bit should be removed if it is a 1, and a default NaN should be used if it is 0. When converting from commonNan, the explicit bit should be added. Signed-off-by: Aurelien Jarno --- fpu/softfloat-specialize.h | 19 +++++++++++++------ 1 files changed, 13 insertions(+), 6 deletions(-) v1 -> v2: fix wrong condition that may create an infinity instead of a NaN. diff --git a/fpu/softfloat-specialize.h b/fpu/softfloat-specialize.h index b110187..29e30ce 100644 --- a/fpu/softfloat-specialize.h +++ b/fpu/softfloat-specialize.h @@ -603,9 +603,15 @@ static commonNaNT floatx80ToCommonNaN( floatx80 a STATUS_PARAM) commonNaNT z; if ( floatx80_is_signaling_nan( a ) ) float_raise( float_flag_invalid STATUS_VAR); - z.sign = a.high>>15; - z.low = 0; - z.high = a.low; + if ( a.low >> 63 ) { + z.sign = a.high >> 15; + z.low = 0; + z.high = a.low << 1; + } else { + z.sign = floatx80_default_nan_high >> 15; + z.low = 0; + z.high = floatx80_default_nan_low << 1; + } return z; } @@ -624,10 +630,11 @@ static floatx80 commonNaNToFloatx80( commonNaNT a STATUS_PARAM) return z; } - if (a.high) - z.low = a.high; - else + if (a.high >> 1) { + z.low = LIT64( 0x8000000000000000 ) | a.high >> 1; + } else { z.low = floatx80_default_nan_low; + } z.high = ( ( (uint16_t) a.sign )<<15 ) | 0x7FFF; return z; } -- 1.7.2.3