From patchwork Wed Dec 18 20:19:03 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Musta X-Patchwork-Id: 303088 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 658772C00B2 for ; Thu, 19 Dec 2013 08:47:36 +1100 (EST) Received: from localhost ([::1]:40461 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VtNcF-0000g1-Lv for incoming@patchwork.ozlabs.org; Wed, 18 Dec 2013 15:21:11 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44229) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VtNbE-0000RQ-OX for qemu-devel@nongnu.org; Wed, 18 Dec 2013 15:20:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VtNb6-0003Q8-BE for qemu-devel@nongnu.org; Wed, 18 Dec 2013 15:20:08 -0500 Received: from mail-oa0-x236.google.com ([2607:f8b0:4003:c02::236]:40415) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VtNb6-0003Px-6Z; Wed, 18 Dec 2013 15:20:00 -0500 Received: by mail-oa0-f54.google.com with SMTP id h16so188452oag.13 for ; Wed, 18 Dec 2013 12:19:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=dMursS/eqy00q33g2J8dcpwauGU2wa2jH9k4qVqQZYE=; b=Wk6uIOSw8eb4sQKqwNb4qwxSJp3tw/884kwM9Y5RqGaJ1Va/QcR3VLvlYKp4RTdaWc D7q6aJkBdQNrY6kmu1cMoTSo2b13cxQaujCZMRSVoDNwRBabLtCli+Am6h8TcppfB7e+ N5R7S++9THM6DjIhuGVmphLO2h2sNpEVPHvDMYeGJTrOnjEeZkgwLzLPtZhXsID7221U eQU37O/e4VecVIZ59JkhlBFGCefKKHffe0G2TmJu7VnN1TDPssJIPF397icYw/2v8kp0 2qcBHUyRI9Ntagt00u2dUOmR8KJRsXZCQRQdrAelqJsVtaYWgI7gXDAqPrqzkKjAR8Gy 1qfg== X-Received: by 10.60.37.33 with SMTP id v1mr22403432oej.2.1387397999658; Wed, 18 Dec 2013 12:19:59 -0800 (PST) Received: from tmusta-sc.rchland.ibm.com (rchp4.rochester.ibm.com. [129.42.161.36]) by mx.google.com with ESMTPSA id h4sm1797915oel.3.2013.12.18.12.19.58 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 18 Dec 2013 12:19:59 -0800 (PST) From: Tom Musta To: qemu-devel@nongnu.org Date: Wed, 18 Dec 2013 14:19:03 -0600 Message-Id: <1387397961-4894-5-git-send-email-tommusta@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1387397961-4894-1-git-send-email-tommusta@gmail.com> References: <1387397961-4894-1-git-send-email-tommusta@gmail.com> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:4003:c02::236 Cc: Tom Musta , qemu-ppc@nongnu.org Subject: [Qemu-devel] [V4 PATCH 04/22] softfloat: Fix float64_to_uint32 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 float64_to_uint32 has several flaws: - for numbers between 2**32 and 2**64, the inexact exception flag may get incorrectly set. In this case, only the invalid flag should be set. test pattern: 425F81378DC0CD1F / 0x1.f81378dc0cd1fp+38 - for numbers between 2**63 and 2**64, incorrect results may be produced: test pattern: 43EAAF73F1F0B8BD / 0x1.aaf73f1f0b8bdp+63 This patch re-implements float64_to_uint32 to re-use the float64_to_uint64 routine (instead of float64_to_int64). For the saturation case, the inexact bit is explicitly cleared before raising the invalid flag, provided that it was not previously set. V4: Fixed handling of stickiness of the inexact bit per comments from Peter Maydell. This contribution can be licensed under either the softfloat-2a or -2b license. Signed-off-by: Tom Musta Reviewed-by: Peter Maydell --- fpu/softfloat.c | 15 +++++++-------- 1 files changed, 7 insertions(+), 8 deletions(-) diff --git a/fpu/softfloat.c b/fpu/softfloat.c index 1b614ae..6110e28 100644 --- a/fpu/softfloat.c +++ b/fpu/softfloat.c @@ -6578,19 +6578,18 @@ uint_fast16_t float32_to_uint16_round_to_zero(float32 a STATUS_PARAM) uint32 float64_to_uint32( float64 a STATUS_PARAM ) { - int64_t v; + uint64_t v; uint32 res; + int old_exc_flags = get_float_exception_flags(status); - v = float64_to_int64(a STATUS_VAR); - if (v < 0) { - res = 0; - float_raise( float_flag_invalid STATUS_VAR); - } else if (v > 0xffffffff) { + v = float64_to_uint64(a STATUS_VAR); + if (v > 0xffffffff) { res = 0xffffffff; - float_raise( float_flag_invalid STATUS_VAR); } else { - res = v; + return v; } + set_float_exception_flags(old_exc_flags, status); + float_raise(float_flag_invalid STATUS_VAR); return res; }