From: Christophe Lyon Date: Mon, 25 Jun 2012 20:11:35 +0000 (+0200) Subject: Commit for Christophe Lyon. X-Git-Tag: upstream/12.2.0~75585 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8490252ad13cee562ef21475eeaea0ca0103d2e3;p=platform%2Fupstream%2Fgcc.git Commit for Christophe Lyon. 2012-06-25 Christophe Lyon * config/arm/neon.md (UNSPEC_VLD1_DUP): Remove. (neon_vld1_dup): Restrict to VQ operands. (neon_vld1_dupv2di): New, fixes vld1q_dup_s64. 2012-06-25 Christophe Lyon * gcc.target/arm/neon-vld1_dupQ.c: New. From-SVN: r188951 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 59109d5..c3e91c9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-06-25 Christophe Lyon + + * config/arm/neon.md (UNSPEC_VLD1_DUP): Remove. + (neon_vld1_dup): Restrict to VQ operands. + (neon_vld1_dupv2di): New, fixes vld1q_dup_s64. + 2012-06-25 Matthew Gretton-Dann James Greenhalgh diff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md index 4568dea..b3b925c 100644 --- a/gcc/config/arm/neon.md +++ b/gcc/config/arm/neon.md @@ -45,7 +45,6 @@ UNSPEC_VHADD UNSPEC_VHSUB UNSPEC_VLD1 - UNSPEC_VLD1_DUP UNSPEC_VLD1_LANE UNSPEC_VLD2 UNSPEC_VLD2_DUP @@ -4381,8 +4380,7 @@ (define_insn "neon_vld1_dup" [(set (match_operand:VDX 0 "s_register_operand" "=w") - (unspec:VDX [(match_operand: 1 "neon_struct_operand" "Um")] - UNSPEC_VLD1_DUP))] + (vec_duplicate:VDX (match_operand: 1 "neon_struct_operand" "Um")))] "TARGET_NEON" { if (GET_MODE_NUNITS (mode) > 1) @@ -4397,20 +4395,30 @@ ) (define_insn "neon_vld1_dup" - [(set (match_operand:VQX 0 "s_register_operand" "=w") - (unspec:VQX [(match_operand: 1 "neon_struct_operand" "Um")] - UNSPEC_VLD1_DUP))] + [(set (match_operand:VQ 0 "s_register_operand" "=w") + (vec_duplicate:VQ (match_operand: 1 "neon_struct_operand" "Um")))] "TARGET_NEON" { - if (GET_MODE_NUNITS (mode) > 2) - return "vld1.\t{%e0[], %f0[]}, %A1"; - else - return "vld1.\t%h0, %A1"; + return "vld1.\t{%e0[], %f0[]}, %A1"; } - [(set (attr "neon_type") - (if_then_else (gt (const_string "") (const_string "1")) - (const_string "neon_vld2_2_regs_vld1_vld2_all_lanes") - (const_string "neon_vld1_1_2_regs")))] + [(set_attr "neon_type" "neon_vld2_2_regs_vld1_vld2_all_lanes")] +) + +(define_insn_and_split "neon_vld1_dupv2di" + [(set (match_operand:V2DI 0 "s_register_operand" "=w") + (vec_duplicate:V2DI (match_operand:DI 1 "neon_struct_operand" "Um")))] + "TARGET_NEON" + "#" + "&& reload_completed" + [(const_int 0)] + { + rtx tmprtx = gen_lowpart (DImode, operands[0]); + emit_insn (gen_neon_vld1_dupdi (tmprtx, operands[1])); + emit_move_insn (gen_highpart (DImode, operands[0]), tmprtx ); + DONE; + } + [(set_attr "length" "8") + (set_attr "neon_type" "neon_vld2_2_regs_vld1_vld2_all_lanes")] ) (define_expand "vec_store_lanes" diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 40547dc..30b83d5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2012-06-25 Christophe Lyon + + * gcc.target/arm/neon-vld1_dupQ.c: New. + 2012-06-25 Florian Weimer * g++.dg/init/new35.C: New. diff --git a/gcc/testsuite/gcc.target/arm/neon-vld1_dupQ.c b/gcc/testsuite/gcc.target/arm/neon-vld1_dupQ.c new file mode 100644 index 0000000..b5793bf --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/neon-vld1_dupQ.c @@ -0,0 +1,24 @@ +/* Test the `vld1q_s64' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include + +int main (void) +{ + int64x1_t input[2] = {(int64x1_t)0x0123456776543210LL, + (int64x1_t)0x89abcdeffedcba90LL}; + int64x1_t output[2] = {0, 0}; + int64x2_t var = vld1q_dup_s64(input); + + vst1q_s64(output, var); + if (output[0] != (int64x1_t)0x0123456776543210LL) + abort(); + if (output[1] != (int64x1_t)0x0123456776543210LL) + abort(); + return 0; +}