From 7b5321188b4011e2ce3b6d56cf26d6dde054419d Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sat, 23 Jun 2012 09:42:07 -0700 Subject: [PATCH] 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_): Update call. (vec_unpacks_hi_): Likewise. (vec_unpacku_lo_): Likewise. (vec_unpacks_lo_): Likewise. * config/i386/i386-protos.h: Update. From-SVN: r188908 --- gcc/ChangeLog | 8 ++++++++ gcc/config/i386/i386-protos.h | 2 +- gcc/config/i386/i386.c | 20 +++++++++----------- gcc/config/i386/sse.md | 8 ++++---- 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d867efd..75f5c0a 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 4e7469d..88de8ed 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 e23c418..7ae2060 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 2f361a6..c7c6392 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;") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; -- 2.7.4