Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
accel/tcg: Move most of gen-icount.h into translator.c
The only usage of gen_tb_start and gen_tb_end are here. Move the static icount_start_insn variable into a local within translator_loop. Simplify the two subroutines by passing in the existing local cflags variable. Leave only the declaration of gen_io_start in gen-icount.h. Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
- Loading branch information
Showing
2 changed files
with
82 additions
and
80 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,83 +1,6 @@ | ||
| #ifndef GEN_ICOUNT_H | ||
| #define GEN_ICOUNT_H | ||
|
|
||
| #include "exec/exec-all.h" | ||
|
|
||
| /* Helpers for instruction counting code generation. */ | ||
|
|
||
| static TCGOp *icount_start_insn; | ||
|
|
||
| static inline void gen_io_start(void) | ||
| { | ||
| tcg_gen_st_i32(tcg_constant_i32(1), cpu_env, | ||
| offsetof(ArchCPU, parent_obj.can_do_io) - | ||
| offsetof(ArchCPU, env)); | ||
| } | ||
|
|
||
| static inline void gen_tb_start(const TranslationBlock *tb) | ||
| { | ||
| TCGv_i32 count = tcg_temp_new_i32(); | ||
|
|
||
| tcg_gen_ld_i32(count, cpu_env, | ||
| offsetof(ArchCPU, neg.icount_decr.u32) - | ||
| offsetof(ArchCPU, env)); | ||
|
|
||
| if (tb_cflags(tb) & CF_USE_ICOUNT) { | ||
| /* | ||
| * We emit a sub with a dummy immediate argument. Keep the insn index | ||
| * of the sub so that we later (when we know the actual insn count) | ||
| * can update the argument with the actual insn count. | ||
| */ | ||
| tcg_gen_sub_i32(count, count, tcg_constant_i32(0)); | ||
| icount_start_insn = tcg_last_op(); | ||
| } | ||
|
|
||
| /* | ||
| * Emit the check against icount_decr.u32 to see if we should exit | ||
| * unless we suppress the check with CF_NOIRQ. If we are using | ||
| * icount and have suppressed interruption the higher level code | ||
| * should have ensured we don't run more instructions than the | ||
| * budget. | ||
| */ | ||
| if (tb_cflags(tb) & CF_NOIRQ) { | ||
| tcg_ctx->exitreq_label = NULL; | ||
| } else { | ||
| tcg_ctx->exitreq_label = gen_new_label(); | ||
| tcg_gen_brcondi_i32(TCG_COND_LT, count, 0, tcg_ctx->exitreq_label); | ||
| } | ||
|
|
||
| if (tb_cflags(tb) & CF_USE_ICOUNT) { | ||
| tcg_gen_st16_i32(count, cpu_env, | ||
| offsetof(ArchCPU, neg.icount_decr.u16.low) - | ||
| offsetof(ArchCPU, env)); | ||
| /* | ||
| * cpu->can_do_io is cleared automatically here at the beginning of | ||
| * each translation block. The cost is minimal and only paid for | ||
| * -icount, plus it would be very easy to forget doing it in the | ||
| * translator. Doing it here means we don't need a gen_io_end() to | ||
| * go with gen_io_start(). | ||
| */ | ||
| tcg_gen_st_i32(tcg_constant_i32(0), cpu_env, | ||
| offsetof(ArchCPU, parent_obj.can_do_io) - | ||
| offsetof(ArchCPU, env)); | ||
| } | ||
| } | ||
|
|
||
| static inline void gen_tb_end(const TranslationBlock *tb, int num_insns) | ||
| { | ||
| if (tb_cflags(tb) & CF_USE_ICOUNT) { | ||
| /* | ||
| * Update the num_insn immediate parameter now that we know | ||
| * the actual insn count. | ||
| */ | ||
| tcg_set_insn_param(icount_start_insn, 2, | ||
| tcgv_i32_arg(tcg_constant_i32(num_insns))); | ||
| } | ||
|
|
||
| if (tcg_ctx->exitreq_label) { | ||
| gen_set_label(tcg_ctx->exitreq_label); | ||
| tcg_gen_exit_tb(tb, TB_EXIT_REQUESTED); | ||
| } | ||
| } | ||
| void gen_io_start(void); | ||
|
|
||
| #endif |