Avoid generate dmac instructions when the register is not odd-even,
use instead the equivalent mac instruction.

gcc/
        Claudiu Zissulescu  <claz...@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  <claz...@synopsys.com>

        * gcc.target/arc/tmac-3.c: New file.
---
 gcc/config/arc/arc.md                 |  4 ++--
 gcc/testsuite/gcc.target/arc/tmac-3.c | 17 +++++++++++++++++
 2 files changed, 19 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/arc/tmac-3.c

diff --git a/gcc/config/arc/arc.md b/gcc/config/arc/arc.md
index dbcd7098bec..2d108ef166d 100644
--- a/gcc/config/arc/arc.md
+++ b/gcc/config/arc/arc.md
@@ -6078,7 +6078,7 @@ core_3, 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
      {
@@ -6178,7 +6178,7 @@ core_3, 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
      {
diff --git a/gcc/testsuite/gcc.target/arc/tmac-3.c 
b/gcc/testsuite/gcc.target/arc/tmac-3.c
new file mode 100644
index 00000000000..3c8c1201f83
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arc/tmac-3.c
@@ -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" } } */
-- 
2.17.1

Reply via email to