summaryrefslogtreecommitdiff
path: root/packages/gcc/11.2.0/0008-arc-Fix-maddhisi-patterns.patch
blob: e4233a36e4c58f2e01e9713633dd5e4b11ec0ba8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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" } } */