Use simple assignment instead of memcpy() when possible.
[libfirm] / ir / be / ia32 / ia32_transform.c
index bf7d9bc..a9acd89 100644 (file)
@@ -62,7 +62,6 @@
 #include "ia32_new_nodes.h"
 #include "ia32_dbg_stat.h"
 #include "ia32_optimize.h"
-#include "ia32_util.h"
 #include "ia32_address_mode.h"
 #include "ia32_architecture.h"
 
@@ -90,6 +89,7 @@
 
 DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
 
+static ir_node         *old_initial_fpcw = NULL;
 static ir_node         *initial_fpcw = NULL;
 int                     ia32_no_pic_adjust;
 
@@ -1038,14 +1038,10 @@ static ir_node *gen_binop_flags(ir_node *node, construct_binop_flags_func *func,
 
 static ir_node *get_fpcw(void)
 {
-       ir_node *fpcw;
        if (initial_fpcw != NULL)
                return initial_fpcw;
 
-       fpcw         = be_abi_get_ignore_irn(be_get_irg_abi(current_ir_graph),
-                                            &ia32_registers[REG_FPCW]);
-       initial_fpcw = be_transform_node(fpcw);
-
+       initial_fpcw = be_transform_node(old_initial_fpcw);
        return initial_fpcw;
 }
 
@@ -2249,7 +2245,8 @@ static ir_node *dest_am_binop(ir_node *node, ir_node *op1, ir_node *op2,
 
        be_set_transformed_node(get_Proj_pred(am.mem_proj), new_node);
        mem_proj = be_transform_node(am.mem_proj);
-       be_set_transformed_node(mem_proj ? mem_proj : am.mem_proj, new_node);
+       be_set_transformed_node(am.mem_proj, new_node);
+       be_set_transformed_node(mem_proj, new_node);
 
        return new_node;
 }
@@ -2284,7 +2281,8 @@ static ir_node *dest_am_unop(ir_node *node, ir_node *op, ir_node *mem,
 
        be_set_transformed_node(get_Proj_pred(am.mem_proj), new_node);
        mem_proj = be_transform_node(am.mem_proj);
-       be_set_transformed_node(mem_proj ? mem_proj : am.mem_proj, new_node);
+       be_set_transformed_node(am.mem_proj, new_node);
+       be_set_transformed_node(mem_proj, new_node);
 
        return new_node;
 }
@@ -4798,6 +4796,7 @@ static ir_node *gen_return_address(ir_node *node)
        ir_node   *frame    = get_Builtin_param(node, 1);
        dbg_info  *dbgi     = get_irn_dbg_info(node);
        ir_tarval *tv       = get_Const_tarval(param);
+       ir_graph  *irg      = get_irn_irg(node);
        unsigned long value = get_tarval_long(tv);
 
        ir_node *block  = be_transform_node(get_nodes_block(node));
@@ -4819,7 +4818,7 @@ static ir_node *gen_return_address(ir_node *node)
 
        set_ia32_am_offs_int(load, 0);
        set_ia32_use_frame(load);
-       set_ia32_frame_ent(load, ia32_get_return_address_entity());
+       set_ia32_frame_ent(load, ia32_get_return_address_entity(irg));
 
        if (get_irn_pinned(node) == op_pin_state_floats) {
                assert((int)pn_ia32_xLoad_res == (int)pn_ia32_vfld_res
@@ -4841,6 +4840,7 @@ static ir_node *gen_frame_address(ir_node *node)
        ir_node   *frame    = get_Builtin_param(node, 1);
        dbg_info  *dbgi     = get_irn_dbg_info(node);
        ir_tarval *tv       = get_Const_tarval(param);
+       ir_graph  *irg      = get_irn_irg(node);
        unsigned long value = get_tarval_long(tv);
 
        ir_node *block  = be_transform_node(get_nodes_block(node));
@@ -4861,7 +4861,7 @@ static ir_node *gen_frame_address(ir_node *node)
        set_ia32_op_type(load, ia32_AddrModeS);
        set_ia32_ls_mode(load, mode_Iu);
 
-       ent = ia32_get_frame_address_entity();
+       ent = ia32_get_frame_address_entity(irg);
        if (ent != NULL) {
                set_ia32_am_offs_int(load, 0);
                set_ia32_use_frame(load);
@@ -5717,8 +5717,6 @@ static void ia32_pretransform_node(void)
 
        nomem    = get_irg_no_mem(irg);
        noreg_GP = ia32_new_NoReg_gp(irg);
-
-       get_fpcw();
 }
 
 /**
@@ -5824,6 +5822,8 @@ void ia32_transform_graph(ir_graph *irg)
        initial_fpcw       = NULL;
        ia32_no_pic_adjust = 0;
 
+       old_initial_fpcw = be_get_initial_reg_value(irg, &ia32_registers[REG_FPCW]);
+
        be_timer_push(T_HEIGHTS);
        ia32_heights = heights_new(irg);
        be_timer_pop(T_HEIGHTS);