From patchwork Tue Feb 25 07:30:32 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 323851 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 E04C52C0804 for ; Tue, 25 Feb 2014 18:31:20 +1100 (EST) Received: from localhost ([::1]:33199 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WICU1-0005lQ-OL for incoming@patchwork.ozlabs.org; Tue, 25 Feb 2014 02:31:17 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44820) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WICTa-0005lF-7g for qemu-devel@nongnu.org; Tue, 25 Feb 2014 02:30:54 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WICTV-0002Vu-M3 for qemu-devel@nongnu.org; Tue, 25 Feb 2014 02:30:50 -0500 Received: from mail-qa0-x235.google.com ([2607:f8b0:400d:c00::235]:54249) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WICTV-0002Vo-Hi for qemu-devel@nongnu.org; Tue, 25 Feb 2014 02:30:45 -0500 Received: by mail-qa0-f53.google.com with SMTP id cm18so17266qab.12 for ; Mon, 24 Feb 2014 23:30:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:subject:date:message-id:in-reply-to:references; bh=xc3dEKDNFo4vp6hO2LojS5d3KlwIXw0qznGJPQQt2Uo=; b=y556Gvfk2RXu68Z6DNVb3KTQtt0S82XYIA4u+Yb6RV7yA6nknYZrcIxfEIAHdujeHN nYfBnfvgSb1wOLRqOFzhNO1osRUHCFJot+rvD6td4QJBIi/ma/ql1HJj4j5Sxhi1pHd6 anNHB72Mwtd+ldvxZFBZ/zeaT8RZUGpfP5Q7pJ7d7ZezcdVut1MwZ2xNDvZfGqcVGwjU aaNDKLJbr30H2xES1GLEcAclhoQjgkZkwcypaA1aqH9rUasDe4/3sZGlBac90zqjr7Ta uWreRcuIaT2ORjlnDsV81ABBSkCSQJUrnWIRL4Ac5mWVb8xqWp6PduaAC+UrxzoA9QZR SFeQ== X-Received: by 10.224.103.66 with SMTP id j2mr36135895qao.13.1393313445186; Mon, 24 Feb 2014 23:30:45 -0800 (PST) Received: from pike.twiddle.home.com (50-194-63-110-static.hfc.comcastbusiness.net. [50.194.63.110]) by mx.google.com with ESMTPSA id i38sm29067766qge.1.2014.02.24.23.30.43 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 24 Feb 2014 23:30:44 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Mon, 24 Feb 2014 23:30:32 -0800 Message-Id: <1393313432-15327-4-git-send-email-rth@twiddle.net> X-Mailer: git-send-email 1.8.5.3 In-Reply-To: <1393313432-15327-1-git-send-email-rth@twiddle.net> References: <1393313432-15327-1-git-send-email-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:400d:c00::235 Subject: [Qemu-devel] [PATCH 3/3] target-i386: Fix ucomis and comis memory access 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 We were loading 16 bytes for both single and double-precision scalar comparisons. Reported-by: Alexander Bluhm Signed-off-by: Richard Henderson --- The original Bluhm patch didn't fix [u]comiss, but was focused on [u]comisd. r~ --- target-i386/translate.c | 46 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/target-i386/translate.c b/target-i386/translate.c index aa985fa..707ebd5 100644 --- a/target-i386/translate.c +++ b/target-i386/translate.c @@ -4284,22 +4284,48 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, if (is_xmm) { op1_offset = offsetof(CPUX86State,xmm_regs[reg]); if (mod != 3) { + int sz = 4; + gen_lea_modrm(env, s, modrm); op2_offset = offsetof(CPUX86State,xmm_t0); - if (b1 >= 2 && ((b >= 0x50 && b <= 0x5f && b != 0x5b) || - b == 0xc2)) { - /* specific case for SSE single instructions */ + + switch (b) { + case 0x50 ... 0x5a: + case 0x5c ... 0x5f: + case 0xc2: + /* Most sse scalar operations. */ if (b1 == 2) { - /* 32 bit access */ - gen_op_ld_v(s, MO_32, cpu_T[0], cpu_A0); - tcg_gen_st32_tl(cpu_T[0], cpu_env, offsetof(CPUX86State,xmm_t0.XMM_L(0))); + sz = 2; + } else if (b1 == 3) { + sz = 3; + } + break; + + case 0x2e: /* ucomis[sd] */ + case 0x2f: /* comis[sd] */ + if (b1 == 0) { + sz = 2; } else { - /* 64 bit access */ - gen_ldq_env_A0(s, offsetof(CPUX86State, - xmm_t0.XMM_D(0))); + sz = 3; } - } else { + break; + } + + switch (sz) { + case 2: + /* 32 bit access */ + gen_op_ld_v(s, MO_32, cpu_T[0], cpu_A0); + tcg_gen_st32_tl(cpu_T[0], cpu_env, + offsetof(CPUX86State,xmm_t0.XMM_L(0))); + break; + case 3: + /* 64 bit access */ + gen_ldq_env_A0(s, offsetof(CPUX86State, xmm_t0.XMM_D(0))); + break; + default: + /* 128 bit access */ gen_ldo_env_A0(s, op2_offset); + break; } } else { rm = (modrm & 7) | REX_B(s);