Commit a23a9ec615e160c9ac008f27d554a79255ca27b0

Authored by bellard
1 parent 95af5ce5

profiler clean up

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4537 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 2 changed files with 93 additions and 13 deletions
tcg/tcg.c
... ... @@ -1156,10 +1156,7 @@ void tcg_liveness_analysis(TCGContext *s)
1156 1156 }
1157 1157 tcg_set_nop(s, gen_opc_buf + op_index, args, def->nb_args);
1158 1158 #ifdef CONFIG_PROFILER
1159   - {
1160   - extern int64_t dyngen_tcg_del_op_count;
1161   - dyngen_tcg_del_op_count++;
1162   - }
  1159 + s->del_op_count++;
1163 1160 #endif
1164 1161 } else {
1165 1162 do_not_remove:
... ... @@ -1822,7 +1819,13 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf,
1822 1819 }
1823 1820 #endif
1824 1821  
  1822 +#ifdef CONFIG_PROFILER
  1823 + s->la_time -= profile_getclock();
  1824 +#endif
1825 1825 tcg_liveness_analysis(s);
  1826 +#ifdef CONFIG_PROFILER
  1827 + s->la_time += profile_getclock();
  1828 +#endif
1826 1829  
1827 1830 #ifdef DEBUG_DISAS
1828 1831 if (unlikely(loglevel & CPU_LOG_TB_OP_OPT)) {
... ... @@ -1911,10 +1914,7 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf,
1911 1914 case 0 ... INDEX_op_end - 1:
1912 1915 /* legacy dyngen ops */
1913 1916 #ifdef CONFIG_PROFILER
1914   - {
1915   - extern int64_t dyngen_old_op_count;
1916   - dyngen_old_op_count++;
1917   - }
  1917 + s->old_op_count++;
1918 1918 #endif
1919 1919 tcg_reg_alloc_bb_end(s);
1920 1920 if (search_pc >= 0) {
... ... @@ -1954,13 +1954,15 @@ int dyngen_code(TCGContext *s, uint8_t *gen_code_buf)
1954 1954 {
1955 1955 #ifdef CONFIG_PROFILER
1956 1956 {
1957   - extern int64_t dyngen_op_count;
1958   - extern int dyngen_op_count_max;
1959 1957 int n;
1960 1958 n = (gen_opc_ptr - gen_opc_buf);
1961   - dyngen_op_count += n;
1962   - if (n > dyngen_op_count_max)
1963   - dyngen_op_count_max = n;
  1959 + s->op_count += n;
  1960 + if (n > s->op_count_max)
  1961 + s->op_count_max = n;
  1962 +
  1963 + s->temp_count += s->nb_temps;
  1964 + if (s->nb_temps > s->temp_count_max)
  1965 + s->temp_count_max = s->nb_temps;
1964 1966 }
1965 1967 #endif
1966 1968  
... ... @@ -1980,3 +1982,60 @@ int dyngen_code_search_pc(TCGContext *s, uint8_t *gen_code_buf, long offset)
1980 1982 {
1981 1983 return tcg_gen_code_common(s, gen_code_buf, offset);
1982 1984 }
  1985 +
  1986 +#ifdef CONFIG_PROFILER
  1987 +void tcg_dump_info(FILE *f,
  1988 + int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
  1989 +{
  1990 + TCGContext *s = &tcg_ctx;
  1991 + int64_t tot;
  1992 +
  1993 + tot = s->interm_time + s->code_time;
  1994 + cpu_fprintf(f, "JIT cycles %" PRId64 " (%0.3f s at 2.4 GHz)\n",
  1995 + tot, tot / 2.4e9);
  1996 + cpu_fprintf(f, "translated TBs %" PRId64 " (aborted=%" PRId64 " %0.1f%%)\n",
  1997 + s->tb_count,
  1998 + s->tb_count1 - s->tb_count,
  1999 + s->tb_count1 ? (double)(s->tb_count1 - s->tb_count) / s->tb_count1 * 100.0 : 0);
  2000 + cpu_fprintf(f, "avg ops/TB %0.1f max=%d\n",
  2001 + s->tb_count ? (double)s->op_count / s->tb_count : 0, s->op_count_max);
  2002 + cpu_fprintf(f, "old ops/total ops %0.1f%%\n",
  2003 + s->op_count ? (double)s->old_op_count / s->op_count * 100.0 : 0);
  2004 + cpu_fprintf(f, "deleted ops/TB %0.2f\n",
  2005 + s->tb_count ?
  2006 + (double)s->del_op_count / s->tb_count : 0);
  2007 + cpu_fprintf(f, "avg temps/TB %0.2f max=%d\n",
  2008 + s->tb_count ?
  2009 + (double)s->temp_count / s->tb_count : 0,
  2010 + s->temp_count_max);
  2011 +
  2012 + cpu_fprintf(f, "cycles/op %0.1f\n",
  2013 + s->op_count ? (double)tot / s->op_count : 0);
  2014 + cpu_fprintf(f, "cycles/in byte %0.1f\n",
  2015 + s->code_in_len ? (double)tot / s->code_in_len : 0);
  2016 + cpu_fprintf(f, "cycles/out byte %0.1f\n",
  2017 + s->code_out_len ? (double)tot / s->code_out_len : 0);
  2018 + if (tot == 0)
  2019 + tot = 1;
  2020 + cpu_fprintf(f, " gen_interm time %0.1f%%\n",
  2021 + (double)s->interm_time / tot * 100.0);
  2022 + cpu_fprintf(f, " gen_code time %0.1f%%\n",
  2023 + (double)s->code_time / tot * 100.0);
  2024 + cpu_fprintf(f, "liveness/code time %0.1f%%\n",
  2025 + (double)s->la_time / (s->code_time ? s->code_time : 1) * 100.0);
  2026 + cpu_fprintf(f, "cpu_restore count %" PRId64 "\n",
  2027 + s->restore_count);
  2028 + cpu_fprintf(f, " avg cycles %0.1f\n",
  2029 + s->restore_count ? (double)s->restore_time / s->restore_count : 0);
  2030 + {
  2031 + extern void dump_op_count(void);
  2032 + dump_op_count();
  2033 + }
  2034 +}
  2035 +#else
  2036 +void dump_tcg_info(FILE *f,
  2037 + int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
  2038 +{
  2039 + cpu_fprintf("[TCG profiler not compiled]\n");
  2040 +}
  2041 +#endif
... ...
tcg/tcg.h
... ... @@ -236,6 +236,25 @@ struct TCGContext {
236 236 TCGHelperInfo *helpers;
237 237 int nb_helpers;
238 238 int allocated_helpers;
  239 +
  240 +#ifdef CONFIG_PROFILER
  241 + /* profiling info */
  242 + int64_t tb_count1;
  243 + int64_t tb_count;
  244 + int64_t op_count; /* total insn count */
  245 + int op_count_max; /* max insn per TB */
  246 + int64_t temp_count;
  247 + int temp_count_max;
  248 + int64_t old_op_count;
  249 + int64_t del_op_count;
  250 + int64_t code_in_len;
  251 + int64_t code_out_len;
  252 + int64_t interm_time;
  253 + int64_t code_time;
  254 + int64_t la_time;
  255 + int64_t restore_count;
  256 + int64_t restore_time;
  257 +#endif
239 258 };
240 259  
241 260 extern TCGContext tcg_ctx;
... ... @@ -281,6 +300,8 @@ TCGv tcg_global_mem_new(TCGType type, int reg, tcg_target_long offset,
281 300 const char *name);
282 301 TCGv tcg_temp_new(TCGType type);
283 302 char *tcg_get_arg_str(TCGContext *s, char *buf, int buf_size, TCGv arg);
  303 +void tcg_dump_info(FILE *f,
  304 + int (*cpu_fprintf)(FILE *f, const char *fmt, ...));
284 305  
285 306 #define TCG_CT_ALIAS 0x80
286 307 #define TCG_CT_IALIAS 0x40
... ...