int i;
ir_node *frame = get_irg_frame(irg);
const arch_register_class_t *cls_frame = arch_get_irn_reg_class(arch_env, frame, -1);
- ir_node *irn = new_ir_node(NULL, irg, bl, op_be_MemPerm, mode_T, n, in);
+ ir_node *irn;
+ const arch_register_t *sp = arch_env->isa->sp;
be_memperm_attr_t *attr;
+ ir_node **real_in;
- init_node_attr(irn, n);
+ real_in = alloca((n+1) * sizeof(real_in[0]));
+ real_in[0] = frame;
+ memcpy(&real_in[1], in, n * sizeof(real_in[0]));
+
+ irn = new_ir_node(NULL, irg, bl, op_be_MemPerm, mode_T, n+1, real_in);
+
+ init_node_attr(irn, n + 1);
+ be_node_set_reg_class(irn, 0, sp->reg_class);
for(i = 0; i < n; ++i) {
- be_node_set_reg_class(irn, i, cls_frame);
+ be_node_set_reg_class(irn, i + 1, cls_frame);
be_node_set_reg_class(irn, OUT_POS(i), cls_frame);
}
attr = get_irn_attr(irn);
- attr->in_entities = obstack_alloc(irg->obst, n*sizeof(attr->in_entities[0]));
- memset(attr->in_entities, 0, n*sizeof(attr->in_entities[0]));
+ attr->in_entities = obstack_alloc(irg->obst, n * sizeof(attr->in_entities[0]));
+ memset(attr->in_entities, 0, n * sizeof(attr->in_entities[0]));
attr->out_entities = obstack_alloc(irg->obst, n*sizeof(attr->out_entities[0]));
memset(attr->out_entities, 0, n*sizeof(attr->out_entities[0]));
}
}
-entity *be_get_frame_entity(const ir_node *irn)
+entity* be_get_frame_entity(const ir_node *irn)
{
if(be_has_frame_entity(irn)) {
be_frame_attr_t *a = get_irn_attr(irn);
return NULL;
}
-void be_set_frame_entity(const ir_node *irn, entity* ent)
-{
- be_frame_attr_t *a;
-
- assert(be_has_frame_entity(irn));
-
- a = get_irn_attr(irn);
- a->ent = ent;
-}
-
void be_set_MemPerm_in_entity(const ir_node *irn, int n, entity *ent)
{
be_memperm_attr_t *attr = get_irn_attr(irn);
assert(be_is_MemPerm(irn));
- assert(n < get_irn_arity(irn));
+ assert(n < be_get_MemPerm_entity_arity(irn));
attr->in_entities[n] = ent;
}
be_memperm_attr_t *attr = get_irn_attr(irn);
assert(be_is_MemPerm(irn));
- assert(n < get_irn_arity(irn));
+ assert(n < be_get_MemPerm_entity_arity(irn));
return attr->in_entities[n];
}
be_memperm_attr_t *attr = get_irn_attr(irn);
assert(be_is_MemPerm(irn));
- assert(n < get_irn_arity(irn));
+ assert(n < be_get_MemPerm_entity_arity(irn));
attr->out_entities[n] = ent;
}
be_memperm_attr_t *attr = get_irn_attr(irn);
assert(be_is_MemPerm(irn));
- assert(n < get_irn_arity(irn));
+ assert(n < be_get_MemPerm_entity_arity(irn));
return attr->out_entities[n];
}
+int be_get_MemPerm_entity_arity(const ir_node *irn)
+{
+ return get_irn_arity(irn) - 1;
+}
+
static void be_limited(void *data, bitset_t *bs)
{
be_req_t *req = data;
XXX(StackParam, stackparam);
#undef XXX
default:
- return 0;
+ return arch_irn_class_normal;
}
return 0;
return be_get_frame_entity(irn);
}
+static void be_node_set_frame_entity(const void *self, ir_node *irn, entity *ent)
+{
+ be_frame_attr_t *a;
+
+ assert(be_has_frame_entity(irn));
+
+ a = get_irn_attr(irn);
+ a->ent = ent;
+}
+
static void be_node_set_frame_offset(const void *self, ir_node *irn, int offset)
{
if(be_has_frame_entity(irn)) {
be_node_classify,
be_node_get_flags,
be_node_get_frame_entity,
- be_node_set_frame_offset
+ be_node_set_frame_entity,
+ be_node_set_frame_offset,
+ NULL, /* get_inverse */
+ NULL, /* get_op_estimated_cost */
+ NULL, /* possible_memory_operand */
+ NULL, /* perform_memory_operand */
};
static const arch_irn_ops_t be_node_irn_ops = {
return NULL;
}
+static void phi_set_frame_entity(const void *_self, ir_node *irn, entity *ent)
+{
+}
+
static void phi_set_frame_offset(const void *_self, ir_node *irn, int bias)
{
}
phi_classify,
phi_get_flags,
phi_get_frame_entity,
- phi_set_frame_offset
+ phi_set_frame_entity,
+ phi_set_frame_offset,
+ NULL, /* get_inverse */
+ NULL, /* get_op_estimated_cost */
+ NULL, /* possible_memory_operand */
+ NULL, /* perform_memory_operand */
};
static const arch_irn_handler_t phi_irn_handler = {
case beo_MemPerm:
{
int i;
- for(i = 0; i < get_irn_arity(irn); ++i) {
+ for(i = 0; i < be_get_MemPerm_entity_arity(irn); ++i) {
entity *in, *out;
in = be_get_MemPerm_in_entity(irn, i);
out = be_get_MemPerm_out_entity(irn, i);