aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Earnshaw <rearnsha@arm.com>2013-08-08 13:46:28 +0000
committerRichard Earnshaw <rearnsha@gcc.gnu.org>2013-08-08 13:46:28 +0000
commit27d2e61268434dc682b81227e93ae9022d4d290f (patch)
treec74cbb02a0e224f62a786e6d19b283646ee1eaf8
parent5efc661cc49cf7bd83fc805f91e02eefd44073e1 (diff)
downloadgcc-27d2e61268434dc682b81227e93ae9022d4d290f.zip
gcc-27d2e61268434dc682b81227e93ae9022d4d290f.tar.gz
gcc-27d2e61268434dc682b81227e93ae9022d4d290f.tar.bz2
re PR target/57431 (ICE in simplify_const_unary_operation vld1_dup_s64/vst1_s64)
PR target/57431 * arm/neon.md (neon_vld1_dupdi): New expand pattern. (neon_vld1_dup<mode> VD iterator): Iterate over VD not VDX. From-SVN: r201599
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/arm/neon.md25
2 files changed, 19 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5645867..e55b5db 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2013-08-08 Richard Earnshaw <rearnsha@arm.com>
+ PR target/57431
+ * arm/neon.md (neon_vld1_dupdi): New expand pattern.
+ (neon_vld1_dup<mode> VD iterator): Iterate over VD not VDX.
+
+2013-08-08 Richard Earnshaw <rearnsha@arm.com>
+
PR target/56979
* arm.c (aapcs_vfp_allocate): Decompose the argument if the
suggested mode for the assignment isn't compatible with the
diff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md
index e8d2285..627cc71 100644
--- a/gcc/config/arm/neon.md
+++ b/gcc/config/arm/neon.md
@@ -4593,19 +4593,20 @@
)
(define_insn "neon_vld1_dup<mode>"
- [(set (match_operand:VDX 0 "s_register_operand" "=w")
- (vec_duplicate:VDX (match_operand:<V_elem> 1 "neon_struct_operand" "Um")))]
+ [(set (match_operand:VD 0 "s_register_operand" "=w")
+ (vec_duplicate:VD (match_operand:<V_elem> 1 "neon_struct_operand" "Um")))]
"TARGET_NEON"
-{
- if (GET_MODE_NUNITS (<MODE>mode) > 1)
- return "vld1.<V_sz_elem>\t{%P0[]}, %A1";
- else
- return "vld1.<V_sz_elem>\t%h0, %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")))]
+ "vld1.<V_sz_elem>\t{%P0[]}, %A1"
+ [(set_attr "neon_type" "neon_vld2_2_regs_vld1_vld2_all_lanes")]
+)
+
+;; Special case for DImode. Treat it exactly like a simple load.
+(define_expand "neon_vld1_dupdi"
+ [(set (match_operand:DI 0 "s_register_operand" "")
+ (unspec:DI [(match_operand:DI 1 "neon_struct_operand" "")]
+ UNSPEC_VLD1))]
+ "TARGET_NEON"
+ ""
)
(define_insn "neon_vld1_dup<mode>"