Fixed be_Return simulation: pop the stack only if floating point values are returned
[libfirm] / ir / be / ia32 / ia32_optimize.c
index 33c361d..5715d36 100644 (file)
@@ -84,8 +84,9 @@ static ir_node *gen_SymConst(ia32_transform_env_t *env) {
        ir_node  *block = env->block;
 
        if (mode_is_float(mode)) {
+               FP_USED(env->cg);
                if (USE_SSE2(env->cg))
-                       cnst = new_rd_ia32_fConst(dbg, irg, block, mode);
+                       cnst = new_rd_ia32_xConst(dbg, irg, block, mode);
                else
                        cnst = new_rd_ia32_vfConst(dbg, irg, block, mode);
        }
@@ -240,7 +241,7 @@ void ia32_place_consts_set_modes(ir_node *irn, void *env) {
                }
 
                /* put the const into the block where the original const was */
-               if (! cg->opt.placecnst) {
+               if (! (cg->opt & IA32_OPT_PLACECNST)) {
                        tenv.block = get_nodes_block(pred);
                }
 
@@ -436,9 +437,9 @@ static void ia32_create_Push(ir_node *irn, ia32_code_gen_t *cg) {
 
        bl   = get_nodes_block(irn);
        push = new_rd_ia32_Push(NULL, current_ir_graph, bl,
-               be_get_IncSP_pred(sp), val, be_get_IncSP_mem(sp), mode_T);
-       proj_res = new_r_Proj(current_ir_graph, bl, push, get_irn_mode(sp), 0);
-       proj_M   = new_r_Proj(current_ir_graph, bl, push, mode_M, 1);
+               be_get_IncSP_pred(sp), val, be_get_IncSP_mem(sp));
+       proj_res = new_r_Proj(current_ir_graph, bl, push, get_irn_mode(sp), pn_ia32_Push_stack);
+       proj_M   = new_r_Proj(current_ir_graph, bl, push, mode_M, pn_ia32_Push_M);
 
        /* the push must have SP out register */
        arch_set_irn_register(cg->arch_env, push, arch_get_irn_register(cg->arch_env, sp));
@@ -466,7 +467,7 @@ static void ia32_create_Pop(ir_node *irn, ia32_code_gen_t *cg) {
        if (arch_get_irn_register(cg->arch_env, get_irn_n(load, 1)) !=
                &ia32_gp_regs[REG_GP_NOREG])
                return;
-       if (arch_get_irn_register(cg->arch_env, get_irn_n(load, 0)) != cg->isa->sp)
+       if (arch_get_irn_register(cg->arch_env, get_irn_n(load, 0)) != cg->isa->arch_isa.sp)
                return;
 
        /* ok, translate into pop */
@@ -493,10 +494,10 @@ static void ia32_create_Pop(ir_node *irn, ia32_code_gen_t *cg) {
        reg = arch_get_irn_register(cg->arch_env, load);
        sp  = arch_get_irn_register(cg->arch_env, irn);
 
-       pop      = new_rd_ia32_Pop(NULL, current_ir_graph, bl, get_irn_n(irn, 0), get_irn_n(load, 2), mode_T);
-       proj_res = new_r_Proj(current_ir_graph, bl, pop, get_irn_mode(old_proj_res), 0);
-       proj_sp  = new_r_Proj(current_ir_graph, bl, pop, get_irn_mode(irn), 1);
-       proj_M   = new_r_Proj(current_ir_graph, bl, pop, mode_M, 2);
+       pop      = new_rd_ia32_Pop(NULL, current_ir_graph, bl, get_irn_n(irn, 0), get_irn_n(load, 2));
+       proj_res = new_r_Proj(current_ir_graph, bl, pop, get_irn_mode(old_proj_res), pn_ia32_Pop_res);
+       proj_sp  = new_r_Proj(current_ir_graph, bl, pop, get_irn_mode(irn), pn_ia32_Pop_stack);
+       proj_M   = new_r_Proj(current_ir_graph, bl, pop, mode_M, pn_ia32_Pop_M);
 
        exchange(old_proj_M, proj_M);
        exchange(old_proj_res, proj_res);
@@ -538,6 +539,9 @@ static void ia32_optimize_IncSP(ir_node *irn, ia32_code_gen_t *cg) {
                be_set_IncSP_offset(prev, 0);
                be_set_IncSP_offset(irn, (unsigned)new_ofs);
                be_set_IncSP_direction(irn, curr_dir);
+
+               /* Omit the optimized IncSP */
+               be_set_IncSP_pred(irn, be_get_IncSP_pred(prev));
        }
 }
 
@@ -1324,7 +1328,7 @@ void ia32_optimize_am(ir_node *irn, void *env) {
                                if (ia32_get_irn_n_edges(succ) == 1) {
                                        succ = get_edge_src_irn(get_irn_out_edge_first(succ));
 
-                                       if (is_ia32_fStore(succ) || is_ia32_Store(succ)) {
+                                       if (is_ia32_xStore(succ) || is_ia32_Store(succ)) {
                                                store  = succ;
                                                addr_b = get_irn_n(store, 0);
                                                addr_i = get_irn_n(store, 1);