From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KuRNd-0005V1-B2 for qemu-devel@nongnu.org; Mon, 27 Oct 2008 08:39:33 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KuRNc-0005UU-S7 for qemu-devel@nongnu.org; Mon, 27 Oct 2008 08:39:32 -0400 Received: from [199.232.76.173] (port=36055 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KuRNc-0005UN-NX for qemu-devel@nongnu.org; Mon, 27 Oct 2008 08:39:32 -0400 Received: from savannah.gnu.org ([199.232.41.3]:48325 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1KuRNc-0004hG-3X for qemu-devel@nongnu.org; Mon, 27 Oct 2008 08:39:32 -0400 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1KuRNb-0004cM-GV for qemu-devel@nongnu.org; Mon, 27 Oct 2008 12:39:31 +0000 Received: from edgar_igl by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1KuRNb-0004cI-88 for qemu-devel@nongnu.org; Mon, 27 Oct 2008 12:39:31 +0000 MIME-Version: 1.0 Errors-To: edgar_igl Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: "Edgar E. Iglesias" Message-Id: Date: Mon, 27 Oct 2008 12:39:31 +0000 Subject: [Qemu-devel] [5546] CRIS: Add branch-free versions of abs, lsl, lsr and asr. Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 5546 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=5546 Author: edgar_igl Date: 2008-10-27 12:39:30 +0000 (Mon, 27 Oct 2008) Log Message: ----------- CRIS: Add branch-free versions of abs, lsl, lsr and asr. Signed-off-by: Edgar E. Iglesias Modified Paths: -------------- trunk/target-cris/translate.c Modified: trunk/target-cris/translate.c =================================================================== --- trunk/target-cris/translate.c 2008-10-26 23:18:06 UTC (rev 5545) +++ trunk/target-cris/translate.c 2008-10-27 12:39:30 UTC (rev 5546) @@ -229,41 +229,52 @@ static void t_gen_lsl(TCGv d, TCGv a, TCGv b) { - int l1; + TCGv t0, t_31; - l1 = gen_new_label(); - /* Speculative shift. */ + t0 = tcg_temp_new(TCG_TYPE_TL); + t_31 = tcg_temp_new(TCG_TYPE_TL); tcg_gen_shl_tl(d, a, b); - tcg_gen_brcondi_tl(TCG_COND_LEU, b, 31, l1); - /* Clear dst if shift operands were to large. */ - tcg_gen_movi_tl(d, 0); - gen_set_label(l1); + + tcg_gen_movi_tl(t_31, 31); + tcg_gen_sub_tl(t0, t_31, b); + tcg_gen_sar_tl(t0, t0, t_31); + tcg_gen_and_tl(t0, t0, d); + tcg_gen_xor_tl(d, d, t0); + tcg_temp_free(t0); + tcg_temp_free(t_31); } static void t_gen_lsr(TCGv d, TCGv a, TCGv b) { - int l1; + TCGv t0, t_31; - l1 = gen_new_label(); - /* Speculative shift. */ + t0 = tcg_temp_new(TCG_TYPE_TL); + t_31 = tcg_temp_new(TCG_TYPE_TL); tcg_gen_shr_tl(d, a, b); - tcg_gen_brcondi_tl(TCG_COND_LEU, b, 31, l1); - /* Clear dst if shift operands were to large. */ - tcg_gen_movi_tl(d, 0); - gen_set_label(l1); + + tcg_gen_movi_tl(t_31, 31); + tcg_gen_sub_tl(t0, t_31, b); + tcg_gen_sar_tl(t0, t0, t_31); + tcg_gen_and_tl(t0, t0, d); + tcg_gen_xor_tl(d, d, t0); + tcg_temp_free(t0); + tcg_temp_free(t_31); } static void t_gen_asr(TCGv d, TCGv a, TCGv b) { - int l1; + TCGv t0, t_31; - l1 = gen_new_label(); - /* Speculative shift. */ + t0 = tcg_temp_new(TCG_TYPE_TL); + t_31 = tcg_temp_new(TCG_TYPE_TL); tcg_gen_sar_tl(d, a, b); - tcg_gen_brcondi_tl(TCG_COND_LEU, b, 31, l1); - /* Clear dst if shift operands were to large. */ - tcg_gen_sar_tl(d, a, tcg_const_tl(30)); - gen_set_label(l1); + + tcg_gen_movi_tl(t_31, 31); + tcg_gen_sub_tl(t0, t_31, b); + tcg_gen_sar_tl(t0, t0, t_31); + tcg_gen_or_tl(d, d, t0); + tcg_temp_free(t0); + tcg_temp_free(t_31); } /* 64-bit signed mul, lower result in d and upper in d2. */ @@ -1777,20 +1788,20 @@ static unsigned int dec_abs_r(DisasContext *dc) { - int l1; + TCGv t0; DIS(fprintf (logfile, "abs $r%u, $r%u\n", dc->op1, dc->op2)); cris_cc_mask(dc, CC_MASK_NZ); - dec_prep_move_r(dc, dc->op1, dc->op2, 4, 0, cpu_T[1]); - /* TODO: consider a branch free approach. */ - l1 = gen_new_label(); - tcg_gen_brcondi_tl(TCG_COND_GE, cpu_T[1], 0, l1); - tcg_gen_neg_tl(cpu_T[1], cpu_T[1]); - gen_set_label(l1); + t0 = tcg_temp_new(TCG_TYPE_TL); + tcg_gen_sari_tl(t0, cpu_R[dc->op1], 31); + tcg_gen_xor_tl(cpu_R[dc->op2], cpu_R[dc->op1], t0); + tcg_gen_sub_tl(cpu_R[dc->op2], cpu_R[dc->op2], t0); + tcg_temp_free(t0); + cris_alu(dc, CC_OP_MOVE, - cpu_R[dc->op2], cpu_R[dc->op2], cpu_T[1], 4); + cpu_R[dc->op2], cpu_R[dc->op2], cpu_R[dc->op2], 4); return 2; }