only set pinned state when not already pinned
[libfirm] / ir / be / ia32 / ia32_fpu.c
index 68d3161..53eecf5 100644 (file)
@@ -64,10 +64,8 @@ static ir_node *create_fpu_mode_spill(void *env, ir_node *state, int force,
                ir_node *nomem = new_NoMem();
                ir_node *frame = get_irg_frame(irg);
 
-               spill = new_rd_ia32_FnstCW(NULL, irg, block, frame, noreg, state,
-                                          nomem);
+               spill = new_rd_ia32_FnstCW(NULL, irg, block, frame, noreg, nomem, state);
                set_ia32_op_type(spill, ia32_AddrModeD);
-               set_ia32_am_flavour(spill, ia32_B);
                set_ia32_ls_mode(spill, ia32_reg_classes[CLASS_ia32_fp_cw].mode);
                set_ia32_use_frame(spill);
 
@@ -91,7 +89,6 @@ static ir_node *create_fpu_mode_reload(void *env, ir_node *state,
        if(spill != NULL) {
                reload = new_rd_ia32_FldCW(NULL, irg, block, frame, noreg, spill);
                set_ia32_op_type(reload, ia32_AddrModeS);
-               set_ia32_am_flavour(reload, ia32_B);
                set_ia32_ls_mode(reload, ia32_reg_classes[CLASS_ia32_fp_cw].mode);
                set_ia32_use_frame(reload);
                arch_set_irn_register(cg->arch_env, reload, &ia32_fp_cw_regs[REG_FPCW]);
@@ -101,19 +98,18 @@ static ir_node *create_fpu_mode_reload(void *env, ir_node *state,
                ir_mode *lsmode = ia32_reg_classes[CLASS_ia32_fp_cw].mode;
                ir_node *nomem = new_NoMem();
                ir_node *cwstore, *load, *load_res, *or, *store, *fldcw;
+               ir_node *or_const;
 
                assert(last_state != NULL);
-               cwstore = new_rd_ia32_FnstCW(NULL, irg, block, frame, noreg, last_state,
-                                            nomem);
+               cwstore = new_rd_ia32_FnstCW(NULL, irg, block, frame, noreg, nomem,
+                                            last_state);
                set_ia32_op_type(cwstore, ia32_AddrModeD);
-               set_ia32_am_flavour(cwstore, ia32_B);
                set_ia32_ls_mode(cwstore, lsmode);
                set_ia32_use_frame(cwstore);
                sched_add_before(before, cwstore);
 
                load = new_rd_ia32_Load(NULL, irg, block, frame, noreg, cwstore);
                set_ia32_op_type(load, ia32_AddrModeS);
-               set_ia32_am_flavour(load, ia32_B);
                set_ia32_ls_mode(load, lsmode);
                set_ia32_use_frame(load);
                sched_add_before(before, load);
@@ -121,21 +117,22 @@ static ir_node *create_fpu_mode_reload(void *env, ir_node *state,
                load_res = new_r_Proj(irg, block, load, mode_Iu, pn_ia32_Load_res);
 
                /* TODO: make the actual mode configurable in ChangeCW... */
-               or = new_rd_ia32_Or(NULL, irg, block, noreg, noreg, load_res, noreg,
-                                   nomem);
-               set_ia32_Immop_tarval(or, new_tarval_from_long(3072, mode_Iu));
+               or_const = new_rd_ia32_Immediate(NULL, irg, get_irg_start_block(irg),
+                                                NULL, 0, 3072);
+               arch_set_irn_register(cg->arch_env, or_const,
+                                     &ia32_gp_regs[REG_GP_NOREG]);
+               or = new_rd_ia32_Or(NULL, irg, block, noreg, noreg, nomem, load_res,
+                                   or_const);
                sched_add_before(before, or);
 
-               store = new_rd_ia32_Store(NULL, irg, block, frame, noreg, or, nomem);
+               store = new_rd_ia32_Store(NULL, irg, block, frame, noreg, nomem, or);
                set_ia32_op_type(store, ia32_AddrModeD);
-               set_ia32_am_flavour(store, ia32_B);
                set_ia32_ls_mode(store, lsmode);
                set_ia32_use_frame(store);
                sched_add_before(before, store);
 
                fldcw = new_rd_ia32_FldCW(NULL, irg, block, frame, noreg, store);
                set_ia32_op_type(fldcw, ia32_AddrModeS);
-               set_ia32_am_flavour(fldcw, ia32_B);
                set_ia32_ls_mode(fldcw, lsmode);
                set_ia32_use_frame(fldcw);
                arch_set_irn_register(cg->arch_env, fldcw, &ia32_fp_cw_regs[REG_FPCW]);
@@ -156,8 +153,12 @@ static
 void collect_fpu_mode_nodes_walker(ir_node *node, void *data)
 {
        collect_fpu_mode_nodes_env_t *env = data;
+       const arch_register_t *reg;
 
-       const arch_register_t *reg = arch_get_irn_register(env->arch_env, node);
+       if(!mode_is_data(get_irn_mode(node)))
+               return;
+
+       reg = arch_get_irn_register(env->arch_env, node);
        if(reg == &ia32_fp_cw_regs[REG_FPCW] && !is_ia32_ChangeCW(node)) {
                ARR_APP1(ir_node*, env->state_nodes, node);
        }