From: Matthias Braun Date: Mon, 13 Aug 2007 15:08:57 +0000 (+0000) Subject: fix fehler69 X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=3242a8dfa467ac86a3043f80a90b4a946d80ce78;p=libfirm fix fehler69 [r15530] --- diff --git a/ir/be/ia32/bearch_ia32.c b/ir/be/ia32/bearch_ia32.c index 43a386506..6d9badeac 100644 --- a/ir/be/ia32/bearch_ia32.c +++ b/ir/be/ia32/bearch_ia32.c @@ -1256,6 +1256,7 @@ static void ia32_collect_frame_entity_nodes(ir_node *node, void *data) be_node_needs_frame_entity(env, node, mode, align); } else if(is_ia32_irn(node) && get_ia32_frame_ent(node) == NULL && is_ia32_use_frame(node)) { + ir_fprintf(stderr, "H: %+F\n", node); if (is_ia32_need_stackent(node) || is_ia32_Load(node)) { const ir_mode *mode = get_ia32_ls_mode(node); const ia32_attr_t *attr = get_ia32_attr_const(node); @@ -1264,6 +1265,10 @@ static void ia32_collect_frame_entity_nodes(ir_node *node, void *data) if(attr->data.need_64bit_stackent) { mode = mode_Ls; } + if(attr->data.need_32bit_stackent) { + printf("I was here\n"); + mode = mode_Is; + } be_node_needs_frame_entity(env, node, mode, align); } else if (is_ia32_vfild(node) || is_ia32_xLoad(node) || is_ia32_vfld(node)) { diff --git a/ir/be/ia32/ia32_nodes_attr.h b/ir/be/ia32/ia32_nodes_attr.h index 008ab3942..a4a23612b 100644 --- a/ir/be/ia32/ia32_nodes_attr.h +++ b/ir/be/ia32/ia32_nodes_attr.h @@ -129,6 +129,7 @@ struct ia32_attr_t { unsigned need_stackent:1; /**< Set to 1 if node need space on stack. */ unsigned need_64bit_stackent:1; /**< needs a 64bit stack entity (see double->unsigned int conv) */ + unsigned need_32bit_stackent:1; /**< needs a 32bit stack entity */ } data; int *out_flags; /**< flags for each produced value */ diff --git a/ir/be/ia32/ia32_optimize.c b/ir/be/ia32/ia32_optimize.c index dcc114085..e5790fbe3 100644 --- a/ir/be/ia32/ia32_optimize.c +++ b/ir/be/ia32/ia32_optimize.c @@ -1485,6 +1485,8 @@ static void optimize_am(ir_node *irn, void *env) { } if (source_possible) { + const ia32_attr_t *attr_load = get_ia32_attr_const(load); + ia32_attr_t *attr_irn = get_ia32_attr(irn); addr_b = get_irn_n(load, 0); addr_i = get_irn_n(load, 1); @@ -1496,6 +1498,10 @@ static void optimize_am(ir_node *irn, void *env) { set_ia32_am_flavour(irn, get_ia32_am_flavour(load)); set_ia32_op_type(irn, ia32_AddrModeS); set_ia32_frame_ent(irn, get_ia32_frame_ent(load)); + attr_irn->data.need_64bit_stackent + = attr_load->data.need_64bit_stackent; + attr_irn->data.need_32bit_stackent + = attr_load->data.need_32bit_stackent; /* set ls_mode if not already present (conv nodes already have ls_mode set) */ diff --git a/ir/be/ia32/ia32_transform.c b/ir/be/ia32/ia32_transform.c index e99c972e2..59834b374 100644 --- a/ir/be/ia32/ia32_transform.c +++ b/ir/be/ia32/ia32_transform.c @@ -2191,6 +2191,10 @@ static ir_node *gen_x87_fp_to_gp(ir_node *node) { if(get_ia32_ls_mode(fist) == mode_Ls) { ia32_attr_t *attr = get_ia32_attr(load); attr->data.need_64bit_stackent = 1; + } else { + ia32_attr_t *attr = get_ia32_attr(load); + attr->data.need_32bit_stackent = 1; + ir_fprintf(stderr, "here too: %+F\n", load); } SET_IA32_ORIG_NODE(load, ia32_get_old_node_name(cg, node)); @@ -3539,7 +3543,8 @@ static ir_node *gen_ia32_l_vfist(ir_node *node) { long am_offs; ia32_am_flavour_t am_flav = ia32_B; - new_op = new_rd_ia32_vfist(dbgi, irg, block, new_ptr, noreg, new_val, trunc_mode, new_mem); + new_op = new_rd_ia32_vfist(dbgi, irg, block, new_ptr, noreg, new_val, + trunc_mode, new_mem); if ((am_offs = get_ia32_am_offs_int(node)) != 0) { am_flav |= ia32_O;