3 * File name: ir/ir/firmstat.c
4 * Purpose: Statistics for Firm.
8 * Copyright: (c) 2004 Universität Karlsruhe
9 * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE.
11 #include "firmstat_t.h"
14 static stat_info_t *status;
17 * calculated the dual logarithmus of |value|
19 static unsigned log2abs(long value) {
49 * classify the value of a float tarval
51 static float_classify_t classify_float_value(tarval *tv)
53 ir_mode *mode = get_tarval_mode(tv);
55 if (tv == get_mode_null(mode))
57 else if (tv == get_mode_one(mode))
63 /* return a human readable name for an float classification */
64 const char *stat_fc_name(float_classify_t classification)
66 switch (classification) {
67 case STAT_FC_0: return "0.0";
68 case STAT_FC_1: return "1.0";
69 case STAT_FC_2: return "2.0";
70 case STAT_FC_0_5: return "0.5";
71 case STAT_FC_EXACT: return "exact";
72 case STAT_FC_OTHER: return "other";
73 default: return "<UNKNOWN>";
78 * update info on Consts
80 * @param status statistic status
81 * @param node The Const node
82 * @param graph The graph entry containing the call
84 void stat_update_const(stat_info_t *status, ir_node *node, graph_entry_t *graph)
86 ir_mode *mode = get_irn_mode(node);
90 if (mode_is_int(mode)) {
91 tv = get_Const_tarval(node);
94 if (! tarval_is_long(tv))
97 bits = log2abs(get_tarval_long(tv));
99 if (bits > ARR_SIZE(status->const_info.int_bits_count))
100 bits = ARR_SIZE(status->const_info.int_bits_count);
102 cnt_inc(&status->const_info.int_bits_count[bits]);
104 else if (mode_is_float(mode)) {
105 tv = get_Const_tarval(node);
107 cnt_inc(&status->const_info.floats[classify_float_value(tv)]);
110 /* something different */
111 cnt_inc(&status->const_info.others);
115 /* clears the const statistics for a new snapshot */
116 void stat_const_clear(stat_info_t *status)
120 for (i = 0; i < ARR_SIZE(status->const_info.int_bits_count); ++i)
121 cnt_clr(&status->const_info.int_bits_count[i]);
123 for (i = 0; i < ARR_SIZE(status->const_info.floats); ++i)
124 cnt_clr(&status->const_info.floats[i]);
126 cnt_clr(&status->const_info.others);
129 /* initialize the Const statistic. */
130 void stat_init_const_cnt(stat_info_t *status)