* @brief This file implements the creation of the achitecture specific firm
* opcodes and the coresponding node constructors for the TEMPLATE
* assembler irg.
- * @version $Id$
*/
#include "config.h"
#include "ircons_t.h"
#include "iropt_t.h"
#include "irop.h"
-#include "irvrfy_t.h"
#include "irprintf.h"
#include "xmalloc.h"
-#include "../bearch.h"
+#include "bearch.h"
#include "TEMPLATE_nodes_attr.h"
#include "TEMPLATE_new_nodes.h"
#include "gen_TEMPLATE_regalloc_if.h"
-
-
-/***********************************************************************************
- * _ _ _ __
- * | | (_) | | / _|
- * __| |_ _ _ __ ___ _ __ ___ _ __ _ _ __ | |_ ___ _ __| |_ __ _ ___ ___
- * / _` | | | | '_ ` _ \| '_ \ / _ \ '__| | | '_ \| __/ _ \ '__| _/ _` |/ __/ _ \
- * | (_| | |_| | | | | | | |_) | __/ | | | | | | || __/ | | || (_| | (_| __/
- * \__,_|\__,_|_| |_| |_| .__/ \___|_| |_|_| |_|\__\___|_| |_| \__,_|\___\___|
- * | |
- * |_|
- ***********************************************************************************/
-
/**
* Dumper interface for dumping TEMPLATE nodes in vcg.
- * @param n the node to dump
* @param F the output file
+ * @param n the node to dump
* @param reason indicates which kind of information should be dumped
- * @return 0 on success or != 0 on failure
*/
-static int TEMPLATE_dump_node(ir_node *n, FILE *F, dump_reason_t reason)
+static void TEMPLATE_dump_node(FILE *F, const ir_node *n, dump_reason_t reason)
{
- ir_mode *mode = NULL;
+ ir_mode *mode = NULL;
switch (reason) {
case dump_node_opcode_txt:
arch_dump_reqs_and_registers(F, n);
break;
}
-
- return 0;
}
-/***************************************************************************************************
- * _ _ _ __ _ _ _ _
- * | | | | | | / / | | | | | | | |
- * __ _| |_| |_ _ __ ___ ___| |_ / /_ _ ___| |_ _ __ ___ ___| |_| |__ ___ __| |___
- * / _` | __| __| '__| / __|/ _ \ __| / / _` |/ _ \ __| | '_ ` _ \ / _ \ __| '_ \ / _ \ / _` / __|
- * | (_| | |_| |_| | \__ \ __/ |_ / / (_| | __/ |_ | | | | | | __/ |_| | | | (_) | (_| \__ \
- * \__,_|\__|\__|_| |___/\___|\__/_/ \__, |\___|\__| |_| |_| |_|\___|\__|_| |_|\___/ \__,_|___/
- * __/ |
- * |___/
- ***************************************************************************************************/
-
const TEMPLATE_attr_t *get_TEMPLATE_attr_const(const ir_node *node)
{
assert(is_TEMPLATE_irn(node) && "need TEMPLATE node to get attributes");
return (TEMPLATE_attr_t *)get_irn_generic_attr(node);
}
-/**
- * Returns the argument register requirements of a TEMPLATE node.
- */
-const arch_register_req_t **get_TEMPLATE_in_req_all(const ir_node *node)
-{
- const TEMPLATE_attr_t *attr = get_TEMPLATE_attr_const(node);
- return attr->in_req;
-}
-
-/**
- * Returns the argument register requirement at position pos of an TEMPLATE node.
- */
-const arch_register_req_t *get_TEMPLATE_in_req(const ir_node *node, int pos)
-{
- const TEMPLATE_attr_t *attr = get_TEMPLATE_attr_const(node);
- return attr->in_req[pos];
-}
-
-/**
- * Sets the IN register requirements at position pos.
- */
-void set_TEMPLATE_req_in(ir_node *node, const arch_register_req_t *req, int pos)
-{
- TEMPLATE_attr_t *attr = get_TEMPLATE_attr(node);
- attr->in_req[pos] = req;
-}
-
/**
* Initializes the nodes attributes.
*/
-void init_TEMPLATE_attributes(ir_node *node, arch_irn_flags_t flags,
- const arch_register_req_t **in_reqs,
- const be_execution_unit_t ***execution_units,
- int n_res)
+static void init_TEMPLATE_attributes(ir_node *node, arch_irn_flags_t flags,
+ const arch_register_req_t **in_reqs,
+ int n_res)
{
ir_graph *irg = get_irn_irg(node);
struct obstack *obst = get_irg_obstack(irg);
- TEMPLATE_attr_t *attr = get_TEMPLATE_attr(node);
backend_info_t *info;
- (void) execution_units;
- arch_irn_set_flags(node, flags);
- attr->in_req = in_reqs;
+ arch_set_irn_flags(node, flags);
+ arch_set_irn_register_reqs_in(node, in_reqs);
info = be_get_info(node);
- info->out_infos = NEW_ARR_D(reg_out_info_t, obst, n_res);
- memset(info->out_infos, 0, n_res * sizeof(info->out_infos[0]));
+ info->out_infos = NEW_ARR_DZ(reg_out_info_t, obst, n_res);
}
-/***************************************************************************************
- * _ _ _
- * | | | | | |
- * _ __ ___ __| | ___ ___ ___ _ __ ___| |_ _ __ _ _ ___| |_ ___ _ __ ___
- * | '_ \ / _ \ / _` |/ _ \ / __/ _ \| '_ \/ __| __| '__| | | |/ __| __/ _ \| '__/ __|
- * | | | | (_) | (_| | __/ | (_| (_) | | | \__ \ |_| | | |_| | (__| || (_) | | \__ \
- * |_| |_|\___/ \__,_|\___| \___\___/|_| |_|___/\__|_| \__,_|\___|\__\___/|_| |___/
- *
- ***************************************************************************************/
+static void set_TEMPLATE_value(ir_node *node, ir_tarval *value)
+{
+ TEMPLATE_attr_t *attr = get_TEMPLATE_attr(node);
+ attr->value = value;
+}
-static int TEMPLATE_compare_attr(ir_node *a, ir_node *b)
+static int TEMPLATE_compare_attr(const ir_node *a, const ir_node *b)
{
const TEMPLATE_attr_t *attr_a = get_TEMPLATE_attr_const(a);
const TEMPLATE_attr_t *attr_b = get_TEMPLATE_attr_const(b);
return 0;
}
+static void TEMPLATE_copy_attr(ir_graph *irg, const ir_node *old_node,
+ ir_node *new_node)
+{
+ struct obstack *obst = get_irg_obstack(irg);
+ const void *attr_old = get_irn_generic_attr_const(old_node);
+ void *attr_new = get_irn_generic_attr(new_node);
+ backend_info_t *old_info = be_get_info(old_node);
+ backend_info_t *new_info = be_get_info(new_node);
+
+ /* copy the attributes */
+ memcpy(attr_new, attr_old, get_op_attr_size(get_irn_op(old_node)));
+
+ /* copy out flags */
+ new_info->flags = old_info->flags;
+ new_info->out_infos =
+ DUP_ARR_D(reg_out_info_t, obst, old_info->out_infos);
+ new_info->in_reqs = old_info->in_reqs;
+}
/* Include the generated constructor functions */
#include "gen_TEMPLATE_new_nodes.c.inl"