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