Statistics
| Branch: | Revision:

root / gen-icount.h @ a74cdab4

History | View | Annotate | Download (1.2 kB)

1 29e922b6 Blue Swirl
#include "qemu-timer.h"
2 29e922b6 Blue Swirl
3 bf20dc07 ths
/* Helpers for instruction counting code generation.  */
4 dd5d6fe9 pbrook
5 dd5d6fe9 pbrook
static TCGArg *icount_arg;
6 dd5d6fe9 pbrook
static int icount_label;
7 dd5d6fe9 pbrook
8 dd5d6fe9 pbrook
static inline void gen_icount_start(void)
9 dd5d6fe9 pbrook
{
10 a7812ae4 pbrook
    TCGv_i32 count;
11 dd5d6fe9 pbrook
12 dd5d6fe9 pbrook
    if (!use_icount)
13 dd5d6fe9 pbrook
        return;
14 dd5d6fe9 pbrook
15 dd5d6fe9 pbrook
    icount_label = gen_new_label();
16 a7812ae4 pbrook
    count = tcg_temp_local_new_i32();
17 dd5d6fe9 pbrook
    tcg_gen_ld_i32(count, cpu_env, offsetof(CPUState, icount_decr.u32));
18 dd5d6fe9 pbrook
    /* This is a horrid hack to allow fixing up the value later.  */
19 dd5d6fe9 pbrook
    icount_arg = gen_opparam_ptr + 1;
20 dd5d6fe9 pbrook
    tcg_gen_subi_i32(count, count, 0xdeadbeef);
21 dd5d6fe9 pbrook
22 dd5d6fe9 pbrook
    tcg_gen_brcondi_i32(TCG_COND_LT, count, 0, icount_label);
23 dd5d6fe9 pbrook
    tcg_gen_st16_i32(count, cpu_env, offsetof(CPUState, icount_decr.u16.low));
24 a7812ae4 pbrook
    tcg_temp_free_i32(count);
25 dd5d6fe9 pbrook
}
26 dd5d6fe9 pbrook
27 dd5d6fe9 pbrook
static void gen_icount_end(TranslationBlock *tb, int num_insns)
28 dd5d6fe9 pbrook
{
29 dd5d6fe9 pbrook
    if (use_icount) {
30 dd5d6fe9 pbrook
        *icount_arg = num_insns;
31 dd5d6fe9 pbrook
        gen_set_label(icount_label);
32 4b4a72e5 Stefan Weil
        tcg_gen_exit_tb((tcg_target_long)tb + 2);
33 dd5d6fe9 pbrook
    }
34 dd5d6fe9 pbrook
}
35 dd5d6fe9 pbrook
36 86178a57 Juan Quintela
static inline void gen_io_start(void)
37 dd5d6fe9 pbrook
{
38 a7812ae4 pbrook
    TCGv_i32 tmp = tcg_const_i32(1);
39 dd5d6fe9 pbrook
    tcg_gen_st_i32(tmp, cpu_env, offsetof(CPUState, can_do_io));
40 a7812ae4 pbrook
    tcg_temp_free_i32(tmp);
41 dd5d6fe9 pbrook
}
42 dd5d6fe9 pbrook
43 dd5d6fe9 pbrook
static inline void gen_io_end(void)
44 dd5d6fe9 pbrook
{
45 a7812ae4 pbrook
    TCGv_i32 tmp = tcg_const_i32(0);
46 dd5d6fe9 pbrook
    tcg_gen_st_i32(tmp, cpu_env, offsetof(CPUState, can_do_io));
47 a7812ae4 pbrook
    tcg_temp_free_i32(tmp);
48 dd5d6fe9 pbrook
}