https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80813

--- Comment #5 from Jan Hubicka <hubicka at gcc dot gnu.org> ---
Combine constructs:

(set (reg:CCZ 17 flags)
    (compare:CCZ (zero_extract:DI (mem:DI (plus:DI (mult:DI (reg:DI 111 [ _8 ])
                        (const_int 8 [0x8]))
                    (reg/f:DI 112 [
v_2(D)->D.25666._M_impl.D.25135._M_start.D.16486._M_p ])) [3 *_10+0 S8 A64])
            (const_int 1 [0x1])
            (subreg:QI (reg:SI 116 [ _12 ]) 0))
        (const_int 0 [0])))

While bt pattern is:


(define_insn "*bt<mode>"
  [(set (reg:CCC FLAGS_REG)
    (compare:CCC
      (zero_extract:SWI48
        (match_operand:SWI48 0 "nonimmediate_operand" "r,m")
        (const_int 1)
        (match_operand:QI 1 "nonmemory_operand" "q<S>,<S>"))
      (const_int 0)))]
  ""
{
  switch (get_attr_mode (insn))
    {
    case MODE_SI:
      return "bt{l}\t{%k1, %k0|%k0, %k1}";

    case MODE_DI:
      return "bt{q}\t{%q1, %0|%0, %q1}";

    default:
      gcc_unreachable ();
    }
} 
  [(set_attr "type" "alu1")
   (set_attr "prefix_0f" "1")
   (set (attr "mode")
    (if_then_else
      (and (match_test "CONST_INT_P (operands[1])")
           (match_test "INTVAL (operands[1]) < 32"))
      (const_string "SI")
      (const_string "<MODE>")))])

It fails since BT produces carry while we want zero flag...

Reply via email to