diff options
author | Jakub Jelinek <jakub@redhat.com> | 2012-03-16 00:45:45 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2012-03-16 00:45:45 +0100 |
commit | b82277395eb57ad0f2fd4d129e3497c74fb74fe0 (patch) | |
tree | 457ac73b9366599842658bcf2c0a32a28401f8db | |
parent | 192b716b1048d69edcef628c1cf5fdf2ad01ef12 (diff) | |
download | gcc-b82277395eb57ad0f2fd4d129e3497c74fb74fe0.zip gcc-b82277395eb57ad0f2fd4d129e3497c74fb74fe0.tar.gz gcc-b82277395eb57ad0f2fd4d129e3497c74fb74fe0.tar.bz2 |
re PR target/52568 (suboptimal __builtin_shuffle on cycles with AVX)
PR target/52568
* config/i386/sse.md (UNSPEC_VPERMDF): Remove.
(avx2_permv4df): Remove.
(avx2_permv4di): Macroize into...
(avx2_perm<mode>): ... this using VI8F_256 iterator.
(avx2_permv4di_1): Macroize into...
(avx2_perm<mode>_1): ... this using VI8F_256 iterator.
From-SVN: r185446
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/config/i386/sse.md | 42 |
2 files changed, 24 insertions, 28 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 32ba912..f262c9c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2012-03-15 Jakub Jelinek <jakub@redhat.com> + + PR target/52568 + * config/i386/sse.md (UNSPEC_VPERMDF): Remove. + (avx2_permv4df): Remove. + (avx2_permv4di): Macroize into... + (avx2_perm<mode>): ... this using VI8F_256 iterator. + (avx2_permv4di_1): Macroize into... + (avx2_perm<mode>_1): ... this using VI8F_256 iterator. + 2012-03-15 Ulrich Weigand <ulrich.weigand@linaro.org> * combine.c (apply_distributive_law): Do not distribute SUBREG. diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index f5935f1..71e8e6d 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -80,7 +80,6 @@ ;; For AVX2 support UNSPEC_VPERMSI - UNSPEC_VPERMDF UNSPEC_VPERMSF UNSPEC_VPERMTI UNSPEC_GATHER @@ -11889,19 +11888,6 @@ (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 @@ (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_perm<mode>" + [(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_perm<mode>_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_perm<mode>_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 @@ 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 "vperm<ssemodesuffix>\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") |