From patchwork Thu Jan 24 04:03:14 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 215244 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 A6BAB2C0080 for ; Thu, 24 Jan 2013 16:39:08 +1100 (EST) Received: from localhost ([::1]:35579 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TyE4S-0003yp-61 for incoming@patchwork.ozlabs.org; Wed, 23 Jan 2013 23:05:48 -0500 Received: from eggs.gnu.org ([208.118.235.92]:51692) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TyE3K-0002Wo-O3 for qemu-devel@nongnu.org; Wed, 23 Jan 2013 23:04:50 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TyE3H-0004Np-Kf for qemu-devel@nongnu.org; Wed, 23 Jan 2013 23:04:38 -0500 Received: from mail-da0-f42.google.com ([209.85.210.42]:40043) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TyE3H-0004Nf-BN for qemu-devel@nongnu.org; Wed, 23 Jan 2013 23:04:35 -0500 Received: by mail-da0-f42.google.com with SMTP id z17so4059500dal.29 for ; Wed, 23 Jan 2013 20:04:34 -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=qyW3+nLC+k16kjj7NIPgYqi74/WgfSjix2lff8vLx58=; b=Gvb7Ia4XgQkD+Y8w/2oy4BHko7xOM018m0ZUoU8dexh94SVmMesTfzf5V09vBglASR SPqPOQLc9xn0p15yB9l70wdkA+vuQh5YvOlI1boVaSb78/RD4mLSV+FN0Jj9xXwN7lKq a25UVaTCcbfBbHmyld2vXpIC9fs/ZMQP6vyTVfESCDtp1+PbNBfGV0Gy+kfLfgXPTW+d /GryxlkapZpbjbygIYyx0EayJPHyiUh0zWd8S/fz7dktPahyTCcs4QV9YH66f9CZQVGZ 1quQookGCJDW7UaWfAlacPZ16Oo66cp125orW8t03P8y+DAqi1G5zkv+VKnkP6N+XXxU EICA== X-Received: by 10.68.236.2 with SMTP id uq2mr1443793pbc.55.1359000274624; Wed, 23 Jan 2013 20:04:34 -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.32 (version=TLSv1 cipher=RC4-SHA bits=128/128); Wed, 23 Jan 2013 20:04:33 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Wed, 23 Jan 2013 20:03:14 -0800 Message-Id: <1359000221-19834-31-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.42 Cc: Blue Swirl , Paolo Bonzini Subject: [Qemu-devel] [PATCH 30/57] target-i386: use CCPrepare to generate conditional jumps 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 From: Paolo Bonzini This simplifies all the jump generation code. CCPrepare allows the code to create an efficient brcond always, so there is no need to duplicate the setcc and jcc code. Signed-off-by: Paolo Bonzini Signed-off-by: Richard Henderson --- target-i386/translate.c | 119 ++++-------------------------------------------- 1 file changed, 9 insertions(+), 110 deletions(-) diff --git a/target-i386/translate.c b/target-i386/translate.c index 70052de..be8d3a3 100644 --- a/target-i386/translate.c +++ b/target-i386/translate.c @@ -1172,117 +1172,16 @@ static CCPrepare gen_prepare_cc(DisasContext *s, int b, TCGv reg) value 'b'. In the fast case, T0 is guaranted not to be used. */ static inline void gen_jcc1(DisasContext *s, int b, int l1) { - int inv, jcc_op, size, cond; - TCGv t0; + CCPrepare cc = gen_prepare_cc(s, b, cpu_T[0]); - inv = b & 1; - jcc_op = (b >> 1) & 7; - - switch (s->cc_op) { - /* we optimize the cmp/jcc case */ - case CC_OP_SUBB: - case CC_OP_SUBW: - case CC_OP_SUBL: - case CC_OP_SUBQ: - - size = s->cc_op - CC_OP_SUBB; - switch(jcc_op) { - case JCC_Z: - fast_jcc_z: - t0 = gen_ext_tl(cpu_tmp0, cpu_cc_dst, size, false); - tcg_gen_brcondi_tl(inv ? TCG_COND_NE : TCG_COND_EQ, t0, 0, l1); - break; - case JCC_S: - fast_jcc_s: - t0 = gen_ext_tl(cpu_tmp0, cpu_cc_dst, size, true); - tcg_gen_brcondi_tl(inv ? TCG_COND_GE : TCG_COND_LT, t0, 0, l1); - break; - - case JCC_B: - cond = inv ? TCG_COND_GEU : TCG_COND_LTU; - goto fast_jcc_b; - case JCC_BE: - cond = inv ? TCG_COND_GTU : TCG_COND_LEU; - fast_jcc_b: - tcg_gen_add_tl(cpu_tmp4, cpu_cc_dst, cpu_cc_src); - gen_extu(size, cpu_tmp4); - t0 = gen_ext_tl(cpu_tmp0, cpu_cc_src, size, false); - tcg_gen_brcond_tl(cond, cpu_tmp4, t0, l1); - break; - - case JCC_L: - cond = inv ? TCG_COND_GE : TCG_COND_LT; - goto fast_jcc_l; - case JCC_LE: - cond = inv ? TCG_COND_GT : TCG_COND_LE; - fast_jcc_l: - tcg_gen_add_tl(cpu_tmp4, cpu_cc_dst, cpu_cc_src); - gen_exts(size, cpu_tmp4); - t0 = gen_ext_tl(cpu_tmp0, cpu_cc_src, size, true); - tcg_gen_brcond_tl(cond, cpu_tmp4, t0, l1); - break; - - default: - goto slow_jcc; - } - break; - - /* some jumps are easy to compute */ - case CC_OP_ADDB: - case CC_OP_ADDW: - case CC_OP_ADDL: - case CC_OP_ADDQ: - - case CC_OP_ADCB: - case CC_OP_ADCW: - case CC_OP_ADCL: - case CC_OP_ADCQ: - - case CC_OP_SBBB: - case CC_OP_SBBW: - case CC_OP_SBBL: - case CC_OP_SBBQ: - - case CC_OP_LOGICB: - case CC_OP_LOGICW: - case CC_OP_LOGICL: - case CC_OP_LOGICQ: - - case CC_OP_INCB: - case CC_OP_INCW: - case CC_OP_INCL: - case CC_OP_INCQ: - - case CC_OP_DECB: - case CC_OP_DECW: - case CC_OP_DECL: - case CC_OP_DECQ: - - case CC_OP_SHLB: - case CC_OP_SHLW: - case CC_OP_SHLL: - case CC_OP_SHLQ: - - case CC_OP_SARB: - case CC_OP_SARW: - case CC_OP_SARL: - case CC_OP_SARQ: - switch(jcc_op) { - case JCC_Z: - size = (s->cc_op - CC_OP_ADDB) & 3; - goto fast_jcc_z; - case JCC_S: - size = (s->cc_op - CC_OP_ADDB) & 3; - goto fast_jcc_s; - default: - goto slow_jcc; - } - break; - default: - slow_jcc: - gen_setcc1(s, b, cpu_T[0]); - tcg_gen_brcondi_tl(TCG_COND_NE, cpu_T[0], 0, l1); - break; + if (cc.mask != -1) { + tcg_gen_andi_tl(cpu_T[0], cc.reg, cc.mask); + cc.reg = cpu_T[0]; + } + if (cc.use_reg2) { + tcg_gen_brcond_tl(cc.cond, cc.reg, cc.reg2, l1); + } else { + tcg_gen_brcondi_tl(cc.cond, cc.reg, cc.imm, l1); } }