i386: Pass ix86_expand_sse_unpack operands by value
authorRichard Henderson <rth@redhat.com>
Sat, 23 Jun 2012 16:42:07 +0000 (09:42 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Sat, 23 Jun 2012 16:42:07 +0000 (09:42 -0700)
        * 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

gcc/ChangeLog
gcc/config/i386/i386-protos.h
gcc/config/i386/i386.c
gcc/config/i386/sse.md

index d867efd..75f5c0a 100644 (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.
index 4e7469d..88de8ed 100644 (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);
index e23c418..7ae2060 100644 (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));
     }
 }
 
index 2f361a6..c7c6392 100644 (file)
   [(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;")
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;