https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68655

--- Comment #13 from rguenther at suse dot de <rguenther at suse dot de> ---
On Fri, 4 Dec 2015, jakub at gcc dot gnu.org wrote:

> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68655
> 
> --- Comment #12 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
> Author: jakub
> Date: Fri Dec  4 08:25:24 2015
> New Revision: 231247
> 
> URL: https://gcc.gnu.org/viewcvs?rev=231247&root=gcc&view=rev
> Log:
>         PR target/68655
>         * config/i386/i386.c (canonicalize_vector_int_perm): New function.
>         (expand_vec_perm_1): Use it and recurse if everything else
>         failed.  Use nd.perm instead of perm2.
>         (expand_vec_perm_even_odd_1): If testing_p, use gen_raw_REG
>         instead of gen_lowpart for the target.
>         (ix86_expand_vec_perm_const_1): Use canonicalize_vector_int_perm
>         and recurse if everything else failed.
> 
>         * gcc.dg/torture/vshuf-4.inc (TESTS): Add one extra test.
>         * gcc.dg/torture/vshuf-4.inc (TESTS): Add two extra tests.
> 
> Modified:
>     trunk/gcc/ChangeLog
>     trunk/gcc/config/i386/i386.c
>     trunk/gcc/testsuite/ChangeLog
>     trunk/gcc/testsuite/gcc.dg/torture/vshuf-4.inc
>     trunk/gcc/testsuite/gcc.dg/torture/vshuf-8.inc

Thanks.  The original testcase from PR66051 improves (with plain SSE2)
to

.L4:
        movdqu  (%r8), %xmm0
        movdqa  %xmm2, %xmm5
        movdqa  %xmm2, %xmm4
        addl    $1, %r10d
        movdqu  16(%r8), %xmm3
        addq    $32, %r9
        movdqa  %xmm0, %xmm1
        addq    $32, %r8
        punpckhqdq      %xmm3, %xmm0
        punpcklqdq      %xmm3, %xmm1
        pcmpgtw %xmm0, %xmm5
        movdqa  %xmm0, %xmm3
        pcmpgtw %xmm1, %xmm4
        movdqa  %xmm1, %xmm6
        punpcklwd       %xmm5, %xmm3
        punpcklwd       %xmm4, %xmm6
        punpckhwd       %xmm5, %xmm0
        punpckhwd       %xmm4, %xmm1
        paddd   %xmm6, %xmm3
        movups  %xmm3, -32(%r9)
        paddd   %xmm1, %xmm0
        movups  %xmm0, -16(%r9)
        cmpl    %ecx, %r10d
        jb      .L4

from the following (ugh).  More SLP is always nice (esp. for low-
tripcount loops).  The above has an unrolling factor of two
while below we need 8 ...

.L4:
        movdqu  (%r9), %xmm4
        addl    $1, %r10d
        subq    $-128, %r9
        subq    $-128, %r8
        movdqu  -112(%r9), %xmm8
        movdqa  %xmm4, %xmm0
        movdqa  %xmm4, %xmm1
        punpcklwd       %xmm8, %xmm0
        movdqu  -96(%r9), %xmm6
        punpckhwd       %xmm8, %xmm1
        punpcklwd       %xmm8, %xmm4
        movdqu  -80(%r9), %xmm9
        movdqa  %xmm0, %xmm11
        movdqa  %xmm6, %xmm8
        punpcklwd       %xmm1, %xmm0
        punpckhwd       %xmm1, %xmm11
        punpcklwd       %xmm9, %xmm8
        movdqu  -64(%r9), %xmm2
        punpcklwd       %xmm1, %xmm4
        movdqa  %xmm6, %xmm1
        punpcklwd       %xmm9, %xmm6
        movdqu  -48(%r9), %xmm5
        punpckhwd       %xmm9, %xmm1
        movdqa  %xmm2, %xmm9
        punpcklwd       %xmm11, %xmm0
        punpckhwd       %xmm11, %xmm4
        movdqa  %xmm8, %xmm11
        punpcklwd       %xmm5, %xmm9
        punpckhwd       %xmm1, %xmm11
        movdqu  -32(%r9), %xmm3
        punpcklwd       %xmm1, %xmm8
        punpcklwd       %xmm1, %xmm6
        movdqa  %xmm2, %xmm1
        punpcklwd       %xmm5, %xmm2
        punpckhwd       %xmm5, %xmm1
        movdqu  -16(%r9), %xmm10
        punpcklwd       %xmm11, %xmm8
        punpckhwd       %xmm11, %xmm6
        movdqa  %xmm9, %xmm11
        punpcklwd       %xmm1, %xmm2
        punpckhwd       %xmm1, %xmm11
        movdqa  %xmm3, %xmm5
        punpcklwd       %xmm1, %xmm9
        movdqa  %xmm3, %xmm1
        punpckhwd       %xmm10, %xmm5
        punpcklwd       %xmm10, %xmm3
        punpcklwd       %xmm10, %xmm1
        movdqa  %xmm0, %xmm10
        punpcklwd       %xmm11, %xmm9
        punpckhwd       %xmm11, %xmm2
        movdqa  %xmm1, %xmm11
        punpcklwd       %xmm5, %xmm3
        punpcklwd       %xmm5, %xmm1
        punpckhwd       %xmm5, %xmm11
        movdqa  %xmm0, %xmm5
        punpckhwd       %xmm8, %xmm10
        punpcklwd       %xmm8, %xmm5
        punpcklwd       %xmm8, %xmm0
        movdqa  %xmm9, %xmm8
        punpcklwd       %xmm11, %xmm1
        punpckhwd       %xmm11, %xmm3
        movdqa  %xmm5, %xmm11
        punpcklwd       %xmm10, %xmm0
        punpckhwd       %xmm10, %xmm11
        punpcklwd       %xmm10, %xmm5
        punpckhwd       %xmm1, %xmm8
        punpckhwd       %xmm11, %xmm0
        punpcklwd       %xmm11, %xmm5
        movdqa  %xmm9, %xmm11
        punpcklwd       %xmm1, %xmm9
        punpcklwd       %xmm1, %xmm11
        movdqa  %xmm4, %xmm1
        punpcklwd       %xmm8, %xmm9
        movdqa  %xmm11, %xmm10
        punpcklwd       %xmm6, %xmm1
        punpcklwd       %xmm8, %xmm11
        punpckhwd       %xmm8, %xmm10
        movdqa  %xmm4, %xmm8
        punpcklwd       %xmm6, %xmm4
        punpckhwd       %xmm6, %xmm8
        movdqa  %xmm2, %xmm6
        punpcklwd       %xmm10, %xmm11
        punpckhwd       %xmm10, %xmm9
        movdqa  %xmm1, %xmm10
        punpcklwd       %xmm8, %xmm4
        punpckhwd       %xmm8, %xmm10
        punpcklwd       %xmm8, %xmm1
        punpckhwd       %xmm3, %xmm6
        punpckhwd       %xmm10, %xmm4
        punpcklwd       %xmm10, %xmm1
        movdqa  %xmm2, %xmm10
        punpcklwd       %xmm3, %xmm2
        punpcklwd       %xmm3, %xmm10
        movdqa  %xmm5, %xmm3
        punpcklwd       %xmm6, %xmm2
        movdqa  %xmm10, %xmm8
        punpcklwd       %xmm6, %xmm10
        punpckhwd       %xmm11, %xmm3
        punpckhwd       %xmm6, %xmm8
        punpcklwd       %xmm8, %xmm10
        punpckhwd       %xmm8, %xmm2
        movdqa  %xmm5, %xmm8
        punpcklwd       %xmm11, %xmm5
        punpcklwd       %xmm11, %xmm8
        punpcklwd       %xmm3, %xmm5
        movdqa  %xmm8, %xmm6
        punpcklwd       %xmm3, %xmm8
        punpckhwd       %xmm3, %xmm6
        movdqa  %xmm1, %xmm3
        punpcklwd       %xmm6, %xmm8
        punpckhwd       %xmm6, %xmm5
        movdqa  %xmm1, %xmm6
        punpckhwd       %xmm10, %xmm3
        punpcklwd       %xmm10, %xmm6
        movdqa  %xmm8, %xmm12
        punpcklwd       %xmm10, %xmm1
        movdqa  %xmm0, %xmm10
        movdqa  %xmm6, %xmm11
        punpcklwd       %xmm3, %xmm6
        punpcklwd       %xmm3, %xmm1
        punpckhwd       %xmm3, %xmm11
        movdqa  %xmm0, %xmm3
        punpckhwd       %xmm9, %xmm10
        punpcklwd       %xmm9, %xmm3
        punpcklwd       %xmm9, %xmm0
        movdqa  %xmm4, %xmm9
        punpcklwd       %xmm11, %xmm6
        punpckhwd       %xmm11, %xmm1
        movdqa  %xmm3, %xmm11
        punpcklwd       %xmm2, %xmm9
        punpckhwd       %xmm10, %xmm11
        punpcklwd       %xmm10, %xmm3
        punpcklwd       %xmm10, %xmm0
        movdqa  %xmm4, %xmm10
        punpcklwd       %xmm2, %xmm4
        punpckhwd       %xmm2, %xmm10
        movdqa  %xmm7, %xmm2
        punpcklwd       %xmm11, %xmm3
        punpckhwd       %xmm11, %xmm0
        movdqa  %xmm9, %xmm11
        punpcklwd       %xmm10, %xmm4
        pcmpgtw %xmm8, %xmm2
        punpckhwd       %xmm10, %xmm11
        punpcklwd       %xmm10, %xmm9
        movdqa  %xmm5, %xmm10
        punpcklwd       %xmm2, %xmm12
        punpckhwd       %xmm11, %xmm4
        punpcklwd       %xmm11, %xmm9
        movdqa  %xmm7, %xmm11
        punpckhwd       %xmm2, %xmm8
        pcmpgtw %xmm5, %xmm11
        movdqa  %xmm7, %xmm2
        punpckhwd       %xmm11, %xmm5
        pcmpgtw %xmm6, %xmm2
        punpcklwd       %xmm11, %xmm10
        movdqa  %xmm7, %xmm11
        paddd   %xmm5, %xmm8
        movdqa  %xmm1, %xmm5
        paddd   %xmm12, %xmm10
        pcmpgtw %xmm1, %xmm11
        movdqa  %xmm6, %xmm12
        punpckhwd       %xmm2, %xmm6
        punpcklwd       %xmm2, %xmm12
        movdqa  %xmm7, %xmm2
        punpcklwd       %xmm11, %xmm5
        punpckhwd       %xmm11, %xmm1
        movdqa  %xmm7, %xmm11
        pcmpgtw %xmm3, %xmm2
        pcmpgtw %xmm0, %xmm11
        paddd   %xmm12, %xmm5
        movdqa  %xmm3, %xmm12
        paddd   %xmm6, %xmm1
        punpckhwd       %xmm2, %xmm3
        movdqa  %xmm0, %xmm6
        punpckhwd       %xmm11, %xmm0
        punpcklwd       %xmm2, %xmm12
        movdqa  %xmm7, %xmm2
        punpcklwd       %xmm11, %xmm6
        paddd   %xmm3, %xmm0
        movdqa  %xmm7, %xmm3
        pcmpgtw %xmm9, %xmm2
        movdqa  %xmm9, %xmm11
        pcmpgtw %xmm4, %xmm3
        paddd   %xmm12, %xmm6
        movdqa  %xmm4, %xmm12
        punpckhwd       %xmm2, %xmm9
        punpckhwd       %xmm3, %xmm4
        punpcklwd       %xmm2, %xmm11
        movdqa  %xmm9, %xmm2
        punpcklwd       %xmm3, %xmm12
        movdqa  %xmm10, %xmm3
        paddd   %xmm4, %xmm2
        movdqa  %xmm5, %xmm4
        punpckhdq       %xmm6, %xmm10
        paddd   %xmm12, %xmm11
        punpckldq       %xmm6, %xmm3
        punpckldq       %xmm11, %xmm4
        punpckhdq       %xmm11, %xmm5
        movdqa  %xmm3, %xmm6
        punpckhdq       %xmm4, %xmm3
        punpckldq       %xmm4, %xmm6
        movups  %xmm3, -112(%r8)
        movdqa  %xmm10, %xmm3
        punpckhdq       %xmm5, %xmm10
        punpckldq       %xmm5, %xmm3
        movups  %xmm6, -128(%r8)
        movups  %xmm3, -96(%r8)
        movdqa  %xmm8, %xmm3
        punpckhdq       %xmm0, %xmm8
        punpckldq       %xmm0, %xmm3
        movdqa  %xmm1, %xmm0
        punpckhdq       %xmm2, %xmm1
        punpckldq       %xmm2, %xmm0
        movdqa  %xmm3, %xmm2
        movups  %xmm10, -80(%r8)
        punpckldq       %xmm0, %xmm2
        punpckhdq       %xmm0, %xmm3
        movdqa  %xmm8, %xmm0
        punpckhdq       %xmm1, %xmm8
        punpckldq       %xmm1, %xmm0
        movups  %xmm2, -64(%r8)
        movups  %xmm3, -48(%r8)
        movups  %xmm0, -32(%r8)
        movups  %xmm8, -16(%r8)
        cmpl    %eax, %r10d
        jb      .L4

Reply via email to