llvm.org GIT mirror llvm / 8b3491b
[X86][AVX512DQ] Enable v16i16 vector shifts to use an extend+shift+truncate pattern. Use the existing AVX2 v8i16 vector shift lowering for v16i16 on AVX512 targets (AVX512BW will have already have lowered with vpsravw). Cost model updates to follow. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@291445 91177308-0d34-0410-b5e6-96231b3b80d8 Simon Pilgrim 3 years ago
7 changed file(s) with 60 addition(s) and 148 deletion(s). Raw diff Collapse all Expand all
2165221652 }
2165321653 }
2165421654
21655 // It's worth extending once and using the v8i32 shifts for 16-bit types, but
21655 // It's worth extending once and using the vXi32 shifts for 16-bit types, but
2165621656 // the extra overheads to get from v16i8 to v8i32 make the existing SSE
2165721657 // solution better.
21658 if (Subtarget.hasInt256() && VT == MVT::v8i16) {
21659 MVT ExtVT = MVT::v8i32;
21658 if ((Subtarget.hasInt256() && VT == MVT::v8i16) ||
21659 (Subtarget.hasAVX512() && VT == MVT::v16i16)) {
21660 MVT ExtVT = MVT::getVectorVT(MVT::i32, VT.getVectorNumElements());
2166021661 unsigned ExtOpc =
2166121662 Op.getOpcode() == ISD::SRA ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND;
2166221663 R = DAG.getNode(ExtOpc, dl, ExtVT, R);
214214 ;
215215 ; AVX512DQ-LABEL: var_shift_v16i16:
216216 ; AVX512DQ: # BB#0:
217 ; AVX512DQ-NEXT: vpxor %ymm2, %ymm2, %ymm2
218 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15]
219 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15]
220 ; AVX512DQ-NEXT: vpsravd %ymm3, %ymm4, %ymm3
221 ; AVX512DQ-NEXT: vpsrld $16, %ymm3, %ymm3
222 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11]
223 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11]
224 ; AVX512DQ-NEXT: vpsravd %ymm1, %ymm0, %ymm0
225 ; AVX512DQ-NEXT: vpsrld $16, %ymm0, %ymm0
226 ; AVX512DQ-NEXT: vpackusdw %ymm3, %ymm0, %ymm0
217 ; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
218 ; AVX512DQ-NEXT: vpmovsxwd %ymm0, %zmm0
219 ; AVX512DQ-NEXT: vpsravd %zmm1, %zmm0, %zmm0
220 ; AVX512DQ-NEXT: vpmovdw %zmm0, %ymm0
227221 ; AVX512DQ-NEXT: retq
228222 ;
229223 ; AVX512BW-LABEL: var_shift_v16i16:
820814 ;
821815 ; AVX512DQ-LABEL: constant_shift_v16i16:
822816 ; AVX512DQ: # BB#0:
823 ; AVX512DQ-NEXT: vpxor %ymm1, %ymm1, %ymm1
824 ; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
825 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm3 = ymm2[4],ymm1[4],ymm2[5],ymm1[5],ymm2[6],ymm1[6],ymm2[7],ymm1[7],ymm2[12],ymm1[12],ymm2[13],ymm1[13],ymm2[14],ymm1[14],ymm2[15],ymm1[15]
826 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15]
827 ; AVX512DQ-NEXT: vpsravd %ymm3, %ymm4, %ymm3
828 ; AVX512DQ-NEXT: vpsrld $16, %ymm3, %ymm3
829 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm2 = ymm2[0],ymm1[0],ymm2[1],ymm1[1],ymm2[2],ymm1[2],ymm2[3],ymm1[3],ymm2[8],ymm1[8],ymm2[9],ymm1[9],ymm2[10],ymm1[10],ymm2[11],ymm1[11]
830 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11]
831 ; AVX512DQ-NEXT: vpsravd %ymm2, %ymm0, %ymm0
832 ; AVX512DQ-NEXT: vpsrld $16, %ymm0, %ymm0
833 ; AVX512DQ-NEXT: vpackusdw %ymm3, %ymm0, %ymm0
817 ; AVX512DQ-NEXT: vpmovsxwd %ymm0, %zmm0
818 ; AVX512DQ-NEXT: vpsravd {{.*}}(%rip), %zmm0, %zmm0
819 ; AVX512DQ-NEXT: vpmovdw %zmm0, %ymm0
834820 ; AVX512DQ-NEXT: retq
835821 ;
836822 ; AVX512BW-LABEL: constant_shift_v16i16:
2525 define <32 x i16> @var_shift_v32i16(<32 x i16> %a, <32 x i16> %b) nounwind {
2626 ; AVX512DQ-LABEL: var_shift_v32i16:
2727 ; AVX512DQ: # BB#0:
28 ; AVX512DQ-NEXT: vpxor %ymm4, %ymm4, %ymm4
29 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm5 = ymm2[4],ymm4[4],ymm2[5],ymm4[5],ymm2[6],ymm4[6],ymm2[7],ymm4[7],ymm2[12],ymm4[12],ymm2[13],ymm4[13],ymm2[14],ymm4[14],ymm2[15],ymm4[15]
30 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm6 = ymm4[4],ymm0[4],ymm4[5],ymm0[5],ymm4[6],ymm0[6],ymm4[7],ymm0[7],ymm4[12],ymm0[12],ymm4[13],ymm0[13],ymm4[14],ymm0[14],ymm4[15],ymm0[15]
31 ; AVX512DQ-NEXT: vpsravd %ymm5, %ymm6, %ymm5
32 ; AVX512DQ-NEXT: vpsrld $16, %ymm5, %ymm5
33 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm2 = ymm2[0],ymm4[0],ymm2[1],ymm4[1],ymm2[2],ymm4[2],ymm2[3],ymm4[3],ymm2[8],ymm4[8],ymm2[9],ymm4[9],ymm2[10],ymm4[10],ymm2[11],ymm4[11]
34 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm4[0],ymm0[0],ymm4[1],ymm0[1],ymm4[2],ymm0[2],ymm4[3],ymm0[3],ymm4[8],ymm0[8],ymm4[9],ymm0[9],ymm4[10],ymm0[10],ymm4[11],ymm0[11]
35 ; AVX512DQ-NEXT: vpsravd %ymm2, %ymm0, %ymm0
36 ; AVX512DQ-NEXT: vpsrld $16, %ymm0, %ymm0
37 ; AVX512DQ-NEXT: vpackusdw %ymm5, %ymm0, %ymm0
38 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm2 = ymm3[4],ymm4[4],ymm3[5],ymm4[5],ymm3[6],ymm4[6],ymm3[7],ymm4[7],ymm3[12],ymm4[12],ymm3[13],ymm4[13],ymm3[14],ymm4[14],ymm3[15],ymm4[15]
39 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm5 = ymm4[4],ymm1[4],ymm4[5],ymm1[5],ymm4[6],ymm1[6],ymm4[7],ymm1[7],ymm4[12],ymm1[12],ymm4[13],ymm1[13],ymm4[14],ymm1[14],ymm4[15],ymm1[15]
40 ; AVX512DQ-NEXT: vpsravd %ymm2, %ymm5, %ymm2
41 ; AVX512DQ-NEXT: vpsrld $16, %ymm2, %ymm2
42 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm3 = ymm3[0],ymm4[0],ymm3[1],ymm4[1],ymm3[2],ymm4[2],ymm3[3],ymm4[3],ymm3[8],ymm4[8],ymm3[9],ymm4[9],ymm3[10],ymm4[10],ymm3[11],ymm4[11]
43 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm4[0],ymm1[0],ymm4[1],ymm1[1],ymm4[2],ymm1[2],ymm4[3],ymm1[3],ymm4[8],ymm1[8],ymm4[9],ymm1[9],ymm4[10],ymm1[10],ymm4[11],ymm1[11]
44 ; AVX512DQ-NEXT: vpsravd %ymm3, %ymm1, %ymm1
45 ; AVX512DQ-NEXT: vpsrld $16, %ymm1, %ymm1
46 ; AVX512DQ-NEXT: vpackusdw %ymm2, %ymm1, %ymm1
28 ; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm2 = ymm2[0],zero,ymm2[1],zero,ymm2[2],zero,ymm2[3],zero,ymm2[4],zero,ymm2[5],zero,ymm2[6],zero,ymm2[7],zero,ymm2[8],zero,ymm2[9],zero,ymm2[10],zero,ymm2[11],zero,ymm2[12],zero,ymm2[13],zero,ymm2[14],zero,ymm2[15],zero
29 ; AVX512DQ-NEXT: vpmovsxwd %ymm0, %zmm0
30 ; AVX512DQ-NEXT: vpsravd %zmm2, %zmm0, %zmm0
31 ; AVX512DQ-NEXT: vpmovdw %zmm0, %ymm0
32 ; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm2 = ymm3[0],zero,ymm3[1],zero,ymm3[2],zero,ymm3[3],zero,ymm3[4],zero,ymm3[5],zero,ymm3[6],zero,ymm3[7],zero,ymm3[8],zero,ymm3[9],zero,ymm3[10],zero,ymm3[11],zero,ymm3[12],zero,ymm3[13],zero,ymm3[14],zero,ymm3[15],zero
33 ; AVX512DQ-NEXT: vpmovsxwd %ymm1, %zmm1
34 ; AVX512DQ-NEXT: vpsravd %zmm2, %zmm1, %zmm1
35 ; AVX512DQ-NEXT: vpmovdw %zmm1, %ymm1
4736 ; AVX512DQ-NEXT: retq
4837 ;
4938 ; AVX512BW-LABEL: var_shift_v32i16:
10241013 define <32 x i16> @constant_shift_v32i16(<32 x i16> %a) nounwind {
10251014 ; AVX512DQ-LABEL: constant_shift_v32i16:
10261015 ; AVX512DQ: # BB#0:
1027 ; AVX512DQ-NEXT: vpxor %ymm2, %ymm2, %ymm2
1028 ; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
1029 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm3[4],ymm2[4],ymm3[5],ymm2[5],ymm3[6],ymm2[6],ymm3[7],ymm2[7],ymm3[12],ymm2[12],ymm3[13],ymm2[13],ymm3[14],ymm2[14],ymm3[15],ymm2[15]
1030 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm5 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15]
1031 ; AVX512DQ-NEXT: vpsravd %ymm4, %ymm5, %ymm5
1032 ; AVX512DQ-NEXT: vpsrld $16, %ymm5, %ymm5
1033 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm3 = ymm3[0],ymm2[0],ymm3[1],ymm2[1],ymm3[2],ymm2[2],ymm3[3],ymm2[3],ymm3[8],ymm2[8],ymm3[9],ymm2[9],ymm3[10],ymm2[10],ymm3[11],ymm2[11]
1034 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11]
1035 ; AVX512DQ-NEXT: vpsravd %ymm3, %ymm0, %ymm0
1036 ; AVX512DQ-NEXT: vpsrld $16, %ymm0, %ymm0
1037 ; AVX512DQ-NEXT: vpackusdw %ymm5, %ymm0, %ymm0
1038 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm5 = ymm2[4],ymm1[4],ymm2[5],ymm1[5],ymm2[6],ymm1[6],ymm2[7],ymm1[7],ymm2[12],ymm1[12],ymm2[13],ymm1[13],ymm2[14],ymm1[14],ymm2[15],ymm1[15]
1039 ; AVX512DQ-NEXT: vpsravd %ymm4, %ymm5, %ymm4
1040 ; AVX512DQ-NEXT: vpsrld $16, %ymm4, %ymm4
1041 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm2[0],ymm1[0],ymm2[1],ymm1[1],ymm2[2],ymm1[2],ymm2[3],ymm1[3],ymm2[8],ymm1[8],ymm2[9],ymm1[9],ymm2[10],ymm1[10],ymm2[11],ymm1[11]
1042 ; AVX512DQ-NEXT: vpsravd %ymm3, %ymm1, %ymm1
1043 ; AVX512DQ-NEXT: vpsrld $16, %ymm1, %ymm1
1044 ; AVX512DQ-NEXT: vpackusdw %ymm4, %ymm1, %ymm1
1016 ; AVX512DQ-NEXT: vpmovsxwd %ymm0, %zmm0
1017 ; AVX512DQ-NEXT: vmovdqa32 {{.*#+}} zmm2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
1018 ; AVX512DQ-NEXT: vpsravd %zmm2, %zmm0, %zmm0
1019 ; AVX512DQ-NEXT: vpmovdw %zmm0, %ymm0
1020 ; AVX512DQ-NEXT: vpmovsxwd %ymm1, %zmm1
1021 ; AVX512DQ-NEXT: vpsravd %zmm2, %zmm1, %zmm1
1022 ; AVX512DQ-NEXT: vpmovdw %zmm1, %ymm1
10451023 ; AVX512DQ-NEXT: retq
10461024 ;
10471025 ; AVX512BW-LABEL: constant_shift_v32i16:
191191 ;
192192 ; AVX512DQ-LABEL: var_shift_v16i16:
193193 ; AVX512DQ: # BB#0:
194 ; AVX512DQ-NEXT: vpxor %ymm2, %ymm2, %ymm2
195 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15]
196 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15]
197 ; AVX512DQ-NEXT: vpsrlvd %ymm3, %ymm4, %ymm3
198 ; AVX512DQ-NEXT: vpsrld $16, %ymm3, %ymm3
199 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11]
200 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11]
201 ; AVX512DQ-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0
202 ; AVX512DQ-NEXT: vpsrld $16, %ymm0, %ymm0
203 ; AVX512DQ-NEXT: vpackusdw %ymm3, %ymm0, %ymm0
194 ; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
195 ; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
196 ; AVX512DQ-NEXT: vpsrlvd %zmm1, %zmm0, %zmm0
197 ; AVX512DQ-NEXT: vpmovdw %zmm0, %ymm0
204198 ; AVX512DQ-NEXT: retq
205199 ;
206200 ; AVX512BW-LABEL: var_shift_v16i16:
675669 ;
676670 ; AVX512DQ-LABEL: constant_shift_v16i16:
677671 ; AVX512DQ: # BB#0:
678 ; AVX512DQ-NEXT: vpxor %ymm1, %ymm1, %ymm1
679 ; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
680 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm3 = ymm2[4],ymm1[4],ymm2[5],ymm1[5],ymm2[6],ymm1[6],ymm2[7],ymm1[7],ymm2[12],ymm1[12],ymm2[13],ymm1[13],ymm2[14],ymm1[14],ymm2[15],ymm1[15]
681 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15]
682 ; AVX512DQ-NEXT: vpsrlvd %ymm3, %ymm4, %ymm3
683 ; AVX512DQ-NEXT: vpsrld $16, %ymm3, %ymm3
684 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm2 = ymm2[0],ymm1[0],ymm2[1],ymm1[1],ymm2[2],ymm1[2],ymm2[3],ymm1[3],ymm2[8],ymm1[8],ymm2[9],ymm1[9],ymm2[10],ymm1[10],ymm2[11],ymm1[11]
685 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11]
686 ; AVX512DQ-NEXT: vpsrlvd %ymm2, %ymm0, %ymm0
687 ; AVX512DQ-NEXT: vpsrld $16, %ymm0, %ymm0
688 ; AVX512DQ-NEXT: vpackusdw %ymm3, %ymm0, %ymm0
672 ; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
673 ; AVX512DQ-NEXT: vpsrlvd {{.*}}(%rip), %zmm0, %zmm0
674 ; AVX512DQ-NEXT: vpmovdw %zmm0, %ymm0
689675 ; AVX512DQ-NEXT: retq
690676 ;
691677 ; AVX512BW-LABEL: constant_shift_v16i16:
2626 define <32 x i16> @var_shift_v32i16(<32 x i16> %a, <32 x i16> %b) nounwind {
2727 ; AVX512DQ-LABEL: var_shift_v32i16:
2828 ; AVX512DQ: # BB#0:
29 ; AVX512DQ-NEXT: vpxor %ymm4, %ymm4, %ymm4
30 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm5 = ymm2[4],ymm4[4],ymm2[5],ymm4[5],ymm2[6],ymm4[6],ymm2[7],ymm4[7],ymm2[12],ymm4[12],ymm2[13],ymm4[13],ymm2[14],ymm4[14],ymm2[15],ymm4[15]
31 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm6 = ymm4[4],ymm0[4],ymm4[5],ymm0[5],ymm4[6],ymm0[6],ymm4[7],ymm0[7],ymm4[12],ymm0[12],ymm4[13],ymm0[13],ymm4[14],ymm0[14],ymm4[15],ymm0[15]
32 ; AVX512DQ-NEXT: vpsrlvd %ymm5, %ymm6, %ymm5
33 ; AVX512DQ-NEXT: vpsrld $16, %ymm5, %ymm5
34 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm2 = ymm2[0],ymm4[0],ymm2[1],ymm4[1],ymm2[2],ymm4[2],ymm2[3],ymm4[3],ymm2[8],ymm4[8],ymm2[9],ymm4[9],ymm2[10],ymm4[10],ymm2[11],ymm4[11]
35 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm4[0],ymm0[0],ymm4[1],ymm0[1],ymm4[2],ymm0[2],ymm4[3],ymm0[3],ymm4[8],ymm0[8],ymm4[9],ymm0[9],ymm4[10],ymm0[10],ymm4[11],ymm0[11]
36 ; AVX512DQ-NEXT: vpsrlvd %ymm2, %ymm0, %ymm0
37 ; AVX512DQ-NEXT: vpsrld $16, %ymm0, %ymm0
38 ; AVX512DQ-NEXT: vpackusdw %ymm5, %ymm0, %ymm0
39 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm2 = ymm3[4],ymm4[4],ymm3[5],ymm4[5],ymm3[6],ymm4[6],ymm3[7],ymm4[7],ymm3[12],ymm4[12],ymm3[13],ymm4[13],ymm3[14],ymm4[14],ymm3[15],ymm4[15]
40 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm5 = ymm4[4],ymm1[4],ymm4[5],ymm1[5],ymm4[6],ymm1[6],ymm4[7],ymm1[7],ymm4[12],ymm1[12],ymm4[13],ymm1[13],ymm4[14],ymm1[14],ymm4[15],ymm1[15]
41 ; AVX512DQ-NEXT: vpsrlvd %ymm2, %ymm5, %ymm2
42 ; AVX512DQ-NEXT: vpsrld $16, %ymm2, %ymm2
43 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm3 = ymm3[0],ymm4[0],ymm3[1],ymm4[1],ymm3[2],ymm4[2],ymm3[3],ymm4[3],ymm3[8],ymm4[8],ymm3[9],ymm4[9],ymm3[10],ymm4[10],ymm3[11],ymm4[11]
44 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm4[0],ymm1[0],ymm4[1],ymm1[1],ymm4[2],ymm1[2],ymm4[3],ymm1[3],ymm4[8],ymm1[8],ymm4[9],ymm1[9],ymm4[10],ymm1[10],ymm4[11],ymm1[11]
45 ; AVX512DQ-NEXT: vpsrlvd %ymm3, %ymm1, %ymm1
46 ; AVX512DQ-NEXT: vpsrld $16, %ymm1, %ymm1
47 ; AVX512DQ-NEXT: vpackusdw %ymm2, %ymm1, %ymm1
29 ; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm2 = ymm2[0],zero,ymm2[1],zero,ymm2[2],zero,ymm2[3],zero,ymm2[4],zero,ymm2[5],zero,ymm2[6],zero,ymm2[7],zero,ymm2[8],zero,ymm2[9],zero,ymm2[10],zero,ymm2[11],zero,ymm2[12],zero,ymm2[13],zero,ymm2[14],zero,ymm2[15],zero
30 ; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
31 ; AVX512DQ-NEXT: vpsrlvd %zmm2, %zmm0, %zmm0
32 ; AVX512DQ-NEXT: vpmovdw %zmm0, %ymm0
33 ; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm2 = ymm3[0],zero,ymm3[1],zero,ymm3[2],zero,ymm3[3],zero,ymm3[4],zero,ymm3[5],zero,ymm3[6],zero,ymm3[7],zero,ymm3[8],zero,ymm3[9],zero,ymm3[10],zero,ymm3[11],zero,ymm3[12],zero,ymm3[13],zero,ymm3[14],zero,ymm3[15],zero
34 ; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
35 ; AVX512DQ-NEXT: vpsrlvd %zmm2, %zmm1, %zmm1
36 ; AVX512DQ-NEXT: vpmovdw %zmm1, %ymm1
4837 ; AVX512DQ-NEXT: retq
4938 ;
5039 ; AVX512BW-LABEL: var_shift_v32i16:
987976 define <32 x i16> @constant_shift_v32i16(<32 x i16> %a) nounwind {
988977 ; AVX512DQ-LABEL: constant_shift_v32i16:
989978 ; AVX512DQ: # BB#0:
990 ; AVX512DQ-NEXT: vpxor %ymm2, %ymm2, %ymm2
991 ; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
992 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm3[4],ymm2[4],ymm3[5],ymm2[5],ymm3[6],ymm2[6],ymm3[7],ymm2[7],ymm3[12],ymm2[12],ymm3[13],ymm2[13],ymm3[14],ymm2[14],ymm3[15],ymm2[15]
993 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm5 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15]
994 ; AVX512DQ-NEXT: vpsrlvd %ymm4, %ymm5, %ymm5
995 ; AVX512DQ-NEXT: vpsrld $16, %ymm5, %ymm5
996 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm3 = ymm3[0],ymm2[0],ymm3[1],ymm2[1],ymm3[2],ymm2[2],ymm3[3],ymm2[3],ymm3[8],ymm2[8],ymm3[9],ymm2[9],ymm3[10],ymm2[10],ymm3[11],ymm2[11]
997 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11]
998 ; AVX512DQ-NEXT: vpsrlvd %ymm3, %ymm0, %ymm0
999 ; AVX512DQ-NEXT: vpsrld $16, %ymm0, %ymm0
1000 ; AVX512DQ-NEXT: vpackusdw %ymm5, %ymm0, %ymm0
1001 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm5 = ymm2[4],ymm1[4],ymm2[5],ymm1[5],ymm2[6],ymm1[6],ymm2[7],ymm1[7],ymm2[12],ymm1[12],ymm2[13],ymm1[13],ymm2[14],ymm1[14],ymm2[15],ymm1[15]
1002 ; AVX512DQ-NEXT: vpsrlvd %ymm4, %ymm5, %ymm4
1003 ; AVX512DQ-NEXT: vpsrld $16, %ymm4, %ymm4
1004 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm2[0],ymm1[0],ymm2[1],ymm1[1],ymm2[2],ymm1[2],ymm2[3],ymm1[3],ymm2[8],ymm1[8],ymm2[9],ymm1[9],ymm2[10],ymm1[10],ymm2[11],ymm1[11]
1005 ; AVX512DQ-NEXT: vpsrlvd %ymm3, %ymm1, %ymm1
1006 ; AVX512DQ-NEXT: vpsrld $16, %ymm1, %ymm1
1007 ; AVX512DQ-NEXT: vpackusdw %ymm4, %ymm1, %ymm1
979 ; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
980 ; AVX512DQ-NEXT: vmovdqa32 {{.*#+}} zmm2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
981 ; AVX512DQ-NEXT: vpsrlvd %zmm2, %zmm0, %zmm0
982 ; AVX512DQ-NEXT: vpmovdw %zmm0, %ymm0
983 ; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
984 ; AVX512DQ-NEXT: vpsrlvd %zmm2, %zmm1, %zmm1
985 ; AVX512DQ-NEXT: vpmovdw %zmm1, %ymm1
1008986 ; AVX512DQ-NEXT: retq
1009987 ;
1010988 ; AVX512BW-LABEL: constant_shift_v32i16:
166166 ;
167167 ; AVX512DQ-LABEL: var_shift_v16i16:
168168 ; AVX512DQ: # BB#0:
169 ; AVX512DQ-NEXT: vpxor %ymm2, %ymm2, %ymm2
170 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15]
171 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15]
172 ; AVX512DQ-NEXT: vpsllvd %ymm3, %ymm4, %ymm3
173 ; AVX512DQ-NEXT: vpsrld $16, %ymm3, %ymm3
174 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11]
175 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11]
176 ; AVX512DQ-NEXT: vpsllvd %ymm1, %ymm0, %ymm0
177 ; AVX512DQ-NEXT: vpsrld $16, %ymm0, %ymm0
178 ; AVX512DQ-NEXT: vpackusdw %ymm3, %ymm0, %ymm0
169 ; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
170 ; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
171 ; AVX512DQ-NEXT: vpsllvd %zmm1, %zmm0, %zmm0
172 ; AVX512DQ-NEXT: vpmovdw %zmm0, %ymm0
179173 ; AVX512DQ-NEXT: retq
180174 ;
181175 ; AVX512BW-LABEL: var_shift_v16i16:
2626 define <32 x i16> @var_shift_v32i16(<32 x i16> %a, <32 x i16> %b) nounwind {
2727 ; AVX512DQ-LABEL: var_shift_v32i16:
2828 ; AVX512DQ: # BB#0:
29 ; AVX512DQ-NEXT: vpxor %ymm4, %ymm4, %ymm4
30 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm5 = ymm2[4],ymm4[4],ymm2[5],ymm4[5],ymm2[6],ymm4[6],ymm2[7],ymm4[7],ymm2[12],ymm4[12],ymm2[13],ymm4[13],ymm2[14],ymm4[14],ymm2[15],ymm4[15]
31 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm6 = ymm4[4],ymm0[4],ymm4[5],ymm0[5],ymm4[6],ymm0[6],ymm4[7],ymm0[7],ymm4[12],ymm0[12],ymm4[13],ymm0[13],ymm4[14],ymm0[14],ymm4[15],ymm0[15]
32 ; AVX512DQ-NEXT: vpsllvd %ymm5, %ymm6, %ymm5
33 ; AVX512DQ-NEXT: vpsrld $16, %ymm5, %ymm5
34 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm2 = ymm2[0],ymm4[0],ymm2[1],ymm4[1],ymm2[2],ymm4[2],ymm2[3],ymm4[3],ymm2[8],ymm4[8],ymm2[9],ymm4[9],ymm2[10],ymm4[10],ymm2[11],ymm4[11]
35 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm4[0],ymm0[0],ymm4[1],ymm0[1],ymm4[2],ymm0[2],ymm4[3],ymm0[3],ymm4[8],ymm0[8],ymm4[9],ymm0[9],ymm4[10],ymm0[10],ymm4[11],ymm0[11]
36 ; AVX512DQ-NEXT: vpsllvd %ymm2, %ymm0, %ymm0
37 ; AVX512DQ-NEXT: vpsrld $16, %ymm0, %ymm0
38 ; AVX512DQ-NEXT: vpackusdw %ymm5, %ymm0, %ymm0
39 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm2 = ymm3[4],ymm4[4],ymm3[5],ymm4[5],ymm3[6],ymm4[6],ymm3[7],ymm4[7],ymm3[12],ymm4[12],ymm3[13],ymm4[13],ymm3[14],ymm4[14],ymm3[15],ymm4[15]
40 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm5 = ymm4[4],ymm1[4],ymm4[5],ymm1[5],ymm4[6],ymm1[6],ymm4[7],ymm1[7],ymm4[12],ymm1[12],ymm4[13],ymm1[13],ymm4[14],ymm1[14],ymm4[15],ymm1[15]
41 ; AVX512DQ-NEXT: vpsllvd %ymm2, %ymm5, %ymm2
42 ; AVX512DQ-NEXT: vpsrld $16, %ymm2, %ymm2
43 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm3 = ymm3[0],ymm4[0],ymm3[1],ymm4[1],ymm3[2],ymm4[2],ymm3[3],ymm4[3],ymm3[8],ymm4[8],ymm3[9],ymm4[9],ymm3[10],ymm4[10],ymm3[11],ymm4[11]
44 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm4[0],ymm1[0],ymm4[1],ymm1[1],ymm4[2],ymm1[2],ymm4[3],ymm1[3],ymm4[8],ymm1[8],ymm4[9],ymm1[9],ymm4[10],ymm1[10],ymm4[11],ymm1[11]
45 ; AVX512DQ-NEXT: vpsllvd %ymm3, %ymm1, %ymm1
46 ; AVX512DQ-NEXT: vpsrld $16, %ymm1, %ymm1
47 ; AVX512DQ-NEXT: vpackusdw %ymm2, %ymm1, %ymm1
29 ; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm2 = ymm2[0],zero,ymm2[1],zero,ymm2[2],zero,ymm2[3],zero,ymm2[4],zero,ymm2[5],zero,ymm2[6],zero,ymm2[7],zero,ymm2[8],zero,ymm2[9],zero,ymm2[10],zero,ymm2[11],zero,ymm2[12],zero,ymm2[13],zero,ymm2[14],zero,ymm2[15],zero
30 ; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
31 ; AVX512DQ-NEXT: vpsllvd %zmm2, %zmm0, %zmm0
32 ; AVX512DQ-NEXT: vpmovdw %zmm0, %ymm0
33 ; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm2 = ymm3[0],zero,ymm3[1],zero,ymm3[2],zero,ymm3[3],zero,ymm3[4],zero,ymm3[5],zero,ymm3[6],zero,ymm3[7],zero,ymm3[8],zero,ymm3[9],zero,ymm3[10],zero,ymm3[11],zero,ymm3[12],zero,ymm3[13],zero,ymm3[14],zero,ymm3[15],zero
34 ; AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
35 ; AVX512DQ-NEXT: vpsllvd %zmm2, %zmm1, %zmm1
36 ; AVX512DQ-NEXT: vpmovdw %zmm1, %ymm1
4837 ; AVX512DQ-NEXT: retq
4938 ;
5039 ; AVX512BW-LABEL: var_shift_v32i16: