Commit ef402c65 by Oleg Endo

re PR target/51244 ([SH] Inefficient conditional branch and code around T bit)

	PR target/51244
	* config/sh/sh.md (*branch_true, *branch_false): New insns.

From-SVN: r187298
parent 4e8ee9cb
2012-05-08 Oleg Endo <olegendo@gcc.gnu.org>
PR target/51244
* config/sh/sh.md (*branch_true, *branch_false): New insns.
2012-05-08 Teresa Johnson <tejohnson@google.com> 2012-05-08 Teresa Johnson <tejohnson@google.com>
* gcov-io.h (__gcov_reset, __gcov_dump): Declare. * gcov-io.h (__gcov_reset, __gcov_dump): Declare.
......
...@@ -7097,6 +7097,29 @@ label: ...@@ -7097,6 +7097,29 @@ label:
} }
[(set_attr "type" "cbranch")]) [(set_attr "type" "cbranch")])
;; The *branch_true patterns help combine when trying to invert conditions.
(define_insn "*branch_true"
[(set (pc) (if_then_else (ne (zero_extend:SI (subreg:QI (reg:SI T_REG) 0))
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
"TARGET_SH1 && TARGET_LITTLE_ENDIAN"
{
return output_branch (1, insn, operands);
}
[(set_attr "type" "cbranch")])
(define_insn "*branch_true"
[(set (pc) (if_then_else (ne (zero_extend:SI (subreg:QI (reg:SI T_REG) 3))
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
"TARGET_SH1 && ! TARGET_LITTLE_ENDIAN"
{
return output_branch (1, insn, operands);
}
[(set_attr "type" "cbranch")])
(define_insn "branch_false" (define_insn "branch_false"
[(set (pc) (if_then_else (eq (reg:SI T_REG) (const_int 0)) [(set (pc) (if_then_else (eq (reg:SI T_REG) (const_int 0))
(label_ref (match_operand 0 "" "")) (label_ref (match_operand 0 "" ""))
...@@ -7107,6 +7130,29 @@ label: ...@@ -7107,6 +7130,29 @@ label:
} }
[(set_attr "type" "cbranch")]) [(set_attr "type" "cbranch")])
;; The *branch_false patterns help combine when trying to invert conditions.
(define_insn "*branch_false"
[(set (pc) (if_then_else (eq (zero_extend:SI (subreg:QI (reg:SI T_REG) 0))
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
"TARGET_SH1 && TARGET_LITTLE_ENDIAN"
{
return output_branch (0, insn, operands);
}
[(set_attr "type" "cbranch")])
(define_insn "*branch_false"
[(set (pc) (if_then_else (eq (zero_extend:SI (subreg:QI (reg:SI T_REG) 3))
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
"TARGET_SH1 && ! TARGET_LITTLE_ENDIAN"
{
return output_branch (0, insn, operands);
}
[(set_attr "type" "cbranch")])
;; Patterns to prevent reorg from re-combining a condbranch with a branch ;; Patterns to prevent reorg from re-combining a condbranch with a branch
;; which destination is too far away. ;; which destination is too far away.
;; The const_int_operand is distinct for each branch target; it avoids ;; The const_int_operand is distinct for each branch target; it avoids
...@@ -9721,7 +9767,7 @@ label: ...@@ -9721,7 +9767,7 @@ label:
"" ""
[(const_int 0)]) [(const_int 0)])
;; The *movtt patterns improve code at -O1. ;; The *movtt patterns eliminate redundant T bit to T bit moves / tests.
(define_insn_and_split "*movtt" (define_insn_and_split "*movtt"
[(set (reg:SI T_REG) [(set (reg:SI T_REG)
(eq:SI (zero_extend:SI (subreg:QI (reg:SI T_REG) 3)) (eq:SI (zero_extend:SI (subreg:QI (reg:SI T_REG) 3))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment