aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorChristophe Lyon <christophe.lyon@st.com>2012-06-25 22:11:35 +0200
committerRamana Radhakrishnan <ramana@gcc.gnu.org>2012-06-25 20:11:35 +0000
commit8490252ad13cee562ef21475eeaea0ca0103d2e3 (patch)
treec9a50f40823d24e5ba5517823f3c1c93e7a45d7b /gcc
parent4ebc46e969f2cdf0e59f04ce755dcf75411fc45e (diff)
downloadgcc-8490252ad13cee562ef21475eeaea0ca0103d2e3.zip
gcc-8490252ad13cee562ef21475eeaea0ca0103d2e3.tar.gz
gcc-8490252ad13cee562ef21475eeaea0ca0103d2e3.tar.bz2
Commit for Christophe Lyon.
2012-06-25 Christophe Lyon <christophe.lyon@st.com> * 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 <christophe.lyon@st.com> * gcc.target/arm/neon-vld1_dupQ.c: New. From-SVN: r188951
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/arm/neon.md36
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/arm/neon-vld1_dupQ.c24
4 files changed, 56 insertions, 14 deletions
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 <christophe.lyon@st.com>
+
+ * 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 <matthew.gretton-dann@arm.com>
James Greenhalgh <james.greenhalgh@arm.com>
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<mode>"
[(set (match_operand:VDX 0 "s_register_operand" "=w")
- (unspec:VDX [(match_operand:<V_elem> 1 "neon_struct_operand" "Um")]
- UNSPEC_VLD1_DUP))]
+ (vec_duplicate:VDX (match_operand:<V_elem> 1 "neon_struct_operand" "Um")))]
"TARGET_NEON"
{
if (GET_MODE_NUNITS (<MODE>mode) > 1)
@@ -4397,20 +4395,30 @@
)
(define_insn "neon_vld1_dup<mode>"
- [(set (match_operand:VQX 0 "s_register_operand" "=w")
- (unspec:VQX [(match_operand:<V_elem> 1 "neon_struct_operand" "Um")]
- UNSPEC_VLD1_DUP))]
+ [(set (match_operand:VQ 0 "s_register_operand" "=w")
+ (vec_duplicate:VQ (match_operand:<V_elem> 1 "neon_struct_operand" "Um")))]
"TARGET_NEON"
{
- if (GET_MODE_NUNITS (<MODE>mode) > 2)
- return "vld1.<V_sz_elem>\t{%e0[], %f0[]}, %A1";
- else
- return "vld1.<V_sz_elem>\t%h0, %A1";
+ return "vld1.<V_sz_elem>\t{%e0[], %f0[]}, %A1";
}
- [(set (attr "neon_type")
- (if_then_else (gt (const_string "<V_mode_nunits>") (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<mode><mode>"
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 <christophe.lyon@st.com>
+
+ * gcc.target/arm/neon-vld1_dupQ.c: New.
+
2012-06-25 Florian Weimer <fweimer@redhat.com>
* 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 <stdlib.h>
+
+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;
+}