[x86] fix assert with horizontal math + broadcast of vector (PR43402)
[llvm-core.git] / test / CodeGen / X86 / vector-fshl-rot-512.ll
blobf6302313c0bdee7a561386348781881da3c7d521
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX512,AVX512F
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VL
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512BW
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VLBW
7 declare <8 x i64> @llvm.fshl.v8i64(<8 x i64>, <8 x i64>, <8 x i64>)
8 declare <16 x i32> @llvm.fshl.v16i32(<16 x i32>, <16 x i32>, <16 x i32>)
9 declare <32 x i16> @llvm.fshl.v32i16(<32 x i16>, <32 x i16>, <32 x i16>)
10 declare <64 x i8> @llvm.fshl.v64i8(<64 x i8>, <64 x i8>, <64 x i8>)
13 ; Variable Shifts
16 define <8 x i64> @var_funnnel_v8i64(<8 x i64> %x, <8 x i64> %amt) nounwind {
17 ; AVX512-LABEL: var_funnnel_v8i64:
18 ; AVX512:       # %bb.0:
19 ; AVX512-NEXT:    vprolvq %zmm1, %zmm0, %zmm0
20 ; AVX512-NEXT:    retq
21   %res = call <8 x i64> @llvm.fshl.v8i64(<8 x i64> %x, <8 x i64> %x, <8 x i64> %amt)
22   ret <8 x i64> %res
25 define <16 x i32> @var_funnnel_v16i32(<16 x i32> %x, <16 x i32> %amt) nounwind {
26 ; AVX512-LABEL: var_funnnel_v16i32:
27 ; AVX512:       # %bb.0:
28 ; AVX512-NEXT:    vprolvd %zmm1, %zmm0, %zmm0
29 ; AVX512-NEXT:    retq
30   %res = call <16 x i32> @llvm.fshl.v16i32(<16 x i32> %x, <16 x i32> %x, <16 x i32> %amt)
31   ret <16 x i32> %res
34 define <32 x i16> @var_funnnel_v32i16(<32 x i16> %x, <32 x i16> %amt) nounwind {
35 ; AVX512F-LABEL: var_funnnel_v32i16:
36 ; AVX512F:       # %bb.0:
37 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm2
38 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm1, %ymm3
39 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
40 ; AVX512F-NEXT:    vpand %ymm4, %ymm3, %ymm3
41 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm5 = 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
42 ; AVX512F-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
43 ; AVX512F-NEXT:    vpsllvd %zmm5, %zmm2, %zmm5
44 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm6 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
45 ; AVX512F-NEXT:    vpsubw %ymm3, %ymm6, %ymm3
46 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm3 = 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
47 ; AVX512F-NEXT:    vpsrlvd %zmm3, %zmm2, %zmm2
48 ; AVX512F-NEXT:    vpord %zmm2, %zmm5, %zmm2
49 ; AVX512F-NEXT:    vpmovdw %zmm2, %ymm2
50 ; AVX512F-NEXT:    vpand %ymm4, %ymm1, %ymm1
51 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm3 = 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
52 ; AVX512F-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
53 ; AVX512F-NEXT:    vpsllvd %zmm3, %zmm0, %zmm3
54 ; AVX512F-NEXT:    vpsubw %ymm1, %ymm6, %ymm1
55 ; AVX512F-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
56 ; AVX512F-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0
57 ; AVX512F-NEXT:    vpord %zmm0, %zmm3, %zmm0
58 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
59 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
60 ; AVX512F-NEXT:    retq
62 ; AVX512VL-LABEL: var_funnnel_v32i16:
63 ; AVX512VL:       # %bb.0:
64 ; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm2
65 ; AVX512VL-NEXT:    vextracti64x4 $1, %zmm1, %ymm3
66 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm4 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
67 ; AVX512VL-NEXT:    vpand %ymm4, %ymm3, %ymm3
68 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm5 = 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
69 ; AVX512VL-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
70 ; AVX512VL-NEXT:    vpsllvd %zmm5, %zmm2, %zmm5
71 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm6 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
72 ; AVX512VL-NEXT:    vpsubw %ymm3, %ymm6, %ymm3
73 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm3 = 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
74 ; AVX512VL-NEXT:    vpsrlvd %zmm3, %zmm2, %zmm2
75 ; AVX512VL-NEXT:    vpord %zmm2, %zmm5, %zmm2
76 ; AVX512VL-NEXT:    vpmovdw %zmm2, %ymm2
77 ; AVX512VL-NEXT:    vpand %ymm4, %ymm1, %ymm1
78 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm3 = 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
79 ; AVX512VL-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
80 ; AVX512VL-NEXT:    vpsllvd %zmm3, %zmm0, %zmm3
81 ; AVX512VL-NEXT:    vpsubw %ymm1, %ymm6, %ymm1
82 ; AVX512VL-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
83 ; AVX512VL-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0
84 ; AVX512VL-NEXT:    vpord %zmm0, %zmm3, %zmm0
85 ; AVX512VL-NEXT:    vpmovdw %zmm0, %ymm0
86 ; AVX512VL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
87 ; AVX512VL-NEXT:    retq
89 ; AVX512BW-LABEL: var_funnnel_v32i16:
90 ; AVX512BW:       # %bb.0:
91 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
92 ; AVX512BW-NEXT:    vpandq %zmm2, %zmm1, %zmm3
93 ; AVX512BW-NEXT:    vpsllvw %zmm3, %zmm0, %zmm3
94 ; AVX512BW-NEXT:    vpxor %xmm4, %xmm4, %xmm4
95 ; AVX512BW-NEXT:    vpsubw %zmm1, %zmm4, %zmm1
96 ; AVX512BW-NEXT:    vpandq %zmm2, %zmm1, %zmm1
97 ; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
98 ; AVX512BW-NEXT:    vporq %zmm0, %zmm3, %zmm0
99 ; AVX512BW-NEXT:    retq
101 ; AVX512VLBW-LABEL: var_funnnel_v32i16:
102 ; AVX512VLBW:       # %bb.0:
103 ; AVX512VLBW-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
104 ; AVX512VLBW-NEXT:    vpandq %zmm2, %zmm1, %zmm3
105 ; AVX512VLBW-NEXT:    vpsllvw %zmm3, %zmm0, %zmm3
106 ; AVX512VLBW-NEXT:    vpxor %xmm4, %xmm4, %xmm4
107 ; AVX512VLBW-NEXT:    vpsubw %zmm1, %zmm4, %zmm1
108 ; AVX512VLBW-NEXT:    vpandq %zmm2, %zmm1, %zmm1
109 ; AVX512VLBW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
110 ; AVX512VLBW-NEXT:    vporq %zmm0, %zmm3, %zmm0
111 ; AVX512VLBW-NEXT:    retq
112   %res = call <32 x i16> @llvm.fshl.v32i16(<32 x i16> %x, <32 x i16> %x, <32 x i16> %amt)
113   ret <32 x i16> %res
116 define <64 x i8> @var_funnnel_v64i8(<64 x i8> %x, <64 x i8> %amt) nounwind {
117 ; AVX512F-LABEL: var_funnnel_v64i8:
118 ; AVX512F:       # %bb.0:
119 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm1, %ymm2
120 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm3
121 ; AVX512F-NEXT:    vpsrlw $4, %ymm3, %ymm4
122 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm5 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
123 ; AVX512F-NEXT:    vpandn %ymm4, %ymm5, %ymm4
124 ; AVX512F-NEXT:    vpsllw $4, %ymm3, %ymm6
125 ; AVX512F-NEXT:    vpand %ymm5, %ymm6, %ymm6
126 ; AVX512F-NEXT:    vpor %ymm4, %ymm6, %ymm4
127 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm6 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
128 ; AVX512F-NEXT:    vpand %ymm6, %ymm2, %ymm2
129 ; AVX512F-NEXT:    vpsllw $5, %ymm2, %ymm2
130 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
131 ; AVX512F-NEXT:    vpsrlw $6, %ymm3, %ymm4
132 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm7 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
133 ; AVX512F-NEXT:    vpandn %ymm4, %ymm7, %ymm4
134 ; AVX512F-NEXT:    vpsllw $2, %ymm3, %ymm8
135 ; AVX512F-NEXT:    vpand %ymm7, %ymm8, %ymm8
136 ; AVX512F-NEXT:    vpor %ymm4, %ymm8, %ymm4
137 ; AVX512F-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
138 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
139 ; AVX512F-NEXT:    vpsrlw $7, %ymm3, %ymm4
140 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm8 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
141 ; AVX512F-NEXT:    vpand %ymm8, %ymm4, %ymm4
142 ; AVX512F-NEXT:    vpaddb %ymm3, %ymm3, %ymm9
143 ; AVX512F-NEXT:    vpor %ymm4, %ymm9, %ymm4
144 ; AVX512F-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
145 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
146 ; AVX512F-NEXT:    vpsrlw $4, %ymm0, %ymm3
147 ; AVX512F-NEXT:    vpandn %ymm3, %ymm5, %ymm3
148 ; AVX512F-NEXT:    vpsllw $4, %ymm0, %ymm4
149 ; AVX512F-NEXT:    vpand %ymm5, %ymm4, %ymm4
150 ; AVX512F-NEXT:    vpor %ymm3, %ymm4, %ymm3
151 ; AVX512F-NEXT:    vpand %ymm6, %ymm1, %ymm1
152 ; AVX512F-NEXT:    vpsllw $5, %ymm1, %ymm1
153 ; AVX512F-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
154 ; AVX512F-NEXT:    vpsrlw $6, %ymm0, %ymm3
155 ; AVX512F-NEXT:    vpandn %ymm3, %ymm7, %ymm3
156 ; AVX512F-NEXT:    vpsllw $2, %ymm0, %ymm4
157 ; AVX512F-NEXT:    vpand %ymm7, %ymm4, %ymm4
158 ; AVX512F-NEXT:    vpor %ymm3, %ymm4, %ymm3
159 ; AVX512F-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
160 ; AVX512F-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
161 ; AVX512F-NEXT:    vpsrlw $7, %ymm0, %ymm3
162 ; AVX512F-NEXT:    vpand %ymm8, %ymm3, %ymm3
163 ; AVX512F-NEXT:    vpaddb %ymm0, %ymm0, %ymm4
164 ; AVX512F-NEXT:    vpor %ymm3, %ymm4, %ymm3
165 ; AVX512F-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
166 ; AVX512F-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
167 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
168 ; AVX512F-NEXT:    retq
170 ; AVX512VL-LABEL: var_funnnel_v64i8:
171 ; AVX512VL:       # %bb.0:
172 ; AVX512VL-NEXT:    vextracti64x4 $1, %zmm1, %ymm2
173 ; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm3
174 ; AVX512VL-NEXT:    vpsrlw $4, %ymm3, %ymm4
175 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm5 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
176 ; AVX512VL-NEXT:    vpandn %ymm4, %ymm5, %ymm4
177 ; AVX512VL-NEXT:    vpsllw $4, %ymm3, %ymm6
178 ; AVX512VL-NEXT:    vpand %ymm5, %ymm6, %ymm6
179 ; AVX512VL-NEXT:    vpor %ymm4, %ymm6, %ymm4
180 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm6 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
181 ; AVX512VL-NEXT:    vpand %ymm6, %ymm2, %ymm2
182 ; AVX512VL-NEXT:    vpsllw $5, %ymm2, %ymm2
183 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
184 ; AVX512VL-NEXT:    vpsrlw $6, %ymm3, %ymm4
185 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm7 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
186 ; AVX512VL-NEXT:    vpandn %ymm4, %ymm7, %ymm4
187 ; AVX512VL-NEXT:    vpsllw $2, %ymm3, %ymm8
188 ; AVX512VL-NEXT:    vpand %ymm7, %ymm8, %ymm8
189 ; AVX512VL-NEXT:    vpor %ymm4, %ymm8, %ymm4
190 ; AVX512VL-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
191 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
192 ; AVX512VL-NEXT:    vpsrlw $7, %ymm3, %ymm4
193 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm8 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
194 ; AVX512VL-NEXT:    vpand %ymm8, %ymm4, %ymm4
195 ; AVX512VL-NEXT:    vpaddb %ymm3, %ymm3, %ymm9
196 ; AVX512VL-NEXT:    vpor %ymm4, %ymm9, %ymm4
197 ; AVX512VL-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
198 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
199 ; AVX512VL-NEXT:    vpsrlw $4, %ymm0, %ymm3
200 ; AVX512VL-NEXT:    vpandn %ymm3, %ymm5, %ymm3
201 ; AVX512VL-NEXT:    vpsllw $4, %ymm0, %ymm4
202 ; AVX512VL-NEXT:    vpand %ymm5, %ymm4, %ymm4
203 ; AVX512VL-NEXT:    vpor %ymm3, %ymm4, %ymm3
204 ; AVX512VL-NEXT:    vpand %ymm6, %ymm1, %ymm1
205 ; AVX512VL-NEXT:    vpsllw $5, %ymm1, %ymm1
206 ; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
207 ; AVX512VL-NEXT:    vpsrlw $6, %ymm0, %ymm3
208 ; AVX512VL-NEXT:    vpandn %ymm3, %ymm7, %ymm3
209 ; AVX512VL-NEXT:    vpsllw $2, %ymm0, %ymm4
210 ; AVX512VL-NEXT:    vpand %ymm7, %ymm4, %ymm4
211 ; AVX512VL-NEXT:    vpor %ymm3, %ymm4, %ymm3
212 ; AVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
213 ; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
214 ; AVX512VL-NEXT:    vpsrlw $7, %ymm0, %ymm3
215 ; AVX512VL-NEXT:    vpand %ymm8, %ymm3, %ymm3
216 ; AVX512VL-NEXT:    vpaddb %ymm0, %ymm0, %ymm4
217 ; AVX512VL-NEXT:    vpor %ymm3, %ymm4, %ymm3
218 ; AVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
219 ; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
220 ; AVX512VL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
221 ; AVX512VL-NEXT:    retq
223 ; AVX512BW-LABEL: var_funnnel_v64i8:
224 ; AVX512BW:       # %bb.0:
225 ; AVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
226 ; AVX512BW-NEXT:    vpsubb %zmm1, %zmm2, %zmm2
227 ; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
228 ; AVX512BW-NEXT:    vpandq %zmm3, %zmm2, %zmm2
229 ; AVX512BW-NEXT:    vpsllw $5, %zmm2, %zmm2
230 ; AVX512BW-NEXT:    vpaddb %zmm2, %zmm2, %zmm4
231 ; AVX512BW-NEXT:    vpmovb2m %zmm4, %k1
232 ; AVX512BW-NEXT:    vpmovb2m %zmm2, %k2
233 ; AVX512BW-NEXT:    vpsrlw $4, %zmm0, %zmm2
234 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm2, %zmm2
235 ; AVX512BW-NEXT:    vpblendmb %zmm2, %zmm0, %zmm2 {%k2}
236 ; AVX512BW-NEXT:    vpsrlw $2, %zmm2, %zmm5
237 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm5, %zmm5
238 ; AVX512BW-NEXT:    vmovdqu8 %zmm5, %zmm2 {%k1}
239 ; AVX512BW-NEXT:    vpsrlw $1, %zmm2, %zmm5
240 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm5, %zmm5
241 ; AVX512BW-NEXT:    vpaddb %zmm4, %zmm4, %zmm4
242 ; AVX512BW-NEXT:    vpmovb2m %zmm4, %k1
243 ; AVX512BW-NEXT:    vmovdqu8 %zmm5, %zmm2 {%k1}
244 ; AVX512BW-NEXT:    vpandq %zmm3, %zmm1, %zmm1
245 ; AVX512BW-NEXT:    vpsllw $5, %zmm1, %zmm1
246 ; AVX512BW-NEXT:    vpaddb %zmm1, %zmm1, %zmm3
247 ; AVX512BW-NEXT:    vpmovb2m %zmm3, %k1
248 ; AVX512BW-NEXT:    vpmovb2m %zmm1, %k2
249 ; AVX512BW-NEXT:    vpsllw $4, %zmm0, %zmm1
250 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm1, %zmm1
251 ; AVX512BW-NEXT:    vmovdqu8 %zmm1, %zmm0 {%k2}
252 ; AVX512BW-NEXT:    vpsllw $2, %zmm0, %zmm1
253 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm1, %zmm1
254 ; AVX512BW-NEXT:    vmovdqu8 %zmm1, %zmm0 {%k1}
255 ; AVX512BW-NEXT:    vpaddb %zmm3, %zmm3, %zmm1
256 ; AVX512BW-NEXT:    vpmovb2m %zmm1, %k1
257 ; AVX512BW-NEXT:    vpaddb %zmm0, %zmm0, %zmm0 {%k1}
258 ; AVX512BW-NEXT:    vporq %zmm2, %zmm0, %zmm0
259 ; AVX512BW-NEXT:    retq
261 ; AVX512VLBW-LABEL: var_funnnel_v64i8:
262 ; AVX512VLBW:       # %bb.0:
263 ; AVX512VLBW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
264 ; AVX512VLBW-NEXT:    vpsubb %zmm1, %zmm2, %zmm2
265 ; AVX512VLBW-NEXT:    vmovdqa64 {{.*#+}} zmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
266 ; AVX512VLBW-NEXT:    vpandq %zmm3, %zmm2, %zmm2
267 ; AVX512VLBW-NEXT:    vpsllw $5, %zmm2, %zmm2
268 ; AVX512VLBW-NEXT:    vpaddb %zmm2, %zmm2, %zmm4
269 ; AVX512VLBW-NEXT:    vpmovb2m %zmm4, %k1
270 ; AVX512VLBW-NEXT:    vpmovb2m %zmm2, %k2
271 ; AVX512VLBW-NEXT:    vpsrlw $4, %zmm0, %zmm2
272 ; AVX512VLBW-NEXT:    vpandq {{.*}}(%rip), %zmm2, %zmm2
273 ; AVX512VLBW-NEXT:    vpblendmb %zmm2, %zmm0, %zmm2 {%k2}
274 ; AVX512VLBW-NEXT:    vpsrlw $2, %zmm2, %zmm5
275 ; AVX512VLBW-NEXT:    vpandq {{.*}}(%rip), %zmm5, %zmm5
276 ; AVX512VLBW-NEXT:    vmovdqu8 %zmm5, %zmm2 {%k1}
277 ; AVX512VLBW-NEXT:    vpsrlw $1, %zmm2, %zmm5
278 ; AVX512VLBW-NEXT:    vpandq {{.*}}(%rip), %zmm5, %zmm5
279 ; AVX512VLBW-NEXT:    vpaddb %zmm4, %zmm4, %zmm4
280 ; AVX512VLBW-NEXT:    vpmovb2m %zmm4, %k1
281 ; AVX512VLBW-NEXT:    vmovdqu8 %zmm5, %zmm2 {%k1}
282 ; AVX512VLBW-NEXT:    vpandq %zmm3, %zmm1, %zmm1
283 ; AVX512VLBW-NEXT:    vpsllw $5, %zmm1, %zmm1
284 ; AVX512VLBW-NEXT:    vpaddb %zmm1, %zmm1, %zmm3
285 ; AVX512VLBW-NEXT:    vpmovb2m %zmm3, %k1
286 ; AVX512VLBW-NEXT:    vpmovb2m %zmm1, %k2
287 ; AVX512VLBW-NEXT:    vpsllw $4, %zmm0, %zmm1
288 ; AVX512VLBW-NEXT:    vpandq {{.*}}(%rip), %zmm1, %zmm1
289 ; AVX512VLBW-NEXT:    vmovdqu8 %zmm1, %zmm0 {%k2}
290 ; AVX512VLBW-NEXT:    vpsllw $2, %zmm0, %zmm1
291 ; AVX512VLBW-NEXT:    vpandq {{.*}}(%rip), %zmm1, %zmm1
292 ; AVX512VLBW-NEXT:    vmovdqu8 %zmm1, %zmm0 {%k1}
293 ; AVX512VLBW-NEXT:    vpaddb %zmm3, %zmm3, %zmm1
294 ; AVX512VLBW-NEXT:    vpmovb2m %zmm1, %k1
295 ; AVX512VLBW-NEXT:    vpaddb %zmm0, %zmm0, %zmm0 {%k1}
296 ; AVX512VLBW-NEXT:    vporq %zmm2, %zmm0, %zmm0
297 ; AVX512VLBW-NEXT:    retq
298   %res = call <64 x i8> @llvm.fshl.v64i8(<64 x i8> %x, <64 x i8> %x, <64 x i8> %amt)
299   ret <64 x i8> %res
303 ; Uniform Variable Shifts
306 define <8 x i64> @splatvar_funnnel_v8i64(<8 x i64> %x, <8 x i64> %amt) nounwind {
307 ; AVX512-LABEL: splatvar_funnnel_v8i64:
308 ; AVX512:       # %bb.0:
309 ; AVX512-NEXT:    vpbroadcastq %xmm1, %zmm1
310 ; AVX512-NEXT:    vprolvq %zmm1, %zmm0, %zmm0
311 ; AVX512-NEXT:    retq
312   %splat = shufflevector <8 x i64> %amt, <8 x i64> undef, <8 x i32> zeroinitializer
313   %res = call <8 x i64> @llvm.fshl.v8i64(<8 x i64> %x, <8 x i64> %x, <8 x i64> %splat)
314   ret <8 x i64> %res
317 define <16 x i32> @splatvar_funnnel_v16i32(<16 x i32> %x, <16 x i32> %amt) nounwind {
318 ; AVX512-LABEL: splatvar_funnnel_v16i32:
319 ; AVX512:       # %bb.0:
320 ; AVX512-NEXT:    vpbroadcastd %xmm1, %zmm1
321 ; AVX512-NEXT:    vprolvd %zmm1, %zmm0, %zmm0
322 ; AVX512-NEXT:    retq
323   %splat = shufflevector <16 x i32> %amt, <16 x i32> undef, <16 x i32> zeroinitializer
324   %res = call <16 x i32> @llvm.fshl.v16i32(<16 x i32> %x, <16 x i32> %x, <16 x i32> %splat)
325   ret <16 x i32> %res
328 define <32 x i16> @splatvar_funnnel_v32i16(<32 x i16> %x, <32 x i16> %amt) nounwind {
329 ; AVX512F-LABEL: splatvar_funnnel_v32i16:
330 ; AVX512F:       # %bb.0:
331 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm2
332 ; AVX512F-NEXT:    vpbroadcastw %xmm1, %xmm1
333 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
334 ; AVX512F-NEXT:    vpmovzxwq {{.*#+}} xmm3 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
335 ; AVX512F-NEXT:    vpsllw %xmm3, %ymm2, %ymm4
336 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm5 = [16,16,16,16,16,16,16,16]
337 ; AVX512F-NEXT:    vpsubw %xmm1, %xmm5, %xmm1
338 ; AVX512F-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
339 ; AVX512F-NEXT:    vpsrlw %xmm1, %ymm2, %ymm2
340 ; AVX512F-NEXT:    vpor %ymm2, %ymm4, %ymm2
341 ; AVX512F-NEXT:    vpsllw %xmm3, %ymm0, %ymm3
342 ; AVX512F-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
343 ; AVX512F-NEXT:    vpor %ymm0, %ymm3, %ymm0
344 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
345 ; AVX512F-NEXT:    retq
347 ; AVX512VL-LABEL: splatvar_funnnel_v32i16:
348 ; AVX512VL:       # %bb.0:
349 ; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm2
350 ; AVX512VL-NEXT:    vpbroadcastw %xmm1, %xmm1
351 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
352 ; AVX512VL-NEXT:    vpmovzxwq {{.*#+}} xmm3 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
353 ; AVX512VL-NEXT:    vpsllw %xmm3, %ymm2, %ymm4
354 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm5 = [16,16,16,16,16,16,16,16]
355 ; AVX512VL-NEXT:    vpsubw %xmm1, %xmm5, %xmm1
356 ; AVX512VL-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
357 ; AVX512VL-NEXT:    vpsrlw %xmm1, %ymm2, %ymm2
358 ; AVX512VL-NEXT:    vpor %ymm2, %ymm4, %ymm2
359 ; AVX512VL-NEXT:    vpsllw %xmm3, %ymm0, %ymm3
360 ; AVX512VL-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
361 ; AVX512VL-NEXT:    vpor %ymm0, %ymm3, %ymm0
362 ; AVX512VL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
363 ; AVX512VL-NEXT:    retq
365 ; AVX512BW-LABEL: splatvar_funnnel_v32i16:
366 ; AVX512BW:       # %bb.0:
367 ; AVX512BW-NEXT:    vpbroadcastw %xmm1, %xmm1
368 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15]
369 ; AVX512BW-NEXT:    vpand %xmm2, %xmm1, %xmm3
370 ; AVX512BW-NEXT:    vpmovzxwq {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero
371 ; AVX512BW-NEXT:    vpsllw %xmm3, %zmm0, %zmm3
372 ; AVX512BW-NEXT:    vpxor %xmm4, %xmm4, %xmm4
373 ; AVX512BW-NEXT:    vpsubw %xmm1, %xmm4, %xmm1
374 ; AVX512BW-NEXT:    vpand %xmm2, %xmm1, %xmm1
375 ; AVX512BW-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
376 ; AVX512BW-NEXT:    vpsrlw %xmm1, %zmm0, %zmm0
377 ; AVX512BW-NEXT:    vporq %zmm0, %zmm3, %zmm0
378 ; AVX512BW-NEXT:    retq
380 ; AVX512VLBW-LABEL: splatvar_funnnel_v32i16:
381 ; AVX512VLBW:       # %bb.0:
382 ; AVX512VLBW-NEXT:    vpbroadcastw %xmm1, %xmm1
383 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15]
384 ; AVX512VLBW-NEXT:    vpand %xmm2, %xmm1, %xmm3
385 ; AVX512VLBW-NEXT:    vpmovzxwq {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero
386 ; AVX512VLBW-NEXT:    vpsllw %xmm3, %zmm0, %zmm3
387 ; AVX512VLBW-NEXT:    vpxor %xmm4, %xmm4, %xmm4
388 ; AVX512VLBW-NEXT:    vpsubw %xmm1, %xmm4, %xmm1
389 ; AVX512VLBW-NEXT:    vpand %xmm2, %xmm1, %xmm1
390 ; AVX512VLBW-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
391 ; AVX512VLBW-NEXT:    vpsrlw %xmm1, %zmm0, %zmm0
392 ; AVX512VLBW-NEXT:    vporq %zmm0, %zmm3, %zmm0
393 ; AVX512VLBW-NEXT:    retq
394   %splat = shufflevector <32 x i16> %amt, <32 x i16> undef, <32 x i32> zeroinitializer
395   %res = call <32 x i16> @llvm.fshl.v32i16(<32 x i16> %x, <32 x i16> %x, <32 x i16> %splat)
396   ret <32 x i16> %res
399 define <64 x i8> @splatvar_funnnel_v64i8(<64 x i8> %x, <64 x i8> %amt) nounwind {
400 ; AVX512F-LABEL: splatvar_funnnel_v64i8:
401 ; AVX512F:       # %bb.0:
402 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm2
403 ; AVX512F-NEXT:    vpbroadcastb %xmm1, %xmm1
404 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
405 ; AVX512F-NEXT:    vpmovzxbq {{.*#+}} xmm3 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
406 ; AVX512F-NEXT:    vpsllw %xmm3, %ymm2, %ymm4
407 ; AVX512F-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
408 ; AVX512F-NEXT:    vpsllw %xmm3, %xmm5, %xmm6
409 ; AVX512F-NEXT:    vpbroadcastb %xmm6, %ymm6
410 ; AVX512F-NEXT:    vpand %ymm6, %ymm4, %ymm4
411 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm7 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
412 ; AVX512F-NEXT:    vpsubb %xmm1, %xmm7, %xmm1
413 ; AVX512F-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
414 ; AVX512F-NEXT:    vpsrlw %xmm1, %ymm2, %ymm2
415 ; AVX512F-NEXT:    vpsrlw %xmm1, %xmm5, %xmm5
416 ; AVX512F-NEXT:    vpsrlw $8, %xmm5, %xmm5
417 ; AVX512F-NEXT:    vpbroadcastb %xmm5, %ymm5
418 ; AVX512F-NEXT:    vpand %ymm5, %ymm2, %ymm2
419 ; AVX512F-NEXT:    vpor %ymm2, %ymm4, %ymm2
420 ; AVX512F-NEXT:    vpsllw %xmm3, %ymm0, %ymm3
421 ; AVX512F-NEXT:    vpand %ymm6, %ymm3, %ymm3
422 ; AVX512F-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
423 ; AVX512F-NEXT:    vpand %ymm5, %ymm0, %ymm0
424 ; AVX512F-NEXT:    vpor %ymm0, %ymm3, %ymm0
425 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
426 ; AVX512F-NEXT:    retq
428 ; AVX512VL-LABEL: splatvar_funnnel_v64i8:
429 ; AVX512VL:       # %bb.0:
430 ; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm2
431 ; AVX512VL-NEXT:    vpbroadcastb %xmm1, %xmm1
432 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
433 ; AVX512VL-NEXT:    vpmovzxbq {{.*#+}} xmm3 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
434 ; AVX512VL-NEXT:    vpsllw %xmm3, %ymm2, %ymm4
435 ; AVX512VL-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
436 ; AVX512VL-NEXT:    vpsllw %xmm3, %xmm5, %xmm6
437 ; AVX512VL-NEXT:    vpbroadcastb %xmm6, %ymm6
438 ; AVX512VL-NEXT:    vpand %ymm6, %ymm4, %ymm4
439 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm7 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
440 ; AVX512VL-NEXT:    vpsubb %xmm1, %xmm7, %xmm1
441 ; AVX512VL-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
442 ; AVX512VL-NEXT:    vpsrlw %xmm1, %ymm2, %ymm2
443 ; AVX512VL-NEXT:    vpsrlw %xmm1, %xmm5, %xmm5
444 ; AVX512VL-NEXT:    vpsrlw $8, %xmm5, %xmm5
445 ; AVX512VL-NEXT:    vpbroadcastb %xmm5, %ymm5
446 ; AVX512VL-NEXT:    vpand %ymm5, %ymm2, %ymm2
447 ; AVX512VL-NEXT:    vpor %ymm2, %ymm4, %ymm2
448 ; AVX512VL-NEXT:    vpsllw %xmm3, %ymm0, %ymm3
449 ; AVX512VL-NEXT:    vpand %ymm6, %ymm3, %ymm3
450 ; AVX512VL-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
451 ; AVX512VL-NEXT:    vpand %ymm5, %ymm0, %ymm0
452 ; AVX512VL-NEXT:    vpor %ymm0, %ymm3, %ymm0
453 ; AVX512VL-NEXT:    vinserti64x4 $1, %ymm2, %zmm0, %zmm0
454 ; AVX512VL-NEXT:    retq
456 ; AVX512BW-LABEL: splatvar_funnnel_v64i8:
457 ; AVX512BW:       # %bb.0:
458 ; AVX512BW-NEXT:    vpbroadcastb %xmm1, %xmm1
459 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
460 ; AVX512BW-NEXT:    vpand %xmm2, %xmm1, %xmm3
461 ; AVX512BW-NEXT:    vpmovzxbq {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,zero,zero,zero,zero,xmm3[1],zero,zero,zero,zero,zero,zero,zero
462 ; AVX512BW-NEXT:    vpsllw %xmm3, %zmm0, %zmm4
463 ; AVX512BW-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
464 ; AVX512BW-NEXT:    vpsllw %xmm3, %xmm5, %xmm3
465 ; AVX512BW-NEXT:    vpbroadcastb %xmm3, %zmm3
466 ; AVX512BW-NEXT:    vpandq %zmm3, %zmm4, %zmm3
467 ; AVX512BW-NEXT:    vpxor %xmm4, %xmm4, %xmm4
468 ; AVX512BW-NEXT:    vpsubb %xmm1, %xmm4, %xmm1
469 ; AVX512BW-NEXT:    vpand %xmm2, %xmm1, %xmm1
470 ; AVX512BW-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
471 ; AVX512BW-NEXT:    vpsrlw %xmm1, %zmm0, %zmm0
472 ; AVX512BW-NEXT:    vpsrlw %xmm1, %xmm5, %xmm1
473 ; AVX512BW-NEXT:    vpsrlw $8, %xmm1, %xmm1
474 ; AVX512BW-NEXT:    vpbroadcastb %xmm1, %zmm1
475 ; AVX512BW-NEXT:    vpandq %zmm1, %zmm0, %zmm0
476 ; AVX512BW-NEXT:    vporq %zmm0, %zmm3, %zmm0
477 ; AVX512BW-NEXT:    retq
479 ; AVX512VLBW-LABEL: splatvar_funnnel_v64i8:
480 ; AVX512VLBW:       # %bb.0:
481 ; AVX512VLBW-NEXT:    vpbroadcastb %xmm1, %xmm1
482 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm2 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
483 ; AVX512VLBW-NEXT:    vpand %xmm2, %xmm1, %xmm3
484 ; AVX512VLBW-NEXT:    vpmovzxbq {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,zero,zero,zero,zero,xmm3[1],zero,zero,zero,zero,zero,zero,zero
485 ; AVX512VLBW-NEXT:    vpsllw %xmm3, %zmm0, %zmm4
486 ; AVX512VLBW-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
487 ; AVX512VLBW-NEXT:    vpsllw %xmm3, %xmm5, %xmm3
488 ; AVX512VLBW-NEXT:    vpbroadcastb %xmm3, %zmm3
489 ; AVX512VLBW-NEXT:    vpandq %zmm3, %zmm4, %zmm3
490 ; AVX512VLBW-NEXT:    vpxor %xmm4, %xmm4, %xmm4
491 ; AVX512VLBW-NEXT:    vpsubb %xmm1, %xmm4, %xmm1
492 ; AVX512VLBW-NEXT:    vpand %xmm2, %xmm1, %xmm1
493 ; AVX512VLBW-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
494 ; AVX512VLBW-NEXT:    vpsrlw %xmm1, %zmm0, %zmm0
495 ; AVX512VLBW-NEXT:    vpsrlw %xmm1, %xmm5, %xmm1
496 ; AVX512VLBW-NEXT:    vpsrlw $8, %xmm1, %xmm1
497 ; AVX512VLBW-NEXT:    vpbroadcastb %xmm1, %zmm1
498 ; AVX512VLBW-NEXT:    vpandq %zmm1, %zmm0, %zmm0
499 ; AVX512VLBW-NEXT:    vporq %zmm0, %zmm3, %zmm0
500 ; AVX512VLBW-NEXT:    retq
501   %splat = shufflevector <64 x i8> %amt, <64 x i8> undef, <64 x i32> zeroinitializer
502   %res = call <64 x i8> @llvm.fshl.v64i8(<64 x i8> %x, <64 x i8> %x, <64 x i8> %splat)
503   ret <64 x i8> %res
507 ; Constant Shifts
510 define <8 x i64> @constant_funnnel_v8i64(<8 x i64> %x) nounwind {
511 ; AVX512-LABEL: constant_funnnel_v8i64:
512 ; AVX512:       # %bb.0:
513 ; AVX512-NEXT:    vprolvq {{.*}}(%rip), %zmm0, %zmm0
514 ; AVX512-NEXT:    retq
515   %res = call <8 x i64> @llvm.fshl.v8i64(<8 x i64> %x, <8 x i64> %x, <8 x i64> <i64 4, i64 14, i64 50, i64 60, i64 4, i64 14, i64 50, i64 60>)
516   ret <8 x i64> %res
519 define <16 x i32> @constant_funnnel_v16i32(<16 x i32> %x) nounwind {
520 ; AVX512-LABEL: constant_funnnel_v16i32:
521 ; AVX512:       # %bb.0:
522 ; AVX512-NEXT:    vprolvd {{.*}}(%rip), %zmm0, %zmm0
523 ; AVX512-NEXT:    retq
524   %res = call <16 x i32> @llvm.fshl.v16i32(<16 x i32> %x, <16 x i32> %x, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11>)
525   ret <16 x i32> %res
528 define <32 x i16> @constant_funnnel_v32i16(<32 x i16> %x) nounwind {
529 ; AVX512F-LABEL: constant_funnnel_v32i16:
530 ; AVX512F:       # %bb.0:
531 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
532 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm2 = <u,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768>
533 ; AVX512F-NEXT:    vpmulhuw %ymm2, %ymm1, %ymm3
534 ; AVX512F-NEXT:    vpblendw {{.*#+}} ymm4 = ymm1[0],ymm3[1,2,3,4,5,6,7],ymm1[8],ymm3[9,10,11,12,13,14,15]
535 ; AVX512F-NEXT:    vpblendd {{.*#+}} ymm3 = ymm4[0,1,2,3],ymm3[4,5,6,7]
536 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm4 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
537 ; AVX512F-NEXT:    vpmullw %ymm4, %ymm1, %ymm1
538 ; AVX512F-NEXT:    vpor %ymm3, %ymm1, %ymm1
539 ; AVX512F-NEXT:    vpmulhuw %ymm2, %ymm0, %ymm2
540 ; AVX512F-NEXT:    vpblendw {{.*#+}} ymm3 = ymm0[0],ymm2[1,2,3,4,5,6,7],ymm0[8],ymm2[9,10,11,12,13,14,15]
541 ; AVX512F-NEXT:    vpblendd {{.*#+}} ymm2 = ymm3[0,1,2,3],ymm2[4,5,6,7]
542 ; AVX512F-NEXT:    vpmullw %ymm4, %ymm0, %ymm0
543 ; AVX512F-NEXT:    vpor %ymm2, %ymm0, %ymm0
544 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
545 ; AVX512F-NEXT:    retq
547 ; AVX512VL-LABEL: constant_funnnel_v32i16:
548 ; AVX512VL:       # %bb.0:
549 ; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
550 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm2 = <u,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768>
551 ; AVX512VL-NEXT:    vpmulhuw %ymm2, %ymm1, %ymm3
552 ; AVX512VL-NEXT:    vpblendw {{.*#+}} ymm4 = ymm1[0],ymm3[1,2,3,4,5,6,7],ymm1[8],ymm3[9,10,11,12,13,14,15]
553 ; AVX512VL-NEXT:    vpblendd {{.*#+}} ymm3 = ymm4[0,1,2,3],ymm3[4,5,6,7]
554 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm4 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
555 ; AVX512VL-NEXT:    vpmullw %ymm4, %ymm1, %ymm1
556 ; AVX512VL-NEXT:    vpor %ymm3, %ymm1, %ymm1
557 ; AVX512VL-NEXT:    vpmulhuw %ymm2, %ymm0, %ymm2
558 ; AVX512VL-NEXT:    vpblendw {{.*#+}} ymm3 = ymm0[0],ymm2[1,2,3,4,5,6,7],ymm0[8],ymm2[9,10,11,12,13,14,15]
559 ; AVX512VL-NEXT:    vpblendd {{.*#+}} ymm2 = ymm3[0,1,2,3],ymm2[4,5,6,7]
560 ; AVX512VL-NEXT:    vpmullw %ymm4, %ymm0, %ymm0
561 ; AVX512VL-NEXT:    vpor %ymm2, %ymm0, %ymm0
562 ; AVX512VL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
563 ; AVX512VL-NEXT:    retq
565 ; AVX512BW-LABEL: constant_funnnel_v32i16:
566 ; AVX512BW:       # %bb.0:
567 ; AVX512BW-NEXT:    vpsrlvw {{.*}}(%rip), %zmm0, %zmm1
568 ; AVX512BW-NEXT:    vpsllvw {{.*}}(%rip), %zmm0, %zmm0
569 ; AVX512BW-NEXT:    vporq %zmm1, %zmm0, %zmm0
570 ; AVX512BW-NEXT:    retq
572 ; AVX512VLBW-LABEL: constant_funnnel_v32i16:
573 ; AVX512VLBW:       # %bb.0:
574 ; AVX512VLBW-NEXT:    vpsrlvw {{.*}}(%rip), %zmm0, %zmm1
575 ; AVX512VLBW-NEXT:    vpsllvw {{.*}}(%rip), %zmm0, %zmm0
576 ; AVX512VLBW-NEXT:    vporq %zmm1, %zmm0, %zmm0
577 ; AVX512VLBW-NEXT:    retq
578   %res = call <32 x i16> @llvm.fshl.v32i16(<32 x i16> %x, <32 x i16> %x, <32 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15, i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>)
579   ret <32 x i16> %res
582 define <64 x i8> @constant_funnnel_v64i8(<64 x i8> %x) nounwind {
583 ; AVX512F-LABEL: constant_funnnel_v64i8:
584 ; AVX512F:       # %bb.0:
585 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
586 ; AVX512F-NEXT:    vpsllw $4, %ymm1, %ymm2
587 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
588 ; AVX512F-NEXT:    vpand %ymm3, %ymm2, %ymm2
589 ; AVX512F-NEXT:    vbroadcasti128 {{.*#+}} ymm4 = [8192,24640,41088,57536,57344,41152,24704,8256,8192,24640,41088,57536,57344,41152,24704,8256]
590 ; AVX512F-NEXT:    # ymm4 = mem[0,1,0,1]
591 ; AVX512F-NEXT:    vpblendvb %ymm4, %ymm2, %ymm1, %ymm2
592 ; AVX512F-NEXT:    vpsllw $2, %ymm2, %ymm5
593 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
594 ; AVX512F-NEXT:    vpand %ymm6, %ymm5, %ymm5
595 ; AVX512F-NEXT:    vpaddb %ymm4, %ymm4, %ymm7
596 ; AVX512F-NEXT:    vpblendvb %ymm7, %ymm5, %ymm2, %ymm2
597 ; AVX512F-NEXT:    vpaddb %ymm2, %ymm2, %ymm5
598 ; AVX512F-NEXT:    vpaddb %ymm7, %ymm7, %ymm8
599 ; AVX512F-NEXT:    vpblendvb %ymm8, %ymm5, %ymm2, %ymm2
600 ; AVX512F-NEXT:    vpxor %xmm5, %xmm5, %xmm5
601 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm9 = ymm1[8],ymm5[8],ymm1[9],ymm5[9],ymm1[10],ymm5[10],ymm1[11],ymm5[11],ymm1[12],ymm5[12],ymm1[13],ymm5[13],ymm1[14],ymm5[14],ymm1[15],ymm5[15],ymm1[24],ymm5[24],ymm1[25],ymm5[25],ymm1[26],ymm5[26],ymm1[27],ymm5[27],ymm1[28],ymm5[28],ymm1[29],ymm5[29],ymm1[30],ymm5[30],ymm1[31],ymm5[31]
602 ; AVX512F-NEXT:    vbroadcasti128 {{.*#+}} ymm10 = [256,128,64,32,16,8,4,2,256,128,64,32,16,8,4,2]
603 ; AVX512F-NEXT:    # ymm10 = mem[0,1,0,1]
604 ; AVX512F-NEXT:    vpmullw %ymm10, %ymm9, %ymm9
605 ; AVX512F-NEXT:    vpsrlw $8, %ymm9, %ymm9
606 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm5[0],ymm1[1],ymm5[1],ymm1[2],ymm5[2],ymm1[3],ymm5[3],ymm1[4],ymm5[4],ymm1[5],ymm5[5],ymm1[6],ymm5[6],ymm1[7],ymm5[7],ymm1[16],ymm5[16],ymm1[17],ymm5[17],ymm1[18],ymm5[18],ymm1[19],ymm5[19],ymm1[20],ymm5[20],ymm1[21],ymm5[21],ymm1[22],ymm5[22],ymm1[23],ymm5[23]
607 ; AVX512F-NEXT:    vbroadcasti128 {{.*#+}} ymm11 = [256,2,4,8,16,32,64,128,256,2,4,8,16,32,64,128]
608 ; AVX512F-NEXT:    # ymm11 = mem[0,1,0,1]
609 ; AVX512F-NEXT:    vpmullw %ymm11, %ymm1, %ymm1
610 ; AVX512F-NEXT:    vpsrlw $8, %ymm1, %ymm1
611 ; AVX512F-NEXT:    vpackuswb %ymm9, %ymm1, %ymm1
612 ; AVX512F-NEXT:    vpor %ymm1, %ymm2, %ymm1
613 ; AVX512F-NEXT:    vpsllw $4, %ymm0, %ymm2
614 ; AVX512F-NEXT:    vpand %ymm3, %ymm2, %ymm2
615 ; AVX512F-NEXT:    vpblendvb %ymm4, %ymm2, %ymm0, %ymm2
616 ; AVX512F-NEXT:    vpsllw $2, %ymm2, %ymm3
617 ; AVX512F-NEXT:    vpand %ymm6, %ymm3, %ymm3
618 ; AVX512F-NEXT:    vpblendvb %ymm7, %ymm3, %ymm2, %ymm2
619 ; AVX512F-NEXT:    vpaddb %ymm2, %ymm2, %ymm3
620 ; AVX512F-NEXT:    vpblendvb %ymm8, %ymm3, %ymm2, %ymm2
621 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8],ymm5[8],ymm0[9],ymm5[9],ymm0[10],ymm5[10],ymm0[11],ymm5[11],ymm0[12],ymm5[12],ymm0[13],ymm5[13],ymm0[14],ymm5[14],ymm0[15],ymm5[15],ymm0[24],ymm5[24],ymm0[25],ymm5[25],ymm0[26],ymm5[26],ymm0[27],ymm5[27],ymm0[28],ymm5[28],ymm0[29],ymm5[29],ymm0[30],ymm5[30],ymm0[31],ymm5[31]
622 ; AVX512F-NEXT:    vpmullw %ymm10, %ymm3, %ymm3
623 ; AVX512F-NEXT:    vpsrlw $8, %ymm3, %ymm3
624 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0],ymm5[0],ymm0[1],ymm5[1],ymm0[2],ymm5[2],ymm0[3],ymm5[3],ymm0[4],ymm5[4],ymm0[5],ymm5[5],ymm0[6],ymm5[6],ymm0[7],ymm5[7],ymm0[16],ymm5[16],ymm0[17],ymm5[17],ymm0[18],ymm5[18],ymm0[19],ymm5[19],ymm0[20],ymm5[20],ymm0[21],ymm5[21],ymm0[22],ymm5[22],ymm0[23],ymm5[23]
625 ; AVX512F-NEXT:    vpmullw %ymm11, %ymm0, %ymm0
626 ; AVX512F-NEXT:    vpsrlw $8, %ymm0, %ymm0
627 ; AVX512F-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
628 ; AVX512F-NEXT:    vpor %ymm0, %ymm2, %ymm0
629 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
630 ; AVX512F-NEXT:    retq
632 ; AVX512VL-LABEL: constant_funnnel_v64i8:
633 ; AVX512VL:       # %bb.0:
634 ; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
635 ; AVX512VL-NEXT:    vpsllw $4, %ymm1, %ymm2
636 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
637 ; AVX512VL-NEXT:    vpand %ymm3, %ymm2, %ymm2
638 ; AVX512VL-NEXT:    vbroadcasti128 {{.*#+}} ymm4 = [8192,24640,41088,57536,57344,41152,24704,8256,8192,24640,41088,57536,57344,41152,24704,8256]
639 ; AVX512VL-NEXT:    # ymm4 = mem[0,1,0,1]
640 ; AVX512VL-NEXT:    vpblendvb %ymm4, %ymm2, %ymm1, %ymm2
641 ; AVX512VL-NEXT:    vpsllw $2, %ymm2, %ymm5
642 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
643 ; AVX512VL-NEXT:    vpand %ymm6, %ymm5, %ymm5
644 ; AVX512VL-NEXT:    vpaddb %ymm4, %ymm4, %ymm7
645 ; AVX512VL-NEXT:    vpblendvb %ymm7, %ymm5, %ymm2, %ymm2
646 ; AVX512VL-NEXT:    vpaddb %ymm2, %ymm2, %ymm5
647 ; AVX512VL-NEXT:    vpaddb %ymm7, %ymm7, %ymm8
648 ; AVX512VL-NEXT:    vpblendvb %ymm8, %ymm5, %ymm2, %ymm2
649 ; AVX512VL-NEXT:    vpunpckhbw {{.*#+}} ymm5 = ymm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
650 ; AVX512VL-NEXT:    vpsrlw $8, %ymm5, %ymm5
651 ; AVX512VL-NEXT:    vbroadcasti128 {{.*#+}} ymm9 = [256,128,64,32,16,8,4,2,256,128,64,32,16,8,4,2]
652 ; AVX512VL-NEXT:    # ymm9 = mem[0,1,0,1]
653 ; AVX512VL-NEXT:    vpmullw %ymm9, %ymm5, %ymm5
654 ; AVX512VL-NEXT:    vpsrlw $8, %ymm5, %ymm5
655 ; AVX512VL-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
656 ; AVX512VL-NEXT:    vpsrlw $8, %ymm1, %ymm1
657 ; AVX512VL-NEXT:    vbroadcasti128 {{.*#+}} ymm10 = [256,2,4,8,16,32,64,128,256,2,4,8,16,32,64,128]
658 ; AVX512VL-NEXT:    # ymm10 = mem[0,1,0,1]
659 ; AVX512VL-NEXT:    vpmullw %ymm10, %ymm1, %ymm1
660 ; AVX512VL-NEXT:    vpsrlw $8, %ymm1, %ymm1
661 ; AVX512VL-NEXT:    vpackuswb %ymm5, %ymm1, %ymm1
662 ; AVX512VL-NEXT:    vpor %ymm1, %ymm2, %ymm1
663 ; AVX512VL-NEXT:    vpsllw $4, %ymm0, %ymm2
664 ; AVX512VL-NEXT:    vpand %ymm3, %ymm2, %ymm2
665 ; AVX512VL-NEXT:    vpblendvb %ymm4, %ymm2, %ymm0, %ymm2
666 ; AVX512VL-NEXT:    vpsllw $2, %ymm2, %ymm3
667 ; AVX512VL-NEXT:    vpand %ymm6, %ymm3, %ymm3
668 ; AVX512VL-NEXT:    vpblendvb %ymm7, %ymm3, %ymm2, %ymm2
669 ; AVX512VL-NEXT:    vpaddb %ymm2, %ymm2, %ymm3
670 ; AVX512VL-NEXT:    vpblendvb %ymm8, %ymm3, %ymm2, %ymm2
671 ; AVX512VL-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
672 ; AVX512VL-NEXT:    vpsrlw $8, %ymm3, %ymm3
673 ; AVX512VL-NEXT:    vpmullw %ymm9, %ymm3, %ymm3
674 ; AVX512VL-NEXT:    vpsrlw $8, %ymm3, %ymm3
675 ; AVX512VL-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
676 ; AVX512VL-NEXT:    vpsrlw $8, %ymm0, %ymm0
677 ; AVX512VL-NEXT:    vpmullw %ymm10, %ymm0, %ymm0
678 ; AVX512VL-NEXT:    vpsrlw $8, %ymm0, %ymm0
679 ; AVX512VL-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
680 ; AVX512VL-NEXT:    vpor %ymm0, %ymm2, %ymm0
681 ; AVX512VL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
682 ; AVX512VL-NEXT:    retq
684 ; AVX512BW-LABEL: constant_funnnel_v64i8:
685 ; AVX512BW:       # %bb.0:
686 ; AVX512BW-NEXT:    vbroadcasti32x4 {{.*#+}} zmm1 = [8192,24640,41088,57536,57344,41152,24704,8256,8192,24640,41088,57536,57344,41152,24704,8256,8192,24640,41088,57536,57344,41152,24704,8256,8192,24640,41088,57536,57344,41152,24704,8256]
687 ; AVX512BW-NEXT:    # zmm1 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
688 ; AVX512BW-NEXT:    vpmovb2m %zmm1, %k1
689 ; AVX512BW-NEXT:    vpsllw $4, %zmm0, %zmm2
690 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm2, %zmm2
691 ; AVX512BW-NEXT:    vpblendmb %zmm2, %zmm0, %zmm2 {%k1}
692 ; AVX512BW-NEXT:    vpsllw $2, %zmm2, %zmm3
693 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm3, %zmm3
694 ; AVX512BW-NEXT:    vpaddb %zmm1, %zmm1, %zmm1
695 ; AVX512BW-NEXT:    vpmovb2m %zmm1, %k1
696 ; AVX512BW-NEXT:    vmovdqu8 %zmm3, %zmm2 {%k1}
697 ; AVX512BW-NEXT:    vpaddb %zmm1, %zmm1, %zmm1
698 ; AVX512BW-NEXT:    vpmovb2m %zmm1, %k1
699 ; AVX512BW-NEXT:    vpaddb %zmm2, %zmm2, %zmm2 {%k1}
700 ; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm1 = zmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]
701 ; AVX512BW-NEXT:    vpsrlw $8, %zmm1, %zmm1
702 ; AVX512BW-NEXT:    vpsllvw {{.*}}(%rip), %zmm1, %zmm1
703 ; AVX512BW-NEXT:    vpsrlw $8, %zmm1, %zmm1
704 ; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
705 ; AVX512BW-NEXT:    vpsrlw $8, %zmm0, %zmm0
706 ; AVX512BW-NEXT:    vpsllvw {{.*}}(%rip), %zmm0, %zmm0
707 ; AVX512BW-NEXT:    vpsrlw $8, %zmm0, %zmm0
708 ; AVX512BW-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0
709 ; AVX512BW-NEXT:    vporq %zmm0, %zmm2, %zmm0
710 ; AVX512BW-NEXT:    retq
712 ; AVX512VLBW-LABEL: constant_funnnel_v64i8:
713 ; AVX512VLBW:       # %bb.0:
714 ; AVX512VLBW-NEXT:    vbroadcasti32x4 {{.*#+}} zmm1 = [8192,24640,41088,57536,57344,41152,24704,8256,8192,24640,41088,57536,57344,41152,24704,8256,8192,24640,41088,57536,57344,41152,24704,8256,8192,24640,41088,57536,57344,41152,24704,8256]
715 ; AVX512VLBW-NEXT:    # zmm1 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]
716 ; AVX512VLBW-NEXT:    vpmovb2m %zmm1, %k1
717 ; AVX512VLBW-NEXT:    vpsllw $4, %zmm0, %zmm2
718 ; AVX512VLBW-NEXT:    vpandq {{.*}}(%rip), %zmm2, %zmm2
719 ; AVX512VLBW-NEXT:    vpblendmb %zmm2, %zmm0, %zmm2 {%k1}
720 ; AVX512VLBW-NEXT:    vpsllw $2, %zmm2, %zmm3
721 ; AVX512VLBW-NEXT:    vpandq {{.*}}(%rip), %zmm3, %zmm3
722 ; AVX512VLBW-NEXT:    vpaddb %zmm1, %zmm1, %zmm1
723 ; AVX512VLBW-NEXT:    vpmovb2m %zmm1, %k1
724 ; AVX512VLBW-NEXT:    vmovdqu8 %zmm3, %zmm2 {%k1}
725 ; AVX512VLBW-NEXT:    vpaddb %zmm1, %zmm1, %zmm1
726 ; AVX512VLBW-NEXT:    vpmovb2m %zmm1, %k1
727 ; AVX512VLBW-NEXT:    vpaddb %zmm2, %zmm2, %zmm2 {%k1}
728 ; AVX512VLBW-NEXT:    vpunpckhbw {{.*#+}} zmm1 = zmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63]
729 ; AVX512VLBW-NEXT:    vpsrlw $8, %zmm1, %zmm1
730 ; AVX512VLBW-NEXT:    vpsllvw {{.*}}(%rip), %zmm1, %zmm1
731 ; AVX512VLBW-NEXT:    vpsrlw $8, %zmm1, %zmm1
732 ; AVX512VLBW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55]
733 ; AVX512VLBW-NEXT:    vpsrlw $8, %zmm0, %zmm0
734 ; AVX512VLBW-NEXT:    vpsllvw {{.*}}(%rip), %zmm0, %zmm0
735 ; AVX512VLBW-NEXT:    vpsrlw $8, %zmm0, %zmm0
736 ; AVX512VLBW-NEXT:    vpackuswb %zmm1, %zmm0, %zmm0
737 ; AVX512VLBW-NEXT:    vporq %zmm0, %zmm2, %zmm0
738 ; AVX512VLBW-NEXT:    retq
739   %res = call <64 x i8> @llvm.fshl.v64i8(<64 x i8> %x, <64 x i8> %x, <64 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1>)
740   ret <64 x i8> %res
744 ; Uniform Constant Shifts
747 define <8 x i64> @splatconstant_funnnel_v8i64(<8 x i64> %x) nounwind {
748 ; AVX512-LABEL: splatconstant_funnnel_v8i64:
749 ; AVX512:       # %bb.0:
750 ; AVX512-NEXT:    vprolq $14, %zmm0, %zmm0
751 ; AVX512-NEXT:    retq
752   %res = call <8 x i64> @llvm.fshl.v8i64(<8 x i64> %x, <8 x i64> %x, <8 x i64> <i64 14, i64 14, i64 14, i64 14, i64 14, i64 14, i64 14, i64 14>)
753   ret <8 x i64> %res
756 define <16 x i32> @splatconstant_funnnel_v16i32(<16 x i32> %x) nounwind {
757 ; AVX512-LABEL: splatconstant_funnnel_v16i32:
758 ; AVX512:       # %bb.0:
759 ; AVX512-NEXT:    vprold $4, %zmm0, %zmm0
760 ; AVX512-NEXT:    retq
761   %res = call <16 x i32> @llvm.fshl.v16i32(<16 x i32> %x, <16 x i32> %x, <16 x i32> <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>)
762   ret <16 x i32> %res
765 define <32 x i16> @splatconstant_funnnel_v32i16(<32 x i16> %x) nounwind {
766 ; AVX512F-LABEL: splatconstant_funnnel_v32i16:
767 ; AVX512F:       # %bb.0:
768 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
769 ; AVX512F-NEXT:    vpsrlw $9, %ymm1, %ymm2
770 ; AVX512F-NEXT:    vpsllw $7, %ymm1, %ymm1
771 ; AVX512F-NEXT:    vpor %ymm2, %ymm1, %ymm1
772 ; AVX512F-NEXT:    vpsrlw $9, %ymm0, %ymm2
773 ; AVX512F-NEXT:    vpsllw $7, %ymm0, %ymm0
774 ; AVX512F-NEXT:    vpor %ymm2, %ymm0, %ymm0
775 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
776 ; AVX512F-NEXT:    retq
778 ; AVX512VL-LABEL: splatconstant_funnnel_v32i16:
779 ; AVX512VL:       # %bb.0:
780 ; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
781 ; AVX512VL-NEXT:    vpsrlw $9, %ymm1, %ymm2
782 ; AVX512VL-NEXT:    vpsllw $7, %ymm1, %ymm1
783 ; AVX512VL-NEXT:    vpor %ymm2, %ymm1, %ymm1
784 ; AVX512VL-NEXT:    vpsrlw $9, %ymm0, %ymm2
785 ; AVX512VL-NEXT:    vpsllw $7, %ymm0, %ymm0
786 ; AVX512VL-NEXT:    vpor %ymm2, %ymm0, %ymm0
787 ; AVX512VL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
788 ; AVX512VL-NEXT:    retq
790 ; AVX512BW-LABEL: splatconstant_funnnel_v32i16:
791 ; AVX512BW:       # %bb.0:
792 ; AVX512BW-NEXT:    vpsrlw $9, %zmm0, %zmm1
793 ; AVX512BW-NEXT:    vpsllw $7, %zmm0, %zmm0
794 ; AVX512BW-NEXT:    vporq %zmm1, %zmm0, %zmm0
795 ; AVX512BW-NEXT:    retq
797 ; AVX512VLBW-LABEL: splatconstant_funnnel_v32i16:
798 ; AVX512VLBW:       # %bb.0:
799 ; AVX512VLBW-NEXT:    vpsrlw $9, %zmm0, %zmm1
800 ; AVX512VLBW-NEXT:    vpsllw $7, %zmm0, %zmm0
801 ; AVX512VLBW-NEXT:    vporq %zmm1, %zmm0, %zmm0
802 ; AVX512VLBW-NEXT:    retq
803   %res = call <32 x i16> @llvm.fshl.v32i16(<32 x i16> %x, <32 x i16> %x, <32 x i16> <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>)
804   ret <32 x i16> %res
807 define <64 x i8> @splatconstant_funnnel_v64i8(<64 x i8> %x) nounwind {
808 ; AVX512F-LABEL: splatconstant_funnnel_v64i8:
809 ; AVX512F:       # %bb.0:
810 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
811 ; AVX512F-NEXT:    vpsrlw $4, %ymm1, %ymm2
812 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
813 ; AVX512F-NEXT:    vpandn %ymm2, %ymm3, %ymm2
814 ; AVX512F-NEXT:    vpsllw $4, %ymm1, %ymm1
815 ; AVX512F-NEXT:    vpand %ymm3, %ymm1, %ymm1
816 ; AVX512F-NEXT:    vpor %ymm2, %ymm1, %ymm1
817 ; AVX512F-NEXT:    vpsrlw $4, %ymm0, %ymm2
818 ; AVX512F-NEXT:    vpandn %ymm2, %ymm3, %ymm2
819 ; AVX512F-NEXT:    vpsllw $4, %ymm0, %ymm0
820 ; AVX512F-NEXT:    vpand %ymm3, %ymm0, %ymm0
821 ; AVX512F-NEXT:    vpor %ymm2, %ymm0, %ymm0
822 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
823 ; AVX512F-NEXT:    retq
825 ; AVX512VL-LABEL: splatconstant_funnnel_v64i8:
826 ; AVX512VL:       # %bb.0:
827 ; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
828 ; AVX512VL-NEXT:    vpsrlw $4, %ymm1, %ymm2
829 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
830 ; AVX512VL-NEXT:    vpandn %ymm2, %ymm3, %ymm2
831 ; AVX512VL-NEXT:    vpsllw $4, %ymm1, %ymm1
832 ; AVX512VL-NEXT:    vpand %ymm3, %ymm1, %ymm1
833 ; AVX512VL-NEXT:    vpor %ymm2, %ymm1, %ymm1
834 ; AVX512VL-NEXT:    vpsrlw $4, %ymm0, %ymm2
835 ; AVX512VL-NEXT:    vpandn %ymm2, %ymm3, %ymm2
836 ; AVX512VL-NEXT:    vpsllw $4, %ymm0, %ymm0
837 ; AVX512VL-NEXT:    vpand %ymm3, %ymm0, %ymm0
838 ; AVX512VL-NEXT:    vpor %ymm2, %ymm0, %ymm0
839 ; AVX512VL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
840 ; AVX512VL-NEXT:    retq
842 ; AVX512BW-LABEL: splatconstant_funnnel_v64i8:
843 ; AVX512BW:       # %bb.0:
844 ; AVX512BW-NEXT:    vpsrlw $4, %zmm0, %zmm1
845 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm1, %zmm1
846 ; AVX512BW-NEXT:    vpsllw $4, %zmm0, %zmm0
847 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm0, %zmm0
848 ; AVX512BW-NEXT:    vporq %zmm1, %zmm0, %zmm0
849 ; AVX512BW-NEXT:    retq
851 ; AVX512VLBW-LABEL: splatconstant_funnnel_v64i8:
852 ; AVX512VLBW:       # %bb.0:
853 ; AVX512VLBW-NEXT:    vpsrlw $4, %zmm0, %zmm1
854 ; AVX512VLBW-NEXT:    vpandq {{.*}}(%rip), %zmm1, %zmm1
855 ; AVX512VLBW-NEXT:    vpsllw $4, %zmm0, %zmm0
856 ; AVX512VLBW-NEXT:    vpandq {{.*}}(%rip), %zmm0, %zmm0
857 ; AVX512VLBW-NEXT:    vporq %zmm1, %zmm0, %zmm0
858 ; AVX512VLBW-NEXT:    retq
859   %res = call <64 x i8> @llvm.fshl.v64i8(<64 x i8> %x, <64 x i8> %x, <64 x i8> <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>)
860   ret <64 x i8> %res