From: Michael Beck Date: Tue, 31 Jul 2007 14:22:42 +0000 (+0000) Subject: transform Load & 0xFF into Loadzx X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=aaa1f103ece7240b243d740b98f23cc81d3f8a35;p=libfirm transform Load & 0xFF into Loadzx [r15389] --- diff --git a/ir/be/ia32/ia32_transform.c b/ir/be/ia32/ia32_transform.c index e315458a6..018d09fed 100644 --- a/ir/be/ia32/ia32_transform.c +++ b/ir/be/ia32/ia32_transform.c @@ -873,7 +873,25 @@ static ir_node *gen_And(ir_node *node) { ir_node *op1 = get_And_left(node); ir_node *op2 = get_And_right(node); - assert (! mode_is_float(get_irn_mode(node))); + assert(! mode_is_float(get_irn_mode(node))); + + if (is_Const(op2) && is_Load(skip_Proj(op1)) && get_irn_n_edges(op1) == 1) { + /* a Load() & Const */ + tarval *tv = get_Const_tarval(op2); + long v = get_tarval_long(tv); + + if (v == 0xFF) { + ir_node *new_op = be_transform_node(op1); + ir_node *load = skip_Proj(new_op); + set_ia32_ls_mode(load, mode_Bu); + return new_op; + } else if (v == 0xFFFF) { + ir_node *new_op = be_transform_node(op1); + ir_node *load = skip_Proj(new_op); + set_ia32_ls_mode(load, mode_Hu); + return new_op; + } + } return gen_binop(node, op1, op2, new_rd_ia32_And, 1); }