fix fehler69
authorMatthias Braun <matze@braunis.de>
Mon, 13 Aug 2007 15:08:57 +0000 (15:08 +0000)
committerMatthias Braun <matze@braunis.de>
Mon, 13 Aug 2007 15:08:57 +0000 (15:08 +0000)
[r15530]

ir/be/ia32/bearch_ia32.c
ir/be/ia32/ia32_nodes_attr.h
ir/be/ia32/ia32_optimize.c
ir/be/ia32/ia32_transform.c

index 43a3865..6d9bade 100644 (file)
@@ -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)) {
index 008ab39..a4a2361 100644 (file)
@@ -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 */
index dcc1140..e5790fb 100644 (file)
@@ -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) */
index e99c972..59834b3 100644 (file)
@@ -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;