diff options
author | Sevak Sargsyan <sevak.sargsyan@ispras.ru> | 2011-09-13 16:21:38 +0000 |
---|---|---|
committer | Alexander Monakov <amonakov@gcc.gnu.org> | 2011-09-13 20:21:38 +0400 |
commit | bd1aa4f4af8e71e13acbda112860cdd2045817ee (patch) | |
tree | 12d8ffa0150dae34b9300e9cfde42d98d735dd7d /gcc | |
parent | 29b7399adf8fc5764f919ab9d94525fb7cbe08a9 (diff) | |
download | gcc-bd1aa4f4af8e71e13acbda112860cdd2045817ee.zip gcc-bd1aa4f4af8e71e13acbda112860cdd2045817ee.tar.gz gcc-bd1aa4f4af8e71e13acbda112860cdd2045817ee.tar.bz2 |
neon.md (neon_vabd<mode>_2, [...]): New define_insn patterns for combine.
2011-09-13 Sevak Sargsyan <sevak.sargsyan@ispras.ru>
* config/arm/neon.md (neon_vabd<mode>_2, neon_vabd<mode>_3): New
define_insn patterns for combine.
* gcc.target/arm/neon-combine-sub-abs-into-vabd.c: New test.
From-SVN: r178817
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/arm/neon.md | 29 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/neon-combine-sub-abs-into-vabd.c | 50 |
4 files changed, 88 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f7e267c..2670db8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2011-09-13 Sevak Sargsyan <sevak.sargsyan@ispras.ru> + + * config/arm/neon.md (neon_vabd<mode>_2, neon_vabd<mode>_3): New + define_insn patterns for combine. + 2011-09-13 Giuseppe Scrivano <gscrivano@gnu.org> * reorg.c: Always define make_return_insns. diff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md index c91b0cd..b70c7af 100644 --- a/gcc/config/arm/neon.md +++ b/gcc/config/arm/neon.md @@ -5665,3 +5665,32 @@ emit_insn (gen_neon_vec_pack_trunc_<V_double> (operands[0], tempreg)); DONE; }) + +(define_insn "neon_vabd<mode>_2" + [(set (match_operand:VDQ 0 "s_register_operand" "=w") + (abs:VDQ (minus:VDQ (match_operand:VDQ 1 "s_register_operand" "w") + (match_operand:VDQ 2 "s_register_operand" "w"))))] + "TARGET_NEON && (!<Is_float_mode> || flag_unsafe_math_optimizations)" + "vabd.<V_s_elem> %<V_reg>0, %<V_reg>1, %<V_reg>2" + [(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_vadd_ddd_vabs_dd") + (const_string "neon_fp_vadd_qqq_vabs_qq")) + (const_string "neon_int_5")))] +) + +(define_insn "neon_vabd<mode>_3" + [(set (match_operand:VDQ 0 "s_register_operand" "=w") + (abs:VDQ (unspec:VDQ [(match_operand:VDQ 1 "s_register_operand" "w") + (match_operand:VDQ 2 "s_register_operand" "w")] + UNSPEC_VSUB)))] + "TARGET_NEON && (!<Is_float_mode> || flag_unsafe_math_optimizations)" + "vabd.<V_if_elem> %<V_reg>0, %<V_reg>1, %<V_reg>2" + [(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_vadd_ddd_vabs_dd") + (const_string "neon_fp_vadd_qqq_vabs_qq")) + (const_string "neon_int_5")))] +) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 65af046..6fe5597 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-09-13 Sevak Sargsyan <sevak.sargsyan@ispras.ru> + + * gcc.target/arm/neon-combine-sub-abs-into-vabd.c: New test. + 2011-09-13 Dodji Seketeli <dodji@redhat.com> PR c++/48320 diff --git a/gcc/testsuite/gcc.target/arm/neon-combine-sub-abs-into-vabd.c b/gcc/testsuite/gcc.target/arm/neon-combine-sub-abs-into-vabd.c new file mode 100644 index 0000000..ad6ba75 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-combine-sub-abs-into-vabd.c @@ -0,0 +1,50 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target arm_neon_ok } */ +/* { dg-options "-O2 -funsafe-math-optimizations" } */ +/* { dg-add-options arm_neon } */ + +#include <arm_neon.h> +float32x2_t f_sub_abs_to_vabd_32() +{ + float32x2_t val1 = vdup_n_f32 (10); + float32x2_t val2 = vdup_n_f32 (30); + float32x2_t sres = vsub_f32(val1, val2); + float32x2_t res = vabs_f32 (sres); + + return res; +} +/* { dg-final { scan-assembler "vabd\.f32" } }*/ + +#include <arm_neon.h> +int8x8_t sub_abs_to_vabd_8() +{ + int8x8_t val1 = vdup_n_s8 (10); + int8x8_t val2 = vdup_n_s8 (30); + int8x8_t sres = vsub_s8(val1, val2); + int8x8_t res = vabs_s8 (sres); + + return res; +} +/* { dg-final { scan-assembler "vabd\.s8" } }*/ + +int16x4_t sub_abs_to_vabd_16() +{ + int16x4_t val1 = vdup_n_s16 (10); + int16x4_t val2 = vdup_n_s16 (30); + int16x4_t sres = vsub_s16(val1, val2); + int16x4_t res = vabs_s16 (sres); + + return res; +} +/* { dg-final { scan-assembler "vabd\.s16" } }*/ + +int32x2_t sub_abs_to_vabd_32() +{ + int32x2_t val1 = vdup_n_s32 (10); + int32x2_t val2 = vdup_n_s32 (30); + int32x2_t sres = vsub_s32(val1, val2); + int32x2_t res = vabs_s32 (sres); + + return res; +} +/* { dg-final { scan-assembler "vabd\.s32" } }*/ |