mirror of
https://github.com/crosstool-ng/crosstool-ng.git
synced 2024-12-29 09:08:52 +00:00
127 lines
3.6 KiB
Diff
127 lines
3.6 KiB
Diff
|
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" } } */
|