bechordal: Remove remnants of the long gone split phase.
[libfirm] / ir / stat / const_stat.c
index 4fd5b20..8941fa1 100644 (file)
  * @file
  * @brief   Statistic functions for constant counting.
  * @author  Michael Beck
- * @version $Id$
  */
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include "config.h"
 
 #include "firmstat_t.h"
 #include "tv_t.h"
+#include "util.h"
 
 /**
  * calculated the dual logarithm of |value|
  */
-static unsigned log2abs(long value) {
+static unsigned log2abs(long value)
+{
        unsigned res = 0;
 
        if (value < 0)
@@ -65,27 +64,31 @@ static unsigned log2abs(long value) {
 /**
  * classify the value of a float tarval
  */
-static float_classify_t classify_float_value(tarval *tv) {
+static float_classify_t classify_float_value(ir_tarval *tv)
+{
        ir_mode *mode = get_tarval_mode(tv);
 
        if (tv == get_mode_null(mode))
-               return STAT_FC_1;
+               return STAT_FC_0;
        else if (tv == get_mode_one(mode))
                return STAT_FC_1;
-       else if (tarval_ieee754_zero_mantissa(tv)) {
-               int exp = tarval_ieee754_get_exponent(tv);
-
-               if (exp == 1)
-                       return STAT_FC_2;
-               else if (exp == -1)
-                       return STAT_FC_0_5;
+       else if (tarval_is_finite(tv) && tarval_zero_mantissa(tv)) {
+               int exp = tarval_get_exponent(tv);
+
+               if (! tarval_is_negative(tv)) {
+                       if (exp == 1)
+                               return STAT_FC_2;
+                       else if (exp == -1)
+                               return STAT_FC_0_5;
+               }
                return STAT_FC_POWER_OF_TWO;
        }
        return STAT_FC_OTHER;
 }
 
 /* return a human readable name for an float classification */
-const char *stat_fc_name(float_classify_t classification) {
+const char *stat_fc_name(float_classify_t classification)
+{
        switch (classification) {
        case STAT_FC_0:            return "0.0";
        case STAT_FC_1:            return "1.0";
@@ -100,9 +103,9 @@ const char *stat_fc_name(float_classify_t classification) {
 /* update info on Consts */
 void stat_update_const(stat_info_t *status, ir_node *node, graph_entry_t *graph)
 {
-       ir_mode *mode = get_irn_mode(node);
-       tarval *tv;
-       unsigned bits;
+       ir_mode   *mode = get_irn_mode(node);
+       ir_tarval *tv;
+       unsigned   bits;
        (void) graph;
 
        if (mode_is_int(mode)) {
@@ -114,8 +117,8 @@ void stat_update_const(stat_info_t *status, ir_node *node, graph_entry_t *graph)
 
                bits = log2abs(get_tarval_long(tv));
 
-               if (bits > ARR_SIZE(status->const_info.int_bits_count))
-                       bits = ARR_SIZE(status->const_info.int_bits_count);
+               if (bits > ARRAY_SIZE(status->const_info.int_bits_count))
+                       bits = ARRAY_SIZE(status->const_info.int_bits_count);
 
                cnt_inc(&status->const_info.int_bits_count[bits]);
        } else if (mode_is_float(mode)) {
@@ -129,20 +132,22 @@ void stat_update_const(stat_info_t *status, ir_node *node, graph_entry_t *graph)
 }
 
 /* clears the const statistics for a new snapshot */
-void stat_const_clear(stat_info_t *status) {
+void stat_const_clear(stat_info_t *status)
+{
        size_t i;
 
-       for (i = 0; i < ARR_SIZE(status->const_info.int_bits_count); ++i)
+       for (i = 0; i < ARRAY_SIZE(status->const_info.int_bits_count); ++i)
                cnt_clr(&status->const_info.int_bits_count[i]);
 
-       for (i = 0; i < ARR_SIZE(status->const_info.floats); ++i)
+       for (i = 0; i < ARRAY_SIZE(status->const_info.floats); ++i)
                cnt_clr(&status->const_info.floats[i]);
 
        cnt_clr(&status->const_info.others);
 }
 
 /* initialize the Const statistic. */
-void stat_init_const_cnt(stat_info_t *status) {
+void stat_init_const_cnt(stat_info_t *status)
+{
        (void) status;
        /* currently nothing */
 }