From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LDex1-0008VG-KF for qemu-devel@nongnu.org; Fri, 19 Dec 2008 07:59:31 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LDex0-0008Ue-Nc for qemu-devel@nongnu.org; Fri, 19 Dec 2008 07:59:30 -0500 Received: from [199.232.76.173] (port=42824 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LDex0-0008UY-G1 for qemu-devel@nongnu.org; Fri, 19 Dec 2008 07:59:30 -0500 Received: from savannah.gnu.org ([199.232.41.3]:35827 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LDex0-00052A-49 for qemu-devel@nongnu.org; Fri, 19 Dec 2008 07:59:30 -0500 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1LDewz-0001Ih-HN for qemu-devel@nongnu.org; Fri, 19 Dec 2008 12:59:29 +0000 Received: from pbrook by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1LDewz-0001IZ-7q for qemu-devel@nongnu.org; Fri, 19 Dec 2008 12:59:29 +0000 MIME-Version: 1.0 Errors-To: pbrook Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Paul Brook Message-Id: Date: Fri, 19 Dec 2008 12:59:29 +0000 Subject: [Qemu-devel] [6102] Correctly normalize values and handle zero inputs to scalbn functions. Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 6102 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6102 Author: pbrook Date: 2008-12-19 12:59:28 +0000 (Fri, 19 Dec 2008) Log Message: ----------- Correctly normalize values and handle zero inputs to scalbn functions. Signed-off-by: Paul Brook Modified Paths: -------------- trunk/fpu/softfloat.c Modified: trunk/fpu/softfloat.c =================================================================== --- trunk/fpu/softfloat.c 2008-12-19 12:57:18 UTC (rev 6101) +++ trunk/fpu/softfloat.c 2008-12-19 12:59:28 UTC (rev 6102) @@ -5479,8 +5479,14 @@ if ( aExp == 0xFF ) { return a; } - aExp += n; - return roundAndPackFloat32( aSign, aExp, aSig STATUS_VAR ); + if ( aExp != 0 ) + aSig |= 0x00800000; + else if ( aSig == 0 ) + return a; + + aExp += n - 1; + aSig <<= 7; + return normalizeRoundAndPackFloat32( aSign, aExp, aSig STATUS_VAR ); } float64 float64_scalbn( float64 a, int n STATUS_PARAM ) @@ -5496,8 +5502,14 @@ if ( aExp == 0x7FF ) { return a; } - aExp += n; - return roundAndPackFloat64( aSign, aExp, aSig STATUS_VAR ); + if ( aExp != 0 ) + aSig |= LIT64( 0x0010000000000000 ); + else if ( aSig == 0 ) + return a; + + aExp += n - 1; + aSig <<= 10; + return normalizeRoundAndPackFloat64( aSign, aExp, aSig STATUS_VAR ); } #ifdef FLOATX80 @@ -5514,9 +5526,12 @@ if ( aExp == 0x7FF ) { return a; } + if (aExp == 0 && aSig == 0) + return a; + aExp += n; - return roundAndPackFloatx80( STATUS(floatx80_rounding_precision), - aSign, aExp, aSig, 0 STATUS_VAR ); + return normalizeRoundAndPackFloatx80( STATUS(floatx80_rounding_precision), + aSign, aExp, aSig, 0 STATUS_VAR ); } #endif @@ -5534,8 +5549,14 @@ if ( aExp == 0x7FFF ) { return a; } - aExp += n; - return roundAndPackFloat128( aSign, aExp, aSig0, aSig1, 0 STATUS_VAR ); + if ( aExp != 0 ) + aSig0 |= LIT64( 0x0001000000000000 ); + else if ( aSig0 == 0 && aSig1 == 0 ) + return a; + aExp += n - 1; + return normalizeRoundAndPackFloat128( aSign, aExp, aSig0, aSig1 + STATUS_VAR ); + } #endif