fixed decimal number parsing
[libfirm] / ir / stat / const_stat.c
index 17b10ff..1561306 100644 (file)
@@ -8,15 +8,17 @@
  * Copyright:   (c) 2004 Universität Karlsruhe
  * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
  */
-#include "firmstat_t.h"
-#include "tv.h"
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
 
-static stat_info_t *status;
+#include "firmstat_t.h"
+#include "tv_t.h"
 
 /**
- * calculated the dual logarithmus of |value|
+ * calculated the dual logarithm of |value|
  */
-static unsigned log2(long value) {
+static unsigned log2abs(long value) {
   unsigned res = 0;
 
   if (value < 0)
@@ -46,30 +48,64 @@ static unsigned log2(long value) {
 }
 
 /**
- * update info on Consts
- *
- * @param node   The Const node
- * @param graph  The graph entry containing the call
+ * classify the value of a float tarval
  */
+static float_classify_t classify_float_value(tarval *tv)
+{
+  ir_mode *mode = get_tarval_mode(tv);
+
+  if (tv == get_mode_null(mode))
+    return STAT_FC_1;
+  else if (tv == get_mode_one(mode))
+    return STAT_FC_1;
+
+  return STAT_FC_OTHER;
+}
+
+/* return a human readable name for an float 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";
+  case STAT_FC_2:     return "2.0";
+  case STAT_FC_0_5:   return "0.5";
+  case STAT_FC_EXACT: return "exact";
+  case STAT_FC_OTHER: return "other";
+  default:            return "<UNKNOWN>";
+  }
+}
+
+/* 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;
 
-  /* we handle integer modes only here */
-  if (! mode_is_int(mode)) {
-    cnt_inc(&status->const_info.others);
-    return;
-  }
+  if (mode_is_int(mode)) {
+    tv   = get_Const_tarval(node);
+
+    /* FIXME: */
+    if (! tarval_is_long(tv))
+      return;
 
-  tv   = get_Const_tarval(node);
-  bits = log2(get_tarval_long(tv));
+    bits = log2abs(get_tarval_long(tv));
 
-  if (bits > ARR_SIZE(status->const_info.bits_count))
-    bits = ARR_SIZE(status->const_info.bits_count);
+    if (bits > ARR_SIZE(status->const_info.int_bits_count))
+      bits = ARR_SIZE(status->const_info.int_bits_count);
+
+    cnt_inc(&status->const_info.int_bits_count[bits]);
+  }
+  else if (mode_is_float(mode)) {
+    tv = get_Const_tarval(node);
 
-  cnt_inc(&status->const_info.bits_count[bits]);
+    cnt_inc(&status->const_info.floats[classify_float_value(tv)]);
+  }
+  else {
+    /* something different */
+    cnt_inc(&status->const_info.others);
+  }
 }
 
 /* clears the const statistics for a new snapshot */
@@ -77,8 +113,12 @@ void stat_const_clear(stat_info_t *status)
 {
   int i;
 
-  for (i = 0; i < ARR_SIZE(status->const_info.bits_count); ++i)
-    cnt_clr(&status->const_info.bits_count[i]);
+  for (i = 0; i < ARR_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)
+    cnt_clr(&status->const_info.floats[i]);
+
   cnt_clr(&status->const_info.others);
 }