diff options
author | Richard Henderson | 2017-05-25 04:17:51 +0200 |
---|---|---|
committer | Richard Henderson | 2017-06-05 18:25:42 +0200 |
commit | 2d826cdc8a43ba1817a44f481f8dc8f08668b0a6 (patch) | |
tree | dafa5ae8bfd6aa13c76af9675c9ae2b8506b05d7 /target/alpha/translate.c | |
parent | target/alpha: Implement WTINT inline (diff) | |
download | qemu-2d826cdc8a43ba1817a44f481f8dc8f08668b0a6.tar.gz qemu-2d826cdc8a43ba1817a44f481f8dc8f08668b0a6.tar.xz qemu-2d826cdc8a43ba1817a44f481f8dc8f08668b0a6.zip |
target/alpha: Use goto_tb for fallthru between TBs
Signed-off-by: Richard Henderson <rth@twiddle.net>
Diffstat (limited to 'target/alpha/translate.c')
-rw-r--r-- | target/alpha/translate.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/target/alpha/translate.c b/target/alpha/translate.c index 4523c4cc85..7c45ae360c 100644 --- a/target/alpha/translate.c +++ b/target/alpha/translate.c @@ -89,6 +89,9 @@ typedef enum { updated the PC for the next instruction to be executed. */ EXIT_PC_STALE, + /* We are exiting the TB due to page crossing or space constraints. */ + EXIT_FALLTHRU, + /* We are ending the TB with a noreturn function call, e.g. longjmp. No following code will be executed. */ EXIT_NORETURN, @@ -2984,7 +2987,7 @@ void gen_intermediate_code(CPUAlphaState *env, struct TranslationBlock *tb) || num_insns >= max_insns || singlestep || ctx.singlestep_enabled)) { - ret = EXIT_PC_STALE; + ret = EXIT_FALLTHRU; } } while (ret == NO_EXIT); @@ -2996,6 +2999,13 @@ void gen_intermediate_code(CPUAlphaState *env, struct TranslationBlock *tb) case EXIT_GOTO_TB: case EXIT_NORETURN: break; + case EXIT_FALLTHRU: + if (use_goto_tb(&ctx, ctx.pc)) { + tcg_gen_goto_tb(0); + tcg_gen_movi_i64(cpu_pc, ctx.pc); + tcg_gen_exit_tb((uintptr_t)ctx.tb); + } + /* FALLTHRU */ case EXIT_PC_STALE: tcg_gen_movi_i64(cpu_pc, ctx.pc); /* FALLTHRU */ @@ -3007,7 +3017,7 @@ void gen_intermediate_code(CPUAlphaState *env, struct TranslationBlock *tb) } break; default: - abort(); + g_assert_not_reached(); } gen_tb_end(tb, num_insns); |