From patchwork Thu Jan 24 04:03:04 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 215214 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 490082C0079 for ; Thu, 24 Jan 2013 15:34:54 +1100 (EST) Received: from localhost ([::1]:40277 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TyEWa-0005q2-Bg for incoming@patchwork.ozlabs.org; Wed, 23 Jan 2013 23:34:52 -0500 Received: from eggs.gnu.org ([208.118.235.92]:51556) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TyE38-0001yI-NY for qemu-devel@nongnu.org; Wed, 23 Jan 2013 23:04:40 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TyE30-0004JL-Ou for qemu-devel@nongnu.org; Wed, 23 Jan 2013 23:04:26 -0500 Received: from mail-da0-f51.google.com ([209.85.210.51]:63598) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TyE30-0004J6-HC for qemu-devel@nongnu.org; Wed, 23 Jan 2013 23:04:18 -0500 Received: by mail-da0-f51.google.com with SMTP id i30so4053722dad.10 for ; Wed, 23 Jan 2013 20:04:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:sender:from:to:cc:subject:date:message-id:x-mailer :in-reply-to:references; bh=HQQ9rwX7EX6vUjs1/GrZAO8Tega8r0A80IktXvQkenA=; b=L7m7o0E+QQa0IwcBWXrBZrjue9T65Xuf5Qd8z8qwlG7Z1SGE2LfQGNcZCx7JY1zjKR mW/MWQ3ED1rJLHfbk6qZ54Q2DxTXa4R7osDWzi80Nq5H5onoeD2rjBdPv54nF2MadwnH JKb2255jJMXX8ufmoODO4vO/pXDwaSjwOLDfEkAiRlW23/mRvRRYZbFdmjbHJNdWaXAQ IGPudDwrEtDeDtGxDb9kFx7png4NoZPMy7Ymnck3dR1n/NOGPicZOdMVRjFys8JVhW6i KAd2aCQpkOPPMOt7GbYzSH1GMAOD0zhF2z3TTzfVWBySTNT3DpmBbfoeMQfUZ7IH7pTL LODg== X-Received: by 10.68.230.103 with SMTP id sx7mr1518827pbc.19.1359000257784; Wed, 23 Jan 2013 20:04:17 -0800 (PST) Received: from anchor.twiddle.home (50-194-63-110-static.hfc.comcastbusiness.net. [50.194.63.110]) by mx.google.com with ESMTPS id ot3sm14027480pbb.38.2013.01.23.20.04.16 (version=TLSv1 cipher=RC4-SHA bits=128/128); Wed, 23 Jan 2013 20:04:16 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Wed, 23 Jan 2013 20:03:04 -0800 Message-Id: <1359000221-19834-21-git-send-email-rth@twiddle.net> X-Mailer: git-send-email 1.7.11.7 In-Reply-To: <1359000221-19834-1-git-send-email-rth@twiddle.net> References: <1359000221-19834-1-git-send-email-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 209.85.210.51 Cc: Blue Swirl , Paolo Bonzini Subject: [Qemu-devel] [PATCH 20/57] target-i386: Move CC discards to set_cc_op 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 This gets us universal coverage, rather than scattering discards around at various places. As a bonus, we do not emit redundant discards e.g. between sequential logic insns. Signed-off-by: Richard Henderson --- target-i386/translate.c | 48 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/target-i386/translate.c b/target-i386/translate.c index af6ca49..e061c6a 100644 --- a/target-i386/translate.c +++ b/target-i386/translate.c @@ -174,14 +174,48 @@ enum { OR_A0, /* temporary register used when doing address evaluation */ }; +enum { + USES_CC_DST = 1, + USES_CC_SRC = 2, +}; + +/* Bit set if the global variable is live after setting CC_OP to X. */ +static const uint8_t cc_op_live[CC_OP_NB] = { + [CC_OP_DYNAMIC] = USES_CC_DST | USES_CC_SRC, + [CC_OP_EFLAGS] = USES_CC_SRC, + [CC_OP_MULB ... CC_OP_MULQ] = USES_CC_DST | USES_CC_SRC, + [CC_OP_ADDB ... CC_OP_ADDQ] = USES_CC_DST | USES_CC_SRC, + [CC_OP_ADCB ... CC_OP_ADCQ] = USES_CC_DST | USES_CC_SRC, + [CC_OP_SUBB ... CC_OP_SUBQ] = USES_CC_DST | USES_CC_SRC, + [CC_OP_SBBB ... CC_OP_SBBQ] = USES_CC_DST | USES_CC_SRC, + [CC_OP_LOGICB ... CC_OP_LOGICQ] = USES_CC_DST, + [CC_OP_INCB ... CC_OP_INCQ] = USES_CC_DST | USES_CC_SRC, + [CC_OP_DECB ... CC_OP_DECQ] = USES_CC_DST | USES_CC_SRC, + [CC_OP_SHLB ... CC_OP_SHLQ] = USES_CC_DST | USES_CC_SRC, + [CC_OP_SARB ... CC_OP_SARQ] = USES_CC_DST | USES_CC_SRC, +}; + static void set_cc_op(DisasContext *s, CCOp op) { - if (s->cc_op != op) { - s->cc_op = op; - /* The DYNAMIC setting is translator only, and should never be - stored. Thus we always consider it clean. */ - s->cc_op_dirty = (op != CC_OP_DYNAMIC); + int dead; + + if (s->cc_op == op) { + return; + } + + /* Discard CC computation that will no longer be used. */ + dead = cc_op_live[s->cc_op] & ~cc_op_live[op]; + if (dead & USES_CC_DST) { + tcg_gen_discard_tl(cpu_cc_dst); } + if (dead & USES_CC_SRC) { + tcg_gen_discard_tl(cpu_cc_src); + } + + s->cc_op = op; + /* The DYNAMIC setting is translator only, and should never be + stored. Thus we always consider it clean. */ + s->cc_op_dirty = (op != CC_OP_DYNAMIC); } static void gen_update_cc_op(DisasContext *s) @@ -809,7 +843,6 @@ static inline void gen_movs(DisasContext *s, int ot) static void gen_op_update1_cc(void) { - tcg_gen_discard_tl(cpu_cc_src); tcg_gen_mov_tl(cpu_cc_dst, cpu_T[0]); } @@ -827,7 +860,6 @@ static inline void gen_op_cmpl_T0_T1_cc(void) static inline void gen_op_testl_T0_T1_cc(void) { - tcg_gen_discard_tl(cpu_cc_src); tcg_gen_and_tl(cpu_cc_dst, cpu_T[0], cpu_T[1]); } @@ -853,7 +885,6 @@ static void gen_compute_eflags(DisasContext *s) } gen_update_cc_op(s); gen_helper_cc_compute_all(cpu_tmp2_i32, cpu_env, cpu_cc_op); - tcg_gen_discard_tl(cpu_cc_dst); set_cc_op(s, CC_OP_EFLAGS); tcg_gen_extu_i32_tl(cpu_cc_src, cpu_tmp2_i32); } @@ -6639,7 +6670,6 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, gen_op_mov_reg_T0(ot, reg); tcg_gen_movi_tl(cpu_cc_dst, 1); gen_set_label(label1); - tcg_gen_discard_tl(cpu_cc_src); set_cc_op(s, CC_OP_LOGICB + ot); } tcg_temp_free(t0);