Commit 0182eb8a by David S. Miller Committed by David S. Miller

Handle V4HI vector initialization more efficiently on VIS1.

	* config/sparc/sparc.c (vector_init_faligndata): New function.
	(sparc_expand_vector_init): Use it for V4HImode on VIS1.

From-SVN: r180752
parent 89401152
...@@ -76,6 +76,9 @@ ...@@ -76,6 +76,9 @@
2011-11-01 David S. Miller <davem@davemloft.net> 2011-11-01 David S. Miller <davem@davemloft.net>
* config/sparc/sparc.c (vector_init_faligndata): New function.
(sparc_expand_vector_init): Use it for V4HImode on VIS1.
* config/sparc/sparc.c (sparc_expand_vcond): New function. * config/sparc/sparc.c (sparc_expand_vcond): New function.
* config/sparc/sparc-protos.h (sparc_expand_vcond): Declare it. * config/sparc/sparc-protos.h (sparc_expand_vcond): Declare it.
* config/sparc/sparc.md (vcond<mode><mode>): New VIS3 expander. * config/sparc/sparc.md (vcond<mode><mode>): New VIS3 expander.
...@@ -11340,6 +11340,25 @@ vector_init_fpmerge (rtx target, rtx elt, enum machine_mode inner_mode) ...@@ -11340,6 +11340,25 @@ vector_init_fpmerge (rtx target, rtx elt, enum machine_mode inner_mode)
emit_insn (gen_fpmerge_vis (gen_lowpart (V8QImode, target), t1, t2)); emit_insn (gen_fpmerge_vis (gen_lowpart (V8QImode, target), t1, t2));
} }
static void
vector_init_faligndata (rtx target, rtx elt, enum machine_mode inner_mode)
{
rtx t1 = gen_reg_rtx (V4HImode);
elt = convert_modes (SImode, inner_mode, elt, true);
emit_move_insn (gen_lowpart (SImode, t1), elt);
emit_insn (gen_alignaddrsi_vis (gen_reg_rtx (SImode),
force_reg (SImode, GEN_INT (6)),
CONST0_RTX (SImode)));
emit_insn (gen_faligndatav4hi_vis (target, t1, target));
emit_insn (gen_faligndatav4hi_vis (target, t1, target));
emit_insn (gen_faligndatav4hi_vis (target, t1, target));
emit_insn (gen_faligndatav4hi_vis (target, t1, target));
}
void void
sparc_expand_vector_init (rtx target, rtx vals) sparc_expand_vector_init (rtx target, rtx vals)
{ {
...@@ -11404,6 +11423,11 @@ sparc_expand_vector_init (rtx target, rtx vals) ...@@ -11404,6 +11423,11 @@ sparc_expand_vector_init (rtx target, rtx vals)
vector_init_fpmerge (target, XVECEXP (vals, 0, 0), inner_mode); vector_init_fpmerge (target, XVECEXP (vals, 0, 0), inner_mode);
return; return;
} }
if (mode == V4HImode)
{
vector_init_faligndata (target, XVECEXP (vals, 0, 0), inner_mode);
return;
}
} }
mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0); mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
......
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