From patchwork Wed Apr 20 10:11:50 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aurelien Jarno X-Patchwork-Id: 92134 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 DC69FB6FBE for ; Wed, 20 Apr 2011 20:12:51 +1000 (EST) Received: from localhost ([::1]:53385 helo=lists2.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QCUOs-0008Rx-Cv for incoming@patchwork.ozlabs.org; Wed, 20 Apr 2011 06:12:46 -0400 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 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 1QCUOU-0002qB-RC; Wed, 20 Apr 2011 12:12:23 +0200 Received: from aurel32 by volta.aurel32.net with local (Exim 4.72) (envelope-from ) id 1QCUOM-0006Gn-TA; Wed, 20 Apr 2011 12:12:14 +0200 From: Aurelien Jarno To: qemu-devel@nongnu.org Date: Wed, 20 Apr 2011 12:11:50 +0200 Message-Id: <1303294329-22634-2-git-send-email-aurelien@aurel32.net> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1303294329-22634-1-git-send-email-aurelien@aurel32.net> References: <1303294329-22634-1-git-send-email-aurelien@aurel32.net> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-Received-From: 88.191.126.93 Cc: Aurelien Jarno Subject: [Qemu-devel] [PATCH v2 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 --- 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; }