diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d867efdeef7..75f5c0abd50 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,13 @@ 2012-06-23 Richard Henderson + * config/i386/i386.c (ix86_expand_sse_unpack): Split operands[] + parameter into src and dest. + * config/i386/sse.md (vec_unpacku_hi_): Update call. + (vec_unpacks_hi_): Likewise. + (vec_unpacku_lo_): Likewise. + (vec_unpacks_lo_): Likewise. + * config/i386/i386-protos.h: Update. + * config/i386/sse.md (mul3): Change from insn_and_split to pure expander; move expansion code ... * config/i386/i386.c (ix86_expand_vecop_qihi): ... here. New function. diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h index 4e7469de6bf..88de8edaeb4 100644 --- a/gcc/config/i386/i386-protos.h +++ b/gcc/config/i386/i386-protos.h @@ -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); diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index e23c418f731..7ae20601040 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -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)); } } diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index 2f361a65d84..c7c6392713e 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -7818,25 +7818,25 @@ [(match_operand: 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_" [(match_operand: 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_" [(match_operand: 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_" [(match_operand: 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;") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;