- if(!use_source_address_mode(block, left, right) &&
- !use_source_address_mode(block, right, left)) {
- res = try_create_Test(node);
- if(res != NULL)
- return res;
- }
-
- match_arguments(&am, block, left, right,
- match_commutative | match_8_16_bit_am |
- match_am_and_immediates);
-
- cmp_unsigned = !mode_is_signed(get_irn_mode(left));
- if(get_mode_size_bits(cmp_mode) == 8) {
- res = new_rd_ia32_Cmp8Bit(dbgi, irg, new_block, addr->base, addr->index,
- addr->mem, am.new_op1, am.new_op2,
- am.flipped, cmp_unsigned);
+ cmp_unsigned = !mode_is_signed(cmp_mode);
+ if (is_Const_0(right)) {
+ if (is_And(left) &&
+ get_irn_n_edges(left) == 1 &&
+ can_fold_test_and(node)) {
+ /* Test(and_left, and_right) */
+ ir_node *and_left = get_And_left(left);
+ ir_node *and_right = get_And_right(left);
+ ir_mode *mode = get_irn_mode(and_left);
+
+ match_arguments(&am, block, and_left, and_right, NULL,
+ match_commutative |
+ match_am | match_8bit_am | match_16bit_am |
+ match_am_and_immediates | match_immediate |
+ match_8bit | match_16bit);
+ if (get_mode_size_bits(mode) == 8) {
+ new_node = new_rd_ia32_Test8Bit(dbgi, irg, new_block, addr->base,
+ addr->index, addr->mem, am.new_op1,
+ am.new_op2, am.ins_permuted,
+ cmp_unsigned);
+ } else {
+ new_node = new_rd_ia32_Test(dbgi, irg, new_block, addr->base,
+ addr->index, addr->mem, am.new_op1,
+ am.new_op2, am.ins_permuted, cmp_unsigned);
+ }
+ } else {
+ match_arguments(&am, block, NULL, left, NULL,
+ match_am | match_8bit_am | match_16bit_am |
+ match_8bit | match_16bit);
+ if (am.op_type == ia32_AddrModeS) {
+ /* Cmp(AM, 0) */
+ ir_node *imm_zero = try_create_Immediate(right, 0);
+ if (get_mode_size_bits(cmp_mode) == 8) {
+ new_node = new_rd_ia32_Cmp8Bit(dbgi, irg, new_block, addr->base,
+ addr->index, addr->mem, am.new_op2,
+ imm_zero, am.ins_permuted,
+ cmp_unsigned);
+ } else {
+ new_node = new_rd_ia32_Cmp(dbgi, irg, new_block, addr->base,
+ addr->index, addr->mem, am.new_op2,
+ imm_zero, am.ins_permuted, cmp_unsigned);
+ }
+ } else {
+ /* Test(left, left) */
+ if (get_mode_size_bits(cmp_mode) == 8) {
+ new_node = new_rd_ia32_Test8Bit(dbgi, irg, new_block, addr->base,
+ addr->index, addr->mem, am.new_op2,
+ am.new_op2, am.ins_permuted,
+ cmp_unsigned);
+ } else {
+ new_node = new_rd_ia32_Test(dbgi, irg, new_block, addr->base,
+ addr->index, addr->mem, am.new_op2,
+ am.new_op2, am.ins_permuted,
+ cmp_unsigned);
+ }
+ }
+ }