return get_mode_size_bytes(mode);
}
+static ir_node *sparc_create_set(ir_node *cond)
+{
+ return ir_create_cond_set(cond, mode_Iu);
+}
+
static void sparc_lower_for_target(void)
{
int i;
int n_irgs = get_irp_n_irgs();
-
- /* TODO, doubleword lowering and others */
+ lower_mode_b_config_t lower_mode_b_config = {
+ mode_Iu,
+ sparc_create_set,
+ 0,
+ };
for (i = 0; i < n_irgs; ++i) {
ir_graph *irg = get_irp_irg(i);
+ ir_lower_mode_b(irg, &lower_mode_b_config);
lower_switch(irg, 256, false);
}
}
static int sparc_is_mux_allowed(ir_node *sel, ir_node *mux_false,
ir_node *mux_true)
{
- (void) sel;
- (void) mux_false;
- (void) mux_true;
+ ir_graph *irg = get_irn_irg(sel);
+ ir_mode *mode = get_irn_mode(mux_true);
+
+ if (get_irg_phase_state(irg) == phase_low)
+ return false;
+
+ if (!mode_is_int(mode) && !mode_is_reference(mode) && mode != mode_b)
+ return false;
+ if (is_Const(mux_true) && is_Const_one(mux_true) &&
+ is_Const(mux_false) && is_Const_null(mux_false))
+ return true;
return false;
}
while (sched_has_prev(schedpoint)) {
schedpoint = sched_prev(schedpoint);
- if (tries++ >= PICK_DELAY_SLOT_MAX_DISTANCE)
- break;
-
if (has_delay_slot(schedpoint))
break;
if (is_no_instruction(schedpoint))
continue;
+ if (tries++ >= PICK_DELAY_SLOT_MAX_DISTANCE)
+ break;
+
if (emits_multiple_instructions(schedpoint))
continue;
{
ir_node *block = be_transform_node(get_nodes_block(node));
ir_node *op = get_Conv_op(node);
- ir_node *new_op = be_transform_node(op);
ir_mode *src_mode = get_irn_mode(op);
ir_mode *dst_mode = get_irn_mode(node);
dbg_info *dbg = get_irn_dbg_info(node);
+ ir_node *new_op;
int src_bits = get_mode_size_bits(src_mode);
int dst_bits = get_mode_size_bits(dst_mode);
+ if (src_mode == mode_b)
+ panic("ConvB not lowered %+F", node);
+
+ new_op = be_transform_node(op);
if (src_mode == dst_mode)
return new_op;
}
return create_itof(dbg, block, new_op, dst_mode);
}
+ } else if (src_mode == mode_b) {
+ panic("ConvB not lowered %+F", node);
} else { /* complete in gp registers */
int min_bits;
ir_mode *min_mode;
set_irn_in(lower_block, ARRAY_SIZE(lower_in), lower_in);
phi = new_r_Phi(lower_block, ARRAY_SIZE(phi_in), phi_in, dest_mode);
- assert(get_Block_phis(lower_block) == NULL);
- set_Block_phis(lower_block, phi);
- set_Phi_next(phi, NULL);
/* make sure we do visit the cond_value later... */
ARR_APP1(ir_node*, check_later, cond_value);