diff --git a/gcc/config/h8300/jumpcall.md b/gcc/config/h8300/jumpcall.md index 3917cf18920337edb240231a6bd1623cf78fc6a1..650b5e6fb705109a58bdd7b48ed81ef3e80b9a8d 100644 --- a/gcc/config/h8300/jumpcall.md +++ b/gcc/config/h8300/jumpcall.md @@ -37,44 +37,60 @@ DONE; }) -(define_insn "branch" +(define_insn "branch_true" [(set (pc) - (if_then_else (match_operator 2 "comparison_operator" + (if_then_else (match_operator 1 "comparison_operator" [(cc0) (const_int 0)]) - (match_operand 0 "pc_or_label_operand" "") - (match_operand 1 "pc_or_label_operand" "")))] - "operands[0] == pc_rtx || operands[1] == pc_rtx" + (label_ref (match_operand 0 "" "")) + (pc)))] + "" { if ((cc_status.flags & CC_OVERFLOW_UNUSABLE) != 0 - && (GET_CODE (operands[2]) == GT - || GET_CODE (operands[2]) == GE - || GET_CODE (operands[2]) == LE - || GET_CODE (operands[2]) == LT)) + && (GET_CODE (operands[1]) == GT + || GET_CODE (operands[1]) == GE + || GET_CODE (operands[1]) == LE + || GET_CODE (operands[1]) == LT)) { cc_status.flags &= ~CC_OVERFLOW_UNUSABLE; return 0; } - if (operands[0] != pc_rtx) - { - if (get_attr_length (insn) == 2) - return "b%j2 %l0"; - else if (get_attr_length (insn) == 4) - return "b%j2 %l0:16"; - else - return "b%k2 .Lh8BR%=\;jmp @%l0\\n.Lh8BR%=:"; - } + if (get_attr_length (insn) == 2) + return "b%j1 %l0"; + else if (get_attr_length (insn) == 4) + return "b%j1 %l0:16"; else + return "b%k1 .Lh8BR%=\;jmp @%l0\\n.Lh8BR%=:"; +} + [(set_attr "type" "branch") + (set_attr "cc" "none")]) + +(define_insn "branch_false" + [(set (pc) + (if_then_else (match_operator 1 "comparison_operator" + [(cc0) (const_int 0)]) + (pc) + (label_ref (match_operand 0 "" ""))))] + "" +{ + if ((cc_status.flags & CC_OVERFLOW_UNUSABLE) != 0 + && (GET_CODE (operands[1]) == GT + || GET_CODE (operands[1]) == GE + || GET_CODE (operands[1]) == LE + || GET_CODE (operands[1]) == LT)) { - if (get_attr_length (insn) == 2) - return "b%k2 %l1"; - else if (get_attr_length (insn) == 4) - return "b%k2 %l1:16"; - else - return "b%j2 .Lh8BR%=\;jmp @%l1\\n.Lh8BR%=:"; + cc_status.flags &= ~CC_OVERFLOW_UNUSABLE; + return 0; } + + if (get_attr_length (insn) == 2) + return "b%k1 %l0"; + else if (get_attr_length (insn) == 4) + return "b%k1 %l0:16"; + else + return "b%j1 .Lh8BR%=\;jmp @%l0\\n.Lh8BR%=:"; } - [(set_attr "type" "branch") + [(set_attr "type" "branch") (set_attr "cc" "none")]) ;; The brabc/brabs patterns have been disabled because their length computation