diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index a9272ba715c..4327d0cf5e3 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -435,20 +435,6 @@ "" "neg %0,%1\;and %0,%0,%1\;cntlz %0,%0\;sfi %0,%0,32") -;; There is no need for (set (condition) (compare (ffs) 0)) because that -;; can be simplified to an ordinary comparison. A parallel set and compare -;; might be used, so include it. - -(define_insn "" - [(set (match_operand:CC 2 "cc_reg_operand" "=x") - (compare:CC (ffs:SI (match_operand:SI 1 "register_operand" "r")) - (const_int 0))) - (set (match_operand:SI 0 "register_operand" "=&r") - (ffs:SI (match_dup 1)))] - "" - "neg %0,%1\;and %0,%0,%1\;cntlz %0,%0\;sfi. %0,%0,32" - [(set_attr "type" "compare")]) - (define_insn "mulsi3" [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r") (mult:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r") @@ -4650,7 +4636,18 @@ "" "cror 0,0,0") -;; Define the subtract-one-and-jump insns. +;; Define the subtract-one-and-jump insns, starting with the template +;; so loop.c knows what to generate. + +(define_expand "decrement_and_branchsi" + [(parallel [(set (pc) (if_then_else (ne (match_operand:SI 0 "register_operand" "c") + (const_int 1)) + (label_ref (match_operand 1 "" "")) + (pc))) + (set (match_dup 0) (plus:SI (match_dup 0) (const_int -1)))])] + "" + "") + ;; We need to be able to do this for any operand, including MEM, or we ;; will cause reload to blow up since we don't allow output reloads on ;; JUMP_INSNs. @@ -4670,7 +4667,7 @@ # #") -;; Similar, but we can use GE since we have a REG_NOTES. +;; Similar, but we can use GE since we have a REG_NONNEG. (define_insn "" [(set (pc) (if_then_else (ge (match_operand:SI 1 "register_operand" "0,*r,*r")