Commit 810c4bf4 by Bernd Schmidt Committed by Bernd Schmidt

re PR target/43902 (suboptimal MIPS widening multiply accumulate)

	PR target/43902
	* config/arm/arm.md (maddsidi4, umaddsidi4): New expanders.
	(maddhisi4): Renamed from mulhisi3addsi.  Operands renumbered.
	(maddhidi4): Likewise.

testsuite/
	PR target/43902
	* gcc.target/arm/wmul-1.c: Test for smlabb instead of smulbb.
	* gcc.target/arm/wmul-3.c: New test.
	* gcc.target/arm/wmul-4.c: New test.

From-SVN: r161533
parent 3c07301f
2010-06-29 Bernd Schmidt <bernds@codesourcery.com>
PR target/43902
* config/arm/arm.md (maddsidi4, umaddsidi4): New expanders.
(maddhisi4): Renamed from mulhisi3addsi. Operands renumbered.
(maddhidi4): Likewise.
2010-06-29 Nathan Froyd <froydnj@codesourcery.com> 2010-06-29 Nathan Froyd <froydnj@codesourcery.com>
* calls.c, dse.c, expr.c, function.c: Call targetm.calls.function_arg, * calls.c, dse.c, expr.c, function.c: Call targetm.calls.function_arg,
......
...@@ -1422,7 +1422,15 @@ ...@@ -1422,7 +1422,15 @@
(set_attr "predicable" "yes")] (set_attr "predicable" "yes")]
) )
;; Unnamed template to match long long multiply-accumulate (smlal) (define_expand "maddsidi4"
[(set (match_operand:DI 0 "s_register_operand" "")
(plus:DI
(mult:DI
(sign_extend:DI (match_operand:SI 1 "s_register_operand" ""))
(sign_extend:DI (match_operand:SI 2 "s_register_operand" "")))
(match_operand:DI 3 "s_register_operand" "")))]
"TARGET_32BIT && arm_arch3m"
"")
(define_insn "*mulsidi3adddi" (define_insn "*mulsidi3adddi"
[(set (match_operand:DI 0 "s_register_operand" "=&r") [(set (match_operand:DI 0 "s_register_operand" "=&r")
...@@ -1518,7 +1526,15 @@ ...@@ -1518,7 +1526,15 @@
(set_attr "predicable" "yes")] (set_attr "predicable" "yes")]
) )
;; Unnamed template to match long long unsigned multiply-accumulate (umlal) (define_expand "umaddsidi4"
[(set (match_operand:DI 0 "s_register_operand" "")
(plus:DI
(mult:DI
(zero_extend:DI (match_operand:SI 1 "s_register_operand" ""))
(zero_extend:DI (match_operand:SI 2 "s_register_operand" "")))
(match_operand:DI 3 "s_register_operand" "")))]
"TARGET_32BIT && arm_arch3m"
"")
(define_insn "*umulsidi3adddi" (define_insn "*umulsidi3adddi"
[(set (match_operand:DI 0 "s_register_operand" "=&r") [(set (match_operand:DI 0 "s_register_operand" "=&r")
...@@ -1686,29 +1702,29 @@ ...@@ -1686,29 +1702,29 @@
(set_attr "predicable" "yes")] (set_attr "predicable" "yes")]
) )
(define_insn "*mulhisi3addsi" (define_insn "maddhisi4"
[(set (match_operand:SI 0 "s_register_operand" "=r") [(set (match_operand:SI 0 "s_register_operand" "=r")
(plus:SI (match_operand:SI 1 "s_register_operand" "r") (plus:SI (match_operand:SI 3 "s_register_operand" "r")
(mult:SI (sign_extend:SI (mult:SI (sign_extend:SI
(match_operand:HI 2 "s_register_operand" "%r")) (match_operand:HI 1 "s_register_operand" "%r"))
(sign_extend:SI (sign_extend:SI
(match_operand:HI 3 "s_register_operand" "r")))))] (match_operand:HI 2 "s_register_operand" "r")))))]
"TARGET_DSP_MULTIPLY" "TARGET_DSP_MULTIPLY"
"smlabb%?\\t%0, %2, %3, %1" "smlabb%?\\t%0, %1, %2, %3"
[(set_attr "insn" "smlaxy") [(set_attr "insn" "smlaxy")
(set_attr "predicable" "yes")] (set_attr "predicable" "yes")]
) )
(define_insn "*mulhidi3adddi" (define_insn "*maddhidi4"
[(set (match_operand:DI 0 "s_register_operand" "=r") [(set (match_operand:DI 0 "s_register_operand" "=r")
(plus:DI (plus:DI
(match_operand:DI 1 "s_register_operand" "0") (match_operand:DI 3 "s_register_operand" "0")
(mult:DI (sign_extend:DI (mult:DI (sign_extend:DI
(match_operand:HI 2 "s_register_operand" "%r")) (match_operand:HI 1 "s_register_operand" "%r"))
(sign_extend:DI (sign_extend:DI
(match_operand:HI 3 "s_register_operand" "r")))))] (match_operand:HI 2 "s_register_operand" "r")))))]
"TARGET_DSP_MULTIPLY" "TARGET_DSP_MULTIPLY"
"smlalbb%?\\t%Q0, %R0, %2, %3" "smlalbb%?\\t%Q0, %R0, %1, %2"
[(set_attr "insn" "smlalxy") [(set_attr "insn" "smlalxy")
(set_attr "predicable" "yes")]) (set_attr "predicable" "yes")])
......
2010-06-29 Bernd Schmidt <bernds@codesourcery.com>
PR target/43902
* gcc.target/arm/wmul-1.c: Test for smlabb instead of smulbb.
* gcc.target/arm/wmul-3.c: New test.
* gcc.target/arm/wmul-4.c: New test.
2010-06-29 H.J. Lu <hongjiu.lu@intel.com> 2010-06-29 H.J. Lu <hongjiu.lu@intel.com>
PR rtl-optimization/44659 PR rtl-optimization/44659
......
...@@ -15,4 +15,4 @@ int mac(const short *a, const short *b, int sqr, int *sum) ...@@ -15,4 +15,4 @@ int mac(const short *a, const short *b, int sqr, int *sum)
return sqr; return sqr;
} }
/* { dg-final { scan-assembler-times "smulbb" 2 } } */ /* { dg-final { scan-assembler-times "smlabb" 2 } } */
/* { dg-do compile } */
/* { dg-options "-O2 -march=armv6t2" } */
int mac(const short *a, const short *b, int sqr, int *sum)
{
int i;
int dotp = *sum;
for (i = 0; i < 150; i++) {
dotp -= b[i] * a[i];
sqr -= b[i] * b[i];
}
*sum = dotp;
return sqr;
}
/* { dg-final { scan-assembler-times "smulbb" 2 } } */
/* { dg-do compile } */
/* { dg-options "-O2 -march=armv6t2" } */
int mac(const int *a, const int *b, long long sqr, long long *sum)
{
int i;
long long dotp = *sum;
for (i = 0; i < 150; i++) {
dotp += (long long) b[i] * a[i];
sqr += (long long) b[i] * b[i];
}
*sum = dotp;
return sqr;
}
/* { dg-final { scan-assembler-times "smlal" 2 } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment