X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Flower%2Flower_mode_b.c;h=6cb298e10a208aa2e4e481916e801cf3fbb2fca5;hb=81f1a041542f3d40f136fca8e0bfac8b3f53fce7;hp=baf9533d749d60571a9a0afc8d68a20e72fca485;hpb=c3a309c14573c17a7040727529b4f5f2e00cce3c;p=libfirm diff --git a/ir/lower/lower_mode_b.c b/ir/lower/lower_mode_b.c index baf9533d7..6cb298e10 100644 --- a/ir/lower/lower_mode_b.c +++ b/ir/lower/lower_mode_b.c @@ -20,7 +20,7 @@ /** * @file * @author Matthias Braun, Christoph Mallon - * @version $Id$ + * @version $Id:$ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -35,6 +35,7 @@ #include "tv.h" #include "error.h" #include "lowering.h" +#include "benode_t.h" static ir_mode *lowered_mode = NULL; static int lower_direct_cmp = 0; @@ -49,6 +50,24 @@ static ir_node *create_not(dbg_info *dbgi, ir_node *node) return new_rd_Eor(dbgi, irg, block, node, one, lowered_mode); } +static ir_node *create_convb(ir_node *node) +{ + ir_graph *irg = current_ir_graph; + ir_node *block = get_nodes_block(node); + ir_node *conv = new_rd_Conv(NULL, irg, block, node, mode_b); + + return conv; +} + +static ir_node *create_conv_lowered_mode(ir_node *node) +{ + ir_graph *irg = current_ir_graph; + ir_node *block = get_nodes_block(node); + ir_node *conv = new_rd_Conv(NULL, irg, block, node, lowered_mode); + + return conv; +} + static ir_node *lower_node(ir_node *node) { ir_graph *irg = current_ir_graph; @@ -140,11 +159,12 @@ static ir_node *lower_node(ir_node *node) ir_node *one = new_d_Const(dbgi, lowered_mode, tv_one); tarval *tv_zero = get_tarval_null(lowered_mode); ir_node *zero = new_d_Const(dbgi, lowered_mode, tv_zero); - ir_mode *mode = get_irn_mode(node); + ir_node *pred = get_Conv_op(node); + ir_mode *mode = get_irn_mode(pred); tarval *tv_zeroc = get_tarval_null(mode); ir_node *zero_cmp = new_d_Const(dbgi, mode, tv_zeroc); - ir_node *cmp = new_rd_Cmp(dbgi, irg, block, node, zero_cmp); + ir_node *cmp = new_rd_Cmp(dbgi, irg, block, pred, zero_cmp); ir_node *proj = new_rd_Proj(dbgi, irg, block, cmp, mode_b, pn_Cmp_Lg); ir_node *vals[2] = { one, zero }; @@ -155,13 +175,12 @@ static ir_node *lower_node(ir_node *node) return psi; } if(op == op_Proj) { - ir_node *pred = get_Proj_pred(node); + ir_node *pred = get_Proj_pred(node); - assert(!is_Load(pred)); if(is_Cmp(pred)) { - ir_mode *mode = get_irn_mode(pred); ir_node *left = get_Cmp_left(pred); ir_node *right = get_Cmp_right(pred); + ir_mode *mode = get_irn_mode(left); if( (mode_is_int(mode) || mode_is_reference(mode)) && (get_mode_size_bits(mode) < get_mode_size_bits(lowered_mode) @@ -226,6 +245,13 @@ static ir_node *lower_node(ir_node *node) set_irn_link(node, psi); return psi; } + } else if(is_Proj(pred) && is_Call(get_Proj_pred(pred))) { + return create_conv_lowered_mode(node); + } else if(is_Proj(pred) && is_Start(get_Proj_pred(pred))) { + return create_conv_lowered_mode(node); + } else if (be_is_Barrier(pred)) { + /* nothing to do */ + return node; } panic("unexpected projb: %+F (pred: %+F)", node, pred); @@ -248,15 +274,6 @@ static ir_node *lower_node(ir_node *node) panic("didn't expect %+F to have mode_b", node); } -static ir_node *create_convb(ir_node *node) -{ - ir_graph *irg = current_ir_graph; - ir_node *block = get_nodes_block(node); - ir_node *conv = new_rd_Conv(NULL, irg, block, node, mode_b); - - return conv; -} - static void lower_mode_b_walker(ir_node *node, void *env) { int i, arity;