[ARC] Check for odd-even register when emitting double mac ops.
authorClaudiu Zissulescu <claziss@synopsys.com>
Mon, 1 Oct 2018 09:37:33 +0000 (11:37 +0200)
committerClaudiu Zissulescu <claziss@gcc.gnu.org>
Mon, 1 Oct 2018 09:37:33 +0000 (11:37 +0200)
gcc/
Claudiu Zissulescu  <claziss@synopsys.com>

* config/arc/arc.md (maddsidi4_split): Don't use dmac if the
destination register is not odd-even.
(umaddsidi4_split): Likewise.

gcc/testsuite/
Claudiu Zissulescu  <claziss@synopsys.com>

* gcc.target/arc/tmac-3.c: New file.

From-SVN: r264736

gcc/ChangeLog
gcc/config/arc/arc.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arc/tmac-3.c [new file with mode: 0644]

index 7783d0994e2631fc7b40e6ed2cbf21ad4494cff5..8773039051857c8b35c0c543075f4815cbce22a8 100644 (file)
@@ -1,3 +1,9 @@
+2018-10-01  Claudiu Zissulescu  <claziss@synopsys.com>
+
+       * config/arc/arc.md (maddsidi4_split): Don't use dmac if the
+       destination register is not odd-even.
+       (umaddsidi4_split): Likewise.
+
 2018-10-01  Richard Biener  <rguenther@suse.de>
 
        * tree-inline.c (expand_call_inline): Store origin of fn
index 181a738f3ab8cb5d729add4859c834c5c72c86ce..95cfa45088872cb3cb4fa1205cba3d41c1884b6e 100644 (file)
@@ -6309,7 +6309,7 @@ archs4x, archs4xd, archs4xd_slow"
   "{
    rtx acc_reg = gen_rtx_REG (DImode, ACC_REG_FIRST);
    emit_move_insn (acc_reg, operands[3]);
-   if (TARGET_PLUS_MACD)
+   if (TARGET_PLUS_MACD && even_register_operand (operands[0], DImode))
      emit_insn (gen_macd (operands[0], operands[1], operands[2]));
    else
      {
@@ -6409,7 +6409,7 @@ archs4x, archs4xd, archs4xd_slow"
   "{
    rtx acc_reg = gen_rtx_REG (DImode, ACC_REG_FIRST);
    emit_move_insn (acc_reg, operands[3]);
-   if (TARGET_PLUS_MACD)
+   if (TARGET_PLUS_MACD && even_register_operand (operands[0], DImode))
      emit_insn (gen_macdu (operands[0], operands[1], operands[2]));
    else
      {
index 4dc292aded6be41052c827f36fc16c6642871910..fe679c6bc6e299d272d58f46fa2f9c7d32298219 100644 (file)
@@ -1,3 +1,7 @@
+2018-10-01  Claudiu Zissulescu  <claziss@synopsys.com>
+
+       * gcc.target/arc/tmac-3.c: New file.
+
 2018-09-30  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/87359
diff --git a/gcc/testsuite/gcc.target/arc/tmac-3.c b/gcc/testsuite/gcc.target/arc/tmac-3.c
new file mode 100644 (file)
index 0000000..23ef173
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-skip-if "" { ! { clmcpu } } } */
+/* { dg-options "-mcpu=hs38 -Os" } */
+
+/* The compiler will assign r1r2 as a DI register, but it doesn't fit
+   the macd operation, hence we need to fall back on the mac
+   instruction.  */
+typedef long long myint64_t;
+
+extern int d (int, myint64_t);
+int b (int c)
+{
+  int x = (int) d;
+  d (c, (myint64_t)x * 2 + 1);
+}
+
+/* { dg-final { scan-assembler "mac\\\s+r1" } } */