xStore, xLoad should have base latency 0
[libfirm] / ir / be / ia32 / ia32_finish.c
index 3490c56..9b23cac 100644 (file)
@@ -93,13 +93,14 @@ static void ia32_transform_sub_to_neg_add(ir_node *irn, ia32_code_gen_t *cg) {
        if(mode_is_float(mode)) {
                int size;
                ir_entity *entity;
+               ir_mode *op_mode = get_ia32_ls_mode(irn);
 
                res = new_rd_ia32_xXor(dbg, irg, block, noreg, noreg, in2, noreg_fp, nomem);
-               size = get_mode_size_bits(mode);
+               size = get_mode_size_bits(op_mode);
                entity = ia32_gen_fp_known_const(size == 32 ? ia32_SSIGN : ia32_DSIGN);
                set_ia32_am_sc(res, entity);
                set_ia32_op_type(res, ia32_AddrModeS);
-               set_ia32_ls_mode(res, get_ia32_ls_mode(irn));
+               set_ia32_ls_mode(res, op_mode);
        } else {
                res = new_rd_ia32_Neg(dbg, irg, block, in2);
        }
@@ -259,16 +260,7 @@ static void ia32_transform_lea_to_add_or_shl(ir_node *node, ia32_code_gen_t *cg)
                        }
 #endif
                        op1 = base;
-                       if(cg->isa->opt & IA32_OPT_INCDEC) {
-                               if(is_am_one(node)) {
-                                       goto make_inc;
-                               }
-                               if(is_am_minus_one(node)) {
-                                       goto make_dec;
-                               }
-                       }
-                       op2 = create_immediate_from_am(cg, node);
-                       goto make_add;
+                       goto make_add_immediate;
                }
                if(scale == 0 && !has_immediates) {
                        op1 = base;
@@ -279,28 +271,19 @@ static void ia32_transform_lea_to_add_or_shl(ir_node *node, ia32_code_gen_t *cg)
                return;
        } else if(out_reg == index_reg) {
                if(base == NULL) {
-                  if(has_immediates && scale == 0) {
-                          op1 = index;
-                               if(cg->isa->opt & IA32_OPT_INCDEC) {
-                                       if(is_am_one(node)) {
-                                               goto make_inc;
-                                       }
-                                       if(is_am_minus_one(node)) {
-                                               goto make_dec;
-                                       }
-                               }
-                          op2 = create_immediate_from_am(cg, node);
-                          goto make_add;
-                  } else if(!has_immediates && scale > 0) {
-                          op1 = index;
-                          op2 = create_immediate_from_int(cg, scale);
-                          goto make_shl;
-                  } else if(!has_immediates) {
+                       if(has_immediates && scale == 0) {
+                               op1 = index;
+                               goto make_add_immediate;
+                       } else if(!has_immediates && scale > 0) {
+                               op1 = index;
+                               op2 = create_immediate_from_int(cg, scale);
+                               goto make_shl;
+                       } else if(!has_immediates) {
 #ifdef DEBUG_libfirm
                                ir_fprintf(stderr, "Optimisation warning: found lea which is "
                                           "just a copy\n");
 #endif
-                  }
+                       }
                } else if(scale == 0 && !has_immediates) {
                        op1 = index;
                        op2 = base;
@@ -313,6 +296,25 @@ static void ia32_transform_lea_to_add_or_shl(ir_node *node, ia32_code_gen_t *cg)
                return;
        }
 
+make_add_immediate:
+       if(cg->isa->opt & IA32_OPT_INCDEC) {
+               if(is_am_one(node)) {
+                       dbgi  = get_irn_dbg_info(node);
+                       block = get_nodes_block(node);
+                       res   = new_rd_ia32_Inc(dbgi, irg, block, op1);
+                       arch_set_irn_register(arch_env, res, out_reg);
+                       goto exchange;
+               }
+               if(is_am_minus_one(node)) {
+                       dbgi  = get_irn_dbg_info(node);
+                       block = get_nodes_block(node);
+                       res   = new_rd_ia32_Dec(dbgi, irg, block, op1);
+                       arch_set_irn_register(arch_env, res, out_reg);
+                       goto exchange;
+               }
+       }
+       op2 = create_immediate_from_am(cg, node);
+
 make_add:
        dbgi  = get_irn_dbg_info(node);
        block = get_nodes_block(node);
@@ -323,20 +325,6 @@ make_add:
        set_ia32_commutative(res);
        goto exchange;
 
-make_inc:
-       dbgi  = get_irn_dbg_info(node);
-       block = get_nodes_block(node);
-       res   = new_rd_ia32_Inc(dbgi, irg, block, op1);
-       arch_set_irn_register(arch_env, res, out_reg);
-       goto exchange;
-
-make_dec:
-       dbgi  = get_irn_dbg_info(node);
-       block = get_nodes_block(node);
-       res   = new_rd_ia32_Dec(dbgi, irg, block, op1);
-       arch_set_irn_register(arch_env, res, out_reg);
-       goto exchange;
-
 make_shl:
        dbgi  = get_irn_dbg_info(node);
        block = get_nodes_block(node);