From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57488) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Vbaa0-0002Oj-8z for qemu-devel@nongnu.org; Wed, 30 Oct 2013 14:33:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VbaZr-0006mQ-1Z for qemu-devel@nongnu.org; Wed, 30 Oct 2013 14:33:20 -0400 Received: from mail-qe0-x230.google.com ([2607:f8b0:400d:c02::230]:37289) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VbaZq-0006mM-Us for qemu-devel@nongnu.org; Wed, 30 Oct 2013 14:33:11 -0400 Received: by mail-qe0-f48.google.com with SMTP id d4so1075016qej.21 for ; Wed, 30 Oct 2013 11:33:10 -0700 (PDT) Sender: Richard Henderson Message-ID: <527150E2.5070200@twiddle.net> Date: Wed, 30 Oct 2013 11:33:06 -0700 From: Richard Henderson MIME-Version: 1.0 References: <1383073495-5332-1-git-send-email-sebastian@macke.de> <1383073495-5332-12-git-send-email-sebastian@macke.de> In-Reply-To: <1383073495-5332-12-git-send-email-sebastian@macke.de> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 11/13] target-openrisc: use jmp_pc as flag variable for branches List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Sebastian Macke Cc: openrisc@openrisc.net, openrisc@lists.opencores.org, qemu-devel@nongnu.org, proljc@gmail.com On 10/29/2013 12:04 PM, Sebastian Macke wrote: > { > int lab = gen_new_label(); > - dc->btaken = tcg_temp_local_new(); > - tcg_gen_movi_tl(jmp_pc, dc->pc+8); > - tcg_gen_movi_tl(dc->btaken, 0); > + tcg_gen_movi_tl(jmp_pc, 0); > tcg_gen_brcondi_i32(op0 == 0x03 ? TCG_COND_NE : TCG_COND_EQ, > cpu_srf, 0, lab); > - tcg_gen_movi_tl(dc->btaken, 1); > tcg_gen_movi_tl(jmp_pc, tmp_pc); > gen_set_label(lab); You can now use movcond here: tcg_gen_movi_i32(jmp_pc, tmp_pc); tcg_gen_movcond_i32(jmp_pc, cpu_srf, zero, jmp_pc, zero, op0 == 0x03 ? TCG_COND_NE : TCG_COND_EQ); Although I'd wonder about just using setcond instead, since I think the value stored in jmp_pc here is also stored in dc->j_target, leading to the right behaviour... > case JUMP_BRANCH: > { > int l1 = gen_new_label(); > - tcg_gen_brcondi_tl(TCG_COND_NE, dc->btaken, 0, l1); > + tcg_gen_brcondi_tl(TCG_COND_NE, jmp_pc, 0, l1); > gen_goto_tb(dc, 1, dc->pc); > gen_set_label(l1); > - tcg_temp_free(dc->btaken); > gen_goto_tb(dc, 0, dc->j_target); > break; ... here. > + case JUMP_BRANCH_DELAYED: > + { > + int l1 = gen_new_label(); > + tcg_gen_brcondi_tl(TCG_COND_NE, jmp_pc, 0, l1); > + gen_goto_tb(dc, 1, dc->pc); > + gen_set_label(l1); > + tcg_gen_mov_tl(cpu_pc, jmp_pc); > + tcg_gen_exit_tb(0); > + break; ... > + > + dc->delayed_branch = !!(dc->tb_flags & D_FLAG); > + if ((dc->delayed_branch) && (dc->tb_flags&B_FLAG)) { > + dc->j_state = JUMP_BRANCH_DELAYED; > + } > + And thus I can't see how these additions are actually useful? If I've missed something, and the last hunk needs to be retained, then please fix the coding style: if (dc->delayed_branch && (dc->tb_flags & B_FLAG)) { r~