[ARC] Update movhi and movdi patterns.
authorClaudiu Zissulescu <claziss@synopsys.com>
Mon, 30 Apr 2018 13:15:35 +0000 (15:15 +0200)
committerClaudiu Zissulescu <claziss@gcc.gnu.org>
Mon, 30 Apr 2018 13:15:35 +0000 (15:15 +0200)
Allow signed 6-bit short immediates into st[d] instructions.

2017-10-19  Claudiu Zissulescu  <claziss@synopsys.com>

* config/arc/arc.c (arc_split_move): Allow signed 6-bit constants
as source of std instructions.
* config/arc/arc.md (movsi_insn): Update pattern predicate to
allow 6-bit constants as source for store instructions.
(movdi_insn): Update instruction pattern to allow 6-bit constants
as source for store instructions.

testsuite/
2017-10-19  Claudiu Zissulescu  <claziss@synopsys.com>

* gcc.target/arc/store-merge-1.c: New test.
* gcc.target/arc/add_n-combine.c: Update test.

From-SVN: r259762

gcc/ChangeLog
gcc/config/arc/arc.c
gcc/config/arc/arc.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arc/add_n-combine.c
gcc/testsuite/gcc.target/arc/store-merge-1.c [new file with mode: 0644]

index 18af830..e2be3b1 100644 (file)
@@ -1,3 +1,12 @@
+2018-04-30  Claudiu Zissulescu  <claziss@synopsys.com>
+
+       * config/arc/arc.c (arc_split_move): Allow signed 6-bit constants
+       as source of std instructions.
+       * config/arc/arc.md (movsi_insn): Update pattern predicate to
+       allow 6-bit constants as source for store instructions.
+       (movdi_insn): Update instruction pattern to allow 6-bit constants
+       as source for store instructions.
+
 2018-04-30  Jonathan Wakely  <jwakely@redhat.com>
 
        * doc/invoke.texi (-fdebug-types-section): Fix grammar.
index 2e6fbcb..33bf3d8 100644 (file)
@@ -9651,7 +9651,8 @@ arc_split_move (rtx *operands)
 
   if (TARGET_LL64
       && ((memory_operand (operands[0], mode)
-          && even_register_operand (operands[1], mode))
+          && (even_register_operand (operands[1], mode)
+              || satisfies_constraint_Cm3 (operands[1])))
          || (memory_operand (operands[1], mode)
              && even_register_operand (operands[0], mode))))
     {
index d19e99d..398b201 100644 (file)
        /* Don't use a LIMM that we could load with a single insn - we loose
          delay-slot filling opportunities.  */
        && !satisfies_constraint_I (operands[1])
-       && satisfies_constraint_Usc (operands[0]))"
+       && satisfies_constraint_Usc (operands[0]))
+   || (satisfies_constraint_Cm3 (operands[1])
+      && memory_operand (operands[0], SImode))"
   "@
    mov%? %0,%1%&       ;0
    mov%? %0,%1%&       ;1
   ")
 
 (define_insn_and_split "*movdi_insn"
-  [(set (match_operand:DI 0 "move_dest_operand"      "=w, w,r,m")
-       (match_operand:DI 1 "move_double_src_operand" "c,Hi,m,c"))]
+  [(set (match_operand:DI 0 "move_dest_operand"      "=w, w,r,   m")
+       (match_operand:DI 1 "move_double_src_operand" "c,Hi,m,cCm3"))]
   "register_operand (operands[0], DImode)
-   || register_operand (operands[1], DImode)"
+   || register_operand (operands[1], DImode)
+   || (satisfies_constraint_Cm3 (operands[1])
+      && memory_operand (operands[0], DImode))"
   "*
 {
   switch (which_alternative)
 
     case 2:
     if (TARGET_LL64
-       && ((even_register_operand (operands[0], DImode)
-            && memory_operand (operands[1], DImode))
-           || (memory_operand (operands[0], DImode)
-               && even_register_operand (operands[1], DImode))))
+        && memory_operand (operands[1], DImode)
+       && even_register_operand (operands[0], DImode))
       return \"ldd%U1%V1 %0,%1%&\";
     return \"#\";
 
     case 3:
     if (TARGET_LL64
-       && ((even_register_operand (operands[0], DImode)
-            && memory_operand (operands[1], DImode))
-           || (memory_operand (operands[0], DImode)
-               && even_register_operand (operands[1], DImode))))
+       && memory_operand (operands[0], DImode)
+       && (even_register_operand (operands[1], DImode)
+           || satisfies_constraint_Cm3 (operands[1])))
      return \"std%U0%V0 %1,%0\";
     return \"#\";
     }
index 093cd36..9eff0ad 100644 (file)
@@ -1,3 +1,8 @@
+2018-04-30  Claudiu Zissulescu  <claziss@synopsys.com>
+
+       * gcc.target/arc/store-merge-1.c: New test.
+       * gcc.target/arc/add_n-combine.c: Update test.
+
 2018-04-30 Andrew Sadek  <andrew.sadek.se@gmail.com>
 
        Microblaze Target: PIC data text relative
index db6454f..cd32ed3 100644 (file)
@@ -45,4 +45,4 @@ void f() {
   a(at3.bn[bu]);
 }
 
-/* { dg-final { scan-rtl-dump-times "\\*add_n" 3 "combine" } } */
+/* { dg-final { scan-rtl-dump-times "\\*add_n" 2 "combine" } } */
diff --git a/gcc/testsuite/gcc.target/arc/store-merge-1.c b/gcc/testsuite/gcc.target/arc/store-merge-1.c
new file mode 100644 (file)
index 0000000..4bb8dcb
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+/* This tests checks if we use st w6,[reg] format.  */
+
+typedef struct {
+  unsigned long __val[2];
+} sigset_t;
+
+int sigemptyset2 (sigset_t *set)
+{
+  set->__val[0] = 0;
+  set->__val[1] = 0;
+  return 0;
+}
+
+/* { dg-final { scan-assembler-times "st 0,\\\[r" 2 } } */