X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fsparc%2Fbearch_sparc.c;h=499c71f42ff67257709693b8a08d7a8e0a6e23a2;hb=f0570c5883d01b28fdb59010bfc18fdc3b15413b;hp=3adab36849e74819b6bd6510cbf1c945754faf66;hpb=6befda80d676b7db82f7c3c421c6541af872deca;p=libfirm diff --git a/ir/be/sparc/bearch_sparc.c b/ir/be/sparc/bearch_sparc.c index 3adab3684..499c71f42 100644 --- a/ir/be/sparc/bearch_sparc.c +++ b/ir/be/sparc/bearch_sparc.c @@ -117,6 +117,8 @@ static int sparc_get_sp_bias(const ir_node *node) * calculates that! */ assert(attr->immediate_value <= -SPARC_MIN_STACKSIZE); return attr->immediate_value + SPARC_MIN_STACKSIZE; + } else if (is_sparc_RestoreZero(node)) { + return SP_BIAS_RESET; } return 0; } @@ -169,8 +171,8 @@ static void transform_Reload(ir_node *node) { ir_node *block = get_nodes_block(node); dbg_info *dbgi = get_irn_dbg_info(node); - ir_node *ptr = get_irn_n(node, be_pos_Spill_frame); - ir_node *mem = get_irn_n(node, be_pos_Reload_mem); + ir_node *ptr = get_irn_n(node, n_be_Spill_frame); + ir_node *mem = get_irn_n(node, n_be_Reload_mem); ir_mode *mode = get_irn_mode(node); ir_entity *entity = be_get_frame_entity(node); const arch_register_t *reg; @@ -198,10 +200,10 @@ static void transform_Spill(ir_node *node) { ir_node *block = get_nodes_block(node); dbg_info *dbgi = get_irn_dbg_info(node); - ir_node *ptr = get_irn_n(node, be_pos_Spill_frame); + ir_node *ptr = get_irn_n(node, n_be_Spill_frame); ir_graph *irg = get_irn_irg(node); - ir_node *mem = new_r_NoMem(irg); - ir_node *val = get_irn_n(node, be_pos_Spill_val); + ir_node *mem = get_irg_no_mem(irg); + ir_node *val = get_irn_n(node, n_be_Spill_val); ir_mode *mode = get_irn_mode(val); ir_entity *entity = be_get_frame_entity(node); ir_node *sched_point; @@ -281,10 +283,12 @@ static void sparc_set_frame_entity(ir_node *node, ir_entity *entity) static void sparc_after_ra(ir_graph *irg) { - be_fec_env_t *fec_env = be_new_frame_entity_coalescer(irg); + be_stack_layout_t *stack_layout = be_get_irg_stack_layout(irg); + bool at_begin = stack_layout->sp_relative ? true : false; + be_fec_env_t *fec_env = be_new_frame_entity_coalescer(irg); irg_walk_graph(irg, NULL, sparc_collect_frame_entity_nodes, fec_env); - be_assign_entities(fec_env, sparc_set_frame_entity); + be_assign_entities(fec_env, sparc_set_frame_entity, at_begin); be_free_frame_entity_coalescer(fec_env); irg_block_walk_graph(irg, NULL, sparc_after_ra_walker, NULL); @@ -306,7 +310,6 @@ static sparc_isa_t sparc_isa_template = { &sparc_registers[REG_SP], /* stack pointer register */ &sparc_registers[REG_FRAME_POINTER],/* base pointer register */ &sparc_reg_classes[CLASS_sparc_gp], /* link pointer register class */ - -1, /* stack direction */ 3, /* power of two stack alignment for calls */ NULL, /* main environment */ @@ -537,8 +540,7 @@ static ir_node *sparc_create_set(ir_node *cond) static void sparc_lower_for_target(void) { - int i; - int n_irgs = get_irp_n_irgs(); + size_t i, n_irgs = get_irp_n_irgs(); lower_mode_b_config_t lower_mode_b_config = { mode_Iu, sparc_create_set,