+define <16 x i16> @test4(<16 x i16> %v) {
+; CHECK-NOSSSE3-LABEL: test4:
+; CHECK-NOSSSE3: # BB#0: # %entry
+; CHECK-NOSSSE3-NEXT: pextrw $7, %xmm0, %eax
+; CHECK-NOSSSE3-NEXT: rolw $8, %ax
+; CHECK-NOSSSE3-NEXT: movd %eax, %xmm2
+; CHECK-NOSSSE3-NEXT: pextrw $3, %xmm0, %eax
+; CHECK-NOSSSE3-NEXT: rolw $8, %ax
+; CHECK-NOSSSE3-NEXT: movd %eax, %xmm3
+; CHECK-NOSSSE3-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
+; CHECK-NOSSSE3-NEXT: pextrw $5, %xmm0, %eax
+; CHECK-NOSSSE3-NEXT: rolw $8, %ax
+; CHECK-NOSSSE3-NEXT: movd %eax, %xmm4
+; CHECK-NOSSSE3-NEXT: pextrw $1, %xmm0, %eax
+; CHECK-NOSSSE3-NEXT: rolw $8, %ax
+; CHECK-NOSSSE3-NEXT: movd %eax, %xmm2
+; CHECK-NOSSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3]
+; CHECK-NOSSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3]
+; CHECK-NOSSSE3-NEXT: pextrw $6, %xmm0, %eax
+; CHECK-NOSSSE3-NEXT: rolw $8, %ax
+; CHECK-NOSSSE3-NEXT: movd %eax, %xmm3
+; CHECK-NOSSSE3-NEXT: pextrw $2, %xmm0, %eax
+; CHECK-NOSSSE3-NEXT: rolw $8, %ax
+; CHECK-NOSSSE3-NEXT: movd %eax, %xmm4
+; CHECK-NOSSSE3-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]
+; CHECK-NOSSSE3-NEXT: pextrw $4, %xmm0, %eax
+; CHECK-NOSSSE3-NEXT: rolw $8, %ax
+; CHECK-NOSSSE3-NEXT: movd %eax, %xmm3
+; CHECK-NOSSSE3-NEXT: movd %xmm0, %eax
+; CHECK-NOSSSE3-NEXT: rolw $8, %ax
+; CHECK-NOSSSE3-NEXT: movd %eax, %xmm0
+; CHECK-NOSSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
+; CHECK-NOSSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3]
+; CHECK-NOSSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
+; CHECK-NOSSSE3-NEXT: pextrw $7, %xmm1, %eax
+; CHECK-NOSSSE3-NEXT: rolw $8, %ax
+; CHECK-NOSSSE3-NEXT: movd %eax, %xmm2
+; CHECK-NOSSSE3-NEXT: pextrw $3, %xmm1, %eax
+; CHECK-NOSSSE3-NEXT: rolw $8, %ax
+; CHECK-NOSSSE3-NEXT: movd %eax, %xmm3
+; CHECK-NOSSSE3-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
+; CHECK-NOSSSE3-NEXT: pextrw $5, %xmm1, %eax
+; CHECK-NOSSSE3-NEXT: rolw $8, %ax
+; CHECK-NOSSSE3-NEXT: movd %eax, %xmm4
+; CHECK-NOSSSE3-NEXT: pextrw $1, %xmm1, %eax
+; CHECK-NOSSSE3-NEXT: rolw $8, %ax
+; CHECK-NOSSSE3-NEXT: movd %eax, %xmm2
+; CHECK-NOSSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3]
+; CHECK-NOSSSE3-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3]
+; CHECK-NOSSSE3-NEXT: pextrw $6, %xmm1, %eax
+; CHECK-NOSSSE3-NEXT: rolw $8, %ax
+; CHECK-NOSSSE3-NEXT: movd %eax, %xmm3
+; CHECK-NOSSSE3-NEXT: pextrw $2, %xmm1, %eax
+; CHECK-NOSSSE3-NEXT: rolw $8, %ax
+; CHECK-NOSSSE3-NEXT: movd %eax, %xmm4
+; CHECK-NOSSSE3-NEXT: punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]
+; CHECK-NOSSSE3-NEXT: pextrw $4, %xmm1, %eax
+; CHECK-NOSSSE3-NEXT: rolw $8, %ax
+; CHECK-NOSSSE3-NEXT: movd %eax, %xmm3
+; CHECK-NOSSSE3-NEXT: movd %xmm1, %eax
+; CHECK-NOSSSE3-NEXT: rolw $8, %ax
+; CHECK-NOSSSE3-NEXT: movd %eax, %xmm1
+; CHECK-NOSSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3]
+; CHECK-NOSSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3]
+; CHECK-NOSSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
+; CHECK-NOSSSE3-NEXT: retq
+;
+; CHECK-SSSE3-LABEL: test4:
+; CHECK-SSSE3: # BB#0: # %entry
+; CHECK-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
+; CHECK-SSSE3-NEXT: pshufb %xmm2, %xmm0
+; CHECK-SSSE3-NEXT: pshufb %xmm2, %xmm1
+; CHECK-SSSE3-NEXT: retq
+;
+; CHECK-AVX2-LABEL: test4:
+; CHECK-AVX2: # BB#0: # %entry
+; CHECK-AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,17,16,19,18,21,20,23,22,25,24,27,26,29,28,31,30]
+; CHECK-AVX2-NEXT: retq
+;
+; CHECK-WIDE-AVX2-LABEL: test4:
+; CHECK-WIDE-AVX2: # BB#0: # %entry
+; CHECK-WIDE-AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,17,16,19,18,21,20,23,22,25,24,27,26,29,28,31,30]
+; CHECK-WIDE-AVX2-NEXT: retq