sparc: Improve handling of MemPerm nodes.
[libfirm] / ir / be / ia32 / ia32_transform.c
index b1d7d6c..a06ccd3 100644 (file)
@@ -2098,18 +2098,6 @@ static ia32_condition_code_t relation_to_condition_code(ir_relation relation,
        }
 }
 
-static ir_node *get_flags_mode_b(ir_node *node, ia32_condition_code_t *cc_out)
-{
-       /* a mode_b value, we have to compare it against 0 */
-       dbg_info *dbgi      = get_irn_dbg_info(node);
-       ir_node  *new_block = be_transform_node(get_nodes_block(node));
-       ir_node  *new_op    = be_transform_node(node);
-       ir_node  *flags     = new_bd_ia32_Test(dbgi, new_block, noreg_GP, noreg_GP, nomem, new_op, new_op, false);
-       set_ia32_ls_mode(flags, get_irn_mode(new_op));
-       *cc_out  = ia32_cc_not_equal;
-       return flags;
-}
-
 static ir_node *get_flags_node_cmp(ir_node *cmp, ia32_condition_code_t *cc_out)
 {
        /* must have a Cmp as input */
@@ -2171,10 +2159,8 @@ static ir_node *get_flags_node_cmp(ir_node *cmp, ia32_condition_code_t *cc_out)
  */
 static ir_node *get_flags_node(ir_node *node, ia32_condition_code_t *cc_out)
 {
-       if (is_Cmp(node))
-               return get_flags_node_cmp(node, cc_out);
-       assert(get_irn_mode(node) == mode_b);
-       return get_flags_mode_b(node, cc_out);
+       assert(is_Cmp(node));
+       return get_flags_node_cmp(node, cc_out);
 }
 
 /**
@@ -3022,7 +3008,8 @@ static bool upper_bits_clean(ir_node *transformed_node, ir_mode *mode)
                                return shifted == 0 || shifted == -1;
                        } else {
                                unsigned long shifted = (unsigned long)attr->offset;
-                               shifted >>= get_mode_size_bits(mode);
+                               shifted >>= get_mode_size_bits(mode)-1;
+                               shifted >>= 1;
                                return shifted == 0;
                        }
                }
@@ -3655,6 +3642,18 @@ static ir_node *gen_Mux(ir_node *node)
        }
 }
 
+static ir_node *gen_ia32_l_Setcc(ir_node *node)
+{
+       ia32_condition_code_t cc;
+       dbg_info *dbgi      = get_irn_dbg_info(node);
+       ir_node  *block     = get_nodes_block(node);
+       ir_node  *new_block = be_transform_node(block);
+       ir_node  *cond      = get_irn_n(node, n_ia32_l_Setcc_cond);
+       ir_node  *flags     = get_flags_node(cond, &cc);
+       ir_node  *new_node  = new_bd_ia32_Setcc(dbgi, new_block, flags, cc);
+       SET_IA32_ORIG_NODE(new_node, node);
+       return new_node;
+}
 
 /**
  * Create a conversion from x87 state register to general purpose.
@@ -3930,7 +3929,7 @@ static ir_node *gen_Conv(ir_node *node)
                        }
                } else {
                        /* this should be optimized already, but who knows... */
-                       DEBUG_ONLY(ir_fprintf(stderr, "Debug warning: conv %+F is pointless\n", node));
+                       DEBUG_ONLY(ir_fprintf(stderr, "Debug warning: conv %+F is pointless\n", node);)
                        DB((dbg, LEVEL_1, "killed Conv(mode, mode) ..."));
                        return be_transform_node(op);
                }
@@ -5780,6 +5779,7 @@ static void register_transformers(void)
        be_set_transform_function(op_ia32_l_LLtoFloat, gen_ia32_l_LLtoFloat);
        be_set_transform_function(op_ia32_l_Mul,       gen_ia32_l_Mul);
        be_set_transform_function(op_ia32_l_Sbb,       gen_ia32_l_Sbb);
+       be_set_transform_function(op_ia32_l_Setcc,     gen_ia32_l_Setcc);
        be_set_transform_function(op_ia32_l_Sub,       gen_ia32_l_Sub);
        be_set_transform_function(op_ia32_GetEIP,      be_duplicate_node);
        be_set_transform_function(op_ia32_Minus64Bit,  be_duplicate_node);
@@ -5893,7 +5893,11 @@ static void postprocess_fp_call_results(void)
                                        assert((long)pn_ia32_xStore_X_except == (long)pn_ia32_vfst_X_except);
 
                                        exchange(succ, st);
-                               } else if (new_res == NULL) {
+
+                                       continue;
+                               }
+
+                               if (new_res == NULL) {
                                        dbg_info *db       = get_irn_dbg_info(call);
                                        ir_node  *block    = get_nodes_block(call);
                                        ir_node  *frame    = get_irg_frame(current_ir_graph);