Added support for out edges.
[libfirm] / ir / ir / irarch.c
index 053a695..e539e20 100644 (file)
 #include "dbginfo_t.h"
 #include "iropt_dbg.h"
 #include "irflag_t.h"
-#include "firmstat.h"
+#include "irhooks.h"
 #include "ircons.h"
 #include "irarch.h"
-#include "firmstat.h"
 
 #undef DEB
 
@@ -88,6 +87,14 @@ void arch_dep_set_opts(arch_dep_opts_t the_opts) {
   opts = the_opts;
 }
 
+/* check, wheater a mode allows a Mulh instruction */
+static int allow_Mulh(ir_mode *mode)
+{
+  if (get_mode_size_bits(mode) > params->max_bits_for_mulh)
+    return 0;
+  return (mode_is_signed(mode) && params->allow_mulhs) || (!mode_is_signed(mode) && params->allow_mulhu);
+}
+
 ir_node *arch_dep_replace_mul_with_shifts(ir_node *irn)
 {
   ir_node *res = irn;
@@ -330,7 +337,7 @@ ir_node *arch_dep_replace_mul_with_shifts(ir_node *irn)
   }
 
   if (res != irn)
-    stat_arch_dep_replace_mul_with_shifts(irn);
+    hook_arch_dep_replace_mul_with_shifts(irn);
 
   return res;
 }
@@ -692,14 +699,13 @@ ir_node *arch_dep_replace_div_by_const(ir_node *irn)
     }
     else {
       /* other constant */
-      if ((mode_is_signed(mode) && params->allow_mulhs) ||
-          (!mode_is_signed(mode) && params->allow_mulhu))
+      if (allow_Mulh(mode))
         res = replace_div_by_mulh(irn, tv);
     }
   }
 
   if (res != irn)
-    stat_arch_dep_replace_div_by_const(irn);
+    hook_arch_dep_replace_div_by_const(irn);
 
   return res;
 }
@@ -777,8 +783,7 @@ ir_node *arch_dep_replace_mod_by_const(ir_node *irn)
     }
     else {
       /* other constant */
-      if ((mode_is_signed(mode) && params->allow_mulhs) ||
-          (!mode_is_signed(mode) && params->allow_mulhu)) {
+      if (allow_Mulh(mode)) {
         res = replace_div_by_mulh(irn, tv);
 
         res = new_rd_Mul(dbg, current_ir_graph, block, res, c, mode);
@@ -791,7 +796,7 @@ ir_node *arch_dep_replace_mod_by_const(ir_node *irn)
   }
 
   if (res != irn)
-    stat_arch_dep_replace_mod_by_const(irn);
+    hook_arch_dep_replace_mod_by_const(irn);
 
   return res;
 }
@@ -883,8 +888,7 @@ void arch_dep_replace_divmod_by_const(ir_node **div, ir_node **mod, ir_node *irn
     }
     else {
       /* other constant */
-      if ((mode_is_signed(mode) && params->allow_mulhs) ||
-          (!mode_is_signed(mode) && params->allow_mulhu)) {
+      if (allow_Mulh(mode)) {
         ir_node *t;
 
         *div = replace_div_by_mulh(irn, tv);
@@ -899,7 +903,7 @@ void arch_dep_replace_divmod_by_const(ir_node **div, ir_node **mod, ir_node *irn
   }
 
   if (*div)
-    stat_arch_dep_replace_DivMod_by_const(irn);
+    hook_arch_dep_replace_DivMod_by_const(irn);
 }