Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / X86 / vector-fshl-rot-128.ll
blob2e12eeabffa0e16f18600317ba95bac03f56570a
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE41
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX512,AVX512F
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VL
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512BW
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VLBW
10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefixes=XOP,XOPAVX1
11 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefixes=XOP,XOPAVX2
13 ; Just one 32-bit run to make sure we do reasonable things for i64 cases.
14 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=X32-SSE,X32-SSE2
16 declare <2 x i64> @llvm.fshl.v2i64(<2 x i64>, <2 x i64>, <2 x i64>)
17 declare <4 x i32> @llvm.fshl.v4i32(<4 x i32>, <4 x i32>, <4 x i32>)
18 declare <8 x i16> @llvm.fshl.v8i16(<8 x i16>, <8 x i16>, <8 x i16>)
19 declare <16 x i8> @llvm.fshl.v16i8(<16 x i8>, <16 x i8>, <16 x i8>)
22 ; Variable Shifts
25 define <2 x i64> @var_funnnel_v2i64(<2 x i64> %x, <2 x i64> %amt) nounwind {
26 ; SSE2-LABEL: var_funnnel_v2i64:
27 ; SSE2:       # %bb.0:
28 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [63,63]
29 ; SSE2-NEXT:    pxor %xmm3, %xmm3
30 ; SSE2-NEXT:    psubq %xmm1, %xmm3
31 ; SSE2-NEXT:    pand %xmm2, %xmm1
32 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
33 ; SSE2-NEXT:    psllq %xmm1, %xmm4
34 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
35 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
36 ; SSE2-NEXT:    psllq %xmm1, %xmm5
37 ; SSE2-NEXT:    movsd {{.*#+}} xmm5 = xmm4[0],xmm5[1]
38 ; SSE2-NEXT:    pand %xmm2, %xmm3
39 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
40 ; SSE2-NEXT:    psrlq %xmm3, %xmm1
41 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,3,0,1]
42 ; SSE2-NEXT:    psrlq %xmm2, %xmm0
43 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
44 ; SSE2-NEXT:    orpd %xmm5, %xmm0
45 ; SSE2-NEXT:    retq
47 ; SSE41-LABEL: var_funnnel_v2i64:
48 ; SSE41:       # %bb.0:
49 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [63,63]
50 ; SSE41-NEXT:    pxor %xmm3, %xmm3
51 ; SSE41-NEXT:    psubq %xmm1, %xmm3
52 ; SSE41-NEXT:    pand %xmm2, %xmm1
53 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
54 ; SSE41-NEXT:    psllq %xmm1, %xmm4
55 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
56 ; SSE41-NEXT:    movdqa %xmm0, %xmm5
57 ; SSE41-NEXT:    psllq %xmm1, %xmm5
58 ; SSE41-NEXT:    pblendw {{.*#+}} xmm5 = xmm4[0,1,2,3],xmm5[4,5,6,7]
59 ; SSE41-NEXT:    pand %xmm2, %xmm3
60 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
61 ; SSE41-NEXT:    psrlq %xmm3, %xmm1
62 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,3,0,1]
63 ; SSE41-NEXT:    psrlq %xmm2, %xmm0
64 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
65 ; SSE41-NEXT:    por %xmm5, %xmm0
66 ; SSE41-NEXT:    retq
68 ; AVX1-LABEL: var_funnnel_v2i64:
69 ; AVX1:       # %bb.0:
70 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [63,63]
71 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm3
72 ; AVX1-NEXT:    vpsllq %xmm3, %xmm0, %xmm4
73 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[2,3,0,1]
74 ; AVX1-NEXT:    vpsllq %xmm3, %xmm0, %xmm3
75 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
76 ; AVX1-NEXT:    vpxor %xmm4, %xmm4, %xmm4
77 ; AVX1-NEXT:    vpsubq %xmm1, %xmm4, %xmm1
78 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
79 ; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm2
80 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
81 ; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
82 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm0[4,5,6,7]
83 ; AVX1-NEXT:    vpor %xmm0, %xmm3, %xmm0
84 ; AVX1-NEXT:    retq
86 ; AVX2-LABEL: var_funnnel_v2i64:
87 ; AVX2:       # %bb.0:
88 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [63,63]
89 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm3
90 ; AVX2-NEXT:    vpsllvq %xmm3, %xmm0, %xmm3
91 ; AVX2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
92 ; AVX2-NEXT:    vpsubq %xmm1, %xmm4, %xmm1
93 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
94 ; AVX2-NEXT:    vpsrlvq %xmm1, %xmm0, %xmm0
95 ; AVX2-NEXT:    vpor %xmm0, %xmm3, %xmm0
96 ; AVX2-NEXT:    retq
98 ; AVX512F-LABEL: var_funnnel_v2i64:
99 ; AVX512F:       # %bb.0:
100 ; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
101 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
102 ; AVX512F-NEXT:    vprolvq %zmm1, %zmm0, %zmm0
103 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
104 ; AVX512F-NEXT:    vzeroupper
105 ; AVX512F-NEXT:    retq
107 ; AVX512VL-LABEL: var_funnnel_v2i64:
108 ; AVX512VL:       # %bb.0:
109 ; AVX512VL-NEXT:    vprolvq %xmm1, %xmm0, %xmm0
110 ; AVX512VL-NEXT:    retq
112 ; AVX512BW-LABEL: var_funnnel_v2i64:
113 ; AVX512BW:       # %bb.0:
114 ; AVX512BW-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
115 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
116 ; AVX512BW-NEXT:    vprolvq %zmm1, %zmm0, %zmm0
117 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
118 ; AVX512BW-NEXT:    vzeroupper
119 ; AVX512BW-NEXT:    retq
121 ; AVX512VLBW-LABEL: var_funnnel_v2i64:
122 ; AVX512VLBW:       # %bb.0:
123 ; AVX512VLBW-NEXT:    vprolvq %xmm1, %xmm0, %xmm0
124 ; AVX512VLBW-NEXT:    retq
126 ; XOP-LABEL: var_funnnel_v2i64:
127 ; XOP:       # %bb.0:
128 ; XOP-NEXT:    vprotq %xmm1, %xmm0, %xmm0
129 ; XOP-NEXT:    retq
131 ; X32-SSE-LABEL: var_funnnel_v2i64:
132 ; X32-SSE:       # %bb.0:
133 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [63,0,63,0]
134 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
135 ; X32-SSE-NEXT:    psubq %xmm1, %xmm3
136 ; X32-SSE-NEXT:    pand %xmm2, %xmm1
137 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm4
138 ; X32-SSE-NEXT:    psllq %xmm1, %xmm4
139 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
140 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm5
141 ; X32-SSE-NEXT:    psllq %xmm1, %xmm5
142 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm5 = xmm4[0],xmm5[1]
143 ; X32-SSE-NEXT:    pand %xmm2, %xmm3
144 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
145 ; X32-SSE-NEXT:    psrlq %xmm3, %xmm1
146 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,3,0,1]
147 ; X32-SSE-NEXT:    psrlq %xmm2, %xmm0
148 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
149 ; X32-SSE-NEXT:    orpd %xmm5, %xmm0
150 ; X32-SSE-NEXT:    retl
151   %res = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> %x, <2 x i64> %x, <2 x i64> %amt)
152   ret <2 x i64> %res
155 define <4 x i32> @var_funnnel_v4i32(<4 x i32> %x, <4 x i32> %amt) nounwind {
156 ; SSE2-LABEL: var_funnnel_v4i32:
157 ; SSE2:       # %bb.0:
158 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
159 ; SSE2-NEXT:    pslld $23, %xmm1
160 ; SSE2-NEXT:    paddd {{.*}}(%rip), %xmm1
161 ; SSE2-NEXT:    cvttps2dq %xmm1, %xmm1
162 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
163 ; SSE2-NEXT:    pmuludq %xmm1, %xmm0
164 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]
165 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
166 ; SSE2-NEXT:    pmuludq %xmm2, %xmm1
167 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]
168 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
169 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
170 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
171 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
172 ; SSE2-NEXT:    por %xmm3, %xmm0
173 ; SSE2-NEXT:    retq
175 ; SSE41-LABEL: var_funnnel_v4i32:
176 ; SSE41:       # %bb.0:
177 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
178 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm1
179 ; SSE41-NEXT:    pslld $23, %xmm1
180 ; SSE41-NEXT:    paddd {{.*}}(%rip), %xmm1
181 ; SSE41-NEXT:    cvttps2dq %xmm1, %xmm1
182 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
183 ; SSE41-NEXT:    pmuludq %xmm2, %xmm3
184 ; SSE41-NEXT:    pmuludq %xmm1, %xmm0
185 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
186 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]
187 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
188 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
189 ; SSE41-NEXT:    por %xmm1, %xmm0
190 ; SSE41-NEXT:    retq
192 ; AVX1-LABEL: var_funnnel_v4i32:
193 ; AVX1:       # %bb.0:
194 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
195 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
196 ; AVX1-NEXT:    vpslld $23, %xmm1, %xmm1
197 ; AVX1-NEXT:    vpaddd {{.*}}(%rip), %xmm1, %xmm1
198 ; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1
199 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
200 ; AVX1-NEXT:    vpmuludq %xmm3, %xmm2, %xmm2
201 ; AVX1-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
202 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
203 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
204 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[0,0,2,2]
205 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
206 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
207 ; AVX1-NEXT:    retq
209 ; AVX2-LABEL: var_funnnel_v4i32:
210 ; AVX2:       # %bb.0:
211 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [31,31,31,31]
212 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
213 ; AVX2-NEXT:    vpsllvd %xmm1, %xmm0, %xmm2
214 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [32,32,32,32]
215 ; AVX2-NEXT:    vpsubd %xmm1, %xmm3, %xmm1
216 ; AVX2-NEXT:    vpsrlvd %xmm1, %xmm0, %xmm0
217 ; AVX2-NEXT:    vpor %xmm0, %xmm2, %xmm0
218 ; AVX2-NEXT:    retq
220 ; AVX512F-LABEL: var_funnnel_v4i32:
221 ; AVX512F:       # %bb.0:
222 ; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
223 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
224 ; AVX512F-NEXT:    vprolvd %zmm1, %zmm0, %zmm0
225 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
226 ; AVX512F-NEXT:    vzeroupper
227 ; AVX512F-NEXT:    retq
229 ; AVX512VL-LABEL: var_funnnel_v4i32:
230 ; AVX512VL:       # %bb.0:
231 ; AVX512VL-NEXT:    vprolvd %xmm1, %xmm0, %xmm0
232 ; AVX512VL-NEXT:    retq
234 ; AVX512BW-LABEL: var_funnnel_v4i32:
235 ; AVX512BW:       # %bb.0:
236 ; AVX512BW-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
237 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
238 ; AVX512BW-NEXT:    vprolvd %zmm1, %zmm0, %zmm0
239 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
240 ; AVX512BW-NEXT:    vzeroupper
241 ; AVX512BW-NEXT:    retq
243 ; AVX512VLBW-LABEL: var_funnnel_v4i32:
244 ; AVX512VLBW:       # %bb.0:
245 ; AVX512VLBW-NEXT:    vprolvd %xmm1, %xmm0, %xmm0
246 ; AVX512VLBW-NEXT:    retq
248 ; XOP-LABEL: var_funnnel_v4i32:
249 ; XOP:       # %bb.0:
250 ; XOP-NEXT:    vprotd %xmm1, %xmm0, %xmm0
251 ; XOP-NEXT:    retq
253 ; X32-SSE-LABEL: var_funnnel_v4i32:
254 ; X32-SSE:       # %bb.0:
255 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm1
256 ; X32-SSE-NEXT:    pslld $23, %xmm1
257 ; X32-SSE-NEXT:    paddd {{\.LCPI.*}}, %xmm1
258 ; X32-SSE-NEXT:    cvttps2dq %xmm1, %xmm1
259 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
260 ; X32-SSE-NEXT:    pmuludq %xmm1, %xmm0
261 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]
262 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
263 ; X32-SSE-NEXT:    pmuludq %xmm2, %xmm1
264 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]
265 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
266 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
267 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
268 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
269 ; X32-SSE-NEXT:    por %xmm3, %xmm0
270 ; X32-SSE-NEXT:    retl
271   %res = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %x, <4 x i32> %amt)
272   ret <4 x i32> %res
275 define <8 x i16> @var_funnnel_v8i16(<8 x i16> %x, <8 x i16> %amt) nounwind {
276 ; SSE2-LABEL: var_funnnel_v8i16:
277 ; SSE2:       # %bb.0:
278 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
279 ; SSE2-NEXT:    pxor %xmm2, %xmm2
280 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
281 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
282 ; SSE2-NEXT:    pslld $23, %xmm3
283 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [1065353216,1065353216,1065353216,1065353216]
284 ; SSE2-NEXT:    paddd %xmm4, %xmm3
285 ; SSE2-NEXT:    cvttps2dq %xmm3, %xmm3
286 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,2,2,3,4,5,6,7]
287 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,6,6,7]
288 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
289 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
290 ; SSE2-NEXT:    pslld $23, %xmm1
291 ; SSE2-NEXT:    paddd %xmm4, %xmm1
292 ; SSE2-NEXT:    cvttps2dq %xmm1, %xmm1
293 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
294 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,6,6,7]
295 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
296 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
297 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
298 ; SSE2-NEXT:    pmulhuw %xmm1, %xmm2
299 ; SSE2-NEXT:    pmullw %xmm1, %xmm0
300 ; SSE2-NEXT:    por %xmm2, %xmm0
301 ; SSE2-NEXT:    retq
303 ; SSE41-LABEL: var_funnnel_v8i16:
304 ; SSE41:       # %bb.0:
305 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm1
306 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
307 ; SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
308 ; SSE41-NEXT:    pslld $23, %xmm1
309 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]
310 ; SSE41-NEXT:    paddd %xmm3, %xmm1
311 ; SSE41-NEXT:    cvttps2dq %xmm1, %xmm1
312 ; SSE41-NEXT:    pslld $23, %xmm2
313 ; SSE41-NEXT:    paddd %xmm3, %xmm2
314 ; SSE41-NEXT:    cvttps2dq %xmm2, %xmm2
315 ; SSE41-NEXT:    packusdw %xmm1, %xmm2
316 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
317 ; SSE41-NEXT:    pmulhuw %xmm2, %xmm1
318 ; SSE41-NEXT:    pmullw %xmm2, %xmm0
319 ; SSE41-NEXT:    por %xmm1, %xmm0
320 ; SSE41-NEXT:    retq
322 ; AVX1-LABEL: var_funnnel_v8i16:
323 ; AVX1:       # %bb.0:
324 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
325 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm2 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
326 ; AVX1-NEXT:    vpslld $23, %xmm2, %xmm2
327 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]
328 ; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm2
329 ; AVX1-NEXT:    vcvttps2dq %xmm2, %xmm2
330 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
331 ; AVX1-NEXT:    vpslld $23, %xmm1, %xmm1
332 ; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm1
333 ; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1
334 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
335 ; AVX1-NEXT:    vpmulhuw %xmm1, %xmm0, %xmm2
336 ; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
337 ; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
338 ; AVX1-NEXT:    retq
340 ; AVX2-LABEL: var_funnnel_v8i16:
341 ; AVX2:       # %bb.0:
342 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
343 ; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
344 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
345 ; AVX2-NEXT:    vpsllvd %ymm2, %ymm0, %ymm2
346 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
347 ; AVX2-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
348 ; AVX2-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
349 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm4 = [16,16,16,16,16,16,16,16]
350 ; AVX2-NEXT:    vpsubw %xmm1, %xmm4, %xmm1
351 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
352 ; AVX2-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
353 ; AVX2-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
354 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
355 ; AVX2-NEXT:    vpor %xmm0, %xmm2, %xmm0
356 ; AVX2-NEXT:    vzeroupper
357 ; AVX2-NEXT:    retq
359 ; AVX512F-LABEL: var_funnnel_v8i16:
360 ; AVX512F:       # %bb.0:
361 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
362 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
363 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} ymm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
364 ; AVX512F-NEXT:    vpsllvd %ymm2, %ymm0, %ymm2
365 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]
366 ; AVX512F-NEXT:    vpsubw %xmm1, %xmm3, %xmm1
367 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
368 ; AVX512F-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
369 ; AVX512F-NEXT:    vpor %ymm0, %ymm2, %ymm0
370 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
371 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
372 ; AVX512F-NEXT:    vzeroupper
373 ; AVX512F-NEXT:    retq
375 ; AVX512VL-LABEL: var_funnnel_v8i16:
376 ; AVX512VL:       # %bb.0:
377 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
378 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
379 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} ymm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
380 ; AVX512VL-NEXT:    vpsllvd %ymm2, %ymm0, %ymm2
381 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]
382 ; AVX512VL-NEXT:    vpsubw %xmm1, %xmm3, %xmm1
383 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
384 ; AVX512VL-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
385 ; AVX512VL-NEXT:    vpor %ymm0, %ymm2, %ymm0
386 ; AVX512VL-NEXT:    vpmovdw %ymm0, %xmm0
387 ; AVX512VL-NEXT:    vzeroupper
388 ; AVX512VL-NEXT:    retq
390 ; AVX512BW-LABEL: var_funnnel_v8i16:
391 ; AVX512BW:       # %bb.0:
392 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
393 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
394 ; AVX512BW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm2
395 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]
396 ; AVX512BW-NEXT:    vpsubw %xmm1, %xmm3, %xmm1
397 ; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
398 ; AVX512BW-NEXT:    vpor %xmm0, %xmm2, %xmm0
399 ; AVX512BW-NEXT:    vzeroupper
400 ; AVX512BW-NEXT:    retq
402 ; AVX512VLBW-LABEL: var_funnnel_v8i16:
403 ; AVX512VLBW:       # %bb.0:
404 ; AVX512VLBW-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
405 ; AVX512VLBW-NEXT:    vpsllvw %xmm1, %xmm0, %xmm2
406 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]
407 ; AVX512VLBW-NEXT:    vpsubw %xmm1, %xmm3, %xmm1
408 ; AVX512VLBW-NEXT:    vpsrlvw %xmm1, %xmm0, %xmm0
409 ; AVX512VLBW-NEXT:    vpor %xmm0, %xmm2, %xmm0
410 ; AVX512VLBW-NEXT:    retq
412 ; XOP-LABEL: var_funnnel_v8i16:
413 ; XOP:       # %bb.0:
414 ; XOP-NEXT:    vprotw %xmm1, %xmm0, %xmm0
415 ; XOP-NEXT:    retq
417 ; X32-SSE-LABEL: var_funnnel_v8i16:
418 ; X32-SSE:       # %bb.0:
419 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm1
420 ; X32-SSE-NEXT:    pxor %xmm2, %xmm2
421 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm3
422 ; X32-SSE-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
423 ; X32-SSE-NEXT:    pslld $23, %xmm3
424 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm4 = [1065353216,1065353216,1065353216,1065353216]
425 ; X32-SSE-NEXT:    paddd %xmm4, %xmm3
426 ; X32-SSE-NEXT:    cvttps2dq %xmm3, %xmm3
427 ; X32-SSE-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,2,2,3,4,5,6,7]
428 ; X32-SSE-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,4,6,6,7]
429 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
430 ; X32-SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
431 ; X32-SSE-NEXT:    pslld $23, %xmm1
432 ; X32-SSE-NEXT:    paddd %xmm4, %xmm1
433 ; X32-SSE-NEXT:    cvttps2dq %xmm1, %xmm1
434 ; X32-SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
435 ; X32-SSE-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,6,6,7]
436 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
437 ; X32-SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
438 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
439 ; X32-SSE-NEXT:    pmulhuw %xmm1, %xmm2
440 ; X32-SSE-NEXT:    pmullw %xmm1, %xmm0
441 ; X32-SSE-NEXT:    por %xmm2, %xmm0
442 ; X32-SSE-NEXT:    retl
443   %res = call <8 x i16> @llvm.fshl.v8i16(<8 x i16> %x, <8 x i16> %x, <8 x i16> %amt)
444   ret <8 x i16> %res
447 define <16 x i8> @var_funnnel_v16i8(<16 x i8> %x, <16 x i8> %amt) nounwind {
448 ; SSE2-LABEL: var_funnnel_v16i8:
449 ; SSE2:       # %bb.0:
450 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
451 ; SSE2-NEXT:    psllw $5, %xmm1
452 ; SSE2-NEXT:    pxor %xmm0, %xmm0
453 ; SSE2-NEXT:    pxor %xmm3, %xmm3
454 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm3
455 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
456 ; SSE2-NEXT:    psrlw $4, %xmm4
457 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm4
458 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
459 ; SSE2-NEXT:    psllw $4, %xmm5
460 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm5
461 ; SSE2-NEXT:    por %xmm4, %xmm5
462 ; SSE2-NEXT:    pand %xmm3, %xmm5
463 ; SSE2-NEXT:    pandn %xmm2, %xmm3
464 ; SSE2-NEXT:    por %xmm5, %xmm3
465 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
466 ; SSE2-NEXT:    psrlw $6, %xmm2
467 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm2
468 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
469 ; SSE2-NEXT:    psllw $2, %xmm4
470 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm4
471 ; SSE2-NEXT:    por %xmm2, %xmm4
472 ; SSE2-NEXT:    paddb %xmm1, %xmm1
473 ; SSE2-NEXT:    pxor %xmm2, %xmm2
474 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
475 ; SSE2-NEXT:    pand %xmm2, %xmm4
476 ; SSE2-NEXT:    pandn %xmm3, %xmm2
477 ; SSE2-NEXT:    por %xmm4, %xmm2
478 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
479 ; SSE2-NEXT:    paddb %xmm2, %xmm3
480 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
481 ; SSE2-NEXT:    psrlw $7, %xmm4
482 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm4
483 ; SSE2-NEXT:    por %xmm3, %xmm4
484 ; SSE2-NEXT:    paddb %xmm1, %xmm1
485 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm0
486 ; SSE2-NEXT:    pand %xmm0, %xmm4
487 ; SSE2-NEXT:    pandn %xmm2, %xmm0
488 ; SSE2-NEXT:    por %xmm4, %xmm0
489 ; SSE2-NEXT:    retq
491 ; SSE41-LABEL: var_funnnel_v16i8:
492 ; SSE41:       # %bb.0:
493 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
494 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
495 ; SSE41-NEXT:    psrlw $4, %xmm0
496 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm0
497 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
498 ; SSE41-NEXT:    psllw $4, %xmm3
499 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
500 ; SSE41-NEXT:    por %xmm0, %xmm3
501 ; SSE41-NEXT:    psllw $5, %xmm2
502 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
503 ; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm1
504 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
505 ; SSE41-NEXT:    psrlw $6, %xmm0
506 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm0
507 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
508 ; SSE41-NEXT:    psllw $2, %xmm3
509 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
510 ; SSE41-NEXT:    por %xmm0, %xmm3
511 ; SSE41-NEXT:    paddb %xmm2, %xmm2
512 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
513 ; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm1
514 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
515 ; SSE41-NEXT:    paddb %xmm1, %xmm0
516 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
517 ; SSE41-NEXT:    psrlw $7, %xmm3
518 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
519 ; SSE41-NEXT:    por %xmm0, %xmm3
520 ; SSE41-NEXT:    paddb %xmm2, %xmm2
521 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
522 ; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm1
523 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
524 ; SSE41-NEXT:    retq
526 ; AVX-LABEL: var_funnnel_v16i8:
527 ; AVX:       # %bb.0:
528 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm2
529 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
530 ; AVX-NEXT:    vpsllw $4, %xmm0, %xmm3
531 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm3, %xmm3
532 ; AVX-NEXT:    vpor %xmm2, %xmm3, %xmm2
533 ; AVX-NEXT:    vpsllw $5, %xmm1, %xmm1
534 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
535 ; AVX-NEXT:    vpsrlw $6, %xmm0, %xmm2
536 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
537 ; AVX-NEXT:    vpsllw $2, %xmm0, %xmm3
538 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm3, %xmm3
539 ; AVX-NEXT:    vpor %xmm2, %xmm3, %xmm2
540 ; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
541 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
542 ; AVX-NEXT:    vpaddb %xmm0, %xmm0, %xmm2
543 ; AVX-NEXT:    vpsrlw $7, %xmm0, %xmm3
544 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm3, %xmm3
545 ; AVX-NEXT:    vpor %xmm3, %xmm2, %xmm2
546 ; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
547 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
548 ; AVX-NEXT:    retq
550 ; AVX512F-LABEL: var_funnnel_v16i8:
551 ; AVX512F:       # %bb.0:
552 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm2 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
553 ; AVX512F-NEXT:    vpand %xmm2, %xmm1, %xmm3
554 ; AVX512F-NEXT:    vpmovzxbd {{.*#+}} zmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero,xmm3[4],zero,zero,zero,xmm3[5],zero,zero,zero,xmm3[6],zero,zero,zero,xmm3[7],zero,zero,zero,xmm3[8],zero,zero,zero,xmm3[9],zero,zero,zero,xmm3[10],zero,zero,zero,xmm3[11],zero,zero,zero,xmm3[12],zero,zero,zero,xmm3[13],zero,zero,zero,xmm3[14],zero,zero,zero,xmm3[15],zero,zero,zero
555 ; AVX512F-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
556 ; AVX512F-NEXT:    vpsllvd %zmm3, %zmm0, %zmm3
557 ; AVX512F-NEXT:    vpxor %xmm4, %xmm4, %xmm4
558 ; AVX512F-NEXT:    vpsubb %xmm1, %xmm4, %xmm1
559 ; AVX512F-NEXT:    vpand %xmm2, %xmm1, %xmm1
560 ; AVX512F-NEXT:    vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero
561 ; AVX512F-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0
562 ; AVX512F-NEXT:    vpord %zmm0, %zmm3, %zmm0
563 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
564 ; AVX512F-NEXT:    vzeroupper
565 ; AVX512F-NEXT:    retq
567 ; AVX512VL-LABEL: var_funnnel_v16i8:
568 ; AVX512VL:       # %bb.0:
569 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm2 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
570 ; AVX512VL-NEXT:    vpand %xmm2, %xmm1, %xmm3
571 ; AVX512VL-NEXT:    vpmovzxbd {{.*#+}} zmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero,xmm3[4],zero,zero,zero,xmm3[5],zero,zero,zero,xmm3[6],zero,zero,zero,xmm3[7],zero,zero,zero,xmm3[8],zero,zero,zero,xmm3[9],zero,zero,zero,xmm3[10],zero,zero,zero,xmm3[11],zero,zero,zero,xmm3[12],zero,zero,zero,xmm3[13],zero,zero,zero,xmm3[14],zero,zero,zero,xmm3[15],zero,zero,zero
572 ; AVX512VL-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
573 ; AVX512VL-NEXT:    vpsllvd %zmm3, %zmm0, %zmm3
574 ; AVX512VL-NEXT:    vpxor %xmm4, %xmm4, %xmm4
575 ; AVX512VL-NEXT:    vpsubb %xmm1, %xmm4, %xmm1
576 ; AVX512VL-NEXT:    vpand %xmm2, %xmm1, %xmm1
577 ; AVX512VL-NEXT:    vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero
578 ; AVX512VL-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0
579 ; AVX512VL-NEXT:    vpord %zmm0, %zmm3, %zmm0
580 ; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
581 ; AVX512VL-NEXT:    vzeroupper
582 ; AVX512VL-NEXT:    retq
584 ; AVX512BW-LABEL: var_funnnel_v16i8:
585 ; AVX512BW:       # %bb.0:
586 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
587 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
588 ; AVX512BW-NEXT:    vpand %xmm2, %xmm1, %xmm3
589 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero,xmm3[8],zero,xmm3[9],zero,xmm3[10],zero,xmm3[11],zero,xmm3[12],zero,xmm3[13],zero,xmm3[14],zero,xmm3[15],zero
590 ; AVX512BW-NEXT:    vpsllvw %zmm3, %zmm0, %zmm3
591 ; AVX512BW-NEXT:    vpxor %xmm4, %xmm4, %xmm4
592 ; AVX512BW-NEXT:    vpsubb %xmm1, %xmm4, %xmm1
593 ; AVX512BW-NEXT:    vpand %xmm2, %xmm1, %xmm1
594 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
595 ; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
596 ; AVX512BW-NEXT:    vpor %ymm0, %ymm3, %ymm0
597 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
598 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
599 ; AVX512BW-NEXT:    vzeroupper
600 ; AVX512BW-NEXT:    retq
602 ; AVX512VLBW-LABEL: var_funnnel_v16i8:
603 ; AVX512VLBW:       # %bb.0:
604 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm2 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
605 ; AVX512VLBW-NEXT:    vpand %xmm2, %xmm1, %xmm3
606 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} ymm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero,xmm3[8],zero,xmm3[9],zero,xmm3[10],zero,xmm3[11],zero,xmm3[12],zero,xmm3[13],zero,xmm3[14],zero,xmm3[15],zero
607 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
608 ; AVX512VLBW-NEXT:    vpsllvw %ymm3, %ymm0, %ymm3
609 ; AVX512VLBW-NEXT:    vpxor %xmm4, %xmm4, %xmm4
610 ; AVX512VLBW-NEXT:    vpsubb %xmm1, %xmm4, %xmm1
611 ; AVX512VLBW-NEXT:    vpand %xmm2, %xmm1, %xmm1
612 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
613 ; AVX512VLBW-NEXT:    vpsrlvw %ymm1, %ymm0, %ymm0
614 ; AVX512VLBW-NEXT:    vpor %ymm0, %ymm3, %ymm0
615 ; AVX512VLBW-NEXT:    vpmovwb %ymm0, %xmm0
616 ; AVX512VLBW-NEXT:    vzeroupper
617 ; AVX512VLBW-NEXT:    retq
619 ; XOP-LABEL: var_funnnel_v16i8:
620 ; XOP:       # %bb.0:
621 ; XOP-NEXT:    vprotb %xmm1, %xmm0, %xmm0
622 ; XOP-NEXT:    retq
624 ; X32-SSE-LABEL: var_funnnel_v16i8:
625 ; X32-SSE:       # %bb.0:
626 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
627 ; X32-SSE-NEXT:    psllw $5, %xmm1
628 ; X32-SSE-NEXT:    pxor %xmm0, %xmm0
629 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
630 ; X32-SSE-NEXT:    pcmpgtb %xmm1, %xmm3
631 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm4
632 ; X32-SSE-NEXT:    psrlw $4, %xmm4
633 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm4
634 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm5
635 ; X32-SSE-NEXT:    psllw $4, %xmm5
636 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm5
637 ; X32-SSE-NEXT:    por %xmm4, %xmm5
638 ; X32-SSE-NEXT:    pand %xmm3, %xmm5
639 ; X32-SSE-NEXT:    pandn %xmm2, %xmm3
640 ; X32-SSE-NEXT:    por %xmm5, %xmm3
641 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm2
642 ; X32-SSE-NEXT:    psrlw $6, %xmm2
643 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm2
644 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
645 ; X32-SSE-NEXT:    psllw $2, %xmm4
646 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm4
647 ; X32-SSE-NEXT:    por %xmm2, %xmm4
648 ; X32-SSE-NEXT:    paddb %xmm1, %xmm1
649 ; X32-SSE-NEXT:    pxor %xmm2, %xmm2
650 ; X32-SSE-NEXT:    pcmpgtb %xmm1, %xmm2
651 ; X32-SSE-NEXT:    pand %xmm2, %xmm4
652 ; X32-SSE-NEXT:    pandn %xmm3, %xmm2
653 ; X32-SSE-NEXT:    por %xmm4, %xmm2
654 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm3
655 ; X32-SSE-NEXT:    paddb %xmm2, %xmm3
656 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm4
657 ; X32-SSE-NEXT:    psrlw $7, %xmm4
658 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm4
659 ; X32-SSE-NEXT:    por %xmm3, %xmm4
660 ; X32-SSE-NEXT:    paddb %xmm1, %xmm1
661 ; X32-SSE-NEXT:    pcmpgtb %xmm1, %xmm0
662 ; X32-SSE-NEXT:    pand %xmm0, %xmm4
663 ; X32-SSE-NEXT:    pandn %xmm2, %xmm0
664 ; X32-SSE-NEXT:    por %xmm4, %xmm0
665 ; X32-SSE-NEXT:    retl
666   %res = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %x, <16 x i8> %x, <16 x i8> %amt)
667   ret <16 x i8> %res
671 ; Uniform Variable Shifts
674 define <2 x i64> @splatvar_funnnel_v2i64(<2 x i64> %x, <2 x i64> %amt) nounwind {
675 ; SSE-LABEL: splatvar_funnnel_v2i64:
676 ; SSE:       # %bb.0:
677 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
678 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [63,63]
679 ; SSE-NEXT:    pxor %xmm3, %xmm3
680 ; SSE-NEXT:    psubq %xmm1, %xmm3
681 ; SSE-NEXT:    pand %xmm2, %xmm1
682 ; SSE-NEXT:    movdqa %xmm0, %xmm4
683 ; SSE-NEXT:    psllq %xmm1, %xmm4
684 ; SSE-NEXT:    pand %xmm2, %xmm3
685 ; SSE-NEXT:    psrlq %xmm3, %xmm0
686 ; SSE-NEXT:    por %xmm4, %xmm0
687 ; SSE-NEXT:    retq
689 ; AVX1-LABEL: splatvar_funnnel_v2i64:
690 ; AVX1:       # %bb.0:
691 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
692 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [63,63]
693 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm3
694 ; AVX1-NEXT:    vpsllq %xmm3, %xmm0, %xmm3
695 ; AVX1-NEXT:    vpxor %xmm4, %xmm4, %xmm4
696 ; AVX1-NEXT:    vpsubq %xmm1, %xmm4, %xmm1
697 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
698 ; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
699 ; AVX1-NEXT:    vpor %xmm0, %xmm3, %xmm0
700 ; AVX1-NEXT:    retq
702 ; AVX2-LABEL: splatvar_funnnel_v2i64:
703 ; AVX2:       # %bb.0:
704 ; AVX2-NEXT:    vpbroadcastq %xmm1, %xmm1
705 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [63,63]
706 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm3
707 ; AVX2-NEXT:    vpsllq %xmm3, %xmm0, %xmm3
708 ; AVX2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
709 ; AVX2-NEXT:    vpsubq %xmm1, %xmm4, %xmm1
710 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
711 ; AVX2-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
712 ; AVX2-NEXT:    vpor %xmm0, %xmm3, %xmm0
713 ; AVX2-NEXT:    retq
715 ; AVX512F-LABEL: splatvar_funnnel_v2i64:
716 ; AVX512F:       # %bb.0:
717 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
718 ; AVX512F-NEXT:    vpbroadcastq %xmm1, %xmm1
719 ; AVX512F-NEXT:    vprolvq %zmm1, %zmm0, %zmm0
720 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
721 ; AVX512F-NEXT:    vzeroupper
722 ; AVX512F-NEXT:    retq
724 ; AVX512VL-LABEL: splatvar_funnnel_v2i64:
725 ; AVX512VL:       # %bb.0:
726 ; AVX512VL-NEXT:    vpbroadcastq %xmm1, %xmm1
727 ; AVX512VL-NEXT:    vprolvq %xmm1, %xmm0, %xmm0
728 ; AVX512VL-NEXT:    retq
730 ; AVX512BW-LABEL: splatvar_funnnel_v2i64:
731 ; AVX512BW:       # %bb.0:
732 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
733 ; AVX512BW-NEXT:    vpbroadcastq %xmm1, %xmm1
734 ; AVX512BW-NEXT:    vprolvq %zmm1, %zmm0, %zmm0
735 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
736 ; AVX512BW-NEXT:    vzeroupper
737 ; AVX512BW-NEXT:    retq
739 ; AVX512VLBW-LABEL: splatvar_funnnel_v2i64:
740 ; AVX512VLBW:       # %bb.0:
741 ; AVX512VLBW-NEXT:    vpbroadcastq %xmm1, %xmm1
742 ; AVX512VLBW-NEXT:    vprolvq %xmm1, %xmm0, %xmm0
743 ; AVX512VLBW-NEXT:    retq
745 ; XOPAVX1-LABEL: splatvar_funnnel_v2i64:
746 ; XOPAVX1:       # %bb.0:
747 ; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
748 ; XOPAVX1-NEXT:    vprotq %xmm1, %xmm0, %xmm0
749 ; XOPAVX1-NEXT:    retq
751 ; XOPAVX2-LABEL: splatvar_funnnel_v2i64:
752 ; XOPAVX2:       # %bb.0:
753 ; XOPAVX2-NEXT:    vpbroadcastq %xmm1, %xmm1
754 ; XOPAVX2-NEXT:    vprotq %xmm1, %xmm0, %xmm0
755 ; XOPAVX2-NEXT:    retq
757 ; X32-SSE-LABEL: splatvar_funnnel_v2i64:
758 ; X32-SSE:       # %bb.0:
759 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
760 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [63,0,63,0]
761 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
762 ; X32-SSE-NEXT:    psubq %xmm1, %xmm3
763 ; X32-SSE-NEXT:    pand %xmm2, %xmm1
764 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm4
765 ; X32-SSE-NEXT:    psllq %xmm1, %xmm4
766 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
767 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm5
768 ; X32-SSE-NEXT:    psllq %xmm1, %xmm5
769 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm5 = xmm4[0],xmm5[1]
770 ; X32-SSE-NEXT:    pand %xmm2, %xmm3
771 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
772 ; X32-SSE-NEXT:    psrlq %xmm3, %xmm1
773 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,3,0,1]
774 ; X32-SSE-NEXT:    psrlq %xmm2, %xmm0
775 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
776 ; X32-SSE-NEXT:    orpd %xmm5, %xmm0
777 ; X32-SSE-NEXT:    retl
778   %splat = shufflevector <2 x i64> %amt, <2 x i64> undef, <2 x i32> zeroinitializer
779   %res = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> %x, <2 x i64> %x, <2 x i64> %splat)
780   ret <2 x i64> %res
783 define <4 x i32> @splatvar_funnnel_v4i32(<4 x i32> %x, <4 x i32> %amt) nounwind {
784 ; SSE2-LABEL: splatvar_funnnel_v4i32:
785 ; SSE2:       # %bb.0:
786 ; SSE2-NEXT:    movd %xmm1, %eax
787 ; SSE2-NEXT:    andl $31, %eax
788 ; SSE2-NEXT:    movd %eax, %xmm1
789 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
790 ; SSE2-NEXT:    pslld %xmm1, %xmm2
791 ; SSE2-NEXT:    movl $32, %ecx
792 ; SSE2-NEXT:    subl %eax, %ecx
793 ; SSE2-NEXT:    movd %ecx, %xmm1
794 ; SSE2-NEXT:    psrld %xmm1, %xmm0
795 ; SSE2-NEXT:    por %xmm2, %xmm0
796 ; SSE2-NEXT:    retq
798 ; SSE41-LABEL: splatvar_funnnel_v4i32:
799 ; SSE41:       # %bb.0:
800 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
801 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm1
802 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero
803 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
804 ; SSE41-NEXT:    pslld %xmm2, %xmm3
805 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [32,32,32,32]
806 ; SSE41-NEXT:    psubd %xmm1, %xmm2
807 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm1 = xmm2[0],zero,xmm2[1],zero
808 ; SSE41-NEXT:    psrld %xmm1, %xmm0
809 ; SSE41-NEXT:    por %xmm3, %xmm0
810 ; SSE41-NEXT:    retq
812 ; AVX1-LABEL: splatvar_funnnel_v4i32:
813 ; AVX1:       # %bb.0:
814 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
815 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
816 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero
817 ; AVX1-NEXT:    vpslld %xmm2, %xmm0, %xmm2
818 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [32,32,32,32]
819 ; AVX1-NEXT:    vpsubd %xmm1, %xmm3, %xmm1
820 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
821 ; AVX1-NEXT:    vpsrld %xmm1, %xmm0, %xmm0
822 ; AVX1-NEXT:    vpor %xmm0, %xmm2, %xmm0
823 ; AVX1-NEXT:    retq
825 ; AVX2-LABEL: splatvar_funnnel_v4i32:
826 ; AVX2:       # %bb.0:
827 ; AVX2-NEXT:    vpbroadcastd %xmm1, %xmm1
828 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [31,31,31,31]
829 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
830 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero
831 ; AVX2-NEXT:    vpslld %xmm2, %xmm0, %xmm2
832 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [32,32,32,32]
833 ; AVX2-NEXT:    vpsubd %xmm1, %xmm3, %xmm1
834 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
835 ; AVX2-NEXT:    vpsrld %xmm1, %xmm0, %xmm0
836 ; AVX2-NEXT:    vpor %xmm0, %xmm2, %xmm0
837 ; AVX2-NEXT:    retq
839 ; AVX512F-LABEL: splatvar_funnnel_v4i32:
840 ; AVX512F:       # %bb.0:
841 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
842 ; AVX512F-NEXT:    vpbroadcastd %xmm1, %xmm1
843 ; AVX512F-NEXT:    vprolvd %zmm1, %zmm0, %zmm0
844 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
845 ; AVX512F-NEXT:    vzeroupper
846 ; AVX512F-NEXT:    retq
848 ; AVX512VL-LABEL: splatvar_funnnel_v4i32:
849 ; AVX512VL:       # %bb.0:
850 ; AVX512VL-NEXT:    vpbroadcastd %xmm1, %xmm1
851 ; AVX512VL-NEXT:    vprolvd %xmm1, %xmm0, %xmm0
852 ; AVX512VL-NEXT:    retq
854 ; AVX512BW-LABEL: splatvar_funnnel_v4i32:
855 ; AVX512BW:       # %bb.0:
856 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
857 ; AVX512BW-NEXT:    vpbroadcastd %xmm1, %xmm1
858 ; AVX512BW-NEXT:    vprolvd %zmm1, %zmm0, %zmm0
859 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
860 ; AVX512BW-NEXT:    vzeroupper
861 ; AVX512BW-NEXT:    retq
863 ; AVX512VLBW-LABEL: splatvar_funnnel_v4i32:
864 ; AVX512VLBW:       # %bb.0:
865 ; AVX512VLBW-NEXT:    vpbroadcastd %xmm1, %xmm1
866 ; AVX512VLBW-NEXT:    vprolvd %xmm1, %xmm0, %xmm0
867 ; AVX512VLBW-NEXT:    retq
869 ; XOPAVX1-LABEL: splatvar_funnnel_v4i32:
870 ; XOPAVX1:       # %bb.0:
871 ; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
872 ; XOPAVX1-NEXT:    vprotd %xmm1, %xmm0, %xmm0
873 ; XOPAVX1-NEXT:    retq
875 ; XOPAVX2-LABEL: splatvar_funnnel_v4i32:
876 ; XOPAVX2:       # %bb.0:
877 ; XOPAVX2-NEXT:    vpbroadcastd %xmm1, %xmm1
878 ; XOPAVX2-NEXT:    vprotd %xmm1, %xmm0, %xmm0
879 ; XOPAVX2-NEXT:    retq
881 ; X32-SSE-LABEL: splatvar_funnnel_v4i32:
882 ; X32-SSE:       # %bb.0:
883 ; X32-SSE-NEXT:    movd %xmm1, %eax
884 ; X32-SSE-NEXT:    andl $31, %eax
885 ; X32-SSE-NEXT:    movd %eax, %xmm1
886 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
887 ; X32-SSE-NEXT:    pslld %xmm1, %xmm2
888 ; X32-SSE-NEXT:    movl $32, %ecx
889 ; X32-SSE-NEXT:    subl %eax, %ecx
890 ; X32-SSE-NEXT:    movd %ecx, %xmm1
891 ; X32-SSE-NEXT:    psrld %xmm1, %xmm0
892 ; X32-SSE-NEXT:    por %xmm2, %xmm0
893 ; X32-SSE-NEXT:    retl
894   %splat = shufflevector <4 x i32> %amt, <4 x i32> undef, <4 x i32> zeroinitializer
895   %res = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %x, <4 x i32> %splat)
896   ret <4 x i32> %res
899 define <8 x i16> @splatvar_funnnel_v8i16(<8 x i16> %x, <8 x i16> %amt) nounwind {
900 ; SSE2-LABEL: splatvar_funnnel_v8i16:
901 ; SSE2:       # %bb.0:
902 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7]
903 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
904 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
905 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [16,16,16,16,16,16,16,16]
906 ; SSE2-NEXT:    psubw %xmm1, %xmm2
907 ; SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1]
908 ; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
909 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
910 ; SSE2-NEXT:    psllw %xmm1, %xmm3
911 ; SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1]
912 ; SSE2-NEXT:    psrldq {{.*#+}} xmm2 = xmm2[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
913 ; SSE2-NEXT:    psrlw %xmm2, %xmm0
914 ; SSE2-NEXT:    por %xmm3, %xmm0
915 ; SSE2-NEXT:    retq
917 ; SSE41-LABEL: splatvar_funnnel_v8i16:
918 ; SSE41:       # %bb.0:
919 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7]
920 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
921 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm1
922 ; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
923 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
924 ; SSE41-NEXT:    psllw %xmm2, %xmm3
925 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [16,16,16,16,16,16,16,16]
926 ; SSE41-NEXT:    psubw %xmm1, %xmm2
927 ; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm1 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
928 ; SSE41-NEXT:    psrlw %xmm1, %xmm0
929 ; SSE41-NEXT:    por %xmm3, %xmm0
930 ; SSE41-NEXT:    retq
932 ; AVX1-LABEL: splatvar_funnnel_v8i16:
933 ; AVX1:       # %bb.0:
934 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7]
935 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
936 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
937 ; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
938 ; AVX1-NEXT:    vpsllw %xmm2, %xmm0, %xmm2
939 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]
940 ; AVX1-NEXT:    vpsubw %xmm1, %xmm3, %xmm1
941 ; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
942 ; AVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
943 ; AVX1-NEXT:    vpor %xmm0, %xmm2, %xmm0
944 ; AVX1-NEXT:    retq
946 ; AVX2-LABEL: splatvar_funnnel_v8i16:
947 ; AVX2:       # %bb.0:
948 ; AVX2-NEXT:    vpbroadcastw %xmm1, %xmm1
949 ; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
950 ; AVX2-NEXT:    vpmovzxwq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
951 ; AVX2-NEXT:    vpsllw %xmm2, %xmm0, %xmm2
952 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]
953 ; AVX2-NEXT:    vpsubw %xmm1, %xmm3, %xmm1
954 ; AVX2-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
955 ; AVX2-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
956 ; AVX2-NEXT:    vpor %xmm0, %xmm2, %xmm0
957 ; AVX2-NEXT:    retq
959 ; AVX512-LABEL: splatvar_funnnel_v8i16:
960 ; AVX512:       # %bb.0:
961 ; AVX512-NEXT:    vpbroadcastw %xmm1, %xmm1
962 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
963 ; AVX512-NEXT:    vpmovzxwq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
964 ; AVX512-NEXT:    vpsllw %xmm2, %xmm0, %xmm2
965 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]
966 ; AVX512-NEXT:    vpsubw %xmm1, %xmm3, %xmm1
967 ; AVX512-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
968 ; AVX512-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
969 ; AVX512-NEXT:    vpor %xmm0, %xmm2, %xmm0
970 ; AVX512-NEXT:    retq
972 ; XOPAVX1-LABEL: splatvar_funnnel_v8i16:
973 ; XOPAVX1:       # %bb.0:
974 ; XOPAVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7]
975 ; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
976 ; XOPAVX1-NEXT:    vprotw %xmm1, %xmm0, %xmm0
977 ; XOPAVX1-NEXT:    retq
979 ; XOPAVX2-LABEL: splatvar_funnnel_v8i16:
980 ; XOPAVX2:       # %bb.0:
981 ; XOPAVX2-NEXT:    vpbroadcastw %xmm1, %xmm1
982 ; XOPAVX2-NEXT:    vprotw %xmm1, %xmm0, %xmm0
983 ; XOPAVX2-NEXT:    retq
985 ; X32-SSE-LABEL: splatvar_funnnel_v8i16:
986 ; X32-SSE:       # %bb.0:
987 ; X32-SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7]
988 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
989 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm1
990 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [16,16,16,16,16,16,16,16]
991 ; X32-SSE-NEXT:    psubw %xmm1, %xmm2
992 ; X32-SSE-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1]
993 ; X32-SSE-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
994 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm3
995 ; X32-SSE-NEXT:    psllw %xmm1, %xmm3
996 ; X32-SSE-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1]
997 ; X32-SSE-NEXT:    psrldq {{.*#+}} xmm2 = xmm2[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
998 ; X32-SSE-NEXT:    psrlw %xmm2, %xmm0
999 ; X32-SSE-NEXT:    por %xmm3, %xmm0
1000 ; X32-SSE-NEXT:    retl
1001   %splat = shufflevector <8 x i16> %amt, <8 x i16> undef, <8 x i32> zeroinitializer
1002   %res = call <8 x i16> @llvm.fshl.v8i16(<8 x i16> %x, <8 x i16> %x, <8 x i16> %splat)
1003   ret <8 x i16> %res
1006 define <16 x i8> @splatvar_funnnel_v16i8(<16 x i8> %x, <16 x i8> %amt) nounwind {
1007 ; SSE2-LABEL: splatvar_funnnel_v16i8:
1008 ; SSE2:       # %bb.0:
1009 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1010 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7]
1011 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
1012 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
1013 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1014 ; SSE2-NEXT:    psubb %xmm1, %xmm2
1015 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
1016 ; SSE2-NEXT:    pslldq {{.*#+}} xmm3 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm3[0]
1017 ; SSE2-NEXT:    psrldq {{.*#+}} xmm3 = xmm3[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1018 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1019 ; SSE2-NEXT:    psllw %xmm3, %xmm1
1020 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
1021 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm5
1022 ; SSE2-NEXT:    psllw %xmm3, %xmm5
1023 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1024 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm5[0,0,2,3,4,5,6,7]
1025 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,0,0,0]
1026 ; SSE2-NEXT:    pand %xmm3, %xmm1
1027 ; SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0]
1028 ; SSE2-NEXT:    psrldq {{.*#+}} xmm2 = xmm2[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1029 ; SSE2-NEXT:    psrlw %xmm2, %xmm0
1030 ; SSE2-NEXT:    psrlw %xmm2, %xmm4
1031 ; SSE2-NEXT:    psrlw $8, %xmm4
1032 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1033 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm4[0,0,2,3,4,5,6,7]
1034 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]
1035 ; SSE2-NEXT:    pand %xmm0, %xmm2
1036 ; SSE2-NEXT:    por %xmm2, %xmm1
1037 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1038 ; SSE2-NEXT:    retq
1040 ; SSE41-LABEL: splatvar_funnnel_v16i8:
1041 ; SSE41:       # %bb.0:
1042 ; SSE41-NEXT:    pxor %xmm3, %xmm3
1043 ; SSE41-NEXT:    pshufb %xmm3, %xmm1
1044 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm1
1045 ; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm4 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
1046 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1047 ; SSE41-NEXT:    psllw %xmm4, %xmm2
1048 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm5
1049 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm6
1050 ; SSE41-NEXT:    psllw %xmm4, %xmm6
1051 ; SSE41-NEXT:    pshufb %xmm3, %xmm6
1052 ; SSE41-NEXT:    pand %xmm6, %xmm2
1053 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1054 ; SSE41-NEXT:    psubb %xmm1, %xmm3
1055 ; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm1 = xmm3[0],zero,zero,zero,zero,zero,zero,zero,xmm3[1],zero,zero,zero,zero,zero,zero,zero
1056 ; SSE41-NEXT:    psrlw %xmm1, %xmm0
1057 ; SSE41-NEXT:    psrlw %xmm1, %xmm5
1058 ; SSE41-NEXT:    pshufb {{.*#+}} xmm5 = xmm5[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1059 ; SSE41-NEXT:    pand %xmm0, %xmm5
1060 ; SSE41-NEXT:    por %xmm5, %xmm2
1061 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1062 ; SSE41-NEXT:    retq
1064 ; AVX1-LABEL: splatvar_funnnel_v16i8:
1065 ; AVX1:       # %bb.0:
1066 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1067 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1068 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
1069 ; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm3 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
1070 ; AVX1-NEXT:    vpsllw %xmm3, %xmm0, %xmm4
1071 ; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
1072 ; AVX1-NEXT:    vpsllw %xmm3, %xmm5, %xmm3
1073 ; AVX1-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
1074 ; AVX1-NEXT:    vpand %xmm2, %xmm4, %xmm2
1075 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1076 ; AVX1-NEXT:    vpsubb %xmm1, %xmm3, %xmm1
1077 ; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
1078 ; AVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
1079 ; AVX1-NEXT:    vpsrlw %xmm1, %xmm5, %xmm1
1080 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1081 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
1082 ; AVX1-NEXT:    vpor %xmm0, %xmm2, %xmm0
1083 ; AVX1-NEXT:    retq
1085 ; AVX2-LABEL: splatvar_funnnel_v16i8:
1086 ; AVX2:       # %bb.0:
1087 ; AVX2-NEXT:    vpbroadcastb %xmm1, %xmm1
1088 ; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
1089 ; AVX2-NEXT:    vpmovzxbq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
1090 ; AVX2-NEXT:    vpsllw %xmm2, %xmm0, %xmm3
1091 ; AVX2-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
1092 ; AVX2-NEXT:    vpsllw %xmm2, %xmm4, %xmm2
1093 ; AVX2-NEXT:    vpbroadcastb %xmm2, %xmm2
1094 ; AVX2-NEXT:    vpand %xmm2, %xmm3, %xmm2
1095 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1096 ; AVX2-NEXT:    vpsubb %xmm1, %xmm3, %xmm1
1097 ; AVX2-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
1098 ; AVX2-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
1099 ; AVX2-NEXT:    vpsrlw %xmm1, %xmm4, %xmm1
1100 ; AVX2-NEXT:    vpsrlw $8, %xmm1, %xmm1
1101 ; AVX2-NEXT:    vpbroadcastb %xmm1, %xmm1
1102 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
1103 ; AVX2-NEXT:    vpor %xmm0, %xmm2, %xmm0
1104 ; AVX2-NEXT:    retq
1106 ; AVX512F-LABEL: splatvar_funnnel_v16i8:
1107 ; AVX512F:       # %bb.0:
1108 ; AVX512F-NEXT:    vpbroadcastb %xmm1, %xmm1
1109 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm2 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1110 ; AVX512F-NEXT:    vpand %xmm2, %xmm1, %xmm3
1111 ; AVX512F-NEXT:    vpmovzxbd {{.*#+}} zmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero,xmm3[4],zero,zero,zero,xmm3[5],zero,zero,zero,xmm3[6],zero,zero,zero,xmm3[7],zero,zero,zero,xmm3[8],zero,zero,zero,xmm3[9],zero,zero,zero,xmm3[10],zero,zero,zero,xmm3[11],zero,zero,zero,xmm3[12],zero,zero,zero,xmm3[13],zero,zero,zero,xmm3[14],zero,zero,zero,xmm3[15],zero,zero,zero
1112 ; AVX512F-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
1113 ; AVX512F-NEXT:    vpsllvd %zmm3, %zmm0, %zmm3
1114 ; AVX512F-NEXT:    vpxor %xmm4, %xmm4, %xmm4
1115 ; AVX512F-NEXT:    vpsubb %xmm1, %xmm4, %xmm1
1116 ; AVX512F-NEXT:    vpand %xmm2, %xmm1, %xmm1
1117 ; AVX512F-NEXT:    vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero
1118 ; AVX512F-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0
1119 ; AVX512F-NEXT:    vpord %zmm0, %zmm3, %zmm0
1120 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
1121 ; AVX512F-NEXT:    vzeroupper
1122 ; AVX512F-NEXT:    retq
1124 ; AVX512VL-LABEL: splatvar_funnnel_v16i8:
1125 ; AVX512VL:       # %bb.0:
1126 ; AVX512VL-NEXT:    vpbroadcastb %xmm1, %xmm1
1127 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm2 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1128 ; AVX512VL-NEXT:    vpand %xmm2, %xmm1, %xmm3
1129 ; AVX512VL-NEXT:    vpmovzxbd {{.*#+}} zmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero,xmm3[4],zero,zero,zero,xmm3[5],zero,zero,zero,xmm3[6],zero,zero,zero,xmm3[7],zero,zero,zero,xmm3[8],zero,zero,zero,xmm3[9],zero,zero,zero,xmm3[10],zero,zero,zero,xmm3[11],zero,zero,zero,xmm3[12],zero,zero,zero,xmm3[13],zero,zero,zero,xmm3[14],zero,zero,zero,xmm3[15],zero,zero,zero
1130 ; AVX512VL-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
1131 ; AVX512VL-NEXT:    vpsllvd %zmm3, %zmm0, %zmm3
1132 ; AVX512VL-NEXT:    vpxor %xmm4, %xmm4, %xmm4
1133 ; AVX512VL-NEXT:    vpsubb %xmm1, %xmm4, %xmm1
1134 ; AVX512VL-NEXT:    vpand %xmm2, %xmm1, %xmm1
1135 ; AVX512VL-NEXT:    vpmovzxbd {{.*#+}} zmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero
1136 ; AVX512VL-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0
1137 ; AVX512VL-NEXT:    vpord %zmm0, %zmm3, %zmm0
1138 ; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
1139 ; AVX512VL-NEXT:    vzeroupper
1140 ; AVX512VL-NEXT:    retq
1142 ; AVX512BW-LABEL: splatvar_funnnel_v16i8:
1143 ; AVX512BW:       # %bb.0:
1144 ; AVX512BW-NEXT:    vpbroadcastb %xmm1, %xmm1
1145 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
1146 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1147 ; AVX512BW-NEXT:    vpand %xmm2, %xmm1, %xmm3
1148 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero,xmm3[8],zero,xmm3[9],zero,xmm3[10],zero,xmm3[11],zero,xmm3[12],zero,xmm3[13],zero,xmm3[14],zero,xmm3[15],zero
1149 ; AVX512BW-NEXT:    vpsllvw %zmm3, %zmm0, %zmm3
1150 ; AVX512BW-NEXT:    vpxor %xmm4, %xmm4, %xmm4
1151 ; AVX512BW-NEXT:    vpsubb %xmm1, %xmm4, %xmm1
1152 ; AVX512BW-NEXT:    vpand %xmm2, %xmm1, %xmm1
1153 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1154 ; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
1155 ; AVX512BW-NEXT:    vpor %ymm0, %ymm3, %ymm0
1156 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
1157 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1158 ; AVX512BW-NEXT:    vzeroupper
1159 ; AVX512BW-NEXT:    retq
1161 ; AVX512VLBW-LABEL: splatvar_funnnel_v16i8:
1162 ; AVX512VLBW:       # %bb.0:
1163 ; AVX512VLBW-NEXT:    vpbroadcastb %xmm1, %xmm1
1164 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm2 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1165 ; AVX512VLBW-NEXT:    vpand %xmm2, %xmm1, %xmm3
1166 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} ymm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero,xmm3[8],zero,xmm3[9],zero,xmm3[10],zero,xmm3[11],zero,xmm3[12],zero,xmm3[13],zero,xmm3[14],zero,xmm3[15],zero
1167 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
1168 ; AVX512VLBW-NEXT:    vpsllvw %ymm3, %ymm0, %ymm3
1169 ; AVX512VLBW-NEXT:    vpxor %xmm4, %xmm4, %xmm4
1170 ; AVX512VLBW-NEXT:    vpsubb %xmm1, %xmm4, %xmm1
1171 ; AVX512VLBW-NEXT:    vpand %xmm2, %xmm1, %xmm1
1172 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1173 ; AVX512VLBW-NEXT:    vpsrlvw %ymm1, %ymm0, %ymm0
1174 ; AVX512VLBW-NEXT:    vpor %ymm0, %ymm3, %ymm0
1175 ; AVX512VLBW-NEXT:    vpmovwb %ymm0, %xmm0
1176 ; AVX512VLBW-NEXT:    vzeroupper
1177 ; AVX512VLBW-NEXT:    retq
1179 ; XOPAVX1-LABEL: splatvar_funnnel_v16i8:
1180 ; XOPAVX1:       # %bb.0:
1181 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1182 ; XOPAVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1183 ; XOPAVX1-NEXT:    vprotb %xmm1, %xmm0, %xmm0
1184 ; XOPAVX1-NEXT:    retq
1186 ; XOPAVX2-LABEL: splatvar_funnnel_v16i8:
1187 ; XOPAVX2:       # %bb.0:
1188 ; XOPAVX2-NEXT:    vpbroadcastb %xmm1, %xmm1
1189 ; XOPAVX2-NEXT:    vprotb %xmm1, %xmm0, %xmm0
1190 ; XOPAVX2-NEXT:    retq
1192 ; X32-SSE-LABEL: splatvar_funnnel_v16i8:
1193 ; X32-SSE:       # %bb.0:
1194 ; X32-SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1195 ; X32-SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7]
1196 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
1197 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm1
1198 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1199 ; X32-SSE-NEXT:    psubb %xmm1, %xmm2
1200 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm3
1201 ; X32-SSE-NEXT:    pslldq {{.*#+}} xmm3 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm3[0]
1202 ; X32-SSE-NEXT:    psrldq {{.*#+}} xmm3 = xmm3[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1203 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1204 ; X32-SSE-NEXT:    psllw %xmm3, %xmm1
1205 ; X32-SSE-NEXT:    pcmpeqd %xmm4, %xmm4
1206 ; X32-SSE-NEXT:    pcmpeqd %xmm5, %xmm5
1207 ; X32-SSE-NEXT:    psllw %xmm3, %xmm5
1208 ; X32-SSE-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1209 ; X32-SSE-NEXT:    pshuflw {{.*#+}} xmm3 = xmm5[0,0,2,3,4,5,6,7]
1210 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,0,0,0]
1211 ; X32-SSE-NEXT:    pand %xmm3, %xmm1
1212 ; X32-SSE-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0]
1213 ; X32-SSE-NEXT:    psrldq {{.*#+}} xmm2 = xmm2[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1214 ; X32-SSE-NEXT:    psrlw %xmm2, %xmm0
1215 ; X32-SSE-NEXT:    psrlw %xmm2, %xmm4
1216 ; X32-SSE-NEXT:    psrlw $8, %xmm4
1217 ; X32-SSE-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1218 ; X32-SSE-NEXT:    pshuflw {{.*#+}} xmm2 = xmm4[0,0,2,3,4,5,6,7]
1219 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]
1220 ; X32-SSE-NEXT:    pand %xmm0, %xmm2
1221 ; X32-SSE-NEXT:    por %xmm2, %xmm1
1222 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm0
1223 ; X32-SSE-NEXT:    retl
1224   %splat = shufflevector <16 x i8> %amt, <16 x i8> undef, <16 x i32> zeroinitializer
1225   %res = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %x, <16 x i8> %x, <16 x i8> %splat)
1226   ret <16 x i8> %res
1230 ; Constant Shifts
1233 define <2 x i64> @constant_funnnel_v2i64(<2 x i64> %x) nounwind {
1234 ; SSE2-LABEL: constant_funnnel_v2i64:
1235 ; SSE2:       # %bb.0:
1236 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1237 ; SSE2-NEXT:    psrlq $60, %xmm1
1238 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1239 ; SSE2-NEXT:    psrlq $50, %xmm2
1240 ; SSE2-NEXT:    movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1]
1241 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1242 ; SSE2-NEXT:    psllq $4, %xmm1
1243 ; SSE2-NEXT:    psllq $14, %xmm0
1244 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1245 ; SSE2-NEXT:    orpd %xmm2, %xmm0
1246 ; SSE2-NEXT:    retq
1248 ; SSE41-LABEL: constant_funnnel_v2i64:
1249 ; SSE41:       # %bb.0:
1250 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
1251 ; SSE41-NEXT:    psrlq $50, %xmm1
1252 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1253 ; SSE41-NEXT:    psrlq $60, %xmm2
1254 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5,6,7]
1255 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
1256 ; SSE41-NEXT:    psllq $14, %xmm1
1257 ; SSE41-NEXT:    psllq $4, %xmm0
1258 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
1259 ; SSE41-NEXT:    por %xmm2, %xmm0
1260 ; SSE41-NEXT:    retq
1262 ; AVX1-LABEL: constant_funnnel_v2i64:
1263 ; AVX1:       # %bb.0:
1264 ; AVX1-NEXT:    vpsrlq $50, %xmm0, %xmm1
1265 ; AVX1-NEXT:    vpsrlq $60, %xmm0, %xmm2
1266 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]
1267 ; AVX1-NEXT:    vpsllq $14, %xmm0, %xmm2
1268 ; AVX1-NEXT:    vpsllq $4, %xmm0, %xmm0
1269 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
1270 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
1271 ; AVX1-NEXT:    retq
1273 ; AVX2-LABEL: constant_funnnel_v2i64:
1274 ; AVX2:       # %bb.0:
1275 ; AVX2-NEXT:    vpsrlvq {{.*}}(%rip), %xmm0, %xmm1
1276 ; AVX2-NEXT:    vpsllvq {{.*}}(%rip), %xmm0, %xmm0
1277 ; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
1278 ; AVX2-NEXT:    retq
1280 ; AVX512F-LABEL: constant_funnnel_v2i64:
1281 ; AVX512F:       # %bb.0:
1282 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1283 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm1 = [4,14]
1284 ; AVX512F-NEXT:    vprolvq %zmm1, %zmm0, %zmm0
1285 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1286 ; AVX512F-NEXT:    vzeroupper
1287 ; AVX512F-NEXT:    retq
1289 ; AVX512VL-LABEL: constant_funnnel_v2i64:
1290 ; AVX512VL:       # %bb.0:
1291 ; AVX512VL-NEXT:    vprolvq {{.*}}(%rip), %xmm0, %xmm0
1292 ; AVX512VL-NEXT:    retq
1294 ; AVX512BW-LABEL: constant_funnnel_v2i64:
1295 ; AVX512BW:       # %bb.0:
1296 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1297 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm1 = [4,14]
1298 ; AVX512BW-NEXT:    vprolvq %zmm1, %zmm0, %zmm0
1299 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1300 ; AVX512BW-NEXT:    vzeroupper
1301 ; AVX512BW-NEXT:    retq
1303 ; AVX512VLBW-LABEL: constant_funnnel_v2i64:
1304 ; AVX512VLBW:       # %bb.0:
1305 ; AVX512VLBW-NEXT:    vprolvq {{.*}}(%rip), %xmm0, %xmm0
1306 ; AVX512VLBW-NEXT:    retq
1308 ; XOP-LABEL: constant_funnnel_v2i64:
1309 ; XOP:       # %bb.0:
1310 ; XOP-NEXT:    vprotq {{.*}}(%rip), %xmm0, %xmm0
1311 ; XOP-NEXT:    retq
1313 ; X32-SSE-LABEL: constant_funnnel_v2i64:
1314 ; X32-SSE:       # %bb.0:
1315 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1316 ; X32-SSE-NEXT:    psrlq $60, %xmm1
1317 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
1318 ; X32-SSE-NEXT:    psrlq $50, %xmm2
1319 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1]
1320 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1321 ; X32-SSE-NEXT:    psllq $4, %xmm1
1322 ; X32-SSE-NEXT:    psllq $14, %xmm0
1323 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1324 ; X32-SSE-NEXT:    orpd %xmm2, %xmm0
1325 ; X32-SSE-NEXT:    retl
1326   %res = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> %x, <2 x i64> %x, <2 x i64> <i64 4, i64 14>)
1327   ret <2 x i64> %res
1330 define <4 x i32> @constant_funnnel_v4i32(<4 x i32> %x) nounwind {
1331 ; SSE2-LABEL: constant_funnnel_v4i32:
1332 ; SSE2:       # %bb.0:
1333 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [16,32,64,128]
1334 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
1335 ; SSE2-NEXT:    pmuludq %xmm1, %xmm0
1336 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]
1337 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1338 ; SSE2-NEXT:    pmuludq %xmm2, %xmm1
1339 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]
1340 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
1341 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1342 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
1343 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1344 ; SSE2-NEXT:    por %xmm3, %xmm0
1345 ; SSE2-NEXT:    retq
1347 ; SSE41-LABEL: constant_funnnel_v4i32:
1348 ; SSE41:       # %bb.0:
1349 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [16,32,64,128]
1350 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
1351 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
1352 ; SSE41-NEXT:    pmuludq %xmm2, %xmm3
1353 ; SSE41-NEXT:    pmuludq %xmm1, %xmm0
1354 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
1355 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]
1356 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
1357 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
1358 ; SSE41-NEXT:    por %xmm1, %xmm0
1359 ; SSE41-NEXT:    retq
1361 ; AVX1-LABEL: constant_funnnel_v4i32:
1362 ; AVX1:       # %bb.0:
1363 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [16,32,64,128]
1364 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
1365 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
1366 ; AVX1-NEXT:    vpmuludq %xmm2, %xmm3, %xmm2
1367 ; AVX1-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
1368 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
1369 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
1370 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[0,0,2,2]
1371 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
1372 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
1373 ; AVX1-NEXT:    retq
1375 ; AVX2-LABEL: constant_funnnel_v4i32:
1376 ; AVX2:       # %bb.0:
1377 ; AVX2-NEXT:    vpsrlvd {{.*}}(%rip), %xmm0, %xmm1
1378 ; AVX2-NEXT:    vpsllvd {{.*}}(%rip), %xmm0, %xmm0
1379 ; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
1380 ; AVX2-NEXT:    retq
1382 ; AVX512F-LABEL: constant_funnnel_v4i32:
1383 ; AVX512F:       # %bb.0:
1384 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1385 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm1 = [4,5,6,7]
1386 ; AVX512F-NEXT:    vprolvd %zmm1, %zmm0, %zmm0
1387 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1388 ; AVX512F-NEXT:    vzeroupper
1389 ; AVX512F-NEXT:    retq
1391 ; AVX512VL-LABEL: constant_funnnel_v4i32:
1392 ; AVX512VL:       # %bb.0:
1393 ; AVX512VL-NEXT:    vprolvd {{.*}}(%rip), %xmm0, %xmm0
1394 ; AVX512VL-NEXT:    retq
1396 ; AVX512BW-LABEL: constant_funnnel_v4i32:
1397 ; AVX512BW:       # %bb.0:
1398 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1399 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm1 = [4,5,6,7]
1400 ; AVX512BW-NEXT:    vprolvd %zmm1, %zmm0, %zmm0
1401 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1402 ; AVX512BW-NEXT:    vzeroupper
1403 ; AVX512BW-NEXT:    retq
1405 ; AVX512VLBW-LABEL: constant_funnnel_v4i32:
1406 ; AVX512VLBW:       # %bb.0:
1407 ; AVX512VLBW-NEXT:    vprolvd {{.*}}(%rip), %xmm0, %xmm0
1408 ; AVX512VLBW-NEXT:    retq
1410 ; XOP-LABEL: constant_funnnel_v4i32:
1411 ; XOP:       # %bb.0:
1412 ; XOP-NEXT:    vprotd {{.*}}(%rip), %xmm0, %xmm0
1413 ; XOP-NEXT:    retq
1415 ; X32-SSE-LABEL: constant_funnnel_v4i32:
1416 ; X32-SSE:       # %bb.0:
1417 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [16,32,64,128]
1418 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
1419 ; X32-SSE-NEXT:    pmuludq %xmm1, %xmm0
1420 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]
1421 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1422 ; X32-SSE-NEXT:    pmuludq %xmm2, %xmm1
1423 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]
1424 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
1425 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1426 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
1427 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1428 ; X32-SSE-NEXT:    por %xmm3, %xmm0
1429 ; X32-SSE-NEXT:    retl
1430   %res = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %x, <4 x i32> <i32 4, i32 5, i32 6, i32 7>)
1431   ret <4 x i32> %res
1434 define <8 x i16> @constant_funnnel_v8i16(<8 x i16> %x) nounwind {
1435 ; SSE-LABEL: constant_funnnel_v8i16:
1436 ; SSE:       # %bb.0:
1437 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
1438 ; SSE-NEXT:    movdqa %xmm0, %xmm2
1439 ; SSE-NEXT:    pmulhuw %xmm1, %xmm2
1440 ; SSE-NEXT:    pmullw %xmm1, %xmm0
1441 ; SSE-NEXT:    por %xmm2, %xmm0
1442 ; SSE-NEXT:    retq
1444 ; AVX-LABEL: constant_funnnel_v8i16:
1445 ; AVX:       # %bb.0:
1446 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
1447 ; AVX-NEXT:    vpmulhuw %xmm1, %xmm0, %xmm2
1448 ; AVX-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1449 ; AVX-NEXT:    vpor %xmm2, %xmm0, %xmm0
1450 ; AVX-NEXT:    retq
1452 ; AVX512F-LABEL: constant_funnnel_v8i16:
1453 ; AVX512F:       # %bb.0:
1454 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
1455 ; AVX512F-NEXT:    vpmulhuw %xmm1, %xmm0, %xmm2
1456 ; AVX512F-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1457 ; AVX512F-NEXT:    vpor %xmm2, %xmm0, %xmm0
1458 ; AVX512F-NEXT:    retq
1460 ; AVX512VL-LABEL: constant_funnnel_v8i16:
1461 ; AVX512VL:       # %bb.0:
1462 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
1463 ; AVX512VL-NEXT:    vpmulhuw %xmm1, %xmm0, %xmm2
1464 ; AVX512VL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1465 ; AVX512VL-NEXT:    vpor %xmm2, %xmm0, %xmm0
1466 ; AVX512VL-NEXT:    retq
1468 ; AVX512BW-LABEL: constant_funnnel_v8i16:
1469 ; AVX512BW:       # %bb.0:
1470 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1471 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm1 = [16,15,14,13,12,11,10,9]
1472 ; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm1
1473 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7]
1474 ; AVX512BW-NEXT:    vpsllvw %zmm2, %zmm0, %zmm0
1475 ; AVX512BW-NEXT:    vpor %xmm1, %xmm0, %xmm0
1476 ; AVX512BW-NEXT:    vzeroupper
1477 ; AVX512BW-NEXT:    retq
1479 ; AVX512VLBW-LABEL: constant_funnnel_v8i16:
1480 ; AVX512VLBW:       # %bb.0:
1481 ; AVX512VLBW-NEXT:    vpsrlvw {{.*}}(%rip), %xmm0, %xmm1
1482 ; AVX512VLBW-NEXT:    vpsllvw {{.*}}(%rip), %xmm0, %xmm0
1483 ; AVX512VLBW-NEXT:    vpor %xmm1, %xmm0, %xmm0
1484 ; AVX512VLBW-NEXT:    retq
1486 ; XOP-LABEL: constant_funnnel_v8i16:
1487 ; XOP:       # %bb.0:
1488 ; XOP-NEXT:    vprotw {{.*}}(%rip), %xmm0, %xmm0
1489 ; XOP-NEXT:    retq
1491 ; X32-SSE-LABEL: constant_funnnel_v8i16:
1492 ; X32-SSE:       # %bb.0:
1493 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
1494 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
1495 ; X32-SSE-NEXT:    pmulhuw %xmm1, %xmm2
1496 ; X32-SSE-NEXT:    pmullw %xmm1, %xmm0
1497 ; X32-SSE-NEXT:    por %xmm2, %xmm0
1498 ; X32-SSE-NEXT:    retl
1499   %res = call <8 x i16> @llvm.fshl.v8i16(<8 x i16> %x, <8 x i16> %x, <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>)
1500   ret <8 x i16> %res
1503 define <16 x i8> @constant_funnnel_v16i8(<16 x i8> %x) nounwind {
1504 ; SSE2-LABEL: constant_funnnel_v16i8:
1505 ; SSE2:       # %bb.0:
1506 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1507 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1508 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
1509 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm2
1510 ; SSE2-NEXT:    psrlw $8, %xmm2
1511 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1512 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3],xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
1513 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm3
1514 ; SSE2-NEXT:    psrlw $8, %xmm3
1515 ; SSE2-NEXT:    packuswb %xmm2, %xmm3
1516 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1517 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
1518 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm1
1519 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
1520 ; SSE2-NEXT:    pand %xmm2, %xmm1
1521 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1522 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm0
1523 ; SSE2-NEXT:    pand %xmm2, %xmm0
1524 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
1525 ; SSE2-NEXT:    por %xmm3, %xmm0
1526 ; SSE2-NEXT:    retq
1528 ; SSE41-LABEL: constant_funnnel_v16i8:
1529 ; SSE41:       # %bb.0:
1530 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1531 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
1532 ; SSE41-NEXT:    pmullw {{.*}}(%rip), %xmm2
1533 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
1534 ; SSE41-NEXT:    pand %xmm3, %xmm2
1535 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1536 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128]
1537 ; SSE41-NEXT:    pmullw %xmm1, %xmm4
1538 ; SSE41-NEXT:    pand %xmm3, %xmm4
1539 ; SSE41-NEXT:    packuswb %xmm2, %xmm4
1540 ; SSE41-NEXT:    pxor %xmm2, %xmm2
1541 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm2[8],xmm0[9],xmm2[9],xmm0[10],xmm2[10],xmm0[11],xmm2[11],xmm0[12],xmm2[12],xmm0[13],xmm2[13],xmm0[14],xmm2[14],xmm0[15],xmm2[15]
1542 ; SSE41-NEXT:    pmullw {{.*}}(%rip), %xmm0
1543 ; SSE41-NEXT:    psrlw $8, %xmm0
1544 ; SSE41-NEXT:    pmullw {{.*}}(%rip), %xmm1
1545 ; SSE41-NEXT:    psrlw $8, %xmm1
1546 ; SSE41-NEXT:    packuswb %xmm0, %xmm1
1547 ; SSE41-NEXT:    por %xmm4, %xmm1
1548 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1549 ; SSE41-NEXT:    retq
1551 ; AVX1-LABEL: constant_funnnel_v16i8:
1552 ; AVX1:       # %bb.0:
1553 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1554 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm1, %xmm1
1555 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
1556 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
1557 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1558 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm3, %xmm4
1559 ; AVX1-NEXT:    vpand %xmm2, %xmm4, %xmm2
1560 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm2, %xmm1
1561 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1562 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8],xmm2[8],xmm0[9],xmm2[9],xmm0[10],xmm2[10],xmm0[11],xmm2[11],xmm0[12],xmm2[12],xmm0[13],xmm2[13],xmm0[14],xmm2[14],xmm0[15],xmm2[15]
1563 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
1564 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
1565 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm3, %xmm2
1566 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
1567 ; AVX1-NEXT:    vpackuswb %xmm0, %xmm2, %xmm0
1568 ; AVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
1569 ; AVX1-NEXT:    retq
1571 ; AVX2-LABEL: constant_funnnel_v16i8:
1572 ; AVX2:       # %bb.0:
1573 ; AVX2-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
1574 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm1
1575 ; AVX2-NEXT:    vpsrlw $8, %ymm1, %ymm1
1576 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
1577 ; AVX2-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
1578 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
1579 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
1580 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
1581 ; AVX2-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
1582 ; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
1583 ; AVX2-NEXT:    vzeroupper
1584 ; AVX2-NEXT:    retq
1586 ; AVX512F-LABEL: constant_funnnel_v16i8:
1587 ; AVX512F:       # %bb.0:
1588 ; AVX512F-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
1589 ; AVX512F-NEXT:    vpsrlvd {{.*}}(%rip), %zmm0, %zmm1
1590 ; AVX512F-NEXT:    vpsllvd {{.*}}(%rip), %zmm0, %zmm0
1591 ; AVX512F-NEXT:    vpord %zmm1, %zmm0, %zmm0
1592 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
1593 ; AVX512F-NEXT:    vzeroupper
1594 ; AVX512F-NEXT:    retq
1596 ; AVX512VL-LABEL: constant_funnnel_v16i8:
1597 ; AVX512VL:       # %bb.0:
1598 ; AVX512VL-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
1599 ; AVX512VL-NEXT:    vpsrlvd {{.*}}(%rip), %zmm0, %zmm1
1600 ; AVX512VL-NEXT:    vpsllvd {{.*}}(%rip), %zmm0, %zmm0
1601 ; AVX512VL-NEXT:    vpord %zmm1, %zmm0, %zmm0
1602 ; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
1603 ; AVX512VL-NEXT:    vzeroupper
1604 ; AVX512VL-NEXT:    retq
1606 ; AVX512BW-LABEL: constant_funnnel_v16i8:
1607 ; AVX512BW:       # %bb.0:
1608 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,7,6,5,4,3,2,1,0,1,2,3,4,5,6,7]
1609 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
1610 ; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm1
1611 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,0,7,6,5,4,3,2,1]
1612 ; AVX512BW-NEXT:    vpsllvw %zmm2, %zmm0, %zmm0
1613 ; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm0
1614 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
1615 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1616 ; AVX512BW-NEXT:    vzeroupper
1617 ; AVX512BW-NEXT:    retq
1619 ; AVX512VLBW-LABEL: constant_funnnel_v16i8:
1620 ; AVX512VLBW:       # %bb.0:
1621 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
1622 ; AVX512VLBW-NEXT:    vpsrlvw {{.*}}(%rip), %ymm0, %ymm1
1623 ; AVX512VLBW-NEXT:    vpsllvw {{.*}}(%rip), %ymm0, %ymm0
1624 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm0
1625 ; AVX512VLBW-NEXT:    vpmovwb %ymm0, %xmm0
1626 ; AVX512VLBW-NEXT:    vzeroupper
1627 ; AVX512VLBW-NEXT:    retq
1629 ; XOP-LABEL: constant_funnnel_v16i8:
1630 ; XOP:       # %bb.0:
1631 ; XOP-NEXT:    vprotb {{.*}}(%rip), %xmm0, %xmm0
1632 ; XOP-NEXT:    retq
1634 ; X32-SSE-LABEL: constant_funnnel_v16i8:
1635 ; X32-SSE:       # %bb.0:
1636 ; X32-SSE-NEXT:    pxor %xmm1, %xmm1
1637 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
1638 ; X32-SSE-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
1639 ; X32-SSE-NEXT:    pmullw {{\.LCPI.*}}, %xmm2
1640 ; X32-SSE-NEXT:    psrlw $8, %xmm2
1641 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm3
1642 ; X32-SSE-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3],xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
1643 ; X32-SSE-NEXT:    pmullw {{\.LCPI.*}}, %xmm3
1644 ; X32-SSE-NEXT:    psrlw $8, %xmm3
1645 ; X32-SSE-NEXT:    packuswb %xmm2, %xmm3
1646 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1647 ; X32-SSE-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
1648 ; X32-SSE-NEXT:    pmullw {{\.LCPI.*}}, %xmm1
1649 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
1650 ; X32-SSE-NEXT:    pand %xmm2, %xmm1
1651 ; X32-SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1652 ; X32-SSE-NEXT:    pmullw {{\.LCPI.*}}, %xmm0
1653 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
1654 ; X32-SSE-NEXT:    packuswb %xmm1, %xmm0
1655 ; X32-SSE-NEXT:    por %xmm3, %xmm0
1656 ; X32-SSE-NEXT:    retl
1657   %res = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %x, <16 x i8> %x, <16 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>)
1658   ret <16 x i8> %res
1662 ; Uniform Constant Shifts
1665 define <2 x i64> @splatconstant_funnnel_v2i64(<2 x i64> %x) nounwind {
1666 ; SSE-LABEL: splatconstant_funnnel_v2i64:
1667 ; SSE:       # %bb.0:
1668 ; SSE-NEXT:    movdqa %xmm0, %xmm1
1669 ; SSE-NEXT:    psrlq $50, %xmm1
1670 ; SSE-NEXT:    psllq $14, %xmm0
1671 ; SSE-NEXT:    por %xmm1, %xmm0
1672 ; SSE-NEXT:    retq
1674 ; AVX-LABEL: splatconstant_funnnel_v2i64:
1675 ; AVX:       # %bb.0:
1676 ; AVX-NEXT:    vpsrlq $50, %xmm0, %xmm1
1677 ; AVX-NEXT:    vpsllq $14, %xmm0, %xmm0
1678 ; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1679 ; AVX-NEXT:    retq
1681 ; AVX512F-LABEL: splatconstant_funnnel_v2i64:
1682 ; AVX512F:       # %bb.0:
1683 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1684 ; AVX512F-NEXT:    vprolq $14, %zmm0, %zmm0
1685 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1686 ; AVX512F-NEXT:    vzeroupper
1687 ; AVX512F-NEXT:    retq
1689 ; AVX512VL-LABEL: splatconstant_funnnel_v2i64:
1690 ; AVX512VL:       # %bb.0:
1691 ; AVX512VL-NEXT:    vprolq $14, %xmm0, %xmm0
1692 ; AVX512VL-NEXT:    retq
1694 ; AVX512BW-LABEL: splatconstant_funnnel_v2i64:
1695 ; AVX512BW:       # %bb.0:
1696 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1697 ; AVX512BW-NEXT:    vprolq $14, %zmm0, %zmm0
1698 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1699 ; AVX512BW-NEXT:    vzeroupper
1700 ; AVX512BW-NEXT:    retq
1702 ; AVX512VLBW-LABEL: splatconstant_funnnel_v2i64:
1703 ; AVX512VLBW:       # %bb.0:
1704 ; AVX512VLBW-NEXT:    vprolq $14, %xmm0, %xmm0
1705 ; AVX512VLBW-NEXT:    retq
1707 ; XOP-LABEL: splatconstant_funnnel_v2i64:
1708 ; XOP:       # %bb.0:
1709 ; XOP-NEXT:    vprotq $14, %xmm0, %xmm0
1710 ; XOP-NEXT:    retq
1712 ; X32-SSE-LABEL: splatconstant_funnnel_v2i64:
1713 ; X32-SSE:       # %bb.0:
1714 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1715 ; X32-SSE-NEXT:    psrlq $50, %xmm1
1716 ; X32-SSE-NEXT:    psllq $14, %xmm0
1717 ; X32-SSE-NEXT:    por %xmm1, %xmm0
1718 ; X32-SSE-NEXT:    retl
1719   %res = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> %x, <2 x i64> %x, <2 x i64> <i64 14, i64 14>)
1720   ret <2 x i64> %res
1723 define <4 x i32> @splatconstant_funnnel_v4i32(<4 x i32> %x) nounwind {
1724 ; SSE-LABEL: splatconstant_funnnel_v4i32:
1725 ; SSE:       # %bb.0:
1726 ; SSE-NEXT:    movdqa %xmm0, %xmm1
1727 ; SSE-NEXT:    psrld $28, %xmm1
1728 ; SSE-NEXT:    pslld $4, %xmm0
1729 ; SSE-NEXT:    por %xmm1, %xmm0
1730 ; SSE-NEXT:    retq
1732 ; AVX-LABEL: splatconstant_funnnel_v4i32:
1733 ; AVX:       # %bb.0:
1734 ; AVX-NEXT:    vpsrld $28, %xmm0, %xmm1
1735 ; AVX-NEXT:    vpslld $4, %xmm0, %xmm0
1736 ; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1737 ; AVX-NEXT:    retq
1739 ; AVX512F-LABEL: splatconstant_funnnel_v4i32:
1740 ; AVX512F:       # %bb.0:
1741 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1742 ; AVX512F-NEXT:    vprold $4, %zmm0, %zmm0
1743 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1744 ; AVX512F-NEXT:    vzeroupper
1745 ; AVX512F-NEXT:    retq
1747 ; AVX512VL-LABEL: splatconstant_funnnel_v4i32:
1748 ; AVX512VL:       # %bb.0:
1749 ; AVX512VL-NEXT:    vprold $4, %xmm0, %xmm0
1750 ; AVX512VL-NEXT:    retq
1752 ; AVX512BW-LABEL: splatconstant_funnnel_v4i32:
1753 ; AVX512BW:       # %bb.0:
1754 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1755 ; AVX512BW-NEXT:    vprold $4, %zmm0, %zmm0
1756 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1757 ; AVX512BW-NEXT:    vzeroupper
1758 ; AVX512BW-NEXT:    retq
1760 ; AVX512VLBW-LABEL: splatconstant_funnnel_v4i32:
1761 ; AVX512VLBW:       # %bb.0:
1762 ; AVX512VLBW-NEXT:    vprold $4, %xmm0, %xmm0
1763 ; AVX512VLBW-NEXT:    retq
1765 ; XOP-LABEL: splatconstant_funnnel_v4i32:
1766 ; XOP:       # %bb.0:
1767 ; XOP-NEXT:    vprotd $4, %xmm0, %xmm0
1768 ; XOP-NEXT:    retq
1770 ; X32-SSE-LABEL: splatconstant_funnnel_v4i32:
1771 ; X32-SSE:       # %bb.0:
1772 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1773 ; X32-SSE-NEXT:    psrld $28, %xmm1
1774 ; X32-SSE-NEXT:    pslld $4, %xmm0
1775 ; X32-SSE-NEXT:    por %xmm1, %xmm0
1776 ; X32-SSE-NEXT:    retl
1777   %res = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %x, <4 x i32> <i32 4, i32 4, i32 4, i32 4>)
1778   ret <4 x i32> %res
1781 define <8 x i16> @splatconstant_funnnel_v8i16(<8 x i16> %x) nounwind {
1782 ; SSE-LABEL: splatconstant_funnnel_v8i16:
1783 ; SSE:       # %bb.0:
1784 ; SSE-NEXT:    movdqa %xmm0, %xmm1
1785 ; SSE-NEXT:    psrlw $9, %xmm1
1786 ; SSE-NEXT:    psllw $7, %xmm0
1787 ; SSE-NEXT:    por %xmm1, %xmm0
1788 ; SSE-NEXT:    retq
1790 ; AVX-LABEL: splatconstant_funnnel_v8i16:
1791 ; AVX:       # %bb.0:
1792 ; AVX-NEXT:    vpsrlw $9, %xmm0, %xmm1
1793 ; AVX-NEXT:    vpsllw $7, %xmm0, %xmm0
1794 ; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1795 ; AVX-NEXT:    retq
1797 ; AVX512-LABEL: splatconstant_funnnel_v8i16:
1798 ; AVX512:       # %bb.0:
1799 ; AVX512-NEXT:    vpsrlw $9, %xmm0, %xmm1
1800 ; AVX512-NEXT:    vpsllw $7, %xmm0, %xmm0
1801 ; AVX512-NEXT:    vpor %xmm1, %xmm0, %xmm0
1802 ; AVX512-NEXT:    retq
1804 ; XOP-LABEL: splatconstant_funnnel_v8i16:
1805 ; XOP:       # %bb.0:
1806 ; XOP-NEXT:    vprotw $7, %xmm0, %xmm0
1807 ; XOP-NEXT:    retq
1809 ; X32-SSE-LABEL: splatconstant_funnnel_v8i16:
1810 ; X32-SSE:       # %bb.0:
1811 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1812 ; X32-SSE-NEXT:    psrlw $9, %xmm1
1813 ; X32-SSE-NEXT:    psllw $7, %xmm0
1814 ; X32-SSE-NEXT:    por %xmm1, %xmm0
1815 ; X32-SSE-NEXT:    retl
1816   %res = call <8 x i16> @llvm.fshl.v8i16(<8 x i16> %x, <8 x i16> %x, <8 x i16> <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>)
1817   ret <8 x i16> %res
1820 define <16 x i8> @splatconstant_funnnel_v16i8(<16 x i8> %x) nounwind {
1821 ; SSE-LABEL: splatconstant_funnnel_v16i8:
1822 ; SSE:       # %bb.0:
1823 ; SSE-NEXT:    movdqa %xmm0, %xmm1
1824 ; SSE-NEXT:    psrlw $4, %xmm1
1825 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm1
1826 ; SSE-NEXT:    psllw $4, %xmm0
1827 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
1828 ; SSE-NEXT:    por %xmm1, %xmm0
1829 ; SSE-NEXT:    retq
1831 ; AVX-LABEL: splatconstant_funnnel_v16i8:
1832 ; AVX:       # %bb.0:
1833 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm1
1834 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
1835 ; AVX-NEXT:    vpsllw $4, %xmm0, %xmm0
1836 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1837 ; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1838 ; AVX-NEXT:    retq
1840 ; AVX512-LABEL: splatconstant_funnnel_v16i8:
1841 ; AVX512:       # %bb.0:
1842 ; AVX512-NEXT:    vpsrlw $4, %xmm0, %xmm1
1843 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
1844 ; AVX512-NEXT:    vpsllw $4, %xmm0, %xmm0
1845 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1846 ; AVX512-NEXT:    vpor %xmm1, %xmm0, %xmm0
1847 ; AVX512-NEXT:    retq
1849 ; XOP-LABEL: splatconstant_funnnel_v16i8:
1850 ; XOP:       # %bb.0:
1851 ; XOP-NEXT:    vprotb $4, %xmm0, %xmm0
1852 ; XOP-NEXT:    retq
1854 ; X32-SSE-LABEL: splatconstant_funnnel_v16i8:
1855 ; X32-SSE:       # %bb.0:
1856 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1857 ; X32-SSE-NEXT:    psrlw $4, %xmm1
1858 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm1
1859 ; X32-SSE-NEXT:    psllw $4, %xmm0
1860 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
1861 ; X32-SSE-NEXT:    por %xmm1, %xmm0
1862 ; X32-SSE-NEXT:    retl
1863   %res = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %x, <16 x i8> %x, <16 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>)
1864   ret <16 x i8> %res