diff options
author | Mark Mitchell <mark@codesourcery.com> | 2009-05-21 16:53:48 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2009-05-21 16:53:48 +0000 |
commit | 1ea9fe562c2e9c3a7772304e588aba86d8e58152 (patch) | |
tree | dad4b6960f3868757726d7534ae09ec956edb48f | |
parent | 449223affaee69a3d70b9c578c727bbb08acba99 (diff) | |
download | gcc-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
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/arm/neon.md | 44 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/neon-vmla-1.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/neon-vmls-1.c | 10 |
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]; +} |