From patchwork Sat Jan 7 20:09:36 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aurelien Jarno X-Patchwork-Id: 134870 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 1DDE4B6F74 for ; Sun, 8 Jan 2012 07:38:58 +1100 (EST) Received: from localhost ([::1]:35991 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Rjcas-0005Kk-MP for incoming@patchwork.ozlabs.org; Sat, 07 Jan 2012 15:10:22 -0500 Received: from eggs.gnu.org ([140.186.70.92]:39600) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RjcaO-0004H3-S5 for qemu-devel@nongnu.org; Sat, 07 Jan 2012 15:09:54 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RjcaM-0001el-57 for qemu-devel@nongnu.org; Sat, 07 Jan 2012 15:09:52 -0500 Received: from hall.aurel32.net ([88.191.126.93]:43920) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RjcaL-0001eT-VP; Sat, 07 Jan 2012 15:09:50 -0500 Received: from [2001:470:d4ed:0:5e26:aff:fe2b:6f5b] (helo=volta.aurel32.net) by hall.aurel32.net with esmtpsa (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.72) (envelope-from ) id 1RjcaL-0004CI-7j; Sat, 07 Jan 2012 21:09:49 +0100 Received: from aurel32 by volta.aurel32.net with local (Exim 4.77) (envelope-from ) id 1RjcaK-0000Ks-3q; Sat, 07 Jan 2012 21:09:48 +0100 From: Aurelien Jarno To: qemu-devel@nongnu.org Date: Sat, 7 Jan 2012 21:09:36 +0100 Message-Id: <1325966978-940-3-git-send-email-aurelien@aurel32.net> X-Mailer: git-send-email 1.7.7.3 In-Reply-To: <1325966978-940-1-git-send-email-aurelien@aurel32.net> References: <1325966978-940-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: qemu-stable@nongnu.org, Aurelien Jarno Subject: [Qemu-devel] [PATCH 2/4] target-i386: fix round{pd, ps, sd, ss} SSE2 instructions 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 roundps and roundss SSE2 instructions have been broken when switching target-i386 to softfloat. They use float64_round_to_int to convert a float32, and while the implicit conversion from float32 to float64 was correct for softfloat-native, it is not for pure softfloat. Fix that by using the correct registers and correct functions. Also fix roundpd and roundsd implementation at the same time, even if these functions are behaving correctly. Signed-off-by: Aurelien Jarno --- target-i386/ops_sse.h | 16 ++++++++-------- 1 files changed, 8 insertions(+), 8 deletions(-) diff --git a/target-i386/ops_sse.h b/target-i386/ops_sse.h index a743c85..a185bfb 100644 --- a/target-i386/ops_sse.h +++ b/target-i386/ops_sse.h @@ -1648,10 +1648,10 @@ void glue(helper_roundps, SUFFIX) (Reg *d, Reg *s, uint32_t mode) break; } - d->L(0) = float64_round_to_int(s->L(0), &env->sse_status); - d->L(1) = float64_round_to_int(s->L(1), &env->sse_status); - d->L(2) = float64_round_to_int(s->L(2), &env->sse_status); - d->L(3) = float64_round_to_int(s->L(3), &env->sse_status); + d->XMM_S(0) = float32_round_to_int(s->XMM_S(0), &env->sse_status); + d->XMM_S(1) = float32_round_to_int(s->XMM_S(1), &env->sse_status); + d->XMM_S(2) = float32_round_to_int(s->XMM_S(2), &env->sse_status); + d->XMM_S(3) = float32_round_to_int(s->XMM_S(3), &env->sse_status); #if 0 /* TODO */ if (mode & (1 << 3)) @@ -1684,8 +1684,8 @@ void glue(helper_roundpd, SUFFIX) (Reg *d, Reg *s, uint32_t mode) break; } - d->Q(0) = float64_round_to_int(s->Q(0), &env->sse_status); - d->Q(1) = float64_round_to_int(s->Q(1), &env->sse_status); + d->XMM_D(0) = float64_round_to_int(s->XMM_D(0), &env->sse_status); + d->XMM_D(1) = float64_round_to_int(s->XMM_D(1), &env->sse_status); #if 0 /* TODO */ if (mode & (1 << 3)) @@ -1718,7 +1718,7 @@ void glue(helper_roundss, SUFFIX) (Reg *d, Reg *s, uint32_t mode) break; } - d->L(0) = float64_round_to_int(s->L(0), &env->sse_status); + d->XMM_S(0) = float32_round_to_int(s->XMM_S(0), &env->sse_status); #if 0 /* TODO */ if (mode & (1 << 3)) @@ -1751,7 +1751,7 @@ void glue(helper_roundsd, SUFFIX) (Reg *d, Reg *s, uint32_t mode) break; } - d->Q(0) = float64_round_to_int(s->Q(0), &env->sse_status); + d->XMM_D(0) = float64_round_to_int(s->XMM_D(0), &env->sse_status); #if 0 /* TODO */ if (mode & (1 << 3))