From 9c6789948747f4d595213a7d2c1058e0a9e548d9 Mon Sep 17 00:00:00 2001 From: Christoph Mallon Date: Wed, 12 Nov 2008 14:03:42 +0000 Subject: [PATCH] Replace if cascade by switch. [r23587] --- ir/be/ia32/ia32_transform.c | 104 +++++++++++++++++++----------------- 1 file changed, 55 insertions(+), 49 deletions(-) diff --git a/ir/be/ia32/ia32_transform.c b/ir/be/ia32/ia32_transform.c index c217a70e2..0ada8f124 100644 --- a/ir/be/ia32/ia32_transform.c +++ b/ir/be/ia32/ia32_transform.c @@ -2645,63 +2645,69 @@ static bool upper_bits_clean(ir_node *transformed_node, ir_mode *mode) if (is_Proj(transformed_node)) return upper_bits_clean(get_Proj_pred(transformed_node), mode); - if (is_ia32_Conv_I2I(transformed_node) - || is_ia32_Conv_I2I8Bit(transformed_node)) { - ir_mode *smaller_mode = get_ia32_ls_mode(transformed_node); - if (mode_is_signed(smaller_mode) != mode_is_signed(mode)) - return false; - if (get_mode_size_bits(smaller_mode) > get_mode_size_bits(mode)) - return false; + switch (get_ia32_irn_opcode(transformed_node)) { + case iro_ia32_Conv_I2I: + case iro_ia32_Conv_I2I8Bit: { + ir_mode *smaller_mode = get_ia32_ls_mode(transformed_node); + if (mode_is_signed(smaller_mode) != mode_is_signed(mode)) + return false; + if (get_mode_size_bits(smaller_mode) > get_mode_size_bits(mode)) + return false; - return true; - } - - if (is_ia32_Shr(transformed_node) && !mode_is_signed(mode)) { - ir_node *right = get_irn_n(transformed_node, n_ia32_Shr_count); - if (is_ia32_Immediate(right) || is_ia32_Const(right)) { - const ia32_immediate_attr_t *attr - = get_ia32_immediate_attr_const(right); - if (attr->symconst == 0 - && (unsigned) attr->offset >= (32 - get_mode_size_bits(mode))) { - return true; - } + return true; } - return upper_bits_clean(get_irn_n(transformed_node, n_ia32_Shr_val), mode); - } - if (is_ia32_And(transformed_node) && !mode_is_signed(mode)) { - ir_node *right = get_irn_n(transformed_node, n_ia32_And_right); - if (is_ia32_Immediate(right) || is_ia32_Const(right)) { - const ia32_immediate_attr_t *attr - = get_ia32_immediate_attr_const(right); - if (attr->symconst == 0 - && (unsigned) attr->offset - <= (0xffffffff >> (32 - get_mode_size_bits(mode)))) { - return true; + case iro_ia32_Shr: + if (mode_is_signed(mode)) { + return false; /* TODO handle signed modes */ + } else { + ir_node *right = get_irn_n(transformed_node, n_ia32_Shr_count); + if (is_ia32_Immediate(right) || is_ia32_Const(right)) { + const ia32_immediate_attr_t *attr + = get_ia32_immediate_attr_const(right); + if (attr->symconst == 0 && + (unsigned)attr->offset >= 32 - get_mode_size_bits(mode)) { + return true; + } + } + return upper_bits_clean(get_irn_n(transformed_node, n_ia32_Shr_val), mode); } - } - /* TODO recurse? */ - } - /* TODO recurse on Or, Xor, ... if appropriate? */ + case iro_ia32_And: + if (mode_is_signed(mode)) { + return false; /* TODO handle signed modes */ + } else { + ir_node *right = get_irn_n(transformed_node, n_ia32_And_right); + if (is_ia32_Immediate(right) || is_ia32_Const(right)) { + const ia32_immediate_attr_t *attr = + get_ia32_immediate_attr_const(right); + if (attr->symconst == 0 && + (unsigned)attr->offset <= 0xFFFFFFFFU >> (32 - get_mode_size_bits(mode))) { + return true; + } + } + /* TODO recurse? */ + return false; + } - if (is_ia32_Immediate(transformed_node) - || is_ia32_Const(transformed_node)) { - const ia32_immediate_attr_t *attr - = get_ia32_immediate_attr_const(transformed_node); - if (mode_is_signed(mode)) { - long shifted = attr->offset >> (get_mode_size_bits(mode) - 1); - if (shifted == 0 || shifted == -1) - return true; - } else { - unsigned long shifted = (unsigned long) attr->offset; - shifted >>= get_mode_size_bits(mode); - if (shifted == 0) - return true; + case iro_ia32_Const: + case iro_ia32_Immediate: { + const ia32_immediate_attr_t *attr = + get_ia32_immediate_attr_const(transformed_node); + if (mode_is_signed(mode)) { + long shifted = attr->offset >> (get_mode_size_bits(mode) - 1); + return shifted == 0 || shifted == -1; + } else { + unsigned long shifted = (unsigned long)attr->offset; + shifted >>= get_mode_size_bits(mode); + return shifted == 0; + } } - } - return false; + default: + /* TODO recurse on Or, Xor, ... if appropriate? */ + return false; + } } /** -- 2.20.1