From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:51740) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TLhgt-0007Ge-93 for qemu-devel@nongnu.org; Tue, 09 Oct 2012 17:50:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TLhgq-0005jQ-4s for qemu-devel@nongnu.org; Tue, 09 Oct 2012 17:50:13 -0400 Received: from mail-pb0-f45.google.com ([209.85.160.45]:39955) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TLhgp-0005hg-Qd for qemu-devel@nongnu.org; Tue, 09 Oct 2012 17:50:12 -0400 Received: by mail-pb0-f45.google.com with SMTP id rp2so5738593pbb.4 for ; Tue, 09 Oct 2012 14:50:10 -0700 (PDT) Sender: Richard Henderson From: Richard Henderson Date: Tue, 9 Oct 2012 14:49:58 -0700 Message-Id: <1349819400-25833-3-git-send-email-rth@twiddle.net> In-Reply-To: <1349819400-25833-1-git-send-email-rth@twiddle.net> References: <1349819400-25833-1-git-send-email-rth@twiddle.net> Subject: [Qemu-devel] [PATCH 2/4] target-sparc: Optimize CC_OP_LOGIC conditions List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Blue Swirl Signed-off-by: Richard Henderson --- target-sparc/translate.c | 58 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/target-sparc/translate.c b/target-sparc/translate.c index 71b9d65..4409f69 100644 --- a/target-sparc/translate.c +++ b/target-sparc/translate.c @@ -1050,7 +1050,7 @@ static void gen_compare(DisasCompare *cmp, bool xcc, unsigned int cond, DisasContext *dc) { static int subcc_cond[16] = { - -1, /* never */ + TCG_COND_NEVER, TCG_COND_EQ, TCG_COND_LE, TCG_COND_LT, @@ -1058,7 +1058,7 @@ static void gen_compare(DisasCompare *cmp, bool xcc, unsigned int cond, TCG_COND_LTU, -1, /* neg */ -1, /* overflow */ - -1, /* always */ + TCG_COND_ALWAYS, TCG_COND_NE, TCG_COND_GT, TCG_COND_GE, @@ -1068,6 +1068,25 @@ static void gen_compare(DisasCompare *cmp, bool xcc, unsigned int cond, -1, /* no overflow */ }; + static int logic_cond[16] = { + TCG_COND_NEVER, + TCG_COND_EQ, /* eq: Z */ + TCG_COND_LE, /* le: Z | (N ^ V) -> Z | N */ + TCG_COND_LT, /* lt: N ^ V -> N */ + TCG_COND_EQ, /* leu: C | Z -> Z */ + TCG_COND_NEVER, /* ltu: C -> 0 */ + TCG_COND_LT, /* neg: N */ + TCG_COND_NEVER, /* vs: V -> 0 */ + TCG_COND_ALWAYS, + TCG_COND_NE, /* ne: !Z */ + TCG_COND_GT, /* gt: !(Z | (N ^ V)) -> !(Z | N) */ + TCG_COND_GE, /* ge: !(N ^ V) -> !N */ + TCG_COND_NE, /* gtu: !(C | Z) -> !Z */ + TCG_COND_ALWAYS, /* geu: !C -> 1 */ + TCG_COND_GE, /* pos: !N */ + TCG_COND_ALWAYS, /* vc: !V -> 1 */ + }; + TCGv_i32 r_src; TCGv r_dst; @@ -1082,28 +1101,31 @@ static void gen_compare(DisasCompare *cmp, bool xcc, unsigned int cond, #endif switch (dc->cc_op) { + case CC_OP_LOGIC: + cmp->cond = logic_cond[cond]; + do_compare_dst_0: + cmp->is_bool = false; + cmp->g2 = false; + cmp->c2 = tcg_const_tl(0); +#ifdef TARGET_SPARC64 + if (!xcc) { + cmp->g1 = false; + cmp->c1 = tcg_temp_new(); + tcg_gen_ext32s_tl(cmp->c1, cpu_cc_dst); + break; + } +#endif + cmp->g1 = true; + cmp->c1 = cpu_cc_dst; + break; + case CC_OP_SUB: switch (cond) { case 6: /* neg */ case 14: /* pos */ cmp->cond = (cond == 6 ? TCG_COND_LT : TCG_COND_GE); - cmp->is_bool = false; - cmp->g2 = false; - cmp->c2 = tcg_const_tl(0); -#ifdef TARGET_SPARC64 - if (!xcc) { - cmp->g1 = false; - cmp->c1 = tcg_temp_new(); - tcg_gen_ext32s_tl(cmp->c1, cpu_cc_dst); - break; - } -#endif - cmp->g1 = true; - cmp->c1 = cpu_cc_dst; - break; + goto do_compare_dst_0; - case 0: /* never */ - case 8: /* always */ case 7: /* overflow */ case 15: /* !overflow */ goto do_dynamic; -- 1.7.11.4