From e73e3c3eaf2c3ea45083dda5dc4b7d29f6a03238 Mon Sep 17 00:00:00 2001
From: Claudiu Zissulescu <claziss@synopsys.com>
Date: Wed, 6 Oct 2021 09:47:50 +0300
Subject: [PATCH] arc: Fix maddhisi patterns

See for more details: https://github.com/foss-for-synopsys-dwc-arc-processors/toolchain/issues/429

---
 gcc/config/arc/arc.md                 |   43 +++++++---------------------------
 gcc/testsuite/gcc.target/arc/tmac-4.c |   29 ++++++++++++++++++++++
 2 files changed, 39 insertions(+), 33 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/arc/tmac-4.c

--- a/gcc/config/arc/arc.md
+++ b/gcc/config/arc/arc.md
@@ -6055,33 +6055,22 @@
    (match_operand:SI 3 "register_operand" "")]
   "TARGET_PLUS_MACD"
   "{
-   rtx acc_reg = gen_rtx_REG (SImode, ACC_REG_FIRST);
+   rtx acc_reg = gen_rtx_REG (SImode, ACCL_REGNO);
 
    emit_move_insn (acc_reg, operands[3]);
-   emit_insn (gen_machi (operands[0], operands[1], operands[2]));
+   emit_insn (gen_machi (operands[0], operands[1], operands[2], acc_reg));
    DONE;
   }")
 
-(define_insn_and_split "machi"
+(define_insn "machi"
   [(set (match_operand:SI 0 "register_operand" "=Ral,r")
 	(plus:SI
 	 (mult:SI (sign_extend:SI (match_operand:HI 1 "register_operand" "%r,r"))
 		  (sign_extend:SI (match_operand:HI 2 "register_operand" "r,r")))
-	 (reg:SI ARCV2_ACC)))
+	 (match_operand:SI 3 "accl_operand" "")))
    (clobber (reg:DI ARCV2_ACC))]
   "TARGET_PLUS_MACD"
-  "@
-   vmac2h\\t%0,%1,%2
-   #"
-  "&& reload_completed && (REGNO (operands[0]) != ACCL_REGNO)"
-  [(parallel
-    [(set (reg:SI ARCV2_ACC)
-	  (plus:SI (mult:SI (sign_extend:SI (match_dup 1))
-			    (sign_extend:SI (match_dup 2)))
-		   (reg:SI ARCV2_ACC)))
-     (clobber (reg:DI ARCV2_ACC))])
-   (set (match_dup 0) (reg:SI ARCV2_ACC))]
-  ""
+  "dmach\\t%0,%1,%2"
   [(set_attr "length" "4")
    (set_attr "type" "multi")
    (set_attr "predicable" "no")
@@ -6095,34 +6084,22 @@
    (match_operand:SI 3 "register_operand" "")]
   "TARGET_PLUS_MACD"
   "{
-   rtx acc_reg = gen_rtx_REG (SImode, ACC_REG_FIRST);
+   rtx acc_reg = gen_rtx_REG (SImode, ACCL_REGNO);
 
    emit_move_insn (acc_reg, operands[3]);
-   emit_insn (gen_umachi (operands[0], operands[1], operands[2]));
+   emit_insn (gen_umachi (operands[0], operands[1], operands[2], acc_reg));
    DONE;
   }")
 
-
-(define_insn_and_split "umachi"
+(define_insn "umachi"
   [(set (match_operand:SI 0 "register_operand" "=Ral,r")
 	(plus:SI
 	 (mult:SI (zero_extend:SI (match_operand:HI 1 "register_operand" "%r,r"))
 		  (zero_extend:SI (match_operand:HI 2 "register_operand" "r,r")))
-	 (reg:SI ARCV2_ACC)))
+	 (match_operand:SI 3 "accl_operand" "")))
    (clobber (reg:DI ARCV2_ACC))]
   "TARGET_PLUS_MACD"
-  "@
-   vmac2hu\\t%0,%1,%2
-   #"
-  "&& reload_completed && (REGNO (operands[0]) != ACCL_REGNO)"
-  [(parallel
-    [(set (reg:SI ARCV2_ACC)
-	  (plus:SI (mult:SI (zero_extend:SI (match_dup 1))
-			    (zero_extend:SI (match_dup 2)))
-		   (reg:SI ARCV2_ACC)))
-     (clobber (reg:DI ARCV2_ACC))])
-   (set (match_dup 0) (reg:SI ARCV2_ACC))]
-  ""
+  "dmachu\\t%0,%1,%2"
   [(set_attr "length" "4")
    (set_attr "type" "multi")
    (set_attr "predicable" "no")
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arc/tmac-4.c
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-skip-if "" { ! { clmcpu } } } */
+/* { dg-options "-O3 -mbig-endian -mcpu=hs38" } */
+
+struct a {};
+struct b {
+  int c;
+  int d;
+};
+
+struct {
+  struct a e;
+  struct b f[];
+} g;
+short h;
+
+extern void bar (int *);
+
+int foo(void)
+{
+  struct b *a;
+  for (;;)
+    {
+      a = &g.f[h];
+      bar(&a->d);
+    }
+}
+
+/* { dg-final { scan-assembler "dmach" } } */
