X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Fia32%2Fia32_intrinsics.c;h=192a20241435b795f791f30178e84870b61eb47a;hb=248af0e1d8280f21f356bb148ecdf11f2e7a6093;hp=f3472c0a26df423df5422a9ce503d754d3986dfe;hpb=ce6161a7e42a48f7422b7babcc64d8ace18e2687;p=libfirm diff --git a/ir/be/ia32/ia32_intrinsics.c b/ir/be/ia32/ia32_intrinsics.c index f3472c0a2..192a20241 100644 --- a/ir/be/ia32/ia32_intrinsics.c +++ b/ir/be/ia32/ia32_intrinsics.c @@ -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"); } @@ -102,7 +101,6 @@ static void reroute_result(ir_node *proj, ir_node *l_res, ir_node *h_res, ir_gra static void resolve_call(ir_node *call, ir_node *l_res, ir_node *h_res, ir_graph *irg, ir_node *block) { ir_node *jmp, *res, *in[2]; - ir_node *bad = get_irg_bad(irg); ir_node *nomem = get_irg_no_mem(irg); int old_cse; @@ -126,20 +124,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, new_r_Bad(irg, mode_X)); 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"); @@ -170,11 +167,10 @@ static void resolve_call(ir_node *call, ir_node *l_res, ir_node *h_res, ir_graph jmp = new_r_Jmp(block); set_opt_cse(old_cse); - set_Tuple_pred(call, pn_Call_M, nomem); - 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); + set_Tuple_pred(call, pn_Call_M, nomem); + set_Tuple_pred(call, pn_Call_X_regular, jmp); + set_Tuple_pred(call, pn_Call_X_except, new_r_Bad(irg, mode_X)); + set_Tuple_pred(call, pn_Call_T_result, res); } } @@ -269,7 +265,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 +297,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 +356,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 +385,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 +444,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 +475,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 +816,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]);