+ {
+ ir_node *block = get_nodes_block(node);
+ ir_node *float_x = get_Conv_op(node);
+ ir_mode *mode_u = get_irn_mode(node);
+ ir_mode *mode_s = find_signed_mode(mode_u);
+ ir_mode *mode_f = get_irn_mode(float_x);
+ ir_tarval *limit = new_tarval_from_double(2147483648., mode_f);
+ ir_node *limitc = new_r_Const(irg, limit);
+ ir_node *cmp = new_rd_Cmp(dbgi, block, float_x, limitc,
+ ir_relation_greater_equal);
+ ir_node *cond = new_rd_Cond(dbgi, block, cmp);
+ ir_node *proj_true = new_r_Proj(cond, mode_X, pn_Cond_true);
+ ir_node *proj_false = new_r_Proj(cond, mode_X, pn_Cond_false);
+ ir_node *in_true[1] = { proj_true };
+ ir_node *in_false[1] = { proj_false };
+ ir_node *true_block = new_r_Block(irg, ARRAY_SIZE(in_true), in_true);
+ ir_node *false_block = new_r_Block(irg, ARRAY_SIZE(in_false),in_false);
+ ir_node *true_jmp = new_r_Jmp(true_block);
+ ir_node *false_jmp = new_r_Jmp(false_block);
+
+ ir_tarval *correction = new_tarval_from_long(0x80000000l, mode_s);
+ ir_node *c_const = new_r_Const(irg, correction);
+ ir_node *sub = new_rd_Sub(dbgi, true_block, float_x, limitc,
+ mode_f);
+ ir_node *sub_conv = new_rd_Conv(dbgi, true_block, sub, mode_s);
+ ir_node *xorn = new_rd_Eor(dbgi, true_block, sub_conv, c_const,
+ mode_s);
+
+ ir_node *converted = new_rd_Conv(dbgi, false_block, float_x,mode_s);
+
+ ir_node *lower_in[2] = { true_jmp, false_jmp };
+ ir_node *phi_in[2] = { xorn, converted };
+ ir_node *phi;
+ ir_node *res_conv;
+
+ set_irn_in(lower_block, ARRAY_SIZE(lower_in), lower_in);
+ phi = new_r_Phi(lower_block, ARRAY_SIZE(phi_in), phi_in, mode_s);
+ assert(get_Block_phis(lower_block) == NULL);
+ set_Block_phis(lower_block, phi);
+ set_Phi_next(phi, NULL);
+
+ res_conv = new_rd_Conv(dbgi, lower_block, phi, mode_u);
+ exchange(node, res_conv);
+ }