@@ -4349,29 +4349,29 @@
)
(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_vld1_1_2_regs")]
+)
+
+;; This has been split from the others because vld1_dupdi is the same
+;; as a DImode move and it is meaningless to vec_duplicate a DImode value into
+;; a DImode value.
+(define_expand "neon_vld1_dupdi"
+ [(set (match_operand:DI 0 "s_register_operand" "")
+ (match_operand:DI 1 "neon_struct_operand" ""))]
+ "TARGET_NEON"
+ ""
)
(define_insn "neon_vld1_dup<mode>"
[(set (match_operand:VQ 0 "s_register_operand" "=w")
(vec_duplicate:VQ (match_operand:<V_elem> 1
"neon_struct_operand" "Um")))]
"TARGET_NEON"
-{
- return "vld1.<V_sz_elem>\t{%e0[], %f0[]}, %A1";
-}
- [(set_attr "neon_type" "neon_vld2_2_regs_vld1_vld2_all_lanes")]
+ "vld1.<V_sz_elem>\t{%e0[], %f0[]}, %A1"
+ [(set_attr "neon_type" "neon_vld2_2_regs_vld1_vld2_all_lanes")]