re PR target/53435 ((ix86_expand_vec_perm) and (ix86_expand_vec_perm) do not pass...
authorAlexander Ivchenko <alexander.ivchenko@intel.com>
Fri, 25 May 2012 13:03:18 +0000 (13:03 +0000)
committerKirill Yukhin <kyukhin@gcc.gnu.org>
Fri, 25 May 2012 13:03:18 +0000 (13:03 +0000)
2012-05-21  Alexander Ivchenko  <alexander.ivchenko@intel.com>

       PR target/53435
       * config/i386/i386.c (ix86_expand_vec_perm): Use correct op.
       (ix86_expand_vec_perm): Use int mode instead of float.
       (expand_vec_perm_pshufb): Remove handling of useseless type
       conversion.

From-SVN: r187881

gcc/ChangeLog
gcc/config/i386/i386.c

index 772d897..677dcac 100644 (file)
@@ -1,3 +1,11 @@
+2012-05-25  Alexander Ivchenko  <alexander.ivchenko@intel.com>
+
+       PR target/53435
+       * config/i386/i386.c (ix86_expand_vec_perm): Use correct op.
+       (ix86_expand_vec_perm): Use int mode instead of float.
+       (expand_vec_perm_pshufb): Remove handling of useseless type
+       conversion.
+
 2012-05-25  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR ada/52362
index e6f2b7e..51deb1a 100644 (file)
@@ -19921,7 +19921,7 @@ ix86_expand_vec_perm (rtx operands[])
              t1 = gen_reg_rtx (V8SImode);
              t2 = gen_reg_rtx (V8SImode);
              emit_insn (gen_avx2_permvarv8si (t1, op0, mask));
-             emit_insn (gen_avx2_permvarv8si (t2, op0, mask));
+             emit_insn (gen_avx2_permvarv8si (t2, op1, mask));
              goto merge_two;
            }
          return;
@@ -19954,10 +19954,10 @@ ix86_expand_vec_perm (rtx operands[])
 
         case V4SFmode:
          t1 = gen_reg_rtx (V8SFmode);
-         t2 = gen_reg_rtx (V8SFmode);
-         mask = gen_lowpart (V4SFmode, mask);
+         t2 = gen_reg_rtx (V8SImode);
+         mask = gen_lowpart (V4SImode, mask);
          emit_insn (gen_avx_vec_concatv8sf (t1, op0, op1));
-         emit_insn (gen_avx_vec_concatv8sf (t2, mask, mask));
+         emit_insn (gen_avx_vec_concatv8si (t2, mask, mask));
          emit_insn (gen_avx2_permvarv8sf (t1, t1, t2));
          emit_insn (gen_avx_vextractf128v8sf (target, t1, const0_rtx));
          return;
@@ -36474,12 +36474,6 @@ expand_vec_perm_pshufb (struct expand_vec_perm_d *d)
                                gen_rtvec_v (GET_MODE_NUNITS (vmode), rperm));
   vperm = force_reg (vmode, vperm);
 
-  if (vmode == V8SImode && d->vmode == V8SFmode)
-    {
-      vmode = V8SFmode;
-      vperm = gen_lowpart (vmode, vperm);
-    }
-
   target = gen_lowpart (vmode, d->target);
   op0 = gen_lowpart (vmode, d->op0);
   if (d->one_operand_p)