File:  [Qemu by Fabrice Bellard] / qemu / gen-icount.h
Revision 1.1.1.3 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 18:24:23 2018 UTC (3 years, 1 month ago) by root
Branches: qemu, MAIN
CVS tags: qemu0150, qemu0141, qemu0140, qemu0130, HEAD
qemu 0.13.0

    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((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: }

unix.superglobalmegacorp.com