[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / vector-fshl-rot-128.ll
blobce521ad8896d9b012bf729b9b21e4cee227ab094
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:    movdqa %xmm1, %xmm2
280 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
281 ; SSE2-NEXT:    pslld $23, %xmm2
282 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]
283 ; SSE2-NEXT:    paddd %xmm3, %xmm2
284 ; SSE2-NEXT:    cvttps2dq %xmm2, %xmm2
285 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,2,2,3,4,5,6,7]
286 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,4,6,6,7]
287 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
288 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
289 ; SSE2-NEXT:    pslld $23, %xmm1
290 ; SSE2-NEXT:    paddd %xmm3, %xmm1
291 ; SSE2-NEXT:    cvttps2dq %xmm1, %xmm1
292 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
293 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,6,6,7]
294 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
295 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
296 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
297 ; SSE2-NEXT:    pmulhuw %xmm1, %xmm2
298 ; SSE2-NEXT:    pmullw %xmm1, %xmm0
299 ; SSE2-NEXT:    por %xmm2, %xmm0
300 ; SSE2-NEXT:    retq
302 ; SSE41-LABEL: var_funnnel_v8i16:
303 ; SSE41:       # %bb.0:
304 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm1
305 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
306 ; SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
307 ; SSE41-NEXT:    pslld $23, %xmm1
308 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]
309 ; SSE41-NEXT:    paddd %xmm3, %xmm1
310 ; SSE41-NEXT:    cvttps2dq %xmm1, %xmm1
311 ; SSE41-NEXT:    pslld $23, %xmm2
312 ; SSE41-NEXT:    paddd %xmm3, %xmm2
313 ; SSE41-NEXT:    cvttps2dq %xmm2, %xmm2
314 ; SSE41-NEXT:    packusdw %xmm1, %xmm2
315 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
316 ; SSE41-NEXT:    pmulhuw %xmm2, %xmm1
317 ; SSE41-NEXT:    pmullw %xmm2, %xmm0
318 ; SSE41-NEXT:    por %xmm1, %xmm0
319 ; SSE41-NEXT:    retq
321 ; AVX1-LABEL: var_funnnel_v8i16:
322 ; AVX1:       # %bb.0:
323 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
324 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm2 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
325 ; AVX1-NEXT:    vpslld $23, %xmm2, %xmm2
326 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]
327 ; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm2
328 ; AVX1-NEXT:    vcvttps2dq %xmm2, %xmm2
329 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
330 ; AVX1-NEXT:    vpslld $23, %xmm1, %xmm1
331 ; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm1
332 ; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1
333 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
334 ; AVX1-NEXT:    vpmulhuw %xmm1, %xmm0, %xmm2
335 ; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
336 ; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
337 ; AVX1-NEXT:    retq
339 ; AVX2-LABEL: var_funnnel_v8i16:
340 ; AVX2:       # %bb.0:
341 ; 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
342 ; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
343 ; 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
344 ; AVX2-NEXT:    vpsllvd %ymm2, %ymm0, %ymm2
345 ; 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]
346 ; AVX2-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
347 ; AVX2-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
348 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm4 = [16,16,16,16,16,16,16,16]
349 ; AVX2-NEXT:    vpsubw %xmm1, %xmm4, %xmm1
350 ; 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
351 ; AVX2-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
352 ; AVX2-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
353 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
354 ; AVX2-NEXT:    vpor %xmm0, %xmm2, %xmm0
355 ; AVX2-NEXT:    vzeroupper
356 ; AVX2-NEXT:    retq
358 ; AVX512F-LABEL: var_funnnel_v8i16:
359 ; AVX512F:       # %bb.0:
360 ; 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
361 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
362 ; 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
363 ; AVX512F-NEXT:    vpsllvd %ymm2, %ymm0, %ymm2
364 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]
365 ; AVX512F-NEXT:    vpsubw %xmm1, %xmm3, %xmm1
366 ; 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
367 ; AVX512F-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
368 ; AVX512F-NEXT:    vpor %ymm0, %ymm2, %ymm0
369 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
370 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
371 ; AVX512F-NEXT:    vzeroupper
372 ; AVX512F-NEXT:    retq
374 ; AVX512VL-LABEL: var_funnnel_v8i16:
375 ; AVX512VL:       # %bb.0:
376 ; 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
377 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
378 ; 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
379 ; AVX512VL-NEXT:    vpsllvd %ymm2, %ymm0, %ymm2
380 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]
381 ; AVX512VL-NEXT:    vpsubw %xmm1, %xmm3, %xmm1
382 ; 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
383 ; AVX512VL-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
384 ; AVX512VL-NEXT:    vpor %ymm0, %ymm2, %ymm0
385 ; AVX512VL-NEXT:    vpmovdw %ymm0, %xmm0
386 ; AVX512VL-NEXT:    vzeroupper
387 ; AVX512VL-NEXT:    retq
389 ; AVX512BW-LABEL: var_funnnel_v8i16:
390 ; AVX512BW:       # %bb.0:
391 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
392 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
393 ; AVX512BW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm2
394 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]
395 ; AVX512BW-NEXT:    vpsubw %xmm1, %xmm3, %xmm1
396 ; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
397 ; AVX512BW-NEXT:    vpor %xmm0, %xmm2, %xmm0
398 ; AVX512BW-NEXT:    vzeroupper
399 ; AVX512BW-NEXT:    retq
401 ; AVX512VLBW-LABEL: var_funnnel_v8i16:
402 ; AVX512VLBW:       # %bb.0:
403 ; AVX512VLBW-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
404 ; AVX512VLBW-NEXT:    vpsllvw %xmm1, %xmm0, %xmm2
405 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]
406 ; AVX512VLBW-NEXT:    vpsubw %xmm1, %xmm3, %xmm1
407 ; AVX512VLBW-NEXT:    vpsrlvw %xmm1, %xmm0, %xmm0
408 ; AVX512VLBW-NEXT:    vpor %xmm0, %xmm2, %xmm0
409 ; AVX512VLBW-NEXT:    retq
411 ; XOP-LABEL: var_funnnel_v8i16:
412 ; XOP:       # %bb.0:
413 ; XOP-NEXT:    vprotw %xmm1, %xmm0, %xmm0
414 ; XOP-NEXT:    retq
416 ; X32-SSE-LABEL: var_funnnel_v8i16:
417 ; X32-SSE:       # %bb.0:
418 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm1
419 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm2
420 ; X32-SSE-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
421 ; X32-SSE-NEXT:    pslld $23, %xmm2
422 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]
423 ; X32-SSE-NEXT:    paddd %xmm3, %xmm2
424 ; X32-SSE-NEXT:    cvttps2dq %xmm2, %xmm2
425 ; X32-SSE-NEXT:    pshuflw {{.*#+}} xmm2 = xmm2[0,2,2,3,4,5,6,7]
426 ; X32-SSE-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,4,6,6,7]
427 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
428 ; X32-SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
429 ; X32-SSE-NEXT:    pslld $23, %xmm1
430 ; X32-SSE-NEXT:    paddd %xmm3, %xmm1
431 ; X32-SSE-NEXT:    cvttps2dq %xmm1, %xmm1
432 ; X32-SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
433 ; X32-SSE-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,6,6,7]
434 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
435 ; X32-SSE-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
436 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
437 ; X32-SSE-NEXT:    pmulhuw %xmm1, %xmm2
438 ; X32-SSE-NEXT:    pmullw %xmm1, %xmm0
439 ; X32-SSE-NEXT:    por %xmm2, %xmm0
440 ; X32-SSE-NEXT:    retl
441   %res = call <8 x i16> @llvm.fshl.v8i16(<8 x i16> %x, <8 x i16> %x, <8 x i16> %amt)
442   ret <8 x i16> %res
445 define <16 x i8> @var_funnnel_v16i8(<16 x i8> %x, <16 x i8> %amt) nounwind {
446 ; SSE2-LABEL: var_funnnel_v16i8:
447 ; SSE2:       # %bb.0:
448 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
449 ; SSE2-NEXT:    psllw $5, %xmm1
450 ; SSE2-NEXT:    pxor %xmm0, %xmm0
451 ; SSE2-NEXT:    pxor %xmm3, %xmm3
452 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm3
453 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
454 ; SSE2-NEXT:    psrlw $4, %xmm4
455 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm4
456 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
457 ; SSE2-NEXT:    psllw $4, %xmm5
458 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm5
459 ; SSE2-NEXT:    por %xmm4, %xmm5
460 ; SSE2-NEXT:    pand %xmm3, %xmm5
461 ; SSE2-NEXT:    pandn %xmm2, %xmm3
462 ; SSE2-NEXT:    por %xmm5, %xmm3
463 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
464 ; SSE2-NEXT:    psrlw $6, %xmm2
465 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm2
466 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
467 ; SSE2-NEXT:    psllw $2, %xmm4
468 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm4
469 ; SSE2-NEXT:    por %xmm2, %xmm4
470 ; SSE2-NEXT:    paddb %xmm1, %xmm1
471 ; SSE2-NEXT:    pxor %xmm2, %xmm2
472 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
473 ; SSE2-NEXT:    pand %xmm2, %xmm4
474 ; SSE2-NEXT:    pandn %xmm3, %xmm2
475 ; SSE2-NEXT:    por %xmm4, %xmm2
476 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
477 ; SSE2-NEXT:    paddb %xmm2, %xmm3
478 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
479 ; SSE2-NEXT:    psrlw $7, %xmm4
480 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm4
481 ; SSE2-NEXT:    por %xmm3, %xmm4
482 ; SSE2-NEXT:    paddb %xmm1, %xmm1
483 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm0
484 ; SSE2-NEXT:    pand %xmm0, %xmm4
485 ; SSE2-NEXT:    pandn %xmm2, %xmm0
486 ; SSE2-NEXT:    por %xmm4, %xmm0
487 ; SSE2-NEXT:    retq
489 ; SSE41-LABEL: var_funnnel_v16i8:
490 ; SSE41:       # %bb.0:
491 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
492 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
493 ; SSE41-NEXT:    psrlw $4, %xmm0
494 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm0
495 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
496 ; SSE41-NEXT:    psllw $4, %xmm3
497 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
498 ; SSE41-NEXT:    por %xmm0, %xmm3
499 ; SSE41-NEXT:    psllw $5, %xmm2
500 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
501 ; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm1
502 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
503 ; SSE41-NEXT:    psrlw $6, %xmm0
504 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm0
505 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
506 ; SSE41-NEXT:    psllw $2, %xmm3
507 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
508 ; SSE41-NEXT:    por %xmm0, %xmm3
509 ; SSE41-NEXT:    paddb %xmm2, %xmm2
510 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
511 ; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm1
512 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
513 ; SSE41-NEXT:    paddb %xmm1, %xmm0
514 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
515 ; SSE41-NEXT:    psrlw $7, %xmm3
516 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm3
517 ; SSE41-NEXT:    por %xmm0, %xmm3
518 ; SSE41-NEXT:    paddb %xmm2, %xmm2
519 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
520 ; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm1
521 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
522 ; SSE41-NEXT:    retq
524 ; AVX-LABEL: var_funnnel_v16i8:
525 ; AVX:       # %bb.0:
526 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm2
527 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
528 ; AVX-NEXT:    vpsllw $4, %xmm0, %xmm3
529 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm3, %xmm3
530 ; AVX-NEXT:    vpor %xmm2, %xmm3, %xmm2
531 ; AVX-NEXT:    vpsllw $5, %xmm1, %xmm1
532 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
533 ; AVX-NEXT:    vpsrlw $6, %xmm0, %xmm2
534 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
535 ; AVX-NEXT:    vpsllw $2, %xmm0, %xmm3
536 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm3, %xmm3
537 ; AVX-NEXT:    vpor %xmm2, %xmm3, %xmm2
538 ; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
539 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
540 ; AVX-NEXT:    vpaddb %xmm0, %xmm0, %xmm2
541 ; AVX-NEXT:    vpsrlw $7, %xmm0, %xmm3
542 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm3, %xmm3
543 ; AVX-NEXT:    vpor %xmm3, %xmm2, %xmm2
544 ; AVX-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
545 ; AVX-NEXT:    vpblendvb %xmm1, %xmm2, %xmm0, %xmm0
546 ; AVX-NEXT:    retq
548 ; AVX512F-LABEL: var_funnnel_v16i8:
549 ; AVX512F:       # %bb.0:
550 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm2 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
551 ; AVX512F-NEXT:    vpand %xmm2, %xmm1, %xmm3
552 ; 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
553 ; 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
554 ; AVX512F-NEXT:    vpsllvd %zmm3, %zmm0, %zmm3
555 ; AVX512F-NEXT:    vpxor %xmm4, %xmm4, %xmm4
556 ; AVX512F-NEXT:    vpsubb %xmm1, %xmm4, %xmm1
557 ; AVX512F-NEXT:    vpand %xmm2, %xmm1, %xmm1
558 ; 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
559 ; AVX512F-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0
560 ; AVX512F-NEXT:    vpord %zmm0, %zmm3, %zmm0
561 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
562 ; AVX512F-NEXT:    vzeroupper
563 ; AVX512F-NEXT:    retq
565 ; AVX512VL-LABEL: var_funnnel_v16i8:
566 ; AVX512VL:       # %bb.0:
567 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm2 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
568 ; AVX512VL-NEXT:    vpand %xmm2, %xmm1, %xmm3
569 ; 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
570 ; 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
571 ; AVX512VL-NEXT:    vpsllvd %zmm3, %zmm0, %zmm3
572 ; AVX512VL-NEXT:    vpxor %xmm4, %xmm4, %xmm4
573 ; AVX512VL-NEXT:    vpsubb %xmm1, %xmm4, %xmm1
574 ; AVX512VL-NEXT:    vpand %xmm2, %xmm1, %xmm1
575 ; 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
576 ; AVX512VL-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0
577 ; AVX512VL-NEXT:    vpord %zmm0, %zmm3, %zmm0
578 ; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
579 ; AVX512VL-NEXT:    vzeroupper
580 ; AVX512VL-NEXT:    retq
582 ; AVX512BW-LABEL: var_funnnel_v16i8:
583 ; AVX512BW:       # %bb.0:
584 ; 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
585 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
586 ; AVX512BW-NEXT:    vpand %xmm2, %xmm1, %xmm3
587 ; 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
588 ; AVX512BW-NEXT:    vpsllvw %zmm3, %zmm0, %zmm3
589 ; AVX512BW-NEXT:    vpxor %xmm4, %xmm4, %xmm4
590 ; AVX512BW-NEXT:    vpsubb %xmm1, %xmm4, %xmm1
591 ; AVX512BW-NEXT:    vpand %xmm2, %xmm1, %xmm1
592 ; 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
593 ; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
594 ; AVX512BW-NEXT:    vpor %ymm0, %ymm3, %ymm0
595 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
596 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
597 ; AVX512BW-NEXT:    vzeroupper
598 ; AVX512BW-NEXT:    retq
600 ; AVX512VLBW-LABEL: var_funnnel_v16i8:
601 ; AVX512VLBW:       # %bb.0:
602 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm2 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
603 ; AVX512VLBW-NEXT:    vpand %xmm2, %xmm1, %xmm3
604 ; 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
605 ; 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
606 ; AVX512VLBW-NEXT:    vpsllvw %ymm3, %ymm0, %ymm3
607 ; AVX512VLBW-NEXT:    vpxor %xmm4, %xmm4, %xmm4
608 ; AVX512VLBW-NEXT:    vpsubb %xmm1, %xmm4, %xmm1
609 ; AVX512VLBW-NEXT:    vpand %xmm2, %xmm1, %xmm1
610 ; 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
611 ; AVX512VLBW-NEXT:    vpsrlvw %ymm1, %ymm0, %ymm0
612 ; AVX512VLBW-NEXT:    vpor %ymm0, %ymm3, %ymm0
613 ; AVX512VLBW-NEXT:    vpmovwb %ymm0, %xmm0
614 ; AVX512VLBW-NEXT:    vzeroupper
615 ; AVX512VLBW-NEXT:    retq
617 ; XOP-LABEL: var_funnnel_v16i8:
618 ; XOP:       # %bb.0:
619 ; XOP-NEXT:    vprotb %xmm1, %xmm0, %xmm0
620 ; XOP-NEXT:    retq
622 ; X32-SSE-LABEL: var_funnnel_v16i8:
623 ; X32-SSE:       # %bb.0:
624 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
625 ; X32-SSE-NEXT:    psllw $5, %xmm1
626 ; X32-SSE-NEXT:    pxor %xmm0, %xmm0
627 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
628 ; X32-SSE-NEXT:    pcmpgtb %xmm1, %xmm3
629 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm4
630 ; X32-SSE-NEXT:    psrlw $4, %xmm4
631 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm4
632 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm5
633 ; X32-SSE-NEXT:    psllw $4, %xmm5
634 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm5
635 ; X32-SSE-NEXT:    por %xmm4, %xmm5
636 ; X32-SSE-NEXT:    pand %xmm3, %xmm5
637 ; X32-SSE-NEXT:    pandn %xmm2, %xmm3
638 ; X32-SSE-NEXT:    por %xmm5, %xmm3
639 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm2
640 ; X32-SSE-NEXT:    psrlw $6, %xmm2
641 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm2
642 ; X32-SSE-NEXT:    movdqa %xmm3, %xmm4
643 ; X32-SSE-NEXT:    psllw $2, %xmm4
644 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm4
645 ; X32-SSE-NEXT:    por %xmm2, %xmm4
646 ; X32-SSE-NEXT:    paddb %xmm1, %xmm1
647 ; X32-SSE-NEXT:    pxor %xmm2, %xmm2
648 ; X32-SSE-NEXT:    pcmpgtb %xmm1, %xmm2
649 ; X32-SSE-NEXT:    pand %xmm2, %xmm4
650 ; X32-SSE-NEXT:    pandn %xmm3, %xmm2
651 ; X32-SSE-NEXT:    por %xmm4, %xmm2
652 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm3
653 ; X32-SSE-NEXT:    paddb %xmm2, %xmm3
654 ; X32-SSE-NEXT:    movdqa %xmm2, %xmm4
655 ; X32-SSE-NEXT:    psrlw $7, %xmm4
656 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm4
657 ; X32-SSE-NEXT:    por %xmm3, %xmm4
658 ; X32-SSE-NEXT:    paddb %xmm1, %xmm1
659 ; X32-SSE-NEXT:    pcmpgtb %xmm1, %xmm0
660 ; X32-SSE-NEXT:    pand %xmm0, %xmm4
661 ; X32-SSE-NEXT:    pandn %xmm2, %xmm0
662 ; X32-SSE-NEXT:    por %xmm4, %xmm0
663 ; X32-SSE-NEXT:    retl
664   %res = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %x, <16 x i8> %x, <16 x i8> %amt)
665   ret <16 x i8> %res
669 ; Uniform Variable Shifts
672 define <2 x i64> @splatvar_funnnel_v2i64(<2 x i64> %x, <2 x i64> %amt) nounwind {
673 ; SSE-LABEL: splatvar_funnnel_v2i64:
674 ; SSE:       # %bb.0:
675 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
676 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [63,63]
677 ; SSE-NEXT:    pxor %xmm3, %xmm3
678 ; SSE-NEXT:    psubq %xmm1, %xmm3
679 ; SSE-NEXT:    pand %xmm2, %xmm1
680 ; SSE-NEXT:    movdqa %xmm0, %xmm4
681 ; SSE-NEXT:    psllq %xmm1, %xmm4
682 ; SSE-NEXT:    pand %xmm2, %xmm3
683 ; SSE-NEXT:    psrlq %xmm3, %xmm0
684 ; SSE-NEXT:    por %xmm4, %xmm0
685 ; SSE-NEXT:    retq
687 ; AVX1-LABEL: splatvar_funnnel_v2i64:
688 ; AVX1:       # %bb.0:
689 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
690 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [63,63]
691 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm3
692 ; AVX1-NEXT:    vpsllq %xmm3, %xmm0, %xmm3
693 ; AVX1-NEXT:    vpxor %xmm4, %xmm4, %xmm4
694 ; AVX1-NEXT:    vpsubq %xmm1, %xmm4, %xmm1
695 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
696 ; AVX1-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
697 ; AVX1-NEXT:    vpor %xmm0, %xmm3, %xmm0
698 ; AVX1-NEXT:    retq
700 ; AVX2-LABEL: splatvar_funnnel_v2i64:
701 ; AVX2:       # %bb.0:
702 ; AVX2-NEXT:    vpbroadcastq %xmm1, %xmm1
703 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [63,63]
704 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm3
705 ; AVX2-NEXT:    vpsllq %xmm3, %xmm0, %xmm3
706 ; AVX2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
707 ; AVX2-NEXT:    vpsubq %xmm1, %xmm4, %xmm1
708 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
709 ; AVX2-NEXT:    vpsrlq %xmm1, %xmm0, %xmm0
710 ; AVX2-NEXT:    vpor %xmm0, %xmm3, %xmm0
711 ; AVX2-NEXT:    retq
713 ; AVX512F-LABEL: splatvar_funnnel_v2i64:
714 ; AVX512F:       # %bb.0:
715 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
716 ; AVX512F-NEXT:    vpbroadcastq %xmm1, %xmm1
717 ; AVX512F-NEXT:    vprolvq %zmm1, %zmm0, %zmm0
718 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
719 ; AVX512F-NEXT:    vzeroupper
720 ; AVX512F-NEXT:    retq
722 ; AVX512VL-LABEL: splatvar_funnnel_v2i64:
723 ; AVX512VL:       # %bb.0:
724 ; AVX512VL-NEXT:    vpbroadcastq %xmm1, %xmm1
725 ; AVX512VL-NEXT:    vprolvq %xmm1, %xmm0, %xmm0
726 ; AVX512VL-NEXT:    retq
728 ; AVX512BW-LABEL: splatvar_funnnel_v2i64:
729 ; AVX512BW:       # %bb.0:
730 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
731 ; AVX512BW-NEXT:    vpbroadcastq %xmm1, %xmm1
732 ; AVX512BW-NEXT:    vprolvq %zmm1, %zmm0, %zmm0
733 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
734 ; AVX512BW-NEXT:    vzeroupper
735 ; AVX512BW-NEXT:    retq
737 ; AVX512VLBW-LABEL: splatvar_funnnel_v2i64:
738 ; AVX512VLBW:       # %bb.0:
739 ; AVX512VLBW-NEXT:    vpbroadcastq %xmm1, %xmm1
740 ; AVX512VLBW-NEXT:    vprolvq %xmm1, %xmm0, %xmm0
741 ; AVX512VLBW-NEXT:    retq
743 ; XOPAVX1-LABEL: splatvar_funnnel_v2i64:
744 ; XOPAVX1:       # %bb.0:
745 ; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
746 ; XOPAVX1-NEXT:    vprotq %xmm1, %xmm0, %xmm0
747 ; XOPAVX1-NEXT:    retq
749 ; XOPAVX2-LABEL: splatvar_funnnel_v2i64:
750 ; XOPAVX2:       # %bb.0:
751 ; XOPAVX2-NEXT:    vpbroadcastq %xmm1, %xmm1
752 ; XOPAVX2-NEXT:    vprotq %xmm1, %xmm0, %xmm0
753 ; XOPAVX2-NEXT:    retq
755 ; X32-SSE-LABEL: splatvar_funnnel_v2i64:
756 ; X32-SSE:       # %bb.0:
757 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
758 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [63,0,63,0]
759 ; X32-SSE-NEXT:    pxor %xmm3, %xmm3
760 ; X32-SSE-NEXT:    psubq %xmm1, %xmm3
761 ; X32-SSE-NEXT:    pand %xmm2, %xmm1
762 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm4
763 ; X32-SSE-NEXT:    psllq %xmm1, %xmm4
764 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
765 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm5
766 ; X32-SSE-NEXT:    psllq %xmm1, %xmm5
767 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm5 = xmm4[0],xmm5[1]
768 ; X32-SSE-NEXT:    pand %xmm2, %xmm3
769 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
770 ; X32-SSE-NEXT:    psrlq %xmm3, %xmm1
771 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,3,0,1]
772 ; X32-SSE-NEXT:    psrlq %xmm2, %xmm0
773 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
774 ; X32-SSE-NEXT:    orpd %xmm5, %xmm0
775 ; X32-SSE-NEXT:    retl
776   %splat = shufflevector <2 x i64> %amt, <2 x i64> undef, <2 x i32> zeroinitializer
777   %res = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> %x, <2 x i64> %x, <2 x i64> %splat)
778   ret <2 x i64> %res
781 define <4 x i32> @splatvar_funnnel_v4i32(<4 x i32> %x, <4 x i32> %amt) nounwind {
782 ; SSE2-LABEL: splatvar_funnnel_v4i32:
783 ; SSE2:       # %bb.0:
784 ; SSE2-NEXT:    movd %xmm1, %eax
785 ; SSE2-NEXT:    andl $31, %eax
786 ; SSE2-NEXT:    movd %eax, %xmm1
787 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
788 ; SSE2-NEXT:    pslld %xmm1, %xmm2
789 ; SSE2-NEXT:    movl $32, %ecx
790 ; SSE2-NEXT:    subl %eax, %ecx
791 ; SSE2-NEXT:    movd %ecx, %xmm1
792 ; SSE2-NEXT:    psrld %xmm1, %xmm0
793 ; SSE2-NEXT:    por %xmm2, %xmm0
794 ; SSE2-NEXT:    retq
796 ; SSE41-LABEL: splatvar_funnnel_v4i32:
797 ; SSE41:       # %bb.0:
798 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
799 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm1
800 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero
801 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
802 ; SSE41-NEXT:    pslld %xmm2, %xmm3
803 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [32,32,32,32]
804 ; SSE41-NEXT:    psubd %xmm1, %xmm2
805 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm1 = xmm2[0],zero,xmm2[1],zero
806 ; SSE41-NEXT:    psrld %xmm1, %xmm0
807 ; SSE41-NEXT:    por %xmm3, %xmm0
808 ; SSE41-NEXT:    retq
810 ; AVX1-LABEL: splatvar_funnnel_v4i32:
811 ; AVX1:       # %bb.0:
812 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
813 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
814 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero
815 ; AVX1-NEXT:    vpslld %xmm2, %xmm0, %xmm2
816 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [32,32,32,32]
817 ; AVX1-NEXT:    vpsubd %xmm1, %xmm3, %xmm1
818 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
819 ; AVX1-NEXT:    vpsrld %xmm1, %xmm0, %xmm0
820 ; AVX1-NEXT:    vpor %xmm0, %xmm2, %xmm0
821 ; AVX1-NEXT:    retq
823 ; AVX2-LABEL: splatvar_funnnel_v4i32:
824 ; AVX2:       # %bb.0:
825 ; AVX2-NEXT:    vpbroadcastd %xmm1, %xmm1
826 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [31,31,31,31]
827 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
828 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero
829 ; AVX2-NEXT:    vpslld %xmm2, %xmm0, %xmm2
830 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [32,32,32,32]
831 ; AVX2-NEXT:    vpsubd %xmm1, %xmm3, %xmm1
832 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
833 ; AVX2-NEXT:    vpsrld %xmm1, %xmm0, %xmm0
834 ; AVX2-NEXT:    vpor %xmm0, %xmm2, %xmm0
835 ; AVX2-NEXT:    retq
837 ; AVX512F-LABEL: splatvar_funnnel_v4i32:
838 ; AVX512F:       # %bb.0:
839 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
840 ; AVX512F-NEXT:    vpbroadcastd %xmm1, %xmm1
841 ; AVX512F-NEXT:    vprolvd %zmm1, %zmm0, %zmm0
842 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
843 ; AVX512F-NEXT:    vzeroupper
844 ; AVX512F-NEXT:    retq
846 ; AVX512VL-LABEL: splatvar_funnnel_v4i32:
847 ; AVX512VL:       # %bb.0:
848 ; AVX512VL-NEXT:    vpbroadcastd %xmm1, %xmm1
849 ; AVX512VL-NEXT:    vprolvd %xmm1, %xmm0, %xmm0
850 ; AVX512VL-NEXT:    retq
852 ; AVX512BW-LABEL: splatvar_funnnel_v4i32:
853 ; AVX512BW:       # %bb.0:
854 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
855 ; AVX512BW-NEXT:    vpbroadcastd %xmm1, %xmm1
856 ; AVX512BW-NEXT:    vprolvd %zmm1, %zmm0, %zmm0
857 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
858 ; AVX512BW-NEXT:    vzeroupper
859 ; AVX512BW-NEXT:    retq
861 ; AVX512VLBW-LABEL: splatvar_funnnel_v4i32:
862 ; AVX512VLBW:       # %bb.0:
863 ; AVX512VLBW-NEXT:    vpbroadcastd %xmm1, %xmm1
864 ; AVX512VLBW-NEXT:    vprolvd %xmm1, %xmm0, %xmm0
865 ; AVX512VLBW-NEXT:    retq
867 ; XOPAVX1-LABEL: splatvar_funnnel_v4i32:
868 ; XOPAVX1:       # %bb.0:
869 ; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
870 ; XOPAVX1-NEXT:    vprotd %xmm1, %xmm0, %xmm0
871 ; XOPAVX1-NEXT:    retq
873 ; XOPAVX2-LABEL: splatvar_funnnel_v4i32:
874 ; XOPAVX2:       # %bb.0:
875 ; XOPAVX2-NEXT:    vpbroadcastd %xmm1, %xmm1
876 ; XOPAVX2-NEXT:    vprotd %xmm1, %xmm0, %xmm0
877 ; XOPAVX2-NEXT:    retq
879 ; X32-SSE-LABEL: splatvar_funnnel_v4i32:
880 ; X32-SSE:       # %bb.0:
881 ; X32-SSE-NEXT:    movd %xmm1, %eax
882 ; X32-SSE-NEXT:    andl $31, %eax
883 ; X32-SSE-NEXT:    movd %eax, %xmm1
884 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
885 ; X32-SSE-NEXT:    pslld %xmm1, %xmm2
886 ; X32-SSE-NEXT:    movl $32, %ecx
887 ; X32-SSE-NEXT:    subl %eax, %ecx
888 ; X32-SSE-NEXT:    movd %ecx, %xmm1
889 ; X32-SSE-NEXT:    psrld %xmm1, %xmm0
890 ; X32-SSE-NEXT:    por %xmm2, %xmm0
891 ; X32-SSE-NEXT:    retl
892   %splat = shufflevector <4 x i32> %amt, <4 x i32> undef, <4 x i32> zeroinitializer
893   %res = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %x, <4 x i32> %splat)
894   ret <4 x i32> %res
897 define <8 x i16> @splatvar_funnnel_v8i16(<8 x i16> %x, <8 x i16> %amt) nounwind {
898 ; SSE2-LABEL: splatvar_funnnel_v8i16:
899 ; SSE2:       # %bb.0:
900 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7]
901 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
902 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
903 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [16,16,16,16,16,16,16,16]
904 ; SSE2-NEXT:    psubw %xmm1, %xmm2
905 ; SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1]
906 ; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
907 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
908 ; SSE2-NEXT:    psllw %xmm1, %xmm3
909 ; SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1]
910 ; SSE2-NEXT:    psrldq {{.*#+}} xmm2 = xmm2[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
911 ; SSE2-NEXT:    psrlw %xmm2, %xmm0
912 ; SSE2-NEXT:    por %xmm3, %xmm0
913 ; SSE2-NEXT:    retq
915 ; SSE41-LABEL: splatvar_funnnel_v8i16:
916 ; SSE41:       # %bb.0:
917 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7]
918 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
919 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm1
920 ; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
921 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
922 ; SSE41-NEXT:    psllw %xmm2, %xmm3
923 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [16,16,16,16,16,16,16,16]
924 ; SSE41-NEXT:    psubw %xmm1, %xmm2
925 ; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm1 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
926 ; SSE41-NEXT:    psrlw %xmm1, %xmm0
927 ; SSE41-NEXT:    por %xmm3, %xmm0
928 ; SSE41-NEXT:    retq
930 ; AVX1-LABEL: splatvar_funnnel_v8i16:
931 ; AVX1:       # %bb.0:
932 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7]
933 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
934 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
935 ; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
936 ; AVX1-NEXT:    vpsllw %xmm2, %xmm0, %xmm2
937 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]
938 ; AVX1-NEXT:    vpsubw %xmm1, %xmm3, %xmm1
939 ; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
940 ; AVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
941 ; AVX1-NEXT:    vpor %xmm0, %xmm2, %xmm0
942 ; AVX1-NEXT:    retq
944 ; AVX2-LABEL: splatvar_funnnel_v8i16:
945 ; AVX2:       # %bb.0:
946 ; AVX2-NEXT:    vpbroadcastw %xmm1, %xmm1
947 ; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
948 ; AVX2-NEXT:    vpmovzxwq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
949 ; AVX2-NEXT:    vpsllw %xmm2, %xmm0, %xmm2
950 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]
951 ; AVX2-NEXT:    vpsubw %xmm1, %xmm3, %xmm1
952 ; AVX2-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
953 ; AVX2-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
954 ; AVX2-NEXT:    vpor %xmm0, %xmm2, %xmm0
955 ; AVX2-NEXT:    retq
957 ; AVX512-LABEL: splatvar_funnnel_v8i16:
958 ; AVX512:       # %bb.0:
959 ; AVX512-NEXT:    vpbroadcastw %xmm1, %xmm1
960 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
961 ; AVX512-NEXT:    vpmovzxwq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
962 ; AVX512-NEXT:    vpsllw %xmm2, %xmm0, %xmm2
963 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]
964 ; AVX512-NEXT:    vpsubw %xmm1, %xmm3, %xmm1
965 ; AVX512-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
966 ; AVX512-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
967 ; AVX512-NEXT:    vpor %xmm0, %xmm2, %xmm0
968 ; AVX512-NEXT:    retq
970 ; XOPAVX1-LABEL: splatvar_funnnel_v8i16:
971 ; XOPAVX1:       # %bb.0:
972 ; XOPAVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7]
973 ; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
974 ; XOPAVX1-NEXT:    vprotw %xmm1, %xmm0, %xmm0
975 ; XOPAVX1-NEXT:    retq
977 ; XOPAVX2-LABEL: splatvar_funnnel_v8i16:
978 ; XOPAVX2:       # %bb.0:
979 ; XOPAVX2-NEXT:    vpbroadcastw %xmm1, %xmm1
980 ; XOPAVX2-NEXT:    vprotw %xmm1, %xmm0, %xmm0
981 ; XOPAVX2-NEXT:    retq
983 ; X32-SSE-LABEL: splatvar_funnnel_v8i16:
984 ; X32-SSE:       # %bb.0:
985 ; X32-SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7]
986 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
987 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm1
988 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [16,16,16,16,16,16,16,16]
989 ; X32-SSE-NEXT:    psubw %xmm1, %xmm2
990 ; X32-SSE-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1]
991 ; X32-SSE-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
992 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm3
993 ; X32-SSE-NEXT:    psllw %xmm1, %xmm3
994 ; X32-SSE-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1]
995 ; X32-SSE-NEXT:    psrldq {{.*#+}} xmm2 = xmm2[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
996 ; X32-SSE-NEXT:    psrlw %xmm2, %xmm0
997 ; X32-SSE-NEXT:    por %xmm3, %xmm0
998 ; X32-SSE-NEXT:    retl
999   %splat = shufflevector <8 x i16> %amt, <8 x i16> undef, <8 x i32> zeroinitializer
1000   %res = call <8 x i16> @llvm.fshl.v8i16(<8 x i16> %x, <8 x i16> %x, <8 x i16> %splat)
1001   ret <8 x i16> %res
1004 define <16 x i8> @splatvar_funnnel_v16i8(<16 x i8> %x, <16 x i8> %amt) nounwind {
1005 ; SSE2-LABEL: splatvar_funnnel_v16i8:
1006 ; SSE2:       # %bb.0:
1007 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1008 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7]
1009 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
1010 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
1011 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1012 ; SSE2-NEXT:    psubb %xmm1, %xmm2
1013 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
1014 ; SSE2-NEXT:    pslldq {{.*#+}} xmm3 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm3[0]
1015 ; SSE2-NEXT:    psrldq {{.*#+}} xmm3 = xmm3[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1016 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1017 ; SSE2-NEXT:    psllw %xmm3, %xmm1
1018 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
1019 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm5
1020 ; SSE2-NEXT:    psllw %xmm3, %xmm5
1021 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1022 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm5[0,0,2,3,4,5,6,7]
1023 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,0,0,0]
1024 ; SSE2-NEXT:    pand %xmm3, %xmm1
1025 ; SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0]
1026 ; SSE2-NEXT:    psrldq {{.*#+}} xmm2 = xmm2[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1027 ; SSE2-NEXT:    psrlw %xmm2, %xmm0
1028 ; SSE2-NEXT:    psrlw %xmm2, %xmm4
1029 ; SSE2-NEXT:    psrlw $8, %xmm4
1030 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1031 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm4[0,0,2,3,4,5,6,7]
1032 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]
1033 ; SSE2-NEXT:    pand %xmm0, %xmm2
1034 ; SSE2-NEXT:    por %xmm2, %xmm1
1035 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1036 ; SSE2-NEXT:    retq
1038 ; SSE41-LABEL: splatvar_funnnel_v16i8:
1039 ; SSE41:       # %bb.0:
1040 ; SSE41-NEXT:    pxor %xmm3, %xmm3
1041 ; SSE41-NEXT:    pshufb %xmm3, %xmm1
1042 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm1
1043 ; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm4 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
1044 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1045 ; SSE41-NEXT:    psllw %xmm4, %xmm2
1046 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm5
1047 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm6
1048 ; SSE41-NEXT:    psllw %xmm4, %xmm6
1049 ; SSE41-NEXT:    pshufb %xmm3, %xmm6
1050 ; SSE41-NEXT:    pand %xmm6, %xmm2
1051 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1052 ; SSE41-NEXT:    psubb %xmm1, %xmm3
1053 ; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm1 = xmm3[0],zero,zero,zero,zero,zero,zero,zero,xmm3[1],zero,zero,zero,zero,zero,zero,zero
1054 ; SSE41-NEXT:    psrlw %xmm1, %xmm0
1055 ; SSE41-NEXT:    psrlw %xmm1, %xmm5
1056 ; SSE41-NEXT:    pshufb {{.*#+}} xmm5 = xmm5[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1057 ; SSE41-NEXT:    pand %xmm0, %xmm5
1058 ; SSE41-NEXT:    por %xmm5, %xmm2
1059 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1060 ; SSE41-NEXT:    retq
1062 ; AVX1-LABEL: splatvar_funnnel_v16i8:
1063 ; AVX1:       # %bb.0:
1064 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1065 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1066 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
1067 ; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm3 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
1068 ; AVX1-NEXT:    vpsllw %xmm3, %xmm0, %xmm4
1069 ; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
1070 ; AVX1-NEXT:    vpsllw %xmm3, %xmm5, %xmm3
1071 ; AVX1-NEXT:    vpshufb %xmm2, %xmm3, %xmm2
1072 ; AVX1-NEXT:    vpand %xmm2, %xmm4, %xmm2
1073 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1074 ; AVX1-NEXT:    vpsubb %xmm1, %xmm3, %xmm1
1075 ; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
1076 ; AVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
1077 ; AVX1-NEXT:    vpsrlw %xmm1, %xmm5, %xmm1
1078 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1079 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
1080 ; AVX1-NEXT:    vpor %xmm0, %xmm2, %xmm0
1081 ; AVX1-NEXT:    retq
1083 ; AVX2-LABEL: splatvar_funnnel_v16i8:
1084 ; AVX2:       # %bb.0:
1085 ; AVX2-NEXT:    vpbroadcastb %xmm1, %xmm1
1086 ; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
1087 ; AVX2-NEXT:    vpmovzxbq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
1088 ; AVX2-NEXT:    vpsllw %xmm2, %xmm0, %xmm3
1089 ; AVX2-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
1090 ; AVX2-NEXT:    vpsllw %xmm2, %xmm4, %xmm2
1091 ; AVX2-NEXT:    vpbroadcastb %xmm2, %xmm2
1092 ; AVX2-NEXT:    vpand %xmm2, %xmm3, %xmm2
1093 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1094 ; AVX2-NEXT:    vpsubb %xmm1, %xmm3, %xmm1
1095 ; AVX2-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
1096 ; AVX2-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
1097 ; AVX2-NEXT:    vpsrlw %xmm1, %xmm4, %xmm1
1098 ; AVX2-NEXT:    vpsrlw $8, %xmm1, %xmm1
1099 ; AVX2-NEXT:    vpbroadcastb %xmm1, %xmm1
1100 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
1101 ; AVX2-NEXT:    vpor %xmm0, %xmm2, %xmm0
1102 ; AVX2-NEXT:    retq
1104 ; AVX512F-LABEL: splatvar_funnnel_v16i8:
1105 ; AVX512F:       # %bb.0:
1106 ; AVX512F-NEXT:    vpbroadcastb %xmm1, %xmm1
1107 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm2 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1108 ; AVX512F-NEXT:    vpand %xmm2, %xmm1, %xmm3
1109 ; 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
1110 ; 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
1111 ; AVX512F-NEXT:    vpsllvd %zmm3, %zmm0, %zmm3
1112 ; AVX512F-NEXT:    vpxor %xmm4, %xmm4, %xmm4
1113 ; AVX512F-NEXT:    vpsubb %xmm1, %xmm4, %xmm1
1114 ; AVX512F-NEXT:    vpand %xmm2, %xmm1, %xmm1
1115 ; 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
1116 ; AVX512F-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0
1117 ; AVX512F-NEXT:    vpord %zmm0, %zmm3, %zmm0
1118 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
1119 ; AVX512F-NEXT:    vzeroupper
1120 ; AVX512F-NEXT:    retq
1122 ; AVX512VL-LABEL: splatvar_funnnel_v16i8:
1123 ; AVX512VL:       # %bb.0:
1124 ; AVX512VL-NEXT:    vpbroadcastb %xmm1, %xmm1
1125 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm2 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1126 ; AVX512VL-NEXT:    vpand %xmm2, %xmm1, %xmm3
1127 ; 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
1128 ; 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
1129 ; AVX512VL-NEXT:    vpsllvd %zmm3, %zmm0, %zmm3
1130 ; AVX512VL-NEXT:    vpxor %xmm4, %xmm4, %xmm4
1131 ; AVX512VL-NEXT:    vpsubb %xmm1, %xmm4, %xmm1
1132 ; AVX512VL-NEXT:    vpand %xmm2, %xmm1, %xmm1
1133 ; 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
1134 ; AVX512VL-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0
1135 ; AVX512VL-NEXT:    vpord %zmm0, %zmm3, %zmm0
1136 ; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
1137 ; AVX512VL-NEXT:    vzeroupper
1138 ; AVX512VL-NEXT:    retq
1140 ; AVX512BW-LABEL: splatvar_funnnel_v16i8:
1141 ; AVX512BW:       # %bb.0:
1142 ; AVX512BW-NEXT:    vpbroadcastb %xmm1, %xmm1
1143 ; 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
1144 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1145 ; AVX512BW-NEXT:    vpand %xmm2, %xmm1, %xmm3
1146 ; 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
1147 ; AVX512BW-NEXT:    vpsllvw %zmm3, %zmm0, %zmm3
1148 ; AVX512BW-NEXT:    vpxor %xmm4, %xmm4, %xmm4
1149 ; AVX512BW-NEXT:    vpsubb %xmm1, %xmm4, %xmm1
1150 ; AVX512BW-NEXT:    vpand %xmm2, %xmm1, %xmm1
1151 ; 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
1152 ; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
1153 ; AVX512BW-NEXT:    vpor %ymm0, %ymm3, %ymm0
1154 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
1155 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1156 ; AVX512BW-NEXT:    vzeroupper
1157 ; AVX512BW-NEXT:    retq
1159 ; AVX512VLBW-LABEL: splatvar_funnnel_v16i8:
1160 ; AVX512VLBW:       # %bb.0:
1161 ; AVX512VLBW-NEXT:    vpbroadcastb %xmm1, %xmm1
1162 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm2 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1163 ; AVX512VLBW-NEXT:    vpand %xmm2, %xmm1, %xmm3
1164 ; 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
1165 ; 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
1166 ; AVX512VLBW-NEXT:    vpsllvw %ymm3, %ymm0, %ymm3
1167 ; AVX512VLBW-NEXT:    vpxor %xmm4, %xmm4, %xmm4
1168 ; AVX512VLBW-NEXT:    vpsubb %xmm1, %xmm4, %xmm1
1169 ; AVX512VLBW-NEXT:    vpand %xmm2, %xmm1, %xmm1
1170 ; 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
1171 ; AVX512VLBW-NEXT:    vpsrlvw %ymm1, %ymm0, %ymm0
1172 ; AVX512VLBW-NEXT:    vpor %ymm0, %ymm3, %ymm0
1173 ; AVX512VLBW-NEXT:    vpmovwb %ymm0, %xmm0
1174 ; AVX512VLBW-NEXT:    vzeroupper
1175 ; AVX512VLBW-NEXT:    retq
1177 ; XOPAVX1-LABEL: splatvar_funnnel_v16i8:
1178 ; XOPAVX1:       # %bb.0:
1179 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1180 ; XOPAVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1181 ; XOPAVX1-NEXT:    vprotb %xmm1, %xmm0, %xmm0
1182 ; XOPAVX1-NEXT:    retq
1184 ; XOPAVX2-LABEL: splatvar_funnnel_v16i8:
1185 ; XOPAVX2:       # %bb.0:
1186 ; XOPAVX2-NEXT:    vpbroadcastb %xmm1, %xmm1
1187 ; XOPAVX2-NEXT:    vprotb %xmm1, %xmm0, %xmm0
1188 ; XOPAVX2-NEXT:    retq
1190 ; X32-SSE-LABEL: splatvar_funnnel_v16i8:
1191 ; X32-SSE:       # %bb.0:
1192 ; X32-SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1193 ; X32-SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7]
1194 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
1195 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm1
1196 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1197 ; X32-SSE-NEXT:    psubb %xmm1, %xmm2
1198 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm3
1199 ; X32-SSE-NEXT:    pslldq {{.*#+}} xmm3 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm3[0]
1200 ; X32-SSE-NEXT:    psrldq {{.*#+}} xmm3 = xmm3[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1201 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1202 ; X32-SSE-NEXT:    psllw %xmm3, %xmm1
1203 ; X32-SSE-NEXT:    pcmpeqd %xmm4, %xmm4
1204 ; X32-SSE-NEXT:    pcmpeqd %xmm5, %xmm5
1205 ; X32-SSE-NEXT:    psllw %xmm3, %xmm5
1206 ; X32-SSE-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1207 ; X32-SSE-NEXT:    pshuflw {{.*#+}} xmm3 = xmm5[0,0,2,3,4,5,6,7]
1208 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,0,0,0]
1209 ; X32-SSE-NEXT:    pand %xmm3, %xmm1
1210 ; X32-SSE-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0]
1211 ; X32-SSE-NEXT:    psrldq {{.*#+}} xmm2 = xmm2[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1212 ; X32-SSE-NEXT:    psrlw %xmm2, %xmm0
1213 ; X32-SSE-NEXT:    psrlw %xmm2, %xmm4
1214 ; X32-SSE-NEXT:    psrlw $8, %xmm4
1215 ; X32-SSE-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1216 ; X32-SSE-NEXT:    pshuflw {{.*#+}} xmm2 = xmm4[0,0,2,3,4,5,6,7]
1217 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]
1218 ; X32-SSE-NEXT:    pand %xmm0, %xmm2
1219 ; X32-SSE-NEXT:    por %xmm2, %xmm1
1220 ; X32-SSE-NEXT:    movdqa %xmm1, %xmm0
1221 ; X32-SSE-NEXT:    retl
1222   %splat = shufflevector <16 x i8> %amt, <16 x i8> undef, <16 x i32> zeroinitializer
1223   %res = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %x, <16 x i8> %x, <16 x i8> %splat)
1224   ret <16 x i8> %res
1228 ; Constant Shifts
1231 define <2 x i64> @constant_funnnel_v2i64(<2 x i64> %x) nounwind {
1232 ; SSE2-LABEL: constant_funnnel_v2i64:
1233 ; SSE2:       # %bb.0:
1234 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1235 ; SSE2-NEXT:    psrlq $60, %xmm1
1236 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1237 ; SSE2-NEXT:    psrlq $50, %xmm2
1238 ; SSE2-NEXT:    movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1]
1239 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1240 ; SSE2-NEXT:    psllq $4, %xmm1
1241 ; SSE2-NEXT:    psllq $14, %xmm0
1242 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1243 ; SSE2-NEXT:    orpd %xmm2, %xmm0
1244 ; SSE2-NEXT:    retq
1246 ; SSE41-LABEL: constant_funnnel_v2i64:
1247 ; SSE41:       # %bb.0:
1248 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
1249 ; SSE41-NEXT:    psrlq $50, %xmm1
1250 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1251 ; SSE41-NEXT:    psrlq $60, %xmm2
1252 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm1[4,5,6,7]
1253 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
1254 ; SSE41-NEXT:    psllq $14, %xmm1
1255 ; SSE41-NEXT:    psllq $4, %xmm0
1256 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
1257 ; SSE41-NEXT:    por %xmm2, %xmm0
1258 ; SSE41-NEXT:    retq
1260 ; AVX1-LABEL: constant_funnnel_v2i64:
1261 ; AVX1:       # %bb.0:
1262 ; AVX1-NEXT:    vpsrlq $50, %xmm0, %xmm1
1263 ; AVX1-NEXT:    vpsrlq $60, %xmm0, %xmm2
1264 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]
1265 ; AVX1-NEXT:    vpsllq $14, %xmm0, %xmm2
1266 ; AVX1-NEXT:    vpsllq $4, %xmm0, %xmm0
1267 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
1268 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
1269 ; AVX1-NEXT:    retq
1271 ; AVX2-LABEL: constant_funnnel_v2i64:
1272 ; AVX2:       # %bb.0:
1273 ; AVX2-NEXT:    vpsrlvq {{.*}}(%rip), %xmm0, %xmm1
1274 ; AVX2-NEXT:    vpsllvq {{.*}}(%rip), %xmm0, %xmm0
1275 ; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
1276 ; AVX2-NEXT:    retq
1278 ; AVX512F-LABEL: constant_funnnel_v2i64:
1279 ; AVX512F:       # %bb.0:
1280 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1281 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm1 = [4,14]
1282 ; AVX512F-NEXT:    vprolvq %zmm1, %zmm0, %zmm0
1283 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1284 ; AVX512F-NEXT:    vzeroupper
1285 ; AVX512F-NEXT:    retq
1287 ; AVX512VL-LABEL: constant_funnnel_v2i64:
1288 ; AVX512VL:       # %bb.0:
1289 ; AVX512VL-NEXT:    vprolvq {{.*}}(%rip), %xmm0, %xmm0
1290 ; AVX512VL-NEXT:    retq
1292 ; AVX512BW-LABEL: constant_funnnel_v2i64:
1293 ; AVX512BW:       # %bb.0:
1294 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1295 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm1 = [4,14]
1296 ; AVX512BW-NEXT:    vprolvq %zmm1, %zmm0, %zmm0
1297 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1298 ; AVX512BW-NEXT:    vzeroupper
1299 ; AVX512BW-NEXT:    retq
1301 ; AVX512VLBW-LABEL: constant_funnnel_v2i64:
1302 ; AVX512VLBW:       # %bb.0:
1303 ; AVX512VLBW-NEXT:    vprolvq {{.*}}(%rip), %xmm0, %xmm0
1304 ; AVX512VLBW-NEXT:    retq
1306 ; XOP-LABEL: constant_funnnel_v2i64:
1307 ; XOP:       # %bb.0:
1308 ; XOP-NEXT:    vprotq {{.*}}(%rip), %xmm0, %xmm0
1309 ; XOP-NEXT:    retq
1311 ; X32-SSE-LABEL: constant_funnnel_v2i64:
1312 ; X32-SSE:       # %bb.0:
1313 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1314 ; X32-SSE-NEXT:    psrlq $60, %xmm1
1315 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
1316 ; X32-SSE-NEXT:    psrlq $50, %xmm2
1317 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm2 = xmm1[0],xmm2[1]
1318 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1319 ; X32-SSE-NEXT:    psllq $4, %xmm1
1320 ; X32-SSE-NEXT:    psllq $14, %xmm0
1321 ; X32-SSE-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1322 ; X32-SSE-NEXT:    orpd %xmm2, %xmm0
1323 ; X32-SSE-NEXT:    retl
1324   %res = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> %x, <2 x i64> %x, <2 x i64> <i64 4, i64 14>)
1325   ret <2 x i64> %res
1328 define <4 x i32> @constant_funnnel_v4i32(<4 x i32> %x) nounwind {
1329 ; SSE2-LABEL: constant_funnnel_v4i32:
1330 ; SSE2:       # %bb.0:
1331 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [16,32,64,128]
1332 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
1333 ; SSE2-NEXT:    pmuludq %xmm1, %xmm0
1334 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]
1335 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1336 ; SSE2-NEXT:    pmuludq %xmm2, %xmm1
1337 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]
1338 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
1339 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1340 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
1341 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1342 ; SSE2-NEXT:    por %xmm3, %xmm0
1343 ; SSE2-NEXT:    retq
1345 ; SSE41-LABEL: constant_funnnel_v4i32:
1346 ; SSE41:       # %bb.0:
1347 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [16,32,64,128]
1348 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
1349 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
1350 ; SSE41-NEXT:    pmuludq %xmm2, %xmm3
1351 ; SSE41-NEXT:    pmuludq %xmm1, %xmm0
1352 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
1353 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]
1354 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
1355 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
1356 ; SSE41-NEXT:    por %xmm1, %xmm0
1357 ; SSE41-NEXT:    retq
1359 ; AVX1-LABEL: constant_funnnel_v4i32:
1360 ; AVX1:       # %bb.0:
1361 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [16,32,64,128]
1362 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
1363 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
1364 ; AVX1-NEXT:    vpmuludq %xmm2, %xmm3, %xmm2
1365 ; AVX1-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
1366 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
1367 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
1368 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[0,0,2,2]
1369 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
1370 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
1371 ; AVX1-NEXT:    retq
1373 ; AVX2-LABEL: constant_funnnel_v4i32:
1374 ; AVX2:       # %bb.0:
1375 ; AVX2-NEXT:    vpsrlvd {{.*}}(%rip), %xmm0, %xmm1
1376 ; AVX2-NEXT:    vpsllvd {{.*}}(%rip), %xmm0, %xmm0
1377 ; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
1378 ; AVX2-NEXT:    retq
1380 ; AVX512F-LABEL: constant_funnnel_v4i32:
1381 ; AVX512F:       # %bb.0:
1382 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1383 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm1 = [4,5,6,7]
1384 ; AVX512F-NEXT:    vprolvd %zmm1, %zmm0, %zmm0
1385 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1386 ; AVX512F-NEXT:    vzeroupper
1387 ; AVX512F-NEXT:    retq
1389 ; AVX512VL-LABEL: constant_funnnel_v4i32:
1390 ; AVX512VL:       # %bb.0:
1391 ; AVX512VL-NEXT:    vprolvd {{.*}}(%rip), %xmm0, %xmm0
1392 ; AVX512VL-NEXT:    retq
1394 ; AVX512BW-LABEL: constant_funnnel_v4i32:
1395 ; AVX512BW:       # %bb.0:
1396 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1397 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm1 = [4,5,6,7]
1398 ; AVX512BW-NEXT:    vprolvd %zmm1, %zmm0, %zmm0
1399 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1400 ; AVX512BW-NEXT:    vzeroupper
1401 ; AVX512BW-NEXT:    retq
1403 ; AVX512VLBW-LABEL: constant_funnnel_v4i32:
1404 ; AVX512VLBW:       # %bb.0:
1405 ; AVX512VLBW-NEXT:    vprolvd {{.*}}(%rip), %xmm0, %xmm0
1406 ; AVX512VLBW-NEXT:    retq
1408 ; XOP-LABEL: constant_funnnel_v4i32:
1409 ; XOP:       # %bb.0:
1410 ; XOP-NEXT:    vprotd {{.*}}(%rip), %xmm0, %xmm0
1411 ; XOP-NEXT:    retq
1413 ; X32-SSE-LABEL: constant_funnnel_v4i32:
1414 ; X32-SSE:       # %bb.0:
1415 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [16,32,64,128]
1416 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
1417 ; X32-SSE-NEXT:    pmuludq %xmm1, %xmm0
1418 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,3,2,3]
1419 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1420 ; X32-SSE-NEXT:    pmuludq %xmm2, %xmm1
1421 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,3,2,3]
1422 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
1423 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1424 ; X32-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
1425 ; X32-SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1426 ; X32-SSE-NEXT:    por %xmm3, %xmm0
1427 ; X32-SSE-NEXT:    retl
1428   %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>)
1429   ret <4 x i32> %res
1432 define <8 x i16> @constant_funnnel_v8i16(<8 x i16> %x) nounwind {
1433 ; SSE-LABEL: constant_funnnel_v8i16:
1434 ; SSE:       # %bb.0:
1435 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
1436 ; SSE-NEXT:    movdqa %xmm0, %xmm2
1437 ; SSE-NEXT:    pmulhuw %xmm1, %xmm2
1438 ; SSE-NEXT:    pmullw %xmm1, %xmm0
1439 ; SSE-NEXT:    por %xmm2, %xmm0
1440 ; SSE-NEXT:    retq
1442 ; AVX-LABEL: constant_funnnel_v8i16:
1443 ; AVX:       # %bb.0:
1444 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
1445 ; AVX-NEXT:    vpmulhuw %xmm1, %xmm0, %xmm2
1446 ; AVX-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1447 ; AVX-NEXT:    vpor %xmm2, %xmm0, %xmm0
1448 ; AVX-NEXT:    retq
1450 ; AVX512F-LABEL: constant_funnnel_v8i16:
1451 ; AVX512F:       # %bb.0:
1452 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
1453 ; AVX512F-NEXT:    vpmulhuw %xmm1, %xmm0, %xmm2
1454 ; AVX512F-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1455 ; AVX512F-NEXT:    vpor %xmm2, %xmm0, %xmm0
1456 ; AVX512F-NEXT:    retq
1458 ; AVX512VL-LABEL: constant_funnnel_v8i16:
1459 ; AVX512VL:       # %bb.0:
1460 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
1461 ; AVX512VL-NEXT:    vpmulhuw %xmm1, %xmm0, %xmm2
1462 ; AVX512VL-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1463 ; AVX512VL-NEXT:    vpor %xmm2, %xmm0, %xmm0
1464 ; AVX512VL-NEXT:    retq
1466 ; AVX512BW-LABEL: constant_funnnel_v8i16:
1467 ; AVX512BW:       # %bb.0:
1468 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1469 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm1 = [16,15,14,13,12,11,10,9]
1470 ; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm1
1471 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7]
1472 ; AVX512BW-NEXT:    vpsllvw %zmm2, %zmm0, %zmm0
1473 ; AVX512BW-NEXT:    vpor %xmm1, %xmm0, %xmm0
1474 ; AVX512BW-NEXT:    vzeroupper
1475 ; AVX512BW-NEXT:    retq
1477 ; AVX512VLBW-LABEL: constant_funnnel_v8i16:
1478 ; AVX512VLBW:       # %bb.0:
1479 ; AVX512VLBW-NEXT:    vpsrlvw {{.*}}(%rip), %xmm0, %xmm1
1480 ; AVX512VLBW-NEXT:    vpsllvw {{.*}}(%rip), %xmm0, %xmm0
1481 ; AVX512VLBW-NEXT:    vpor %xmm1, %xmm0, %xmm0
1482 ; AVX512VLBW-NEXT:    retq
1484 ; XOP-LABEL: constant_funnnel_v8i16:
1485 ; XOP:       # %bb.0:
1486 ; XOP-NEXT:    vprotw {{.*}}(%rip), %xmm0, %xmm0
1487 ; XOP-NEXT:    retq
1489 ; X32-SSE-LABEL: constant_funnnel_v8i16:
1490 ; X32-SSE:       # %bb.0:
1491 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128]
1492 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
1493 ; X32-SSE-NEXT:    pmulhuw %xmm1, %xmm2
1494 ; X32-SSE-NEXT:    pmullw %xmm1, %xmm0
1495 ; X32-SSE-NEXT:    por %xmm2, %xmm0
1496 ; X32-SSE-NEXT:    retl
1497   %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>)
1498   ret <8 x i16> %res
1501 define <16 x i8> @constant_funnnel_v16i8(<16 x i8> %x) nounwind {
1502 ; SSE2-LABEL: constant_funnnel_v16i8:
1503 ; SSE2:       # %bb.0:
1504 ; SSE2-NEXT:    pxor %xmm1, %xmm1
1505 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1506 ; 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]
1507 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm2
1508 ; SSE2-NEXT:    psrlw $8, %xmm2
1509 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1510 ; 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]
1511 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm3
1512 ; SSE2-NEXT:    psrlw $8, %xmm3
1513 ; SSE2-NEXT:    packuswb %xmm2, %xmm3
1514 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1515 ; 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]
1516 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm1
1517 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
1518 ; SSE2-NEXT:    pand %xmm2, %xmm1
1519 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1520 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm0
1521 ; SSE2-NEXT:    pand %xmm2, %xmm0
1522 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
1523 ; SSE2-NEXT:    por %xmm3, %xmm0
1524 ; SSE2-NEXT:    retq
1526 ; SSE41-LABEL: constant_funnnel_v16i8:
1527 ; SSE41:       # %bb.0:
1528 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1529 ; 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]
1530 ; SSE41-NEXT:    pmullw {{.*}}(%rip), %xmm2
1531 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
1532 ; SSE41-NEXT:    pand %xmm3, %xmm2
1533 ; 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
1534 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128]
1535 ; SSE41-NEXT:    pmullw %xmm1, %xmm4
1536 ; SSE41-NEXT:    pand %xmm3, %xmm4
1537 ; SSE41-NEXT:    packuswb %xmm2, %xmm4
1538 ; SSE41-NEXT:    pxor %xmm2, %xmm2
1539 ; 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]
1540 ; SSE41-NEXT:    pmullw {{.*}}(%rip), %xmm0
1541 ; SSE41-NEXT:    psrlw $8, %xmm0
1542 ; SSE41-NEXT:    pmullw {{.*}}(%rip), %xmm1
1543 ; SSE41-NEXT:    psrlw $8, %xmm1
1544 ; SSE41-NEXT:    packuswb %xmm0, %xmm1
1545 ; SSE41-NEXT:    por %xmm4, %xmm1
1546 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1547 ; SSE41-NEXT:    retq
1549 ; AVX1-LABEL: constant_funnnel_v16i8:
1550 ; AVX1:       # %bb.0:
1551 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1552 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm1, %xmm1
1553 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
1554 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
1555 ; 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
1556 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm3, %xmm4
1557 ; AVX1-NEXT:    vpand %xmm2, %xmm4, %xmm2
1558 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm2, %xmm1
1559 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1560 ; 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]
1561 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
1562 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
1563 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm3, %xmm2
1564 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
1565 ; AVX1-NEXT:    vpackuswb %xmm0, %xmm2, %xmm0
1566 ; AVX1-NEXT:    vpor %xmm0, %xmm1, %xmm0
1567 ; AVX1-NEXT:    retq
1569 ; AVX2-LABEL: constant_funnnel_v16i8:
1570 ; AVX2:       # %bb.0:
1571 ; 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
1572 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm1
1573 ; AVX2-NEXT:    vpsrlw $8, %ymm1, %ymm1
1574 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
1575 ; AVX2-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
1576 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
1577 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
1578 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
1579 ; AVX2-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
1580 ; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
1581 ; AVX2-NEXT:    vzeroupper
1582 ; AVX2-NEXT:    retq
1584 ; AVX512F-LABEL: constant_funnnel_v16i8:
1585 ; AVX512F:       # %bb.0:
1586 ; 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
1587 ; AVX512F-NEXT:    vpsrlvd {{.*}}(%rip), %zmm0, %zmm1
1588 ; AVX512F-NEXT:    vpsllvd {{.*}}(%rip), %zmm0, %zmm0
1589 ; AVX512F-NEXT:    vpord %zmm1, %zmm0, %zmm0
1590 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
1591 ; AVX512F-NEXT:    vzeroupper
1592 ; AVX512F-NEXT:    retq
1594 ; AVX512VL-LABEL: constant_funnnel_v16i8:
1595 ; AVX512VL:       # %bb.0:
1596 ; 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
1597 ; AVX512VL-NEXT:    vpsrlvd {{.*}}(%rip), %zmm0, %zmm1
1598 ; AVX512VL-NEXT:    vpsllvd {{.*}}(%rip), %zmm0, %zmm0
1599 ; AVX512VL-NEXT:    vpord %zmm1, %zmm0, %zmm0
1600 ; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
1601 ; AVX512VL-NEXT:    vzeroupper
1602 ; AVX512VL-NEXT:    retq
1604 ; AVX512BW-LABEL: constant_funnnel_v16i8:
1605 ; AVX512BW:       # %bb.0:
1606 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,7,6,5,4,3,2,1,0,1,2,3,4,5,6,7]
1607 ; 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
1608 ; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm1
1609 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,0,7,6,5,4,3,2,1]
1610 ; AVX512BW-NEXT:    vpsllvw %zmm2, %zmm0, %zmm0
1611 ; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm0
1612 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
1613 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1614 ; AVX512BW-NEXT:    vzeroupper
1615 ; AVX512BW-NEXT:    retq
1617 ; AVX512VLBW-LABEL: constant_funnnel_v16i8:
1618 ; AVX512VLBW:       # %bb.0:
1619 ; 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
1620 ; AVX512VLBW-NEXT:    vpsrlvw {{.*}}(%rip), %ymm0, %ymm1
1621 ; AVX512VLBW-NEXT:    vpsllvw {{.*}}(%rip), %ymm0, %ymm0
1622 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm0
1623 ; AVX512VLBW-NEXT:    vpmovwb %ymm0, %xmm0
1624 ; AVX512VLBW-NEXT:    vzeroupper
1625 ; AVX512VLBW-NEXT:    retq
1627 ; XOP-LABEL: constant_funnnel_v16i8:
1628 ; XOP:       # %bb.0:
1629 ; XOP-NEXT:    vprotb {{.*}}(%rip), %xmm0, %xmm0
1630 ; XOP-NEXT:    retq
1632 ; X32-SSE-LABEL: constant_funnnel_v16i8:
1633 ; X32-SSE:       # %bb.0:
1634 ; X32-SSE-NEXT:    pxor %xmm1, %xmm1
1635 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm2
1636 ; 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]
1637 ; X32-SSE-NEXT:    pmullw {{\.LCPI.*}}, %xmm2
1638 ; X32-SSE-NEXT:    psrlw $8, %xmm2
1639 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm3
1640 ; 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]
1641 ; X32-SSE-NEXT:    pmullw {{\.LCPI.*}}, %xmm3
1642 ; X32-SSE-NEXT:    psrlw $8, %xmm3
1643 ; X32-SSE-NEXT:    packuswb %xmm2, %xmm3
1644 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1645 ; 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]
1646 ; X32-SSE-NEXT:    pmullw {{\.LCPI.*}}, %xmm1
1647 ; X32-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
1648 ; X32-SSE-NEXT:    pand %xmm2, %xmm1
1649 ; X32-SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1650 ; X32-SSE-NEXT:    pmullw {{\.LCPI.*}}, %xmm0
1651 ; X32-SSE-NEXT:    pand %xmm2, %xmm0
1652 ; X32-SSE-NEXT:    packuswb %xmm1, %xmm0
1653 ; X32-SSE-NEXT:    por %xmm3, %xmm0
1654 ; X32-SSE-NEXT:    retl
1655   %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>)
1656   ret <16 x i8> %res
1660 ; Uniform Constant Shifts
1663 define <2 x i64> @splatconstant_funnnel_v2i64(<2 x i64> %x) nounwind {
1664 ; SSE-LABEL: splatconstant_funnnel_v2i64:
1665 ; SSE:       # %bb.0:
1666 ; SSE-NEXT:    movdqa %xmm0, %xmm1
1667 ; SSE-NEXT:    psrlq $50, %xmm1
1668 ; SSE-NEXT:    psllq $14, %xmm0
1669 ; SSE-NEXT:    por %xmm1, %xmm0
1670 ; SSE-NEXT:    retq
1672 ; AVX-LABEL: splatconstant_funnnel_v2i64:
1673 ; AVX:       # %bb.0:
1674 ; AVX-NEXT:    vpsrlq $50, %xmm0, %xmm1
1675 ; AVX-NEXT:    vpsllq $14, %xmm0, %xmm0
1676 ; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1677 ; AVX-NEXT:    retq
1679 ; AVX512F-LABEL: splatconstant_funnnel_v2i64:
1680 ; AVX512F:       # %bb.0:
1681 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1682 ; AVX512F-NEXT:    vprolq $14, %zmm0, %zmm0
1683 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1684 ; AVX512F-NEXT:    vzeroupper
1685 ; AVX512F-NEXT:    retq
1687 ; AVX512VL-LABEL: splatconstant_funnnel_v2i64:
1688 ; AVX512VL:       # %bb.0:
1689 ; AVX512VL-NEXT:    vprolq $14, %xmm0, %xmm0
1690 ; AVX512VL-NEXT:    retq
1692 ; AVX512BW-LABEL: splatconstant_funnnel_v2i64:
1693 ; AVX512BW:       # %bb.0:
1694 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1695 ; AVX512BW-NEXT:    vprolq $14, %zmm0, %zmm0
1696 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1697 ; AVX512BW-NEXT:    vzeroupper
1698 ; AVX512BW-NEXT:    retq
1700 ; AVX512VLBW-LABEL: splatconstant_funnnel_v2i64:
1701 ; AVX512VLBW:       # %bb.0:
1702 ; AVX512VLBW-NEXT:    vprolq $14, %xmm0, %xmm0
1703 ; AVX512VLBW-NEXT:    retq
1705 ; XOP-LABEL: splatconstant_funnnel_v2i64:
1706 ; XOP:       # %bb.0:
1707 ; XOP-NEXT:    vprotq $14, %xmm0, %xmm0
1708 ; XOP-NEXT:    retq
1710 ; X32-SSE-LABEL: splatconstant_funnnel_v2i64:
1711 ; X32-SSE:       # %bb.0:
1712 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1713 ; X32-SSE-NEXT:    psrlq $50, %xmm1
1714 ; X32-SSE-NEXT:    psllq $14, %xmm0
1715 ; X32-SSE-NEXT:    por %xmm1, %xmm0
1716 ; X32-SSE-NEXT:    retl
1717   %res = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> %x, <2 x i64> %x, <2 x i64> <i64 14, i64 14>)
1718   ret <2 x i64> %res
1721 define <4 x i32> @splatconstant_funnnel_v4i32(<4 x i32> %x) nounwind {
1722 ; SSE-LABEL: splatconstant_funnnel_v4i32:
1723 ; SSE:       # %bb.0:
1724 ; SSE-NEXT:    movdqa %xmm0, %xmm1
1725 ; SSE-NEXT:    psrld $28, %xmm1
1726 ; SSE-NEXT:    pslld $4, %xmm0
1727 ; SSE-NEXT:    por %xmm1, %xmm0
1728 ; SSE-NEXT:    retq
1730 ; AVX-LABEL: splatconstant_funnnel_v4i32:
1731 ; AVX:       # %bb.0:
1732 ; AVX-NEXT:    vpsrld $28, %xmm0, %xmm1
1733 ; AVX-NEXT:    vpslld $4, %xmm0, %xmm0
1734 ; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1735 ; AVX-NEXT:    retq
1737 ; AVX512F-LABEL: splatconstant_funnnel_v4i32:
1738 ; AVX512F:       # %bb.0:
1739 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1740 ; AVX512F-NEXT:    vprold $4, %zmm0, %zmm0
1741 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1742 ; AVX512F-NEXT:    vzeroupper
1743 ; AVX512F-NEXT:    retq
1745 ; AVX512VL-LABEL: splatconstant_funnnel_v4i32:
1746 ; AVX512VL:       # %bb.0:
1747 ; AVX512VL-NEXT:    vprold $4, %xmm0, %xmm0
1748 ; AVX512VL-NEXT:    retq
1750 ; AVX512BW-LABEL: splatconstant_funnnel_v4i32:
1751 ; AVX512BW:       # %bb.0:
1752 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1753 ; AVX512BW-NEXT:    vprold $4, %zmm0, %zmm0
1754 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1755 ; AVX512BW-NEXT:    vzeroupper
1756 ; AVX512BW-NEXT:    retq
1758 ; AVX512VLBW-LABEL: splatconstant_funnnel_v4i32:
1759 ; AVX512VLBW:       # %bb.0:
1760 ; AVX512VLBW-NEXT:    vprold $4, %xmm0, %xmm0
1761 ; AVX512VLBW-NEXT:    retq
1763 ; XOP-LABEL: splatconstant_funnnel_v4i32:
1764 ; XOP:       # %bb.0:
1765 ; XOP-NEXT:    vprotd $4, %xmm0, %xmm0
1766 ; XOP-NEXT:    retq
1768 ; X32-SSE-LABEL: splatconstant_funnnel_v4i32:
1769 ; X32-SSE:       # %bb.0:
1770 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1771 ; X32-SSE-NEXT:    psrld $28, %xmm1
1772 ; X32-SSE-NEXT:    pslld $4, %xmm0
1773 ; X32-SSE-NEXT:    por %xmm1, %xmm0
1774 ; X32-SSE-NEXT:    retl
1775   %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>)
1776   ret <4 x i32> %res
1779 define <8 x i16> @splatconstant_funnnel_v8i16(<8 x i16> %x) nounwind {
1780 ; SSE-LABEL: splatconstant_funnnel_v8i16:
1781 ; SSE:       # %bb.0:
1782 ; SSE-NEXT:    movdqa %xmm0, %xmm1
1783 ; SSE-NEXT:    psrlw $9, %xmm1
1784 ; SSE-NEXT:    psllw $7, %xmm0
1785 ; SSE-NEXT:    por %xmm1, %xmm0
1786 ; SSE-NEXT:    retq
1788 ; AVX-LABEL: splatconstant_funnnel_v8i16:
1789 ; AVX:       # %bb.0:
1790 ; AVX-NEXT:    vpsrlw $9, %xmm0, %xmm1
1791 ; AVX-NEXT:    vpsllw $7, %xmm0, %xmm0
1792 ; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1793 ; AVX-NEXT:    retq
1795 ; AVX512-LABEL: splatconstant_funnnel_v8i16:
1796 ; AVX512:       # %bb.0:
1797 ; AVX512-NEXT:    vpsrlw $9, %xmm0, %xmm1
1798 ; AVX512-NEXT:    vpsllw $7, %xmm0, %xmm0
1799 ; AVX512-NEXT:    vpor %xmm1, %xmm0, %xmm0
1800 ; AVX512-NEXT:    retq
1802 ; XOP-LABEL: splatconstant_funnnel_v8i16:
1803 ; XOP:       # %bb.0:
1804 ; XOP-NEXT:    vprotw $7, %xmm0, %xmm0
1805 ; XOP-NEXT:    retq
1807 ; X32-SSE-LABEL: splatconstant_funnnel_v8i16:
1808 ; X32-SSE:       # %bb.0:
1809 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1810 ; X32-SSE-NEXT:    psrlw $9, %xmm1
1811 ; X32-SSE-NEXT:    psllw $7, %xmm0
1812 ; X32-SSE-NEXT:    por %xmm1, %xmm0
1813 ; X32-SSE-NEXT:    retl
1814   %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>)
1815   ret <8 x i16> %res
1818 define <16 x i8> @splatconstant_funnnel_v16i8(<16 x i8> %x) nounwind {
1819 ; SSE-LABEL: splatconstant_funnnel_v16i8:
1820 ; SSE:       # %bb.0:
1821 ; SSE-NEXT:    movdqa %xmm0, %xmm1
1822 ; SSE-NEXT:    psrlw $4, %xmm1
1823 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm1
1824 ; SSE-NEXT:    psllw $4, %xmm0
1825 ; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
1826 ; SSE-NEXT:    por %xmm1, %xmm0
1827 ; SSE-NEXT:    retq
1829 ; AVX-LABEL: splatconstant_funnnel_v16i8:
1830 ; AVX:       # %bb.0:
1831 ; AVX-NEXT:    vpsrlw $4, %xmm0, %xmm1
1832 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
1833 ; AVX-NEXT:    vpsllw $4, %xmm0, %xmm0
1834 ; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1835 ; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1836 ; AVX-NEXT:    retq
1838 ; AVX512F-LABEL: splatconstant_funnnel_v16i8:
1839 ; AVX512F:       # %bb.0:
1840 ; AVX512F-NEXT:    vpsrlw $4, %xmm0, %xmm1
1841 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
1842 ; AVX512F-NEXT:    vpsllw $4, %xmm0, %xmm0
1843 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1844 ; AVX512F-NEXT:    vpor %xmm1, %xmm0, %xmm0
1845 ; AVX512F-NEXT:    retq
1847 ; AVX512VL-LABEL: splatconstant_funnnel_v16i8:
1848 ; AVX512VL:       # %bb.0:
1849 ; AVX512VL-NEXT:    vpsllw $4, %xmm0, %xmm1
1850 ; AVX512VL-NEXT:    vpsrlw $4, %xmm0, %xmm0
1851 ; AVX512VL-NEXT:    vpternlogq $216, {{.*}}(%rip), %xmm1, %xmm0
1852 ; AVX512VL-NEXT:    retq
1854 ; AVX512BW-LABEL: splatconstant_funnnel_v16i8:
1855 ; AVX512BW:       # %bb.0:
1856 ; AVX512BW-NEXT:    vpsrlw $4, %xmm0, %xmm1
1857 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
1858 ; AVX512BW-NEXT:    vpsllw $4, %xmm0, %xmm0
1859 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1860 ; AVX512BW-NEXT:    vpor %xmm1, %xmm0, %xmm0
1861 ; AVX512BW-NEXT:    retq
1863 ; AVX512VLBW-LABEL: splatconstant_funnnel_v16i8:
1864 ; AVX512VLBW:       # %bb.0:
1865 ; AVX512VLBW-NEXT:    vpsllw $4, %xmm0, %xmm1
1866 ; AVX512VLBW-NEXT:    vpsrlw $4, %xmm0, %xmm0
1867 ; AVX512VLBW-NEXT:    vpternlogq $216, {{.*}}(%rip), %xmm1, %xmm0
1868 ; AVX512VLBW-NEXT:    retq
1870 ; XOP-LABEL: splatconstant_funnnel_v16i8:
1871 ; XOP:       # %bb.0:
1872 ; XOP-NEXT:    vprotb $4, %xmm0, %xmm0
1873 ; XOP-NEXT:    retq
1875 ; X32-SSE-LABEL: splatconstant_funnnel_v16i8:
1876 ; X32-SSE:       # %bb.0:
1877 ; X32-SSE-NEXT:    movdqa %xmm0, %xmm1
1878 ; X32-SSE-NEXT:    psrlw $4, %xmm1
1879 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm1
1880 ; X32-SSE-NEXT:    psllw $4, %xmm0
1881 ; X32-SSE-NEXT:    pand {{\.LCPI.*}}, %xmm0
1882 ; X32-SSE-NEXT:    por %xmm1, %xmm0
1883 ; X32-SSE-NEXT:    retl
1884   %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>)
1885   ret <16 x i8> %res