X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fsparc%2Fsparc_finish.c;h=29138b9ab5155b49b4718599e265bf56ec4a196c;hb=dfc8071b06fbef877b269aac45b08de8dc5409c5;hp=0021d333a2fd690b1f006607fdb8146fadeff2fd;hpb=0c6c4fcf2dd1d2f28194b04e205789f06584c23e;p=libfirm diff --git a/ir/be/sparc/sparc_finish.c b/ir/be/sparc/sparc_finish.c index 0021d333a..29138b9ab 100644 --- a/ir/be/sparc/sparc_finish.c +++ b/ir/be/sparc/sparc_finish.c @@ -91,8 +91,10 @@ static void introduce_epilog(ir_node *ret) if (!layout->sp_relative) { const arch_register_t *fp_reg = &sparc_registers[REG_FRAME_POINTER]; + const arch_register_t *sp_reg = &sparc_registers[REG_SP]; ir_node *fp = be_get_initial_reg_value(irg, fp_reg); - ir_node *restore = new_bd_sparc_RestoreZero(NULL, block, fp); + ir_node *sp = be_get_initial_reg_value(irg, sp_reg); + ir_node *restore = new_bd_sparc_RestoreZero(NULL, block, sp, fp); sched_add_before(ret, restore); arch_set_irn_register(restore, sp_reg); set_irn_n(ret, sp_idx, restore); @@ -249,7 +251,7 @@ static void finish_sparc_FrameAddr(ir_node *node) sched_add_before(node, new_frameaddr); arch_set_irn_register(new_frameaddr, reg); - exchange(node, new_frameaddr); + be_peephole_exchange(node, new_frameaddr); } } @@ -281,11 +283,41 @@ static void finish_sparc_Ld(ir_node *node) for (i = 0; i < n_outs; i++) { arch_set_irn_register_out(new_load, i, arch_get_irn_register_out(node, i)); } - exchange(node, new_load); + be_peephole_exchange(node, new_load); } } +static void split_sparc_ldf(ir_node *node) +{ + sparc_load_store_attr_t *attr = get_sparc_load_store_attr(node); + unsigned bits = get_mode_size_bits(attr->load_store_mode); + /* split 128bit loads into 2 64bit loads */ + if (bits == 128) { + dbg_info *dbgi = get_irn_dbg_info(node); + ir_node *block = get_nodes_block(node); + ir_node *ptr = get_irn_n(node, n_sparc_Ldf_ptr); + ir_node *mem = get_irn_n(node, n_sparc_Ldf_mem); + ir_node *new_load + = new_bd_sparc_Ldf_d(dbgi, block, ptr, mem, mode_D, + attr->base.immediate_value_entity, + attr->base.immediate_value + 8, + attr->is_frame_entity); + ir_node *new_mem = new_r_Proj(new_load, mode_M, pn_sparc_Ldf_M); + + const arch_register_t *reg + = arch_get_irn_register_out(node, pn_sparc_Ldf_res); + unsigned reg_index = reg->global_index; + + arch_set_irn_register_out(new_load, pn_sparc_Ldf_res, + &sparc_registers[reg_index+2]); + + attr->load_store_mode = mode_D; + set_irn_n(node, n_sparc_Ldf_mem, new_mem); + sched_add_before(node, new_load); + } +} + static void finish_sparc_Ldf(ir_node *node) { sparc_attr_t *attr = get_sparc_attr(node); @@ -315,7 +347,7 @@ static void finish_sparc_Ldf(ir_node *node) for (i = 0; i < n_outs; i++) { arch_set_irn_register_out(new_load, i, arch_get_irn_register_out(node, i)); } - exchange(node, new_load); + be_peephole_exchange(node, new_load); } } @@ -349,7 +381,7 @@ static void finish_sparc_St(ir_node *node) for (i = 0; i < n_outs; i++) { arch_set_irn_register_out(new_load, i, arch_get_irn_register_out(node, i)); } - exchange(node, new_load); + be_peephole_exchange(node, new_load); } } @@ -384,7 +416,7 @@ static void finish_sparc_Stf(ir_node *node) for (i = 0; i < n_outs; i++) { arch_set_irn_register_out(new_load, i, arch_get_irn_register_out(node, i)); } - exchange(node, new_load); + be_peephole_exchange(node, new_load); } } @@ -433,10 +465,12 @@ static void replace_with_restore_reg(ir_node *node, ir_node *replaced, ir_node *op0, ir_node *op1) { dbg_info *dbgi = get_irn_dbg_info(node); + ir_node *stack_in = get_irn_n(node, n_sparc_RestoreZero_stack); ir_node *fp = get_irn_n(node, n_sparc_RestoreZero_frame_pointer); ir_node *block = get_nodes_block(node); ir_mode *mode = get_irn_mode(node); - ir_node *new_node = new_bd_sparc_Restore_reg(dbgi, block, fp, op0, op1); + ir_node *new_node = new_bd_sparc_Restore_reg(dbgi, block, stack_in, fp, + op0, op1); ir_node *stack = new_r_Proj(new_node, mode, pn_sparc_Restore_stack); ir_node *res = new_r_Proj(new_node, mode, pn_sparc_Restore_res); const arch_register_t *reg = arch_get_irn_register(replaced); @@ -454,11 +488,12 @@ static void replace_with_restore_imm(ir_node *node, ir_node *replaced, int32_t immediate) { dbg_info *dbgi = get_irn_dbg_info(node); + ir_node *stack_in = get_irn_n(node, n_sparc_RestoreZero_stack); ir_node *fp = get_irn_n(node, n_sparc_RestoreZero_frame_pointer); ir_node *block = get_nodes_block(node); ir_mode *mode = get_irn_mode(node); - ir_node *new_node - = new_bd_sparc_Restore_imm(dbgi, block, fp, op, imm_entity, immediate); + ir_node *new_node = new_bd_sparc_Restore_imm(dbgi, block, stack_in, fp, + op, imm_entity, immediate); ir_node *stack = new_r_Proj(new_node, mode, pn_sparc_Restore_stack); ir_node *res = new_r_Proj(new_node, mode, pn_sparc_Restore_res); const arch_register_t *reg = arch_get_irn_register(replaced); @@ -507,13 +542,13 @@ static void peephole_sparc_RestoreZero(ir_node *node) if (!is_restorezeroopt_reg(reg)) continue; - if (be_is_Copy(schedpoint) && be_can_move_before(heights, schedpoint, node)) { - ir_node *op = get_irn_n(schedpoint, n_be_Copy_op); + if (be_is_Copy(schedpoint) && be_can_move_down(heights, schedpoint, node)) { + ir_node *const op = be_get_Copy_op(schedpoint); replace_with_restore_imm(node, schedpoint, op, NULL, 0); } else if (is_sparc_Or(schedpoint) && arch_get_irn_flags(schedpoint) & ((arch_irn_flags_t)sparc_arch_irn_flag_immediate_form) && arch_get_irn_register_in(schedpoint, 0) == &sparc_registers[REG_G0] && - be_can_move_before(heights, schedpoint, node)) { + be_can_move_down(heights, schedpoint, node)) { /* it's a constant */ const sparc_attr_t *attr = get_sparc_attr_const(schedpoint); ir_entity *entity = attr->immediate_value_entity; @@ -521,7 +556,7 @@ static void peephole_sparc_RestoreZero(ir_node *node) ir_node *g0 = get_irn_n(schedpoint, 0); replace_with_restore_imm(node, schedpoint, g0, entity, immediate); } else if (is_sparc_Add(schedpoint) && - be_can_move_before(heights, schedpoint, node)) { + be_can_move_down(heights, schedpoint, node)) { if (arch_get_irn_flags(schedpoint) & ((arch_irn_flags_t)sparc_arch_irn_flag_immediate_form)) { ir_node *op = get_irn_n(schedpoint, 0); const sparc_attr_t *attr = get_sparc_attr_const(schedpoint); @@ -536,7 +571,7 @@ static void peephole_sparc_RestoreZero(ir_node *node) } else if (is_sparc_Sub(schedpoint) && arch_get_irn_flags(schedpoint) & ((arch_irn_flags_t)sparc_arch_irn_flag_immediate_form) && arch_get_irn_register_in(schedpoint, 0) == &sparc_registers[REG_G0] && - be_can_move_before(heights, schedpoint, node)) { + be_can_move_down(heights, schedpoint, node)) { /* it's a constant */ const sparc_attr_t *attr = get_sparc_attr_const(schedpoint); ir_entity *entity = attr->immediate_value_entity; @@ -653,6 +688,7 @@ void sparc_finish_graph(ir_graph *irg) register_peephole_optimisation(op_sparc_FrameAddr, peephole_sparc_FrameAddr); register_peephole_optimisation(op_sparc_RestoreZero, peephole_sparc_RestoreZero); + register_peephole_optimisation(op_sparc_Ldf, split_sparc_ldf); be_peephole_opt(irg); /* perform legalizations (mostly fix nodes with too big immediates) */