added new attributes and get/set functions for allowed execution units
authorChristian Würdig <chriswue@ipd.info.uni-karlsruhe.de>
Tue, 24 Oct 2006 12:26:50 +0000 (12:26 +0000)
committerChristian Würdig <chriswue@ipd.info.uni-karlsruhe.de>
Tue, 24 Oct 2006 12:26:50 +0000 (12:26 +0000)
ir/be/ia32/ia32_new_nodes.c
ir/be/ia32/ia32_new_nodes.h
ir/be/ia32/ia32_nodes_attr.h

index e509b21..9369172 100644 (file)
@@ -35,6 +35,7 @@
 #include "ia32_nodes_attr.h"
 #include "ia32_new_nodes.h"
 #include "gen_ia32_regalloc_if.h"
+#include "gen_ia32_machine.h"
 
 /**
  * Returns the ident of a SymConst.
@@ -1092,6 +1093,22 @@ arch_irn_flags_t get_ia32_out_flags(const ir_node *node, int pos) {
        return pos < (int)attr->data.n_res ? attr->out_flags[pos] : arch_irn_flags_none;
 }
 
+/**
+ * Set the number of available execution units for this node.
+ */
+void set_ia32_n_exec_units(ir_node *node, unsigned n) {
+       ia32_attr_t *attr  = get_ia32_attr(node);
+       attr->n_exec_units = n;
+}
+
+/**
+ * Get the number of available execution units for this node.
+ */
+unsigned get_ia32_n_exec_units(const ir_node *node) {
+       ia32_attr_t *attr = get_ia32_attr(node);
+       return attr->n_exec_units;
+}
+
 #ifndef NDEBUG
 
 /**
@@ -1339,18 +1356,30 @@ const arch_register_t *get_ia32_out_reg(const ir_node *node, int pos) {
  * Initializes the nodes attributes.
  */
 void init_ia32_attributes(ir_node *node, arch_irn_flags_t flags, const ia32_register_req_t **in_reqs,
-                                                 const ia32_register_req_t **out_reqs, int n_res, unsigned latency)
+                                                 const ia32_register_req_t **out_reqs, const be_execution_unit_t **execution_units,
+                                                 int n_res, unsigned latency)
 {
-       ia32_attr_t *attr = get_ia32_attr(node);
+       ia32_attr_t         *attr = get_ia32_attr(node);
+       unsigned            i;
+       be_execution_unit_t *unit;
+
        set_ia32_flags(node, flags);
        set_ia32_in_req_all(node, in_reqs);
        set_ia32_out_req_all(node, out_reqs);
        set_ia32_latency(node, latency);
+       set_ia32_n_res(node, n_res);
+
+       if (execution_units) {
+               for (i = 0, unit = execution_units[0]; unit; unit = execution_units[++i])
+                       /* do nothing but count number of given units */ ;
+               set_ia32_n_exec_units(node, i);
+               attr->exec_units = execution_units;
+       }
+       /* else attr is already zero'ed out */
 
        attr->out_flags = NEW_ARR_D(int, get_irg_obstack(get_irn_irg(node)), n_res);
        memset(attr->out_flags, 0, n_res * sizeof(attr->out_flags[0]));
 
-       attr->data.n_res = n_res;
        memset((void *)attr->slots, 0, n_res * sizeof(attr->slots[0]));
 }
 
index ba51f21..b0abefe 100644 (file)
@@ -9,6 +9,7 @@
 
 #include "firm_config.h"
 #include "ia32_nodes_attr.h"
+#include "gen_ia32_machine.h"
 
 /***************************************************************************************************
  *        _   _                   _       __        _                    _   _               _
@@ -404,6 +405,16 @@ void set_ia32_out_flags(ir_node *node, arch_irn_flags_t flags, int pos);
  */
 arch_irn_flags_t get_ia32_out_flags(const ir_node *node, int pos);
 
+/**
+ * Set the number of available execution units for this node.
+ */
+void set_ia32_n_exec_units(ir_node *node, unsigned n);
+
+/**
+ * Get the number of available execution units for this node.
+ */
+unsigned get_ia32_n_exec_units(const ir_node *node);
+
 #ifndef NDEBUG
 
 /**
@@ -499,7 +510,7 @@ int is_ia32_Cnst(const ir_node *node);
  * Initializes the nodes attributes.
  */
 void init_ia32_attributes(ir_node *node, arch_irn_flags_t flags, const ia32_register_req_t **in_reqs, \
-       const ia32_register_req_t **out_reqs, int n_res, unsigned latency);
+       const ia32_register_req_t **out_reqs, const be_execution_unit_t **execution_units, int n_res, unsigned latency);
 
 /* Include the generated headers */
 #include "gen_ia32_new_nodes.h"
index d9e36dc..026e829 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "firm_types.h"
 #include "../bearch.h"
+#include "../bemachine.h"
 
 typedef enum { flavour_Div = 1, flavour_Mod, flavour_DivMod } ia32_op_flavour_t;
 typedef enum { pn_EAX, pn_EDX } pn_ia32_Register;
@@ -128,6 +129,9 @@ typedef struct _ia32_attr_t {
        const char *orig_node;      /**< holds the name of the original ir node for debugging purposes */
 #endif /* NDEBUG */
 
+       const be_execution_unit_t **exec_units; /**< NULL terminated list of units this operation can be executed on */
+       unsigned                  n_exec_units; /**< the number of available execution units for this operation */
+
        const ia32_register_req_t **in_req;  /**< register requirements for arguments */
        const ia32_register_req_t **out_req; /**< register requirements for results */