Commit a23a9ec615e160c9ac008f27d554a79255ca27b0
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,10 +1156,7 @@ void tcg_liveness_analysis(TCGContext *s) | ||
| 1156 | } | 1156 | } |
| 1157 | tcg_set_nop(s, gen_opc_buf + op_index, args, def->nb_args); | 1157 | tcg_set_nop(s, gen_opc_buf + op_index, args, def->nb_args); |
| 1158 | #ifdef CONFIG_PROFILER | 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 | #endif | 1160 | #endif |
| 1164 | } else { | 1161 | } else { |
| 1165 | do_not_remove: | 1162 | do_not_remove: |
| @@ -1822,7 +1819,13 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf, | @@ -1822,7 +1819,13 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf, | ||
| 1822 | } | 1819 | } |
| 1823 | #endif | 1820 | #endif |
| 1824 | 1821 | ||
| 1822 | +#ifdef CONFIG_PROFILER | ||
| 1823 | + s->la_time -= profile_getclock(); | ||
| 1824 | +#endif | ||
| 1825 | tcg_liveness_analysis(s); | 1825 | tcg_liveness_analysis(s); |
| 1826 | +#ifdef CONFIG_PROFILER | ||
| 1827 | + s->la_time += profile_getclock(); | ||
| 1828 | +#endif | ||
| 1826 | 1829 | ||
| 1827 | #ifdef DEBUG_DISAS | 1830 | #ifdef DEBUG_DISAS |
| 1828 | if (unlikely(loglevel & CPU_LOG_TB_OP_OPT)) { | 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,10 +1914,7 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf, | ||
| 1911 | case 0 ... INDEX_op_end - 1: | 1914 | case 0 ... INDEX_op_end - 1: |
| 1912 | /* legacy dyngen ops */ | 1915 | /* legacy dyngen ops */ |
| 1913 | #ifdef CONFIG_PROFILER | 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 | #endif | 1918 | #endif |
| 1919 | tcg_reg_alloc_bb_end(s); | 1919 | tcg_reg_alloc_bb_end(s); |
| 1920 | if (search_pc >= 0) { | 1920 | if (search_pc >= 0) { |
| @@ -1954,13 +1954,15 @@ int dyngen_code(TCGContext *s, uint8_t *gen_code_buf) | @@ -1954,13 +1954,15 @@ int dyngen_code(TCGContext *s, uint8_t *gen_code_buf) | ||
| 1954 | { | 1954 | { |
| 1955 | #ifdef CONFIG_PROFILER | 1955 | #ifdef CONFIG_PROFILER |
| 1956 | { | 1956 | { |
| 1957 | - extern int64_t dyngen_op_count; | ||
| 1958 | - extern int dyngen_op_count_max; | ||
| 1959 | int n; | 1957 | int n; |
| 1960 | n = (gen_opc_ptr - gen_opc_buf); | 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 | #endif | 1967 | #endif |
| 1966 | 1968 | ||
| @@ -1980,3 +1982,60 @@ int dyngen_code_search_pc(TCGContext *s, uint8_t *gen_code_buf, long offset) | @@ -1980,3 +1982,60 @@ int dyngen_code_search_pc(TCGContext *s, uint8_t *gen_code_buf, long offset) | ||
| 1980 | { | 1982 | { |
| 1981 | return tcg_gen_code_common(s, gen_code_buf, offset); | 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,6 +236,25 @@ struct TCGContext { | ||
| 236 | TCGHelperInfo *helpers; | 236 | TCGHelperInfo *helpers; |
| 237 | int nb_helpers; | 237 | int nb_helpers; |
| 238 | int allocated_helpers; | 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 | extern TCGContext tcg_ctx; | 260 | extern TCGContext tcg_ctx; |
| @@ -281,6 +300,8 @@ TCGv tcg_global_mem_new(TCGType type, int reg, tcg_target_long offset, | @@ -281,6 +300,8 @@ TCGv tcg_global_mem_new(TCGType type, int reg, tcg_target_long offset, | ||
| 281 | const char *name); | 300 | const char *name); |
| 282 | TCGv tcg_temp_new(TCGType type); | 301 | TCGv tcg_temp_new(TCGType type); |
| 283 | char *tcg_get_arg_str(TCGContext *s, char *buf, int buf_size, TCGv arg); | 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 | #define TCG_CT_ALIAS 0x80 | 306 | #define TCG_CT_ALIAS 0x80 |
| 286 | #define TCG_CT_IALIAS 0x40 | 307 | #define TCG_CT_IALIAS 0x40 |