Commit 3188ed59 by Richard Sandiford Committed by Richard Sandiford

neon.md (vec_load_lanes<mode><mode>): New expanders,

gcc/
	* config/arm/neon.md (vec_load_lanes<mode><mode>): New expanders,
	(vec_store_lanes<mode><mode>): Likewise.

From-SVN: r173292
parent 272c6793
2011-05-03 Richard Sandiford <richard.sandiford@linaro.org> 2011-05-03 Richard Sandiford <richard.sandiford@linaro.org>
* config/arm/neon.md (vec_load_lanes<mode><mode>): New expanders,
(vec_store_lanes<mode><mode>): Likewise.
2011-05-03 Richard Sandiford <richard.sandiford@linaro.org>
* doc/md.texi (vec_load_lanes, vec_store_lanes): Document. * doc/md.texi (vec_load_lanes, vec_store_lanes): Document.
* optabs.h (COI_vec_load_lanes, COI_vec_store_lanes): New * optabs.h (COI_vec_load_lanes, COI_vec_store_lanes): New
convert_optab_index values. convert_optab_index values.
......
...@@ -4261,6 +4261,12 @@ ...@@ -4261,6 +4261,12 @@
DONE; DONE;
}) })
(define_expand "vec_load_lanes<mode><mode>"
[(set (match_operand:VDQX 0 "s_register_operand")
(unspec:VDQX [(match_operand:VDQX 1 "neon_struct_operand")]
UNSPEC_VLD1))]
"TARGET_NEON")
(define_insn "neon_vld1<mode>" (define_insn "neon_vld1<mode>"
[(set (match_operand:VDQX 0 "s_register_operand" "=w") [(set (match_operand:VDQX 0 "s_register_operand" "=w")
(unspec:VDQX [(match_operand:VDQX 1 "neon_struct_operand" "Um")] (unspec:VDQX [(match_operand:VDQX 1 "neon_struct_operand" "Um")]
...@@ -4358,6 +4364,12 @@ ...@@ -4358,6 +4364,12 @@
(const_string "neon_vld1_1_2_regs")))] (const_string "neon_vld1_1_2_regs")))]
) )
(define_expand "vec_store_lanes<mode><mode>"
[(set (match_operand:VDQX 0 "neon_struct_operand")
(unspec:VDQX [(match_operand:VDQX 1 "s_register_operand")]
UNSPEC_VST1))]
"TARGET_NEON")
(define_insn "neon_vst1<mode>" (define_insn "neon_vst1<mode>"
[(set (match_operand:VDQX 0 "neon_struct_operand" "=Um") [(set (match_operand:VDQX 0 "neon_struct_operand" "=Um")
(unspec:VDQX [(match_operand:VDQX 1 "s_register_operand" "w")] (unspec:VDQX [(match_operand:VDQX 1 "s_register_operand" "w")]
...@@ -4414,6 +4426,13 @@ ...@@ -4414,6 +4426,13 @@
[(set_attr "neon_type" "neon_vst1_vst2_lane")] [(set_attr "neon_type" "neon_vst1_vst2_lane")]
) )
(define_expand "vec_load_lanesti<mode>"
[(set (match_operand:TI 0 "s_register_operand")
(unspec:TI [(match_operand:TI 1 "neon_struct_operand")
(unspec:VDX [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
UNSPEC_VLD2))]
"TARGET_NEON")
(define_insn "neon_vld2<mode>" (define_insn "neon_vld2<mode>"
[(set (match_operand:TI 0 "s_register_operand" "=w") [(set (match_operand:TI 0 "s_register_operand" "=w")
(unspec:TI [(match_operand:TI 1 "neon_struct_operand" "Um") (unspec:TI [(match_operand:TI 1 "neon_struct_operand" "Um")
...@@ -4432,6 +4451,13 @@ ...@@ -4432,6 +4451,13 @@
(const_string "neon_vld2_2_regs_vld1_vld2_all_lanes")))] (const_string "neon_vld2_2_regs_vld1_vld2_all_lanes")))]
) )
(define_expand "vec_load_lanesoi<mode>"
[(set (match_operand:OI 0 "s_register_operand")
(unspec:OI [(match_operand:OI 1 "neon_struct_operand")
(unspec:VQ [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
UNSPEC_VLD2))]
"TARGET_NEON")
(define_insn "neon_vld2<mode>" (define_insn "neon_vld2<mode>"
[(set (match_operand:OI 0 "s_register_operand" "=w") [(set (match_operand:OI 0 "s_register_operand" "=w")
(unspec:OI [(match_operand:OI 1 "neon_struct_operand" "Um") (unspec:OI [(match_operand:OI 1 "neon_struct_operand" "Um")
...@@ -4514,6 +4540,13 @@ ...@@ -4514,6 +4540,13 @@
(const_string "neon_vld1_1_2_regs")))] (const_string "neon_vld1_1_2_regs")))]
) )
(define_expand "vec_store_lanesti<mode>"
[(set (match_operand:TI 0 "neon_struct_operand")
(unspec:TI [(match_operand:TI 1 "s_register_operand")
(unspec:VDX [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
UNSPEC_VST2))]
"TARGET_NEON")
(define_insn "neon_vst2<mode>" (define_insn "neon_vst2<mode>"
[(set (match_operand:TI 0 "neon_struct_operand" "=Um") [(set (match_operand:TI 0 "neon_struct_operand" "=Um")
(unspec:TI [(match_operand:TI 1 "s_register_operand" "w") (unspec:TI [(match_operand:TI 1 "s_register_operand" "w")
...@@ -4532,6 +4565,13 @@ ...@@ -4532,6 +4565,13 @@
(const_string "neon_vst1_1_2_regs_vst2_2_regs")))] (const_string "neon_vst1_1_2_regs_vst2_2_regs")))]
) )
(define_expand "vec_store_lanesoi<mode>"
[(set (match_operand:OI 0 "neon_struct_operand")
(unspec:OI [(match_operand:OI 1 "s_register_operand")
(unspec:VQ [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
UNSPEC_VST2))]
"TARGET_NEON")
(define_insn "neon_vst2<mode>" (define_insn "neon_vst2<mode>"
[(set (match_operand:OI 0 "neon_struct_operand" "=Um") [(set (match_operand:OI 0 "neon_struct_operand" "=Um")
(unspec:OI [(match_operand:OI 1 "s_register_operand" "w") (unspec:OI [(match_operand:OI 1 "s_register_operand" "w")
...@@ -4597,6 +4637,13 @@ ...@@ -4597,6 +4637,13 @@
[(set_attr "neon_type" "neon_vst1_vst2_lane")] [(set_attr "neon_type" "neon_vst1_vst2_lane")]
) )
(define_expand "vec_load_lanesei<mode>"
[(set (match_operand:EI 0 "s_register_operand")
(unspec:EI [(match_operand:EI 1 "neon_struct_operand")
(unspec:VDX [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
UNSPEC_VLD3))]
"TARGET_NEON")
(define_insn "neon_vld3<mode>" (define_insn "neon_vld3<mode>"
[(set (match_operand:EI 0 "s_register_operand" "=w") [(set (match_operand:EI 0 "s_register_operand" "=w")
(unspec:EI [(match_operand:EI 1 "neon_struct_operand" "Um") (unspec:EI [(match_operand:EI 1 "neon_struct_operand" "Um")
...@@ -4615,6 +4662,16 @@ ...@@ -4615,6 +4662,16 @@
(const_string "neon_vld3_vld4")))] (const_string "neon_vld3_vld4")))]
) )
(define_expand "vec_load_lanesci<mode>"
[(match_operand:CI 0 "s_register_operand")
(match_operand:CI 1 "neon_struct_operand")
(unspec:VQ [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
"TARGET_NEON"
{
emit_insn (gen_neon_vld3<mode> (operands[0], operands[1]));
DONE;
})
(define_expand "neon_vld3<mode>" (define_expand "neon_vld3<mode>"
[(match_operand:CI 0 "s_register_operand") [(match_operand:CI 0 "s_register_operand")
(match_operand:CI 1 "neon_struct_operand") (match_operand:CI 1 "neon_struct_operand")
...@@ -4754,6 +4811,13 @@ ...@@ -4754,6 +4811,13 @@
(const_string "neon_vld3_vld4_all_lanes") (const_string "neon_vld3_vld4_all_lanes")
(const_string "neon_vld1_1_2_regs")))]) (const_string "neon_vld1_1_2_regs")))])
(define_expand "vec_store_lanesei<mode>"
[(set (match_operand:EI 0 "neon_struct_operand")
(unspec:EI [(match_operand:EI 1 "s_register_operand")
(unspec:VDX [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
UNSPEC_VST3))]
"TARGET_NEON")
(define_insn "neon_vst3<mode>" (define_insn "neon_vst3<mode>"
[(set (match_operand:EI 0 "neon_struct_operand" "=Um") [(set (match_operand:EI 0 "neon_struct_operand" "=Um")
(unspec:EI [(match_operand:EI 1 "s_register_operand" "w") (unspec:EI [(match_operand:EI 1 "s_register_operand" "w")
...@@ -4771,6 +4835,16 @@ ...@@ -4771,6 +4835,16 @@
(const_string "neon_vst1_1_2_regs_vst2_2_regs") (const_string "neon_vst1_1_2_regs_vst2_2_regs")
(const_string "neon_vst2_4_regs_vst3_vst4")))]) (const_string "neon_vst2_4_regs_vst3_vst4")))])
(define_expand "vec_store_lanesci<mode>"
[(match_operand:CI 0 "neon_struct_operand")
(match_operand:CI 1 "s_register_operand")
(unspec:VQ [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
"TARGET_NEON"
{
emit_insn (gen_neon_vst3<mode> (operands[0], operands[1]));
DONE;
})
(define_expand "neon_vst3<mode>" (define_expand "neon_vst3<mode>"
[(match_operand:CI 0 "neon_struct_operand") [(match_operand:CI 0 "neon_struct_operand")
(match_operand:CI 1 "s_register_operand") (match_operand:CI 1 "s_register_operand")
...@@ -4882,6 +4956,13 @@ ...@@ -4882,6 +4956,13 @@
} }
[(set_attr "neon_type" "neon_vst3_vst4_lane")]) [(set_attr "neon_type" "neon_vst3_vst4_lane")])
(define_expand "vec_load_lanesoi<mode>"
[(set (match_operand:OI 0 "s_register_operand")
(unspec:OI [(match_operand:OI 1 "neon_struct_operand")
(unspec:VDX [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
UNSPEC_VLD4))]
"TARGET_NEON")
(define_insn "neon_vld4<mode>" (define_insn "neon_vld4<mode>"
[(set (match_operand:OI 0 "s_register_operand" "=w") [(set (match_operand:OI 0 "s_register_operand" "=w")
(unspec:OI [(match_operand:OI 1 "neon_struct_operand" "Um") (unspec:OI [(match_operand:OI 1 "neon_struct_operand" "Um")
...@@ -4900,6 +4981,16 @@ ...@@ -4900,6 +4981,16 @@
(const_string "neon_vld3_vld4")))] (const_string "neon_vld3_vld4")))]
) )
(define_expand "vec_load_lanesxi<mode>"
[(match_operand:XI 0 "s_register_operand")
(match_operand:XI 1 "neon_struct_operand")
(unspec:VQ [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
"TARGET_NEON"
{
emit_insn (gen_neon_vld4<mode> (operands[0], operands[1]));
DONE;
})
(define_expand "neon_vld4<mode>" (define_expand "neon_vld4<mode>"
[(match_operand:XI 0 "s_register_operand") [(match_operand:XI 0 "s_register_operand")
(match_operand:XI 1 "neon_struct_operand") (match_operand:XI 1 "neon_struct_operand")
...@@ -5046,6 +5137,13 @@ ...@@ -5046,6 +5137,13 @@
(const_string "neon_vld1_1_2_regs")))] (const_string "neon_vld1_1_2_regs")))]
) )
(define_expand "vec_store_lanesoi<mode>"
[(set (match_operand:OI 0 "neon_struct_operand")
(unspec:OI [(match_operand:OI 1 "s_register_operand")
(unspec:VDX [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
UNSPEC_VST4))]
"TARGET_NEON")
(define_insn "neon_vst4<mode>" (define_insn "neon_vst4<mode>"
[(set (match_operand:OI 0 "neon_struct_operand" "=Um") [(set (match_operand:OI 0 "neon_struct_operand" "=Um")
(unspec:OI [(match_operand:OI 1 "s_register_operand" "w") (unspec:OI [(match_operand:OI 1 "s_register_operand" "w")
...@@ -5064,6 +5162,16 @@ ...@@ -5064,6 +5162,16 @@
(const_string "neon_vst2_4_regs_vst3_vst4")))] (const_string "neon_vst2_4_regs_vst3_vst4")))]
) )
(define_expand "vec_store_lanesxi<mode>"
[(match_operand:XI 0 "neon_struct_operand")
(match_operand:XI 1 "s_register_operand")
(unspec:VQ [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
"TARGET_NEON"
{
emit_insn (gen_neon_vst4<mode> (operands[0], operands[1]));
DONE;
})
(define_expand "neon_vst4<mode>" (define_expand "neon_vst4<mode>"
[(match_operand:XI 0 "neon_struct_operand") [(match_operand:XI 0 "neon_struct_operand")
(match_operand:XI 1 "s_register_operand") (match_operand:XI 1 "s_register_operand")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment