- cg = XMALLOC(sparc_code_gen_t);
- cg->impl = &sparc_code_gen_if;
- cg->irg = birg->irg;
- //cg->reg_set = new_set(arm_cmp_irn_reg_assoc, 1024);
- cg->isa = isa;
- cg->birg = birg;
- //cg->int_tp = int_tp;
- //cg->have_fp_insn = 0;
- //cg->unknown_gp = NULL;
- //cg->unknown_fpa = NULL;
- cg->dump = (birg->main_env->options->dump_flags & DUMP_BE) ? 1 : 0;
-
- /* enter the current code generator */
- isa->cg = cg;
-
- return (arch_code_generator_t *)cg;
+ {
+ ir_node *block = get_nodes_block(node);
+ ir_node *unsigned_x = get_Conv_op(node);
+ ir_mode *mode_u = get_irn_mode(unsigned_x);
+ ir_mode *mode_s = find_signed_mode(mode_u);
+ ir_mode *mode_d = mode_D;
+ ir_node *signed_x = new_rd_Conv(dbgi, block, unsigned_x, mode_s);
+ ir_node *res = new_rd_Conv(dbgi, block, signed_x, mode_d);
+ ir_node *zero = new_r_Const(irg, get_mode_null(mode_s));
+ ir_node *cmp = new_rd_Cmp(dbgi, block, signed_x, zero);
+ ir_node *proj_lt = new_r_Proj(cmp, mode_b, pn_Cmp_Lt);
+ ir_node *cond = new_rd_Cond(dbgi, block, proj_lt);
+ 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_double(4294967296., mode_d);
+ ir_node *c_const = new_r_Const(irg, correction);
+ ir_node *fadd = new_rd_Add(dbgi, true_block, res, c_const,
+ mode_d);
+
+ ir_node *lower_in[2] = { true_jmp, false_jmp };
+ ir_node *phi_in[2] = { fadd, res };
+ ir_mode *dest_mode = get_irn_mode(node);
+ 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_d);
+ 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, dest_mode);
+
+ exchange(node, res_conv);
+ }