From patchwork Wed Apr 20 11:24:20 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aurelien Jarno X-Patchwork-Id: 92195 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id B4217B6FC7 for ; Wed, 20 Apr 2011 21:25:24 +1000 (EST) Received: from localhost ([::1]:33346 helo=lists2.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QCVX6-00076v-QU for incoming@patchwork.ozlabs.org; Wed, 20 Apr 2011 07:25:20 -0400 Received: from eggs.gnu.org ([140.186.70.92]:41289) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QCVWz-00076p-Tm for qemu-devel@nongnu.org; Wed, 20 Apr 2011 07:25:14 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QCVWz-0000CN-0I for qemu-devel@nongnu.org; Wed, 20 Apr 2011 07:25:13 -0400 Received: from hall.aurel32.net ([88.191.126.93]:38465) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QCVWy-0000C1-Rq for qemu-devel@nongnu.org; Wed, 20 Apr 2011 07:25:12 -0400 Received: from [90.84.144.153] (helo=volta.aurel32.net) by hall.aurel32.net with esmtpsa (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.72) (envelope-from ) id 1QCVWv-0006O5-1J for qemu-devel@nongnu.org; Wed, 20 Apr 2011 13:25:10 +0200 Received: from aurel32 by volta.aurel32.net with local (Exim 4.72) (envelope-from ) id 1QCVW8-00038J-6E for qemu-devel@nongnu.org; Wed, 20 Apr 2011 13:24:20 +0200 Date: Wed, 20 Apr 2011 13:24:20 +0200 From: Aurelien Jarno To: qemu-devel@nongnu.org Message-ID: <20110420112420.GE24035@volta.aurel32.net> References: <1303294329-22634-1-git-send-email-aurelien@aurel32.net> <1303294329-22634-2-git-send-email-aurelien@aurel32.net> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-Received-From: 88.191.126.93 Subject: [Qemu-devel] [PATCH v3 01/20] softfloat: fix floatx80 handling of NaN X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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 Reviewed-by: Peter Maydell --- fpu/softfloat-specialize.h | 23 ++++++++++++++++------- 1 files changed, 16 insertions(+), 7 deletions(-) v1 -> v2: fix wrong condition that may create an infinity instead of a NaN v2 -> v3: don't change the sign of the default NaN. diff --git a/fpu/softfloat-specialize.h b/fpu/softfloat-specialize.h index b110187..9d68aae 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,11 +630,14 @@ 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; + z.high = ( ( (uint16_t) a.sign )<<15 ) | 0x7FFF; + } else { z.low = floatx80_default_nan_low; - z.high = ( ( (uint16_t) a.sign )<<15 ) | 0x7FFF; + z.high = floatx80_default_nan_high; + } + return z; }