]> git.proxmox.com Git - qemu.git/blame - include/exec/gen-icount.h
tcg: Don't make exitreq flag a local temporary
[qemu.git] / include / exec / gen-icount.h
CommitLineData
cb9c377f
PB
1#ifndef GEN_ICOUNT_H
2#define GEN_ICOUNT_H 1
3
1de7afc9 4#include "qemu/timer.h"
29e922b6 5
bf20dc07 6/* Helpers for instruction counting code generation. */
dd5d6fe9
PB
7
8static TCGArg *icount_arg;
9static int icount_label;
378df4b2 10static int exitreq_label;
dd5d6fe9 11
806f352d 12static inline void gen_tb_start(void)
dd5d6fe9 13{
a7812ae4 14 TCGv_i32 count;
378df4b2
PM
15 TCGv_i32 flag;
16
17 exitreq_label = gen_new_label();
a4960ef3 18 flag = tcg_temp_new_i32();
378df4b2
PM
19 tcg_gen_ld_i32(flag, cpu_env,
20 offsetof(CPUState, tcg_exit_req) - ENV_OFFSET);
21 tcg_gen_brcondi_i32(TCG_COND_NE, flag, 0, exitreq_label);
22 tcg_temp_free_i32(flag);
dd5d6fe9
PB
23
24 if (!use_icount)
25 return;
26
27 icount_label = gen_new_label();
a7812ae4 28 count = tcg_temp_local_new_i32();
9349b4f9 29 tcg_gen_ld_i32(count, cpu_env, offsetof(CPUArchState, icount_decr.u32));
dd5d6fe9 30 /* This is a horrid hack to allow fixing up the value later. */
c4afe5c4 31 icount_arg = tcg_ctx.gen_opparam_ptr + 1;
dd5d6fe9
PB
32 tcg_gen_subi_i32(count, count, 0xdeadbeef);
33
34 tcg_gen_brcondi_i32(TCG_COND_LT, count, 0, icount_label);
9349b4f9 35 tcg_gen_st16_i32(count, cpu_env, offsetof(CPUArchState, icount_decr.u16.low));
a7812ae4 36 tcg_temp_free_i32(count);
dd5d6fe9
PB
37}
38
806f352d 39static void gen_tb_end(TranslationBlock *tb, int num_insns)
dd5d6fe9 40{
378df4b2
PM
41 gen_set_label(exitreq_label);
42 tcg_gen_exit_tb((tcg_target_long)tb + TB_EXIT_REQUESTED);
43
dd5d6fe9
PB
44 if (use_icount) {
45 *icount_arg = num_insns;
46 gen_set_label(icount_label);
0980011b 47 tcg_gen_exit_tb((tcg_target_long)tb + TB_EXIT_ICOUNT_EXPIRED);
dd5d6fe9
PB
48 }
49}
50
86178a57 51static inline void gen_io_start(void)
dd5d6fe9 52{
a7812ae4 53 TCGv_i32 tmp = tcg_const_i32(1);
9349b4f9 54 tcg_gen_st_i32(tmp, cpu_env, offsetof(CPUArchState, can_do_io));
a7812ae4 55 tcg_temp_free_i32(tmp);
dd5d6fe9
PB
56}
57
58static inline void gen_io_end(void)
59{
a7812ae4 60 TCGv_i32 tmp = tcg_const_i32(0);
9349b4f9 61 tcg_gen_st_i32(tmp, cpu_env, offsetof(CPUArchState, can_do_io));
a7812ae4 62 tcg_temp_free_i32(tmp);
dd5d6fe9 63}
cb9c377f
PB
64
65#endif