aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2009-05-21 16:53:48 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2009-05-21 16:53:48 +0000
commit1ea9fe562c2e9c3a7772304e588aba86d8e58152 (patch)
treedad4b6960f3868757726d7534ae09ec956edb48f /gcc
parent449223affaee69a3d70b9c578c727bbb08acba99 (diff)
downloadgcc-1ea9fe562c2e9c3a7772304e588aba86d8e58152.zip
gcc-1ea9fe562c2e9c3a7772304e588aba86d8e58152.tar.gz
gcc-1ea9fe562c2e9c3a7772304e588aba86d8e58152.tar.bz2
neon.md (*mul<mode>3add<mode>_neon): New pattern.
* config/arm/neon.md (*mul<mode>3add<mode>_neon): New pattern. (*mul<mode>3neg<mode>add<mode>_neon): Likewise. * gcc.dg/target/arm/neon-vmla-1.c: New. * gcc.dg/target/arm/neon-vmls-1.c: Likewise. From-SVN: r147771
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/arm/neon.md44
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/arm/neon-vmla-1.c10
-rw-r--r--gcc/testsuite/gcc.target/arm/neon-vmls-1.c10
5 files changed, 74 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6b0f89a..8b7c623 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2009-05-21 Mark Mitchell <mark@codesourcery.com>
+
+ * config/arm/neon.md (*mul<mode>3add<mode>_neon): New pattern.
+ (*mul<mode>3neg<mode>add<mode>_neon): Likewise.
+
2009-05-21 Shujing Zhao <pearly.zhao@oracle.com>
* config/i386/i386.c: Use REG_P, MEM_P, CONST_INT_P, LABEL_P and
diff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md
index f4ba7e7..ebd2a45 100644
--- a/gcc/config/arm/neon.md
+++ b/gcc/config/arm/neon.md
@@ -862,6 +862,50 @@
(const_string "neon_mul_qqq_8_16_32_ddd_32")))))]
)
+(define_insn "*mul<mode>3add<mode>_neon"
+ [(set (match_operand:VDQ 0 "s_register_operand" "=w")
+ (plus:VDQ (mult:VDQ (match_operand:VDQ 2 "s_register_operand" "w")
+ (match_operand:VDQ 3 "s_register_operand" "w"))
+ (match_operand:VDQ 1 "s_register_operand" "0")))]
+ "TARGET_NEON"
+ "vmla.<V_if_elem>\t%<V_reg>0, %<V_reg>2, %<V_reg>3"
+ [(set (attr "neon_type")
+ (if_then_else (ne (symbol_ref "<Is_float_mode>") (const_int 0))
+ (if_then_else (ne (symbol_ref "<Is_d_reg>") (const_int 0))
+ (const_string "neon_fp_vmla_ddd")
+ (const_string "neon_fp_vmla_qqq"))
+ (if_then_else (ne (symbol_ref "<Is_d_reg>") (const_int 0))
+ (if_then_else
+ (ne (symbol_ref "<Scalar_mul_8_16>") (const_int 0))
+ (const_string "neon_mla_ddd_8_16_qdd_16_8_long_32_16_long")
+ (const_string "neon_mla_ddd_32_qqd_16_ddd_32_scalar_qdd_64_32_long_scalar_qdd_64_32_long"))
+ (if_then_else (ne (symbol_ref "<Scalar_mul_8_16>") (const_int 0))
+ (const_string "neon_mla_qqq_8_16")
+ (const_string "neon_mla_qqq_32_qqd_32_scalar")))))]
+)
+
+(define_insn "*mul<mode>3neg<mode>add<mode>_neon"
+ [(set (match_operand:VDQ 0 "s_register_operand" "=w")
+ (minus:VDQ (match_operand:VDQ 1 "s_register_operand" "0")
+ (mult:VDQ (match_operand:VDQ 2 "s_register_operand" "w")
+ (match_operand:VDQ 3 "s_register_operand" "w"))))]
+ "TARGET_NEON"
+ "vmls.<V_if_elem>\t%<V_reg>0, %<V_reg>2, %<V_reg>3"
+ [(set (attr "neon_type")
+ (if_then_else (ne (symbol_ref "<Is_float_mode>") (const_int 0))
+ (if_then_else (ne (symbol_ref "<Is_d_reg>") (const_int 0))
+ (const_string "neon_fp_vmla_ddd")
+ (const_string "neon_fp_vmla_qqq"))
+ (if_then_else (ne (symbol_ref "<Is_d_reg>") (const_int 0))
+ (if_then_else
+ (ne (symbol_ref "<Scalar_mul_8_16>") (const_int 0))
+ (const_string "neon_mla_ddd_8_16_qdd_16_8_long_32_16_long")
+ (const_string "neon_mla_ddd_32_qqd_16_ddd_32_scalar_qdd_64_32_long_scalar_qdd_64_32_long"))
+ (if_then_else (ne (symbol_ref "<Scalar_mul_8_16>") (const_int 0))
+ (const_string "neon_mla_qqq_8_16")
+ (const_string "neon_mla_qqq_32_qqd_32_scalar")))))]
+)
+
(define_insn "ior<mode>3"
[(set (match_operand:VDQ 0 "s_register_operand" "=w,w")
(ior:VDQ (match_operand:VDQ 1 "s_register_operand" "w,0")
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6c693b8..e1db42b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-05-21 Mark Mitchell <mark@codesourcery.com>
+
+ * gcc.dg/target/arm/neon-vmla-1.c: New.
+ * gcc.dg/target/arm/neon-vmls-1.c: Likewise.
+
2009-05-20 Adam Nemet <anemet@caviumnetworks.com>
* gcc.target/mips/octeon-exts-6.c: New test.
diff --git a/gcc/testsuite/gcc.target/arm/neon-vmla-1.c b/gcc/testsuite/gcc.target/arm/neon-vmla-1.c
new file mode 100644
index 0000000..3592ab9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/neon-vmla-1.c
@@ -0,0 +1,10 @@
+/* { dg-require-effective-target arm_neon_hw } */
+/* { dg-options "-O2 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize" } */
+/* { dg-final { scan-assembler "vmla\\.f32" } } */
+
+/* Verify that VMLA is used. */
+void f1(int n, float a, float x[], float y[]) {
+ int i;
+ for (i = 0; i < n; ++i)
+ y[i] = a * x[i] + y[i];
+}
diff --git a/gcc/testsuite/gcc.target/arm/neon-vmls-1.c b/gcc/testsuite/gcc.target/arm/neon-vmls-1.c
new file mode 100644
index 0000000..1b3fcbb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/neon-vmls-1.c
@@ -0,0 +1,10 @@
+/* { dg-require-effective-target arm_neon_hw } */
+/* { dg-options "-O2 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize" } */
+/* { dg-final { scan-assembler "vmls\\.f32" } } */
+
+/* Verify that VMLS is used. */
+void f1(int n, float a, float x[], float y[]) {
+ int i;
+ for (i = 0; i < n; ++i)
+ y[i] = y[i] - a * x[i];
+}