From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34093) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VbEbg-0003tw-Ny for qemu-devel@nongnu.org; Tue, 29 Oct 2013 15:05:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VbEbV-0005Q6-9l for qemu-devel@nongnu.org; Tue, 29 Oct 2013 15:05:36 -0400 Received: from www11.your-server.de ([213.133.104.11]:59965) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VbEbV-0005PX-3p for qemu-devel@nongnu.org; Tue, 29 Oct 2013 15:05:25 -0400 From: Sebastian Macke Date: Tue, 29 Oct 2013 20:04:44 +0100 Message-Id: <1383073495-5332-3-git-send-email-sebastian@macke.de> In-Reply-To: <1383073495-5332-1-git-send-email-sebastian@macke.de> References: <1383073495-5332-1-git-send-email-sebastian@macke.de> Subject: [Qemu-devel] [PATCH 02/13] target-openrisc: Separate Delayed slot handling from main loop List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, proljc@gmail.com Cc: Sebastian Macke , openrisc@lists.openrisc.net, openrisc@lists.opencores.org To increase the readability the delayed slot handling is separated to a function Signed-off-by: Sebastian Macke --- target-openrisc/translate.c | 46 +++++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/target-openrisc/translate.c b/target-openrisc/translate.c index 1047661..31f8717 100644 --- a/target-openrisc/translate.c +++ b/target-openrisc/translate.c @@ -1655,6 +1655,35 @@ static void check_breakpoint(OpenRISCCPU *cpu, DisasContext *dc) } } +static void handle_delay_slot(DisasContext *dc) +{ + dc->tb_flags &= ~D_FLAG; + gen_sync_flags(dc); + + switch (dc->j_state) { + case JUMP_BRANCH: + { + int l1 = gen_new_label(); + tcg_gen_brcondi_tl(TCG_COND_NE, dc->btaken, 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; + } + case JUMP_STATIC: + gen_goto_tb(dc, 0, dc->j_target); + break; + case JUMP_DYNAMIC: + default: + tcg_gen_mov_tl(cpu_pc, jmp_pc); + tcg_gen_exit_tb(0); + break; + } + dc->is_jmp = DISAS_JUMP; +} + + static inline void gen_intermediate_code_internal(OpenRISCCPU *cpu, TranslationBlock *tb, int search_pc) @@ -1726,22 +1755,7 @@ static inline void gen_intermediate_code_internal(OpenRISCCPU *cpu, if (dc->delayed_branch) { dc->delayed_branch--; if (!dc->delayed_branch) { - dc->tb_flags &= ~D_FLAG; - gen_sync_flags(dc); - if (dc->j_state == JUMP_BRANCH) { - int l1 = gen_new_label(); - tcg_gen_brcondi_tl(TCG_COND_NE, dc->btaken, 0, l1); - gen_goto_tb(dc, 1, dc->pc); - gen_set_label(l1); - gen_goto_tb(dc, 0, dc->j_target); - tcg_temp_free(dc->btaken); - } else if (dc->j_state == JUMP_STATIC) { - gen_goto_tb(dc, 0, dc->j_target); - } else { - tcg_gen_mov_tl(cpu_pc, jmp_pc); - tcg_gen_exit_tb(0); - } - dc->is_jmp = DISAS_JUMP; + handle_delay_slot(dc); break; } } -- 1.8.4.1