From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=46863 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Py6pL-0002x6-1r for qemu-devel@nongnu.org; Fri, 11 Mar 2011 13:12:40 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Py6pK-0005oP-0w for qemu-devel@nongnu.org; Fri, 11 Mar 2011 13:12:38 -0500 Received: from mnementh.archaic.org.uk ([81.2.115.146]:53506) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Py6pJ-0005kF-PZ for qemu-devel@nongnu.org; Fri, 11 Mar 2011 13:12:37 -0500 From: Peter Maydell Date: Fri, 11 Mar 2011 18:12:24 +0000 Message-Id: <1299867146-22049-6-git-send-email-peter.maydell@linaro.org> In-Reply-To: <1299867146-22049-1-git-send-email-peter.maydell@linaro.org> References: <1299867146-22049-1-git-send-email-peter.maydell@linaro.org> Subject: [Qemu-devel] [PATCH 5/7] target-arm: Correct ABD's handling of negative zeroes List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: patches@linaro.org Implement ABD by taking the absolute value of the difference of the operands (as the ARM ARM specifies) rather than by flipping the order of the operands to the subtract based on the results of a comparison. The latter approch gives the wrong answers for some edge cases like negative zero. Signed-off-by: Peter Maydell --- target-arm/neon_helper.c | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-) diff --git a/target-arm/neon_helper.c b/target-arm/neon_helper.c index 8eb4cef..1905545 100644 --- a/target-arm/neon_helper.c +++ b/target-arm/neon_helper.c @@ -1788,9 +1788,7 @@ uint32_t HELPER(neon_abd_f32)(CPUState *env, uint32_t a, uint32_t b) { float32 f0 = make_float32(a); float32 f1 = make_float32(b); - return float32_val((float32_compare_quiet(f0, f1, NFS) == 1) - ? float32_sub(f0, f1, NFS) - : float32_sub(f1, f0, NFS)); + return float32_val(float32_abs(float32_sub(f0, f1, NFS))); } uint32_t HELPER(neon_add_f32)(CPUState *env, uint32_t a, uint32_t b) -- 1.7.1