aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2012-06-23 09:42:07 -0700
committerRichard Henderson <rth@gcc.gnu.org>2012-06-23 09:42:07 -0700
commit7b5321188b4011e2ce3b6d56cf26d6dde054419d (patch)
treef116e4e9eaf72a1761f1bc2db2a6c7baf5d949ad /gcc
parent77a3dbf6c43109eda52407e3cd38021323592a09 (diff)
downloadgcc-7b5321188b4011e2ce3b6d56cf26d6dde054419d.zip
gcc-7b5321188b4011e2ce3b6d56cf26d6dde054419d.tar.gz
gcc-7b5321188b4011e2ce3b6d56cf26d6dde054419d.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/i386/i386-protos.h2
-rw-r--r--gcc/config/i386/i386.c20
-rw-r--r--gcc/config/i386/sse.md8
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 <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.
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:<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;")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;