- 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_And:
+ if (!mode_is_signed(mode)) {
+ return
+ upper_bits_clean(get_irn_n(transformed_node, n_ia32_And_right), mode) ||
+ upper_bits_clean(get_irn_n(transformed_node, n_ia32_And_left), mode);
+ }
+ /* TODO if one is known to be zero extended, then || is sufficient */
+ /* FALLTHROUGH */
+ case iro_ia32_Or:
+ case iro_ia32_Xor:
+ return
+ upper_bits_clean(get_irn_n(transformed_node, n_ia32_binary_right), mode) &&
+ upper_bits_clean(get_irn_n(transformed_node, n_ia32_binary_left), mode);
+
+ 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;
+ }