[PATCH] Use vpermpd instead of vpermq for V4DF AVX2 permutations (PR target/52568)

2012-03-15 Thread Jakub Jelinek
Hi!

This patch let's -mavx2 use vpermpd instead of vpermq for
V4DFmode __builtin_shuffle (e.g. {1, 2, 3, 0}).
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2012-03-15  Jakub Jelinek  ja...@redhat.com

PR target/52568
* config/i386/sse.md (UNSPEC_VPERMDF): Remove.
(avx2_permv4df): Remove.
(avx2_permv4di): Macroize into...
(avx2_permmode): ... this using VI8F_256 iterator.
(avx2_permv4di_1): Macroize into...
(avx2_permmode_1): ... this using VI8F_256 iterator.

--- gcc/config/i386/sse.md.jj   2012-03-14 09:39:41.0 +0100
+++ gcc/config/i386/sse.md  2012-03-15 12:47:56.649703448 +0100
@@ -80,7 +80,6 @@ (define_c_enum unspec [
 
   ;; For AVX2 support
   UNSPEC_VPERMSI
-  UNSPEC_VPERMDF
   UNSPEC_VPERMSF
   UNSPEC_VPERMTI
   UNSPEC_GATHER
@@ -11889,19 +11888,6 @@ (define_insn avx2_permvarv8si
(set_attr prefix vex)
(set_attr mode OI)])
 
-(define_insn avx2_permv4df
-  [(set (match_operand:V4DF 0 register_operand =x)
-   (unspec:V4DF
- [(match_operand:V4DF 1 register_operand xm)
-  (match_operand:SI 2 const_0_to_255_operand n)]
- UNSPEC_VPERMDF))]
-  TARGET_AVX2
-  vpermpd\t{%2, %1, %0|%0, %1, %2}
-  [(set_attr type sselog)
-   (set_attr prefix_extra 1)
-   (set_attr prefix vex)
-   (set_attr mode OI)])
-
 (define_insn avx2_permvarv8sf
   [(set (match_operand:V8SF 0 register_operand =x)
(unspec:V8SF
@@ -11914,25 +11900,25 @@ (define_insn avx2_permvarv8sf
(set_attr prefix vex)
(set_attr mode OI)])
 
-(define_expand avx2_permv4di
-  [(match_operand:V4DI 0 register_operand )
-   (match_operand:V4DI 1 nonimmediate_operand )
+(define_expand avx2_permmode
+  [(match_operand:VI8F_256 0 register_operand )
+   (match_operand:VI8F_256 1 nonimmediate_operand )
(match_operand:SI 2 const_0_to_255_operand )]
   TARGET_AVX2
 {
   int mask = INTVAL (operands[2]);
-  emit_insn (gen_avx2_permv4di_1 (operands[0], operands[1],
- GEN_INT ((mask  0)  3),
- GEN_INT ((mask  2)  3),
- GEN_INT ((mask  4)  3),
- GEN_INT ((mask  6)  3)));
+  emit_insn (gen_avx2_permmode_1 (operands[0], operands[1],
+   GEN_INT ((mask  0)  3),
+   GEN_INT ((mask  2)  3),
+   GEN_INT ((mask  4)  3),
+   GEN_INT ((mask  6)  3)));
   DONE;
 })
 
-(define_insn avx2_permv4di_1
-  [(set (match_operand:V4DI 0 register_operand =x)
-   (vec_select:V4DI
- (match_operand:V4DI 1 nonimmediate_operand xm)
+(define_insn avx2_permmode_1
+  [(set (match_operand:VI8F_256 0 register_operand =x)
+   (vec_select:VI8F_256
+ (match_operand:VI8F_256 1 nonimmediate_operand xm)
  (parallel [(match_operand 2 const_0_to_3_operand )
 (match_operand 3 const_0_to_3_operand )
 (match_operand 4 const_0_to_3_operand )
@@ -11945,11 +11931,11 @@ (define_insn avx2_permv4di_1
   mask |= INTVAL (operands[4])  4;
   mask |= INTVAL (operands[5])  6;
   operands[2] = GEN_INT (mask);
-  return vpermq\t{%2, %1, %0|%0, %1, %2};
+  return vpermssemodesuffix\t{%2, %1, %0|%0, %1, %2};
 }
   [(set_attr type sselog)
(set_attr prefix vex)
-   (set_attr mode OI)])
+   (set_attr mode sseinsnmode)])
 
 (define_insn avx2_permv2ti
   [(set (match_operand:V4DI 0 register_operand =x)

Jakub


Re: [PATCH] Use vpermpd instead of vpermq for V4DF AVX2 permutations (PR target/52568)

2012-03-15 Thread Richard Henderson
On 03/15/12 13:05, Jakub Jelinek wrote:
 Hi!
 
 This patch let's -mavx2 use vpermpd instead of vpermq for
 V4DFmode __builtin_shuffle (e.g. {1, 2, 3, 0}).
 Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
 
 2012-03-15  Jakub Jelinek  ja...@redhat.com
 
   PR target/52568
   * config/i386/sse.md (UNSPEC_VPERMDF): Remove.
   (avx2_permv4df): Remove.
   (avx2_permv4di): Macroize into...
   (avx2_permmode): ... this using VI8F_256 iterator.
   (avx2_permv4di_1): Macroize into...
   (avx2_permmode_1): ... this using VI8F_256 iterator.

Ok.


r~