X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fsparc%2Fsparc_transform.c;h=4f6c92b6354734599f565616ee55eb7115b3bb16;hb=c32482bc042c9f0591bec432ccb6dfcadbad4cb7;hp=93da822effeadfc86a9e135b959b568bbce9b83b;hpb=d990f15e5b35ff6d6a790bacb35eaacd5e583fdc;p=libfirm diff --git a/ir/be/sparc/sparc_transform.c b/ir/be/sparc/sparc_transform.c index 93da822ef..4f6c92b63 100644 --- a/ir/be/sparc/sparc_transform.c +++ b/ir/be/sparc/sparc_transform.c @@ -663,7 +663,7 @@ static ir_node *gen_Proj_AddCC_t(ir_node *node) case pn_sparc_AddCC_t_flags: return new_r_Proj(new_pred, mode_flags, pn_sparc_AddCC_flags); default: - panic("Invalid AddCC_t proj found"); + panic("Invalid proj found"); } } @@ -710,7 +710,7 @@ static ir_node *gen_Proj_SubCC_t(ir_node *node) case pn_sparc_SubCC_t_flags: return new_r_Proj(new_pred, mode_flags, pn_sparc_SubCC_flags); default: - panic("Invalid SubCC_t proj found"); + panic("Invalid proj found"); } } @@ -777,7 +777,7 @@ static ir_node *gen_Load(ir_node *node) address_t address; if (get_Load_unaligned(node) == align_non_aligned) { - panic("sparc: transformation of unaligned Loads not implemented yet"); + panic("transformation of unaligned Loads not implemented yet"); } if (mode_is_float(mode)) { @@ -820,7 +820,7 @@ static ir_node *gen_Store(ir_node *node) address_t address; if (get_Store_unaligned(node) == align_non_aligned) { - panic("sparc: transformation of unaligned Stores not implemented yet"); + panic("transformation of unaligned Stores not implemented yet"); } if (mode_is_float(mode)) { @@ -1054,7 +1054,7 @@ static ir_node *gen_Shl(ir_node *node) { ir_mode *mode = get_irn_mode(node); if (get_mode_modulo_shift(mode) != 32) - panic("modulo_shift!=32 not supported by sparc backend"); + panic("modulo_shift!=32 not supported"); return gen_helper_binop(node, MATCH_NONE, new_bd_sparc_Sll_reg, new_bd_sparc_Sll_imm); } @@ -1062,7 +1062,7 @@ static ir_node *gen_Shr(ir_node *node) { ir_mode *mode = get_irn_mode(node); if (get_mode_modulo_shift(mode) != 32) - panic("modulo_shift!=32 not supported by sparc backend"); + panic("modulo_shift!=32 not supported"); return gen_helper_binop(node, MATCH_NONE, new_bd_sparc_Srl_reg, new_bd_sparc_Srl_imm); } @@ -1070,7 +1070,7 @@ static ir_node *gen_Shrs(ir_node *node) { ir_mode *mode = get_irn_mode(node); if (get_mode_modulo_shift(mode) != 32) - panic("modulo_shift!=32 not supported by sparc backend"); + panic("modulo_shift!=32 not supported"); return gen_helper_binop(node, MATCH_NONE, new_bd_sparc_Sra_reg, new_bd_sparc_Sra_imm); } @@ -2022,7 +2022,10 @@ static ir_node *gen_Alloc(ir_node *node) ir_type *type = get_Alloc_type(node); ir_node *size = get_Alloc_count(node); ir_node *stack_pred = get_stack_pointer_for(node); + ir_node *mem = get_Alloc_mem(node); + ir_node *new_mem = be_transform_node(mem); ir_node *subsp; + if (get_Alloc_where(node) != stack_alloc) panic("only stack-alloc supported in sparc backend (at %+F)", node); /* lowerer should have transformed all allocas to byte size */ @@ -2032,44 +2035,45 @@ static ir_node *gen_Alloc(ir_node *node) if (is_Const(size)) { ir_tarval *tv = get_Const_tarval(size); long sizel = get_tarval_long(tv); - subsp = be_new_IncSP(sp_reg, new_block, stack_pred, sizel, 0); - set_irn_dbg_info(subsp, dbgi); + + assert((sizel & (SPARC_STACK_ALIGNMENT - 1)) == 0 && "Found Alloc with misaligned constant"); + subsp = new_bd_sparc_SubSP_imm(dbgi, new_block, stack_pred, new_mem, NULL, sizel); } else { ir_node *new_size = be_transform_node(size); - subsp = new_bd_sparc_SubSP(dbgi, new_block, stack_pred, new_size); - arch_set_irn_register(subsp, sp_reg); + subsp = new_bd_sparc_SubSP_reg(dbgi, new_block, stack_pred, new_size, new_mem); } - /* if we are the last IncSP producer in a block then we have to keep - * the stack value. - * Note: This here keeps all producers which is more than necessary */ - keep_alive(subsp); + ir_node *stack_proj = new_r_Proj(subsp, mode_gp, pn_sparc_SubSP_stack); + arch_set_irn_register(stack_proj, sp_reg); + /* If we are the last stack producer in a block, we have to keep the + * stack value. This keeps all producers, which is more than necessary. */ + keep_alive(stack_proj); - pmap_insert(node_to_stack, node, subsp); - /* the "result" is the unmodified sp value */ - return stack_pred; + pmap_insert(node_to_stack, node, stack_proj); + + return subsp; } static ir_node *gen_Proj_Alloc(ir_node *node) { - ir_node *alloc = get_Proj_pred(node); - long pn = get_Proj_proj(node); + ir_node *alloc = get_Proj_pred(node); + ir_node *new_alloc = be_transform_node(alloc); + long pn = get_Proj_proj(node); switch ((pn_Alloc)pn) { - case pn_Alloc_M: { - ir_node *alloc_mem = get_Alloc_mem(alloc); - return be_transform_node(alloc_mem); - } + case pn_Alloc_M: + return new_r_Proj(new_alloc, mode_M, pn_sparc_SubSP_M); case pn_Alloc_res: { - ir_node *new_alloc = be_transform_node(alloc); - return new_alloc; + ir_node *addr_proj = new_r_Proj(new_alloc, mode_gp, pn_sparc_SubSP_addr); + arch_set_irn_register(addr_proj, arch_get_irn_register(node)); + return addr_proj; } case pn_Alloc_X_regular: case pn_Alloc_X_except: - panic("sparc backend: exception output of alloc not supported (at %+F)", + panic("exception output of alloc not supported (at %+F)", node); } - panic("sparc backend: invalid Proj->Alloc"); + panic("invalid Proj->Alloc"); } static ir_node *gen_Free(ir_node *node) @@ -2265,7 +2269,7 @@ static ir_node *gen_Proj_Div(ir_node *node) } else if (is_sparc_fdiv(new_pred)) { res_mode = get_Div_resmode(pred); } else { - panic("sparc backend: Div transformed to something unexpected: %+F", + panic("Div transformed to something unexpected: %+F", new_pred); } assert((int)pn_sparc_SDiv_res == (int)pn_sparc_UDiv_res);