i386: Pass ix86_expand_sse_unpack operands by value

* config/i386/i386.c (ix86_expand_sse_unpack): Split operands[]
        parameter into src and dest.
        * config/i386/sse.md (vec_unpacku_hi_<V124_AVX2>): Update call.
        (vec_unpacks_hi_<V124_AVX2>): Likewise.
        (vec_unpacku_lo_<V124_AVX2>): Likewise.
        (vec_unpacks_lo_<V124_AVX2>): Likewise.
        * config/i386/i386-protos.h: Update.

From-SVN: r188908
This commit is contained in:
Richard Henderson 2012-06-23 09:42:07 -07:00 committed by Richard Henderson
parent 77a3dbf6c4
commit 7b5321188b
4 changed files with 22 additions and 16 deletions

View File

@ -1,5 +1,13 @@
2012-06-23 Richard Henderson <rth@redhat.com>
* config/i386/i386.c (ix86_expand_sse_unpack): Split operands[]
parameter into src and dest.
* config/i386/sse.md (vec_unpacku_hi_<V124_AVX2>): Update call.
(vec_unpacks_hi_<V124_AVX2>): Likewise.
(vec_unpacku_lo_<V124_AVX2>): Likewise.
(vec_unpacks_lo_<V124_AVX2>): Likewise.
* config/i386/i386-protos.h: Update.
* config/i386/sse.md (mul<VI1_AVX2>3): Change from insn_and_split to
pure expander; move expansion code ...
* config/i386/i386.c (ix86_expand_vecop_qihi): ... here. New function.

View File

@ -130,7 +130,7 @@ extern bool ix86_expand_fp_vcond (rtx[]);
extern bool ix86_expand_int_vcond (rtx[]);
extern void ix86_expand_vec_perm (rtx[]);
extern bool ix86_expand_vec_perm_const (rtx[]);
extern void ix86_expand_sse_unpack (rtx[], bool, bool);
extern void ix86_expand_sse_unpack (rtx, rtx, bool, bool);
extern bool ix86_expand_int_addcc (rtx[]);
extern rtx ix86_expand_call (rtx, rtx, rtx, rtx, rtx, bool);
extern void ix86_split_call_vzeroupper (rtx, rtx);

View File

@ -20187,10 +20187,10 @@ ix86_expand_vec_perm (rtx operands[])
true if we want the N/2 high elements, else the low elements. */
void
ix86_expand_sse_unpack (rtx operands[2], bool unsigned_p, bool high_p)
ix86_expand_sse_unpack (rtx dest, rtx src, bool unsigned_p, bool high_p)
{
enum machine_mode imode = GET_MODE (operands[1]);
rtx tmp, dest;
enum machine_mode imode = GET_MODE (src);
rtx tmp;
if (TARGET_SSE4_1)
{
@ -20252,20 +20252,20 @@ ix86_expand_sse_unpack (rtx operands[2], bool unsigned_p, bool high_p)
if (GET_MODE_SIZE (imode) == 32)
{
tmp = gen_reg_rtx (halfmode);
emit_insn (extract (tmp, operands[1]));
emit_insn (extract (tmp, src));
}
else if (high_p)
{
/* Shift higher 8 bytes to lower 8 bytes. */
tmp = gen_reg_rtx (imode);
emit_insn (gen_sse2_lshrv1ti3 (gen_lowpart (V1TImode, tmp),
gen_lowpart (V1TImode, operands[1]),
gen_lowpart (V1TImode, src),
GEN_INT (64)));
}
else
tmp = operands[1];
tmp = src;
emit_insn (unpack (operands[0], tmp));
emit_insn (unpack (dest, tmp));
}
else
{
@ -20295,15 +20295,13 @@ ix86_expand_sse_unpack (rtx operands[2], bool unsigned_p, bool high_p)
gcc_unreachable ();
}
dest = gen_lowpart (imode, operands[0]);
if (unsigned_p)
tmp = force_reg (imode, CONST0_RTX (imode));
else
tmp = ix86_expand_sse_cmp (gen_reg_rtx (imode), GT, CONST0_RTX (imode),
operands[1], pc_rtx, pc_rtx);
src, pc_rtx, pc_rtx);
emit_insn (unpack (dest, operands[1], tmp));
emit_insn (unpack (gen_lowpart (imode, dest), src, tmp));
}
}

View File

@ -7818,25 +7818,25 @@
[(match_operand:<sseunpackmode> 0 "register_operand")
(match_operand:VI124_AVX2 1 "register_operand")]
"TARGET_SSE2"
"ix86_expand_sse_unpack (operands, false, false); DONE;")
"ix86_expand_sse_unpack (operands[0], operands[1], false, false); DONE;")
(define_expand "vec_unpacks_hi_<mode>"
[(match_operand:<sseunpackmode> 0 "register_operand")
(match_operand:VI124_AVX2 1 "register_operand")]
"TARGET_SSE2"
"ix86_expand_sse_unpack (operands, false, true); DONE;")
"ix86_expand_sse_unpack (operands[0], operands[1], false, true); DONE;")
(define_expand "vec_unpacku_lo_<mode>"
[(match_operand:<sseunpackmode> 0 "register_operand")
(match_operand:VI124_AVX2 1 "register_operand")]
"TARGET_SSE2"
"ix86_expand_sse_unpack (operands, true, false); DONE;")
"ix86_expand_sse_unpack (operands[0], operands[1], true, false); DONE;")
(define_expand "vec_unpacku_hi_<mode>"
[(match_operand:<sseunpackmode> 0 "register_operand")
(match_operand:VI124_AVX2 1 "register_operand")]
"TARGET_SSE2"
"ix86_expand_sse_unpack (operands, true, true); DONE;")
"ix86_expand_sse_unpack (operands[0], operands[1], true, true); DONE;")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;