added DBG_OPT_LEA( to report Lea craetion to the firm statistic module
[libfirm] / ir / be / ia32 / ia32_new_nodes.c
index e158fa8..2ddc467 100644 (file)
@@ -9,9 +9,11 @@
 #include "config.h"
 #endif
 
-#ifdef _WIN32
+#ifdef HAVE_MALLOC_H
 #include <malloc.h>
-#else
+#endif
+
+#ifdef HAVE_ALLOCA_H
 #include <alloca.h>
 #endif
 
 #include "ia32_new_nodes.h"
 #include "gen_ia32_regalloc_if.h"
 
-#ifdef obstack_chunk_alloc
-# undef obstack_chunk_alloc
-# define obstack_chunk_alloc xmalloc
-#else
-# define obstack_chunk_alloc xmalloc
-# define obstack_chunk_free free
-#endif
-
-extern int obstack_printf(struct obstack *obst, char *fmt, ...);
-
 /**
  * Returns the ident of a SymConst.
  * @param symc  The SymConst
@@ -445,8 +437,8 @@ ia32_am_type_t get_ia32_am_support(const ir_node *node) {
  * Sets the supported addrmode of an ia32 node
  */
 void set_ia32_am_support(ir_node *node, ia32_am_type_t am_tp) {
-       ia32_attr_t *attr = get_ia32_attr(node);
-       attr->data.am_support  = am_tp;
+       ia32_attr_t *attr     = get_ia32_attr(node);
+       attr->data.am_support = am_tp;
 }
 
 /**
@@ -461,8 +453,8 @@ ia32_am_flavour_t get_ia32_am_flavour(const ir_node *node) {
  * Sets the addrmode flavour of an ia32 node
  */
 void set_ia32_am_flavour(ir_node *node, ia32_am_flavour_t am_flavour) {
-       ia32_attr_t *attr = get_ia32_attr(node);
-       attr->data.am_flavour  = am_flavour;
+       ia32_attr_t *attr     = get_ia32_attr(node);
+       attr->data.am_flavour = am_flavour;
 }
 
 /**
@@ -765,6 +757,38 @@ void set_ia32_res_mode(ir_node *node, ir_mode *mode) {
        attr->res_mode    = mode;
 }
 
+/**
+ * Gets the source mode of conversion.
+ */
+ir_mode *get_ia32_src_mode(const ir_node *node) {
+       ia32_attr_t *attr = get_ia32_attr(node);
+       return attr->src_mode;
+}
+
+/**
+ * Sets the source mode of conversion.
+ */
+void set_ia32_src_mode(ir_node *node, ir_mode *mode) {
+       ia32_attr_t *attr = get_ia32_attr(node);
+       attr->src_mode    = mode;
+}
+
+/**
+ * Gets the target mode of conversion.
+ */
+ir_mode *get_ia32_tgt_mode(const ir_node *node) {
+       ia32_attr_t *attr = get_ia32_attr(node);
+       return attr->tgt_mode;
+}
+
+/**
+ * Sets the target mode of conversion.
+ */
+void set_ia32_tgt_mode(ir_node *node, ir_mode *mode) {
+       ia32_attr_t *attr = get_ia32_attr(node);
+       attr->tgt_mode    = mode;
+}
+
 /**
  * Gets the frame entity assigned to this node;
  */
@@ -1195,11 +1219,17 @@ void init_ia32_attributes(ir_node *node, arch_irn_flags_t flags, const ia32_regi
 
 /* default compare operation to compare immediate ops */
 int ia32_compare_immop_attr(ia32_attr_t *a, ia32_attr_t *b) {
+       int equ = 0;
+
        if (a->data.tp == b->data.tp) {
-               return a->cnst == b->cnst;
+               equ = (a->cnst == b->cnst);
+               equ = equ ? (a->data.use_frame == b->data.use_frame) : 0;
+
+               if (equ && a->data.use_frame && b->data.use_frame)
+                       equ = (a->frame_ent == b->frame_ent);
        }
 
-       return 1;
+       return !equ;
 }
 
 /* copies the ia32 attributes */
@@ -1228,9 +1258,5 @@ void ia32_register_copy_attr_func(void) {
        }
 }
 
-static void ia32_register_additional_opcodes(int n) {
-       /* we don't need any additional opcodes */
-}
-
 /* Include the generated constructor functions */
 #include "gen_ia32_new_nodes.c.inl"