From 199fcc3a56d1ce5f18819aef4a6fb91adf490694 Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Fri, 8 Oct 2010 14:02:17 +0000 Subject: [PATCH] sparc: support mode_b lowering [r28070] --- ir/be/sparc/bearch_sparc.c | 27 ++++++++++++++++++++++----- ir/be/sparc/sparc_emitter.c | 6 +++--- ir/be/sparc/sparc_transform.c | 8 +++++++- ir/lower/lower_mode_b.c | 3 --- 4 files changed, 32 insertions(+), 12 deletions(-) diff --git a/ir/be/sparc/bearch_sparc.c b/ir/be/sparc/bearch_sparc.c index 821f5a2c0..6467a4459 100644 --- a/ir/be/sparc/bearch_sparc.c +++ b/ir/be/sparc/bearch_sparc.c @@ -536,15 +536,24 @@ static int sparc_get_reg_class_alignment(const arch_register_class_t *cls) 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); } } @@ -552,9 +561,17 @@ static void sparc_lower_for_target(void) 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; } diff --git a/ir/be/sparc/sparc_emitter.c b/ir/be/sparc/sparc_emitter.c index 2061029dc..82fff9ace 100644 --- a/ir/be/sparc/sparc_emitter.c +++ b/ir/be/sparc/sparc_emitter.c @@ -451,9 +451,6 @@ static const ir_node *pick_delay_slot_for(const ir_node *node) while (sched_has_prev(schedpoint)) { schedpoint = sched_prev(schedpoint); - if (tries++ >= PICK_DELAY_SLOT_MAX_DISTANCE) - break; - if (has_delay_slot(schedpoint)) break; @@ -461,6 +458,9 @@ static const ir_node *pick_delay_slot_for(const ir_node *node) if (is_no_instruction(schedpoint)) continue; + if (tries++ >= PICK_DELAY_SLOT_MAX_DISTANCE) + break; + if (emits_multiple_instructions(schedpoint)) continue; diff --git a/ir/be/sparc/sparc_transform.c b/ir/be/sparc/sparc_transform.c index 09e360821..990b4f29f 100644 --- a/ir/be/sparc/sparc_transform.c +++ b/ir/be/sparc/sparc_transform.c @@ -1132,14 +1132,18 @@ static ir_node *gen_Conv(ir_node *node) { 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; @@ -1165,6 +1169,8 @@ static ir_node *gen_Conv(ir_node *node) } 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; diff --git a/ir/lower/lower_mode_b.c b/ir/lower/lower_mode_b.c index 00e6e1d83..6375d7b23 100644 --- a/ir/lower/lower_mode_b.c +++ b/ir/lower/lower_mode_b.c @@ -149,9 +149,6 @@ ir_node *ir_create_cond_set(ir_node *cond_value, ir_mode *dest_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); -- 2.20.1