/*
- * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved.
+ * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved.
*
* This file is part of libFirm.
*
}
if (reqs[i]->type & arch_register_req_type_should_be_same) {
- ir_fprintf(F, " same as %+F", get_irn_n(n, reqs[i]->other_same));
+ const unsigned other = reqs[i]->other_same;
+ int i;
+
+ ir_fprintf(F, " same as");
+ for (i = 0; 1U << i <= other; ++i) {
+ if (other & (1U << i)) {
+ ir_fprintf(F, " %+F", get_irn_n(n, i));
+ }
+ }
}
- if (reqs[i]->type & arch_register_req_type_should_be_different) {
- ir_fprintf(F, " different from %+F", get_irn_n(n, reqs[i]->other_different));
+ if (reqs[i]->type & arch_register_req_type_must_be_different) {
+ const unsigned other = reqs[i]->other_different;
+ int i;
+
+ ir_fprintf(F, " different from");
+ for (i = 0; 1U << i <= other; ++i) {
+ if (other & (1U << i)) {
+ ir_fprintf(F, " %+F", get_irn_n(n, i));
+ }
+ }
}
fprintf(F, "\n");
}
/* dump OUT requirements */
- if (attr->n_res > 0) {
+ if (ARR_LEN(attr->slots) > 0) {
reqs = get_TEMPLATE_out_req_all(n);
dump_reg_req(F, n, reqs, 1);
}
/* dump assigned registers */
slots = get_TEMPLATE_slots(n);
- if (slots && attr->n_res > 0) {
- for (i = 0; i < attr->n_res; i++) {
+ if (slots && ARR_LEN(attr->slots) > 0) {
+ for (i = 0; i < ARR_LEN(attr->slots); i++) {
if (slots[i]) {
fprintf(F, "reg #%d = %s\n", i, slots[i]->name);
}
const TEMPLATE_attr_t *attr = get_TEMPLATE_attr_const(node);
assert(is_TEMPLATE_irn(node) && "Not an TEMPLATE node.");
- assert(pos < attr->n_res && "Invalid OUT position.");
+ assert(pos < ARR_LEN(attr->slots) && "Invalid OUT position.");
assert(attr->slots[pos] && "No register assigned");
return arch_register_get_name(attr->slots[pos]);
const TEMPLATE_attr_t *attr = get_TEMPLATE_attr_const(node);
assert(is_TEMPLATE_irn(node) && "Not an TEMPLATE node.");
- assert(pos < attr->n_res && "Invalid OUT position.");
+ assert(pos < ARR_LEN(attr->slots) && "Invalid OUT position.");
assert(attr->slots[pos] && "No register assigned");
return arch_register_get_index(attr->slots[pos]);
const TEMPLATE_attr_t *attr = get_TEMPLATE_attr_const(node);
assert(is_TEMPLATE_irn(node) && "Not an TEMPLATE node.");
- assert(pos < attr->n_res && "Invalid OUT position.");
+ assert(pos < ARR_LEN(attr->slots) && "Invalid OUT position.");
assert(attr->slots[pos] && "No register assigned");
return attr->slots[pos];
}
-/**
- * Sets the number of results.
- */
-void set_TEMPLATE_n_res(ir_node *node, int n_res) {
- TEMPLATE_attr_t *attr = get_TEMPLATE_attr(node);
- attr->n_res = n_res;
-}
-
/**
* Returns the number of results.
*/
int get_TEMPLATE_n_res(const ir_node *node) {
const TEMPLATE_attr_t *attr = get_TEMPLATE_attr_const(node);
- return attr->n_res;
+ return ARR_LEN(attr->slots);
}
/**
const arch_register_req_t **in_reqs,
const arch_register_req_t **out_reqs,
const be_execution_unit_t ***execution_units,
- int n_res, unsigned latency)
+ 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);
+ (void) execution_units;
- attr->flags = flags;
+ attr->flags = flags;
attr->out_req = out_reqs;
- attr->in_req = in_reqs;
- attr->n_res = n_res;
+ attr->in_req = in_reqs;
- memset((void *)attr->slots, 0, n_res * sizeof(attr->slots[0]));
+ attr->slots = NEW_ARR_D(const arch_register_t*, obst, n_res);
+ memset(attr->slots, 0, n_res * sizeof(attr->slots[0]));
}
/***************************************************************************************
*
***************************************************************************************/
+static
+int TEMPLATE_compare_attr(ir_node *a, 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);
+
+ if(attr_a->flags != attr_b->flags)
+ return 1;
+
+ return 0;
+}
+
+
/* Include the generated constructor functions */
#include "gen_TEMPLATE_new_nodes.c.inl"