root / gen-icount.h @ 73f5e313
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 | } |