Both memory projs are involved in the transformation.
[libfirm] / ir / be / ia32 / ia32_intrinsics.c
index f3472c0..f2c1a17 100644 (file)
@@ -70,9 +70,8 @@ void ia32_handle_intrinsics(void)
  * @param proj   the pn_Call_T_result Proj
  * @param l_res  the lower 32 bit result
  * @param h_res  the upper 32 bit result or NULL
- * @param irg    the graph to replace on
  */
-static void reroute_result(ir_node *proj, ir_node *l_res, ir_node *h_res, ir_graph *irg)
+static void reroute_result(ir_node *proj, ir_node *l_res, ir_node *h_res)
 {
        const ir_edge_t *edge, *next;
 
@@ -81,9 +80,9 @@ static void reroute_result(ir_node *proj, ir_node *l_res, ir_node *h_res, ir_gra
                long    pn    = get_Proj_proj(proj);
 
                if (pn == 0) {
-                       edges_reroute(proj, l_res, irg);
+                       edges_reroute(proj, l_res);
                } else if (pn == 1 && h_res != NULL) {
-                       edges_reroute(proj, h_res, irg);
+                       edges_reroute(proj, h_res);
                } else {
                        panic("Unsupported Result-Proj from Call found");
                }
@@ -126,20 +125,19 @@ static void resolve_call(ir_node *call, ir_node *l_res, ir_node *h_res, ir_graph
                                set_opt_cse(0);
                                jmp = new_r_Jmp(block);
                                set_opt_cse(old_cse);
-                               edges_reroute(proj, jmp, irg);
+                               edges_reroute(proj, jmp);
                                break;
 
                        case pn_Call_X_except:
-                       case pn_Call_P_value_res_base:
                                /* should not happen here */
-                               edges_reroute(proj, bad, irg);
+                               edges_reroute(proj, bad);
                                break;
                        case pn_Call_M:
                                /* should not happen here */
-                               edges_reroute(proj, nomem, irg);
+                               edges_reroute(proj, nomem);
                                break;
                        case pn_Call_T_result:
-                               reroute_result(proj, l_res, h_res, irg);
+                               reroute_result(proj, l_res, h_res);
                                break;
                        default:
                                panic("Wrong Proj from Call");
@@ -174,7 +172,6 @@ static void resolve_call(ir_node *call, ir_node *l_res, ir_node *h_res, ir_graph
                set_Tuple_pred(call, pn_Call_X_regular,        jmp);
                set_Tuple_pred(call, pn_Call_X_except,         bad);
                set_Tuple_pred(call, pn_Call_T_result,         res);
-               set_Tuple_pred(call, pn_Call_P_value_res_base, bad);
        }
 }
 
@@ -269,7 +266,8 @@ static int map_Shl(ir_node *call, void *ctx)
                /* the shift count is a const, create better code */
                ir_tarval *tv = get_Const_tarval(cnt);
 
-               if (tarval_cmp(tv, new_tarval_from_long(32, l_mode)) & (pn_Cmp_Gt|pn_Cmp_Eq)) {
+               if (tarval_cmp(tv, new_tarval_from_long(32, l_mode))
+                               & (ir_relation_greater_equal)) {
                        /* simplest case: shift only the lower bits. Note that there is no
                           need to reduce the constant here, this is done by the hardware.  */
                        ir_node *conv = new_rd_Conv(dbg, block, a_l, h_mode);
@@ -300,8 +298,7 @@ static int map_Shl(ir_node *call, void *ctx)
        c_mode = get_irn_mode(cnt);
        irn    = new_r_Const_long(irg, c_mode, 32);
        irn    = new_rd_And(dbg, upper, cnt, irn, c_mode);
-       irn    = new_rd_Cmp(dbg, upper, irn, new_r_Const(irg, get_mode_null(c_mode)));
-       irn    = new_r_Proj(irn, mode_b, pn_Cmp_Eq);
+       irn    = new_rd_Cmp(dbg, upper, irn, new_r_Const(irg, get_mode_null(c_mode)), ir_relation_equal);
        cond   = new_rd_Cond(dbg, upper, irn);
 
        in[0]  = new_r_Proj(cond, mode_X, pn_Cond_true);
@@ -360,7 +357,7 @@ static int map_Shr(ir_node *call, void *ctx)
                /* the shift count is a const, create better code */
                ir_tarval *tv = get_Const_tarval(cnt);
 
-               if (tarval_cmp(tv, new_tarval_from_long(32, l_mode)) & (pn_Cmp_Gt|pn_Cmp_Eq)) {
+               if (tarval_cmp(tv, new_tarval_from_long(32, l_mode)) & (ir_relation_greater_equal)) {
                        /* simplest case: shift only the higher bits. Note that there is no
                           need to reduce the constant here, this is done by the hardware.  */
                        ir_node *conv = new_rd_Conv(dbg, block, a_h, l_mode);
@@ -389,8 +386,7 @@ static int map_Shr(ir_node *call, void *ctx)
        c_mode = get_irn_mode(cnt);
        irn    = new_r_Const_long(irg, c_mode, 32);
        irn    = new_rd_And(dbg, upper, cnt, irn, c_mode);
-       irn    = new_rd_Cmp(dbg, upper, irn, new_r_Const(irg, get_mode_null(c_mode)));
-       irn    = new_r_Proj(irn, mode_b, pn_Cmp_Eq);
+       irn    = new_rd_Cmp(dbg, upper, irn, new_r_Const(irg, get_mode_null(c_mode)), ir_relation_equal);
        cond   = new_rd_Cond(dbg, upper, irn);
 
        in[0]  = new_r_Proj(cond, mode_X, pn_Cond_true);
@@ -449,7 +445,7 @@ static int map_Shrs(ir_node *call, void *ctx)
                /* the shift count is a const, create better code */
                ir_tarval *tv = get_Const_tarval(cnt);
 
-               if (tarval_cmp(tv, new_tarval_from_long(32, l_mode)) & (pn_Cmp_Gt|pn_Cmp_Eq)) {
+               if (tarval_cmp(tv, new_tarval_from_long(32, l_mode)) & (ir_relation_greater_equal)) {
                        /* simplest case: shift only the higher bits. Note that there is no
                           need to reduce the constant here, this is done by the hardware.  */
                        ir_node *conv    = new_rd_Conv(dbg, block, a_h, l_mode);
@@ -480,8 +476,7 @@ static int map_Shrs(ir_node *call, void *ctx)
        c_mode = get_irn_mode(cnt);
        irn    = new_r_Const_long(irg, c_mode, 32);
        irn    = new_rd_And(dbg, upper, cnt, irn, c_mode);
-       irn    = new_rd_Cmp(dbg, upper, irn, new_r_Const(irg, get_mode_null(c_mode)));
-       irn    = new_r_Proj(irn, mode_b, pn_Cmp_Eq);
+       irn    = new_rd_Cmp(dbg, upper, irn, new_r_Const(irg, get_mode_null(c_mode)), ir_relation_equal);
        cond   = new_rd_Cond(dbg, upper, irn);
 
        in[0]  = new_r_Proj(cond, mode_X, pn_Cond_true);
@@ -822,9 +817,8 @@ static int map_Conv(ir_node *call, void *ctx)
                        part_block(call);
                        upper_blk = get_nodes_block(call);
 
-                       cmp   = new_rd_Cmp(dbg, upper_blk, a_f, flt_corr);
-                       proj  = new_r_Proj(cmp, mode_b, pn_Cmp_Lt);
-                       cond  = new_rd_Cond(dbg, upper_blk, proj);
+                       cmp   = new_rd_Cmp(dbg, upper_blk, a_f, flt_corr, ir_relation_less);
+                       cond  = new_rd_Cond(dbg, upper_blk, cmp);
                        in[0] = new_r_Proj(cond, mode_X, pn_Cond_true);
                        in[1] = new_r_Proj(cond, mode_X, pn_Cond_false);
                        blk   = new_r_Block(irg, 1, &in[1]);