X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Flower%2Flower_softfloat.c;h=08133813965b5db9a1f3a76b5e1c5884f2397da0;hb=b59e22a229aa1227ef992c184c79fdafe34908cf;hp=71717cf0bf8d67ac633ccb6bd458e3a36a47e7b7;hpb=c47eb955f454e1b488a4175d6831c025e0b76293;p=libfirm diff --git a/ir/lower/lower_softfloat.c b/ir/lower/lower_softfloat.c index 71717cf0b..081338139 100644 --- a/ir/lower/lower_softfloat.c +++ b/ir/lower/lower_softfloat.c @@ -37,6 +37,7 @@ #include "irgwalk.h" #include "irmode.h" #include "iropt_dbg.h" +#include "iroptimize.h" #include "irprog_t.h" #include "lower_softfloat.h" #include "lowering.h" @@ -140,7 +141,6 @@ static ir_type *get_softfloat_type(const ir_node *n) switch (opcode) { case iro_Div: - mode = get_Div_resmode(n); operand_mode = get_irn_mode(get_Div_left(n)); /* fall through */ case iro_Add: @@ -317,10 +317,8 @@ static ir_node *create_softfloat_symconst(const ir_node *n, const char *name) else snprintf(buf, sizeof(buf), "__%s%s%s%s", name, first_param, second_param, result); - id = new_id_from_str(buf); - ent = new_entity(get_glob_type(), id, method); - - set_entity_ld_ident(ent, get_entity_ident(ent)); + id = new_id_from_str(buf); + ent = create_compilerlib_entity(id, method); sym.entity_p = ent; return new_r_SymConst(irg, mode_P_code, sym, symconst_addr_ent); @@ -380,7 +378,7 @@ static ir_type *lower_method_type(ir_type *mtp) size_t n_param; size_t n_res; - res = (ir_type*)pmap_get(lowered_type, mtp); + res = pmap_get(ir_type, lowered_type, mtp); if (res != NULL) return res; @@ -415,7 +413,7 @@ static ir_type *lower_method_type(ir_type *mtp) set_method_calling_convention(res, get_method_calling_convention(mtp)); set_method_additional_properties(res, get_method_additional_properties(mtp)); - set_lowered_type(mtp, res); + set_higher_type(res, mtp); pmap_insert(lowered_type, mtp, res); return res; @@ -485,7 +483,7 @@ static void lower_Cmp(ir_node *n) ir_mode *op_mode = get_irn_mode(left); ir_node *right = get_Cmp_right(n); ir_node *symconst2 = NULL; - ir_node *zero = new_rd_Const_long(dbgi, irg, mode_Is, 0); + ir_node *zero = new_rd_Const(dbgi, irg, get_mode_null(mode_Is)); if (! mode_is_float(op_mode)) return; @@ -602,23 +600,19 @@ static const tarval_mode_info hex_output = { */ static void lower_Const(ir_node *n) { - ir_mode *lowered_mode; - ir_mode *mode = get_irn_mode(n); - ir_tarval *tv = get_Const_tarval(n); - char buf[100]; - size_t len; - - if (! mode_is_float(mode)) + ir_mode *mode = get_irn_mode(n); + if (!mode_is_float(mode)) return; - lowered_mode = get_lowered_mode(mode); + ir_mode *lowered_mode = get_lowered_mode(mode); set_irn_mode(n, lowered_mode); set_tarval_mode_output_option(mode, &hex_output); - tarval_snprintf(buf, 100, get_Const_tarval(n)); + char buf[100]; + tarval_snprintf(buf, sizeof(buf), get_Const_tarval(n)); - len = strlen(buf); - tv = new_tarval_from_str(buf, len, lowered_mode); + size_t len = strlen(buf); + ir_tarval *tv = new_tarval_from_str(buf, len, lowered_mode); set_Const_tarval(n, tv); } @@ -695,16 +689,14 @@ static void lower_Conv(ir_node *n) */ static void lower_Div(ir_node *n) { - ir_node *symconst; - ir_node *block = get_nodes_block(n); - ir_node *call_result = NULL; - dbg_info *dbgi = get_irn_dbg_info(n); - ir_graph *irg = get_irn_irg(n); - ir_node *left = get_Div_left(n); - ir_mode *mode = get_Div_resmode(n); - ir_node *right = get_Div_right(n); - const ir_edge_t *edge; - const ir_edge_t *next; + ir_node *symconst; + ir_node *block = get_nodes_block(n); + ir_node *call_result = NULL; + dbg_info *dbgi = get_irn_dbg_info(n); + ir_graph *irg = get_irn_irg(n); + ir_node *left = get_Div_left(n); + ir_mode *mode = get_Div_resmode(n); + ir_node *right = get_Div_right(n); if (! mode_is_float(mode)) return; @@ -724,7 +716,7 @@ static void lower_Div(ir_node *n) set_irn_pinned(call, get_irn_pinned(n)); - foreach_out_edge_safe(n, edge, next) { + foreach_out_edge_safe(n, edge) { ir_node *proj = get_edge_src_irn(edge); if (! is_Proj(proj)) continue; @@ -1062,7 +1054,7 @@ void lower_floating_point(void) ir_prepare_softfloat_lowering(); - clear_irp_opcodes_generic_func(); + ir_clear_opcodes_generic_func(); ir_register_softloat_lower_function(op_Add, lower_Add); ir_register_softloat_lower_function(op_Cmp, lower_Cmp); ir_register_softloat_lower_function(op_Conv, lower_Conv); @@ -1076,7 +1068,7 @@ void lower_floating_point(void) ir_nodeset_init(&created_mux_nodes); - edges_assure(irg); + assure_edges(irg); irg_walk_graph(irg, NULL, lower_node, NULL); @@ -1086,7 +1078,7 @@ void lower_floating_point(void) ir_nodeset_destroy(&created_mux_nodes); } - clear_irp_opcodes_generic_func(); + ir_clear_opcodes_generic_func(); ir_register_softloat_lower_function(op_Call, lower_Call); ir_register_softloat_lower_function(op_Const, lower_Const); ir_register_softloat_lower_function(op_Div, lower_Div_mode); @@ -1097,10 +1089,24 @@ void lower_floating_point(void) ir_entity *ent = get_irg_entity(irg); ir_type *mtp = get_entity_type(ent); ir_type *lowered_mtp = lower_method_type(mtp); + ir_type *frame_tp = get_irg_frame_type(irg); + size_t n_members; + size_t i; if (lowered_mtp != mtp) set_entity_type(ent, lowered_mtp); irg_walk_graph(irg, NULL, lower_mode, NULL); + + /* fixup parameter entities */ + n_members = get_compound_n_members(frame_tp); + for (i = 0; i < n_members; ++i) { + ir_entity *member = get_compound_member(frame_tp, i); + ir_type *type = get_entity_type(member); + if (is_Primitive_type(type)) { + ir_type *lowered = lower_type(type); + set_entity_type(member, lowered); + } + } } }