re PR target/54089 ([SH] Refactor shift patterns)
authorOleg Endo <olegendo@gcc.gnu.org>
Fri, 6 May 2016 09:41:57 +0000 (09:41 +0000)
committerOleg Endo <olegendo@gcc.gnu.org>
Fri, 6 May 2016 09:41:57 +0000 (09:41 +0000)
gcc/
PR target/54089
* config/sh/sh.md (*rotcr): Add another variant.

gcc/testsuite/
PR target/54089
* gcc.target/sh/pr54089-1.c (test_24): Add new sub-test.

From-SVN: r235950

gcc/ChangeLog
gcc/config/sh/sh.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/sh/pr54089-1.c

index 3bf441a48f0edcf07587c0151342d3276581f2d0..951ae2cc5dc18c42f45aa433869ce03a49524552 100644 (file)
@@ -1,3 +1,8 @@
+2016-05-06  Oleg Endo  <olegendo@gcc.gnu.org>
+
+       PR target/54089
+       * config/sh/sh.md (*rotcr): Add another variant.
+
 2016-05-06  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/70931
index 2a8fbc8df9b954d282cf8fd82a25dfe3d83714ea..0ab76b562b944269f632dd101fd39456964aab09 100644 (file)
   DONE;
 })
 
+(define_insn_and_split "*rotcr"
+  [(set (match_operand:SI 0 "arith_reg_dest")
+       (ior:SI (lshiftrt:SI (match_operand:SI 1 "arith_reg_operand")
+                            (const_int 1))
+               (const_int -2147483648))) ;; 0xffffffff80000000
+   (clobber (reg:SI T_REG))]
+  "TARGET_SH1"
+  "#"
+  "&& can_create_pseudo_p ()"
+  [(const_int 0)]
+{
+  emit_insn (gen_sett ());
+  emit_insn (gen_rotcr (operands[0], operands[1], get_t_reg_rtx ()));
+  DONE;
+})
+
 ;; rotcr combine patterns for rotating in the negated T_REG value.
 (define_insn_and_split "*rotcr_neg_t"
   [(set (match_operand:SI 0 "arith_reg_dest")
index 13f71217cedd44b60148a19c4314d478a693c9ec..17773ced6cf8517e12c8a7028c1250ab900ed517 100644 (file)
@@ -1,3 +1,8 @@
+2016-05-06  Oleg Endo  <olegendo@gcc.gnu.org>
+
+       PR target/54089
+       * gcc.target/sh/pr54089-1.c (test_24): Add new sub-test.
+
 2016-05-06  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/70931
index 64f79ebc737bd9591983dc0354ffa1d3b200ae39..8b6a729f64cc2eccfae46f9441cf38b50e3031a0 100644 (file)
@@ -1,7 +1,8 @@
 /* Check that the rotcr instruction is generated.  */
 /* { dg-do compile }  */
 /* { dg-options "-O2" } */
-/* { dg-final { scan-assembler-times "rotcr" 24 } } */
+/* { dg-final { scan-assembler-times "rotcr" 25 } } */
+/* { dg-final { scan-assembler-times "sett" 1 } } */
 /* { dg-final { scan-assembler-times "shll\t" 1 } } */
 /* { dg-final { scan-assembler-not "and\t#1" } }  */
 /* { dg-final { scan-assembler-not "cmp/pl" } }  */
@@ -173,3 +174,9 @@ test_23 (unsigned int a, int b, int c)
   bool r = b != c;
   return ((a >> 31) | (r << 31));
 }
+
+unsigned int
+test_24 (unsigned int a)
+{
+  return (a >> 1) | (1 << 31);
+}