2 * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved.
4 * This file is part of libFirm.
6 * This file may be distributed and/or modified under the terms of the
7 * GNU General Public License version 2 as published by the Free Software
8 * Foundation and appearing in the file LICENSE.GPL included in the
9 * packaging of this file.
11 * Licensees holding valid libFirm Professional Edition licenses may use
12 * this file in accordance with the libFirm Commercial License.
13 * Agreement provided with the Software.
15 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * @brief Statistic functions for constant counting.
23 * @author Michael Beck
30 #include "firmstat_t.h"
34 * calculated the dual logarithm of |value|
36 static unsigned log2abs(long value) {
66 * classify the value of a float tarval
68 static float_classify_t classify_float_value(tarval *tv) {
69 ir_mode *mode = get_tarval_mode(tv);
71 if (tv == get_mode_null(mode))
73 else if (tv == get_mode_one(mode))
75 else if (tarval_is_finite(tv) && tarval_ieee754_zero_mantissa(tv)) {
76 int exp = tarval_ieee754_get_exponent(tv);
78 if (! tarval_is_negative(tv)) {
84 return STAT_FC_POWER_OF_TWO;
89 /* return a human readable name for an float classification */
90 const char *stat_fc_name(float_classify_t classification) {
91 switch (classification) {
92 case STAT_FC_0: return "0.0";
93 case STAT_FC_1: return "1.0";
94 case STAT_FC_2: return "2.0";
95 case STAT_FC_0_5: return "0.5";
96 case STAT_FC_POWER_OF_TWO: return "2.0^x";
97 case STAT_FC_OTHER: return "other";
98 default: return "<UNKNOWN>";
102 /* update info on Consts */
103 void stat_update_const(stat_info_t *status, ir_node *node, graph_entry_t *graph)
105 ir_mode *mode = get_irn_mode(node);
110 if (mode_is_int(mode)) {
111 tv = get_Const_tarval(node);
114 if (! tarval_is_long(tv))
117 bits = log2abs(get_tarval_long(tv));
119 if (bits > ARR_SIZE(status->const_info.int_bits_count))
120 bits = ARR_SIZE(status->const_info.int_bits_count);
122 cnt_inc(&status->const_info.int_bits_count[bits]);
123 } else if (mode_is_float(mode)) {
124 tv = get_Const_tarval(node);
126 cnt_inc(&status->const_info.floats[classify_float_value(tv)]);
128 /* something different */
129 cnt_inc(&status->const_info.others);
133 /* clears the const statistics for a new snapshot */
134 void stat_const_clear(stat_info_t *status) {
137 for (i = 0; i < ARR_SIZE(status->const_info.int_bits_count); ++i)
138 cnt_clr(&status->const_info.int_bits_count[i]);
140 for (i = 0; i < ARR_SIZE(status->const_info.floats); ++i)
141 cnt_clr(&status->const_info.floats[i]);
143 cnt_clr(&status->const_info.others);
146 /* initialize the Const statistic. */
147 void stat_init_const_cnt(stat_info_t *status) {
149 /* currently nothing */