From: Sevak Sargsyan Date: Tue, 13 Sep 2011 16:21:38 +0000 (+0000) Subject: neon.md (neon_vabd_2, [...]): New define_insn patterns for combine. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=bd1aa4f4af8e71e13acbda112860cdd2045817ee;p=gcc.git neon.md (neon_vabd_2, [...]): New define_insn patterns for combine. 2011-09-13 Sevak Sargsyan * config/arm/neon.md (neon_vabd_2, neon_vabd_3): New define_insn patterns for combine. * gcc.target/arm/neon-combine-sub-abs-into-vabd.c: New test. From-SVN: r178817 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f7e267c0193..2670db85609 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2011-09-13 Sevak Sargsyan + + * config/arm/neon.md (neon_vabd_2, neon_vabd_3): New + define_insn patterns for combine. + 2011-09-13 Giuseppe Scrivano * reorg.c: Always define make_return_insns. diff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md index c91b0cdb931..b70c7af98f3 100644 --- a/gcc/config/arm/neon.md +++ b/gcc/config/arm/neon.md @@ -5665,3 +5665,32 @@ emit_insn (gen_neon_vec_pack_trunc_ (operands[0], tempreg)); DONE; }) + +(define_insn "neon_vabd_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 && (! || flag_unsafe_math_optimizations)" + "vabd. %0, %1, %2" + [(set (attr "neon_type") + (if_then_else (ne (symbol_ref "") (const_int 0)) + (if_then_else (ne (symbol_ref "") (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_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 && (! || flag_unsafe_math_optimizations)" + "vabd. %0, %1, %2" + [(set (attr "neon_type") + (if_then_else (ne (symbol_ref "") (const_int 0)) + (if_then_else (ne (symbol_ref "") (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 65af046e5a4..6fe55977ce4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-09-13 Sevak Sargsyan + + * gcc.target/arm/neon-combine-sub-abs-into-vabd.c: New test. + 2011-09-13 Dodji Seketeli 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 00000000000..ad6ba755e64 --- /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 +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 +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" } }*/