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