From: olegendo Date: Wed, 19 Sep 2012 17:45:37 +0000 (+0000) Subject: PR target/54236 X-Git-Tag: upstream/4.9.2~10520 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ef7405619c4f5ea6f0ad392fe8bdb4acd12afca1;p=platform%2Fupstream%2Flinaro-gcc.git PR target/54236 * config/sh/sh.md (*addc): Add pattern to handle one bit left shifts. PR target/54236 * gcc.target/sh/pr54236-1.c (test_08): Add one bit left shift case. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@191489 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d791861..b4d2311 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2012-09-19 Oleg Endo + PR target/54236 + * config/sh/sh.md (*addc): Add pattern to handle one bit left shifts. + +2012-09-19 Oleg Endo + * config/sh/sh.md (prologue, epilogue): Use braced strings. 2012-09-19 Eric Botcazou diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md index 3497ce8..71e758b 100644 --- a/gcc/config/sh/sh.md +++ b/gcc/config/sh/sh.md @@ -1787,6 +1787,22 @@ (reg:SI T_REG))) (clobber (reg:SI T_REG))])]) +;; Left shifts by one are usually done with an add insn to avoid T_REG +;; clobbers. Thus addc can also be used to do something like '(x << 1) + 1'. +(define_insn_and_split "*addc" + [(set (match_operand:SI 0 "arith_reg_dest") + (plus:SI (mult:SI (match_operand:SI 1 "arith_reg_operand") + (const_int 2)) + (const_int 1))) + (clobber (reg:SI T_REG))] + "TARGET_SH1" + "#" + "&& 1" + [(set (reg:SI T_REG) (const_int 1)) + (parallel [(set (match_dup 0) (plus:SI (plus:SI (match_dup 1) (match_dup 1)) + (reg:SI T_REG))) + (clobber (reg:SI T_REG))])]) + ;; Sometimes combine will try to do 'reg + (0-reg) + 1' if the *addc pattern ;; matched. Split this up into a simple sub add sequence, as this will save ;; us one sett insn. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6c6fdf3..c4c041f84 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-09-19 Oleg Endo + + PR target/54236 + * gcc.target/sh/pr54236-1.c (test_08): Add one bit left shift case. + 2012-09-19 Eric Botcazou * gcc.c-torture/execute/20120919-1.c: New test. diff --git a/gcc/testsuite/gcc.target/sh/pr54236-1.c b/gcc/testsuite/gcc.target/sh/pr54236-1.c index 3a7453c..748b6c9 100644 --- a/gcc/testsuite/gcc.target/sh/pr54236-1.c +++ b/gcc/testsuite/gcc.target/sh/pr54236-1.c @@ -4,9 +4,9 @@ /* { dg-do compile { target "sh*-*-*" } } */ /* { dg-options "-O1" } */ /* { dg-skip-if "" { "sh*-*-*" } { "-m5*"} { "" } } */ -/* { dg-final { scan-assembler-times "addc" 3 } } */ +/* { dg-final { scan-assembler-times "addc" 4 } } */ /* { dg-final { scan-assembler-times "subc" 3 } } */ -/* { dg-final { scan-assembler-times "sett" 4 } } */ +/* { dg-final { scan-assembler-times "sett" 5 } } */ /* { dg-final { scan-assembler-times "negc" 1 } } */ /* { dg-final { scan-assembler-not "movt" } } */ @@ -74,3 +74,10 @@ test_07 (int *vec) return vi; } + +int +test_08 (int a) +{ + /* 1x addc, 1x sett */ + return (a << 1) + 1; +}