X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fbenode.c;h=31b337c9d51219c3d85d8acea2beffb15d8f167a;hb=80a6158fdd766f42ee6c508a773bc114ff1b61f3;hp=992daed02b0ba2547cf63883ad760be0df5ac7c6;hpb=6c89661f18047a222ab40af13a4cc97a69fe9b9c;p=libfirm diff --git a/ir/be/benode.c b/ir/be/benode.c index 992daed02..31b337c9d 100644 --- a/ir/be/benode.c +++ b/ir/be/benode.c @@ -7,7 +7,7 @@ * * This file provides Perm, Copy, Spill and Reload nodes. * - * Copyright (C) 2005 Universitaet Karlsruhe + * Copyright (C) 2005-2006 Universitaet Karlsruhe * Released under the GPL */ @@ -95,21 +95,21 @@ typedef struct { /** The be_Frame attribute type. */ typedef struct { be_node_attr_t node_attr; - entity *ent; + ir_entity *ent; int offset; } be_frame_attr_t; /** The be_Call attribute type. */ typedef struct { be_node_attr_t node_attr; - entity *ent; /**< The called entity if this is a static call. */ + ir_entity *ent; /**< The called entity if this is a static call. */ ir_type *call_tp; /**< The call type, copied from the original Call node. */ } be_call_attr_t; typedef struct { be_node_attr_t node_attr; - entity **in_entities; - entity **out_entities; + ir_entity **in_entities; + ir_entity **out_entities; } be_memperm_attr_t; ir_op *op_be_Spill; @@ -123,6 +123,7 @@ ir_op *op_be_Call; ir_op *op_be_Return; ir_op *op_be_IncSP; ir_op *op_be_AddSP; +ir_op *op_be_SubSP; ir_op *op_be_SetSP; ir_op *op_be_RegParams; ir_op *op_be_StackParam; @@ -200,9 +201,10 @@ void be_node_init(void) { op_be_Copy = new_ir_op(beo_base + beo_Copy, "be_Copy", op_pin_state_floats, N, oparity_unary, 0, sizeof(be_node_attr_t), &be_node_op_ops); op_be_Keep = new_ir_op(beo_base + beo_Keep, "be_Keep", op_pin_state_pinned, K, oparity_variable, 0, sizeof(be_node_attr_t), &be_node_op_ops); op_be_CopyKeep = new_ir_op(beo_base + beo_CopyKeep, "be_CopyKeep", op_pin_state_pinned, K, oparity_variable, 0, sizeof(be_node_attr_t), &be_node_op_ops); - op_be_Call = new_ir_op(beo_base + beo_Call, "be_Call", op_pin_state_pinned, N, oparity_variable, 0, sizeof(be_call_attr_t), &be_node_op_ops); + op_be_Call = new_ir_op(beo_base + beo_Call, "be_Call", op_pin_state_pinned, F, oparity_variable, 0, sizeof(be_call_attr_t), &be_node_op_ops); op_be_Return = new_ir_op(beo_base + beo_Return, "be_Return", op_pin_state_pinned, X, oparity_variable, 0, sizeof(be_return_attr_t), &be_node_op_ops); op_be_AddSP = new_ir_op(beo_base + beo_AddSP, "be_AddSP", op_pin_state_pinned, N, oparity_unary, 0, sizeof(be_node_attr_t), &be_node_op_ops); + op_be_SubSP = new_ir_op(beo_base + beo_SubSP, "be_SubSP", op_pin_state_pinned, N, oparity_unary, 0, sizeof(be_node_attr_t), &be_node_op_ops); op_be_SetSP = new_ir_op(beo_base + beo_SetSP, "be_SetSP", op_pin_state_pinned, N, oparity_binary, 0, sizeof(be_stack_attr_t), &be_node_op_ops); op_be_IncSP = new_ir_op(beo_base + beo_IncSP, "be_IncSP", op_pin_state_pinned, N, oparity_binary, 0, sizeof(be_stack_attr_t), &be_node_op_ops); op_be_RegParams = new_ir_op(beo_base + beo_RegParams, "be_RegParams", op_pin_state_pinned, N, oparity_zero, 0, sizeof(be_node_attr_t), &be_node_op_ops); @@ -222,6 +224,7 @@ void be_node_init(void) { set_op_tag(op_be_Call, &be_node_tag); set_op_tag(op_be_Return, &be_node_tag); set_op_tag(op_be_AddSP, &be_node_tag); + set_op_tag(op_be_SubSP, &be_node_tag); set_op_tag(op_be_SetSP, &be_node_tag); set_op_tag(op_be_IncSP, &be_node_tag); set_op_tag(op_be_RegParams, &be_node_tag); @@ -335,34 +338,24 @@ be_node_set_irn_reg(const void *_self, ir_node *irn, const arch_register_t *reg) } -ir_node *be_new_Spill(const arch_register_class_t *cls, const arch_register_class_t *cls_frame, ir_graph *irg, ir_node *bl, ir_node *frame, ir_node *to_spill) +ir_node *be_new_Spill(const arch_register_class_t *cls, ir_graph *irg, ir_node *bl, ir_node *to_spill) { be_frame_attr_t *a; - ir_node *in[2]; - ir_node *res; + ir_node *res; - in[0] = frame; - in[1] = to_spill; - res = new_ir_node(NULL, irg, bl, op_be_Spill, mode_M, 2, in); - a = init_node_attr(res, 2); - a->ent = NULL; + res = new_ir_node(NULL, irg, bl, op_be_Spill, mode_M, 1, &to_spill); + a = init_node_attr(res, 2); + a->ent = NULL; a->offset = 0; - be_node_set_reg_class(res, 0, cls_frame); - be_node_set_reg_class(res, 1, cls); + be_node_set_reg_class(res, be_pos_Spill_val, cls); return res; } -ir_node *be_new_Reload(const arch_register_class_t *cls, const arch_register_class_t *cls_frame, ir_graph *irg, ir_node *bl, ir_node *frame, ir_node *mem, ir_mode *mode) +ir_node *be_new_Reload(const arch_register_class_t *cls, ir_graph *irg, ir_node *bl, ir_node *mem, ir_mode *mode) { - ir_node *in[2]; - ir_node *res; - - in[0] = frame; - in[1] = mem; - res = new_ir_node(NULL, irg, bl, op_be_Reload, mode, 2, in); + ir_node *res = new_ir_node(NULL, irg, bl, op_be_Reload, mode, 1, &mem); init_node_attr(res, 2); - be_node_set_reg_class(res, 0, cls_frame); be_node_set_reg_class(res, -1, cls); be_node_set_flags(res, -1, arch_irn_flags_rematerializable); return res; @@ -374,24 +367,12 @@ ir_node *be_get_Reload_mem(const ir_node *irn) return get_irn_n(irn, be_pos_Reload_mem); } -ir_node *be_get_Reload_frame(const ir_node *irn) -{ - assert(be_is_Reload(irn)); - return get_irn_n(irn, be_pos_Reload_frame); -} - ir_node *be_get_Spill_val(const ir_node *irn) { assert(be_is_Spill(irn)); return get_irn_n(irn, be_pos_Spill_val); } -ir_node *be_get_Spill_frame(const ir_node *irn) -{ - assert(be_is_Spill(irn)); - return get_irn_n(irn, be_pos_Spill_frame); -} - ir_node *be_new_Perm(const arch_register_class_t *cls, ir_graph *irg, ir_node *bl, int n, ir_node *in[]) { int i; @@ -496,14 +477,14 @@ ir_node *be_new_Call(dbg_info *dbg, ir_graph *irg, ir_node *bl, ir_node *mem, ir } /* Gets the call entity or NULL if this is no static call. */ -entity *be_Call_get_entity(const ir_node *call) { +ir_entity *be_Call_get_entity(const ir_node *call) { be_call_attr_t *a = get_irn_attr(call); assert(be_is_Call(call)); return a->ent; } /* Sets the call entity. */ -void be_Call_set_entity(ir_node *call, entity *ent) { +void be_Call_set_entity(ir_node *call, ir_entity *ent) { be_call_attr_t *a = get_irn_attr(call); assert(be_is_Call(call)); a->ent = ent; @@ -586,6 +567,29 @@ ir_node *be_new_AddSP(const arch_register_t *sp, ir_graph *irg, ir_node *bl, ir_ return irn; } +ir_node *be_new_SubSP(const arch_register_t *sp, ir_graph *irg, ir_node *bl, ir_node *old_sp, ir_node *sz) +{ + be_node_attr_t *a; + ir_node *irn; + ir_node *in[be_pos_SubSP_last]; + + in[be_pos_SubSP_old_sp] = old_sp; + in[be_pos_SubSP_size] = sz; + + irn = new_ir_node(NULL, irg, bl, op_be_SubSP, mode_T, be_pos_SubSP_last, in); + a = init_node_attr(irn, be_pos_SubSP_last); + + be_node_set_flags(irn, OUT_POS(pn_be_SubSP_res), arch_irn_flags_ignore | arch_irn_flags_modify_sp); + + /* Set output constraint to stack register. */ + be_set_constr_single_reg(irn, be_pos_SubSP_old_sp, sp); + be_node_set_reg_class(irn, be_pos_SubSP_size, arch_register_get_class(sp)); + be_set_constr_single_reg(irn, OUT_POS(pn_be_SubSP_res), sp); + a->reg_data[pn_be_SubSP_res].reg = sp; + + return irn; +} + ir_node *be_new_SetSP(const arch_register_t *sp, ir_graph *irg, ir_node *bl, ir_node *old_sp, ir_node *op, ir_node *mem) { be_node_attr_t *a; @@ -608,7 +612,7 @@ ir_node *be_new_SetSP(const arch_register_t *sp, ir_graph *irg, ir_node *bl, ir_ return irn; } -ir_node *be_new_StackParam(const arch_register_class_t *cls, const arch_register_class_t *cls_frame, ir_graph *irg, ir_node *bl, ir_mode *mode, ir_node *frame_pointer, entity *ent) +ir_node *be_new_StackParam(const arch_register_class_t *cls, const arch_register_class_t *cls_frame, ir_graph *irg, ir_node *bl, ir_mode *mode, ir_node *frame_pointer, ir_entity *ent) { be_frame_attr_t *a; ir_node *irn; @@ -635,7 +639,7 @@ ir_node *be_new_RegParams(ir_graph *irg, ir_node *bl, int n_outs) } ir_node *be_new_FrameLoad(const arch_register_class_t *cls_frame, const arch_register_class_t *cls_data, - ir_graph *irg, ir_node *bl, ir_node *mem, ir_node *frame, entity *ent) + ir_graph *irg, ir_node *bl, ir_node *mem, ir_node *frame, ir_entity *ent) { be_frame_attr_t *a; ir_node *irn; @@ -653,7 +657,7 @@ ir_node *be_new_FrameLoad(const arch_register_class_t *cls_frame, const arch_reg } ir_node *be_new_FrameStore(const arch_register_class_t *cls_frame, const arch_register_class_t *cls_data, - ir_graph *irg, ir_node *bl, ir_node *mem, ir_node *frame, ir_node *data, entity *ent) + ir_graph *irg, ir_node *bl, ir_node *mem, ir_node *frame, ir_node *data, ir_entity *ent) { be_frame_attr_t *a; ir_node *irn; @@ -671,7 +675,7 @@ ir_node *be_new_FrameStore(const arch_register_class_t *cls_frame, const arch_re return irn; } -ir_node *be_new_FrameAddr(const arch_register_class_t *cls_frame, ir_graph *irg, ir_node *bl, ir_node *frame, entity *ent) +ir_node *be_new_FrameAddr(const arch_register_class_t *cls_frame, ir_graph *irg, ir_node *bl, ir_node *frame, ir_entity *ent) { be_frame_attr_t *a; ir_node *irn; @@ -762,7 +766,7 @@ int be_has_frame_entity(const ir_node *irn) } } -entity* be_get_frame_entity(const ir_node *irn) +ir_entity* be_get_frame_entity(const ir_node *irn) { if(be_has_frame_entity(irn)) { be_frame_attr_t *a = get_irn_attr(irn); @@ -771,7 +775,7 @@ entity* be_get_frame_entity(const ir_node *irn) return NULL; } -void be_set_MemPerm_in_entity(const ir_node *irn, int n, entity *ent) +void be_set_MemPerm_in_entity(const ir_node *irn, int n, ir_entity *ent) { be_memperm_attr_t *attr = get_irn_attr(irn); @@ -781,7 +785,7 @@ void be_set_MemPerm_in_entity(const ir_node *irn, int n, entity *ent) attr->in_entities[n] = ent; } -entity* be_get_MemPerm_in_entity(const ir_node* irn, int n) +ir_entity* be_get_MemPerm_in_entity(const ir_node* irn, int n) { be_memperm_attr_t *attr = get_irn_attr(irn); @@ -791,7 +795,7 @@ entity* be_get_MemPerm_in_entity(const ir_node* irn, int n) return attr->in_entities[n]; } -void be_set_MemPerm_out_entity(const ir_node *irn, int n, entity *ent) +void be_set_MemPerm_out_entity(const ir_node *irn, int n, ir_entity *ent) { be_memperm_attr_t *attr = get_irn_attr(irn); @@ -801,7 +805,7 @@ void be_set_MemPerm_out_entity(const ir_node *irn, int n, entity *ent) attr->out_entities[n] = ent; } -entity* be_get_MemPerm_out_entity(const ir_node* irn, int n) +ir_entity* be_get_MemPerm_out_entity(const ir_node* irn, int n) { be_memperm_attr_t *attr = get_irn_attr(irn); @@ -927,30 +931,25 @@ int be_get_IncSP_offset(const ir_node *irn) ir_node *be_spill(const arch_env_t *arch_env, ir_node *irn) { - ir_node *bl = get_nodes_block(irn); - ir_graph *irg = get_irn_irg(bl); - ir_node *frame = get_irg_frame(irg); - ir_node *spill; + ir_node *bl = get_nodes_block(irn); + ir_graph *irg = get_irn_irg(bl); + const arch_register_class_t *cls = arch_get_irn_reg_class(arch_env, irn, -1); + ir_node *spill; - const arch_register_class_t *cls = arch_get_irn_reg_class(arch_env, irn, -1); - const arch_register_class_t *cls_frame = arch_get_irn_reg_class(arch_env, frame, -1); - spill = be_new_Spill(cls, cls_frame, irg, bl, frame, irn); + spill = be_new_Spill(cls, irg, bl, irn); return spill; } ir_node *be_reload(const arch_env_t *arch_env, const arch_register_class_t *cls, ir_node *insert, ir_mode *mode, ir_node *spill) { - ir_node *reload; - - ir_node *bl = is_Block(insert) ? insert : get_nodes_block(insert); - ir_graph *irg = get_irn_irg(bl); - 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 *reload; + ir_node *bl = is_Block(insert) ? insert : get_nodes_block(insert); + ir_graph *irg = get_irn_irg(bl); assert(be_is_Spill(spill) || (is_Phi(spill) && get_irn_mode(spill) == mode_M)); - reload = be_new_Reload(cls, cls_frame, irg, bl, frame, spill, mode); + reload = be_new_Reload(cls, irg, bl, spill, mode); if(is_Block(insert)) { insert = sched_skip(insert, 0, sched_skip_cf_predicator, (void *) arch_env); @@ -1062,12 +1061,12 @@ static arch_irn_flags_t be_node_get_flags(const void *_self, const ir_node *irn) return r ? r->req.flags : 0; } -static entity *be_node_get_frame_entity(const void *self, const ir_node *irn) +static ir_entity *be_node_get_frame_entity(const void *self, const ir_node *irn) { return be_get_frame_entity(irn); } -static void be_node_set_frame_entity(const void *self, ir_node *irn, entity *ent) +static void be_node_set_frame_entity(const void *self, ir_node *irn, ir_entity *ent) { be_frame_attr_t *a; @@ -1087,13 +1086,7 @@ static void be_node_set_frame_offset(const void *self, ir_node *irn, int offset) static int be_node_get_sp_bias(const void *self, const ir_node *irn) { - int result = 0; - - if(be_is_IncSP(irn)) { - result = be_get_IncSP_offset(irn); - } - - return result; + return be_is_IncSP(irn) ? be_get_IncSP_offset(irn) : 0; } /* @@ -1233,12 +1226,12 @@ static arch_irn_flags_t phi_get_flags(const void *_self, const ir_node *irn) return arch_irn_flags_none; } -static entity *phi_get_frame_entity(const void *_self, const ir_node *irn) +static ir_entity *phi_get_frame_entity(const void *_self, const ir_node *irn) { return NULL; } -static void phi_set_frame_entity(const void *_self, ir_node *irn, entity *ent) +static void phi_set_frame_entity(const void *_self, ir_node *irn, ir_entity *ent) { } @@ -1430,7 +1423,7 @@ static int dump_node(ir_node *irn, FILE *f, dump_reason_t reason) { int i; for(i = 0; i < be_get_MemPerm_entity_arity(irn); ++i) { - entity *in, *out; + ir_entity *in, *out; in = be_get_MemPerm_in_entity(irn, i); out = be_get_MemPerm_out_entity(irn, i); if(in) {