/*
- * Project: libFIRM
- * File name: ir/be/benode.c
- * Purpose: Backend node support for generic backend nodes.
- * Author: Sebastian Hack
- * Modified by: Michael Beck, Matthias Braun
- * Created: 17.05.2005
- * CVS-ID: $Id$
- * Copyright: (c) 1998-2007 Universität Karlsruhe
- * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE.
+ * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved.
+ *
+ * This file is part of libFirm.
+ *
+ * This file may be distributed and/or modified under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation and appearing in the file LICENSE.GPL included in the
+ * packaging of this file.
+ *
+ * Licensees holding valid libFirm Professional Edition licenses may use
+ * this file in accordance with the libFirm Commercial License.
+ * Agreement provided with the Software.
+ *
+ * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+ * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
*/
/**
- * @file benode.c
- * @date 17.05.2005
- * @author Sebastian Hack
+ * @file
+ * @brief Backend node support for generic backend nodes.
+ * @author Sebastian Hack
+ * @date 17.05.2005
+ * @version $Id$
*
* Backend node support for generic backend nodes.
* This file provides Perm, Copy, Spill and Reload nodes.
*/
-
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
*
* @return zero if both attributes are identically
*/
-static int cmp_node_attr(be_node_attr_t *a, be_node_attr_t *b) {
+static int _node_cmp_attr(be_node_attr_t *a, be_node_attr_t *b) {
int i, len;
if(ARR_LEN(a->reg_data) != ARR_LEN(b->reg_data))
return 0;
}
+static int node_cmp_attr(ir_node *a, ir_node *b) {
+ be_node_attr_t *a_attr = get_irn_attr(a);
+ be_node_attr_t *b_attr = get_irn_attr(b);
+
+ return _node_cmp_attr(a_attr, b_attr);
+}
+
/**
* Compare the attributes of two FrameAddr nodes.
*
be_frame_attr_t *a_attr = get_irn_attr(a);
be_frame_attr_t *b_attr = get_irn_attr(b);
- if (a_attr->ent == b_attr->ent && a_attr->offset == b_attr->offset)
- return cmp_node_attr(&a_attr->node_attr, &b_attr->node_attr);
- return 1;
+ if (a_attr->ent != b_attr->ent || a_attr->offset != b_attr->offset)
+ return 1;
+
+ return _node_cmp_attr((be_node_attr_t*) a_attr, (be_node_attr_t*) b_attr);
+}
+
+static int Return_cmp_attr(ir_node *a, ir_node *b) {
+ be_return_attr_t *a_attr = get_irn_attr(a);
+ be_return_attr_t *b_attr = get_irn_attr(b);
+
+ if (a_attr->num_ret_vals != b_attr->num_ret_vals)
+ return 1;
+
+ return _node_cmp_attr((be_node_attr_t*) a_attr, (be_node_attr_t*) b_attr);
+}
+
+static int Stack_cmp_attr(ir_node *a, ir_node *b) {
+ be_stack_attr_t *a_attr = get_irn_attr(a);
+ be_stack_attr_t *b_attr = get_irn_attr(b);
+
+ if (a_attr->offset != b_attr->offset)
+ return 1;
+
+ return _node_cmp_attr((be_node_attr_t*) a_attr, (be_node_attr_t*) b_attr);
+}
+
+static int Call_cmp_attr(ir_node *a, ir_node *b) {
+ be_call_attr_t *a_attr = get_irn_attr(a);
+ be_call_attr_t *b_attr = get_irn_attr(b);
+
+ if (a_attr->ent != b_attr->ent ||
+ a_attr->call_tp != b_attr->call_tp)
+ return 1;
+
+ return _node_cmp_attr((be_node_attr_t*) a_attr, (be_node_attr_t*) b_attr);
}
static INLINE be_req_t *get_be_req(const ir_node *node, int pos)
op_be_Barrier = new_ir_op(beo_base + beo_Barrier, "be_Barrier", op_pin_state_pinned, N, oparity_dynamic, 0, sizeof(be_node_attr_t), &be_node_op_ops);
set_op_tag(op_be_Spill, &be_node_tag);
+ op_be_Spill->ops.node_cmp_attr = FrameAddr_cmp_attr;
set_op_tag(op_be_Reload, &be_node_tag);
+ op_be_Reload->ops.node_cmp_attr = FrameAddr_cmp_attr;
set_op_tag(op_be_Perm, &be_node_tag);
+ op_be_Perm->ops.node_cmp_attr = node_cmp_attr;
set_op_tag(op_be_MemPerm, &be_node_tag);
+ op_be_MemPerm->ops.node_cmp_attr = node_cmp_attr;
set_op_tag(op_be_Copy, &be_node_tag);
+ op_be_Copy->ops.node_cmp_attr = node_cmp_attr;
set_op_tag(op_be_Keep, &be_node_tag);
+ op_be_Keep->ops.node_cmp_attr = node_cmp_attr;
set_op_tag(op_be_CopyKeep, &be_node_tag);
+ op_be_CopyKeep->ops.node_cmp_attr = node_cmp_attr;
set_op_tag(op_be_Call, &be_node_tag);
+ op_be_Call->ops.node_cmp_attr = Call_cmp_attr;
set_op_tag(op_be_Return, &be_node_tag);
+ op_be_Return->ops.node_cmp_attr = Return_cmp_attr;
set_op_tag(op_be_AddSP, &be_node_tag);
+ op_be_AddSP->ops.node_cmp_attr = node_cmp_attr;
set_op_tag(op_be_SubSP, &be_node_tag);
+ op_be_SubSP->ops.node_cmp_attr = node_cmp_attr;
set_op_tag(op_be_SetSP, &be_node_tag);
+ op_be_SetSP->ops.node_cmp_attr = Stack_cmp_attr;
set_op_tag(op_be_IncSP, &be_node_tag);
+ op_be_IncSP->ops.node_cmp_attr = Stack_cmp_attr;
set_op_tag(op_be_RegParams, &be_node_tag);
+ op_be_RegParams->ops.node_cmp_attr = node_cmp_attr;
set_op_tag(op_be_StackParam, &be_node_tag);
+ op_be_StackParam->ops.node_cmp_attr = FrameAddr_cmp_attr;
set_op_tag(op_be_FrameLoad, &be_node_tag);
+ op_be_FrameLoad->ops.node_cmp_attr = FrameAddr_cmp_attr;
set_op_tag(op_be_FrameStore, &be_node_tag);
+ op_be_FrameStore->ops.node_cmp_attr = FrameAddr_cmp_attr;
set_op_tag(op_be_FrameAddr, &be_node_tag);
- set_op_tag(op_be_Barrier, &be_node_tag);
-
op_be_FrameAddr->ops.node_cmp_attr = FrameAddr_cmp_attr;
+ set_op_tag(op_be_Barrier, &be_node_tag);
+ op_be_Barrier->ops.node_cmp_attr = node_cmp_attr;
}
/**
be_node_set_reg_class(irn, 0, cls_frame);
be_node_set_reg_class(irn, OUT_POS(0), cls);
+ be_node_set_flags(irn, OUT_POS(0), arch_irn_flags_rematerializable);
+
return irn;
}