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.
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);
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)
{
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
{
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));
}
}
[(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;")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;