[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / X86 / vector-fshl-128.ll
blobd0f632527276812638eed93361892a10ae03a2ce
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=AVX512F
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=AVX512VL
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512BW
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vbmi2 | FileCheck %s --check-prefixes=AVX512VBMI2
10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512VLBW
11 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vbmi2,+avx512vl | FileCheck %s --check-prefixes=AVX512VLVBMI2
12 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefixes=XOP,XOPAVX1
13 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefixes=XOP,XOPAVX2
15 ; Just one 32-bit run to make sure we do reasonable things for i64 cases.
16 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=X86-SSE2
18 declare <2 x i64> @llvm.fshl.v2i64(<2 x i64>, <2 x i64>, <2 x i64>)
19 declare <4 x i32> @llvm.fshl.v4i32(<4 x i32>, <4 x i32>, <4 x i32>)
20 declare <8 x i16> @llvm.fshl.v8i16(<8 x i16>, <8 x i16>, <8 x i16>)
21 declare <16 x i8> @llvm.fshl.v16i8(<16 x i8>, <16 x i8>, <16 x i8>)
24 ; Variable Shifts
27 define <2 x i64> @var_funnnel_v2i64(<2 x i64> %x, <2 x i64> %y, <2 x i64> %amt) nounwind {
28 ; SSE2-LABEL: var_funnnel_v2i64:
29 ; SSE2:       # %bb.0:
30 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [63,63]
31 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
32 ; SSE2-NEXT:    pandn %xmm3, %xmm4
33 ; SSE2-NEXT:    psrlq $1, %xmm1
34 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
35 ; SSE2-NEXT:    psrlq %xmm4, %xmm5
36 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[2,3,2,3]
37 ; SSE2-NEXT:    psrlq %xmm4, %xmm1
38 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm5[0],xmm1[1]
39 ; SSE2-NEXT:    pand %xmm3, %xmm2
40 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
41 ; SSE2-NEXT:    psllq %xmm2, %xmm3
42 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]
43 ; SSE2-NEXT:    psllq %xmm2, %xmm0
44 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm3[0],xmm0[1]
45 ; SSE2-NEXT:    orpd %xmm1, %xmm0
46 ; SSE2-NEXT:    retq
48 ; SSE41-LABEL: var_funnnel_v2i64:
49 ; SSE41:       # %bb.0:
50 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [63,63]
51 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
52 ; SSE41-NEXT:    pandn %xmm3, %xmm4
53 ; SSE41-NEXT:    psrlq $1, %xmm1
54 ; SSE41-NEXT:    movdqa %xmm1, %xmm5
55 ; SSE41-NEXT:    psrlq %xmm4, %xmm5
56 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[2,3,2,3]
57 ; SSE41-NEXT:    psrlq %xmm4, %xmm1
58 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm5[0,1,2,3],xmm1[4,5,6,7]
59 ; SSE41-NEXT:    pand %xmm3, %xmm2
60 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
61 ; SSE41-NEXT:    psllq %xmm2, %xmm3
62 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]
63 ; SSE41-NEXT:    psllq %xmm2, %xmm0
64 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]
65 ; SSE41-NEXT:    por %xmm1, %xmm0
66 ; SSE41-NEXT:    retq
68 ; AVX1-LABEL: var_funnnel_v2i64:
69 ; AVX1:       # %bb.0:
70 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [63,63]
71 ; AVX1-NEXT:    vpandn %xmm3, %xmm2, %xmm4
72 ; AVX1-NEXT:    vpsrlq $1, %xmm1, %xmm1
73 ; AVX1-NEXT:    vpsrlq %xmm4, %xmm1, %xmm5
74 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[2,3,2,3]
75 ; AVX1-NEXT:    vpsrlq %xmm4, %xmm1, %xmm1
76 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm5[0,1,2,3],xmm1[4,5,6,7]
77 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
78 ; AVX1-NEXT:    vpsllq %xmm2, %xmm0, %xmm3
79 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]
80 ; AVX1-NEXT:    vpsllq %xmm2, %xmm0, %xmm0
81 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]
82 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
83 ; AVX1-NEXT:    retq
85 ; AVX2-LABEL: var_funnnel_v2i64:
86 ; AVX2:       # %bb.0:
87 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [63,63]
88 ; AVX2-NEXT:    vpandn %xmm3, %xmm2, %xmm4
89 ; AVX2-NEXT:    vpsrlq $1, %xmm1, %xmm1
90 ; AVX2-NEXT:    vpsrlvq %xmm4, %xmm1, %xmm1
91 ; AVX2-NEXT:    vpand %xmm3, %xmm2, %xmm2
92 ; AVX2-NEXT:    vpsllvq %xmm2, %xmm0, %xmm0
93 ; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
94 ; AVX2-NEXT:    retq
96 ; AVX512F-LABEL: var_funnnel_v2i64:
97 ; AVX512F:       # %bb.0:
98 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm3 = [63,63]
99 ; AVX512F-NEXT:    vpandn %xmm3, %xmm2, %xmm4
100 ; AVX512F-NEXT:    vpsrlq $1, %xmm1, %xmm1
101 ; AVX512F-NEXT:    vpsrlvq %xmm4, %xmm1, %xmm1
102 ; AVX512F-NEXT:    vpand %xmm3, %xmm2, %xmm2
103 ; AVX512F-NEXT:    vpsllvq %xmm2, %xmm0, %xmm0
104 ; AVX512F-NEXT:    vpor %xmm1, %xmm0, %xmm0
105 ; AVX512F-NEXT:    retq
107 ; AVX512VL-LABEL: var_funnnel_v2i64:
108 ; AVX512VL:       # %bb.0:
109 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm3 = [63,63]
110 ; AVX512VL-NEXT:    vpandn %xmm3, %xmm2, %xmm4
111 ; AVX512VL-NEXT:    vpsrlq $1, %xmm1, %xmm1
112 ; AVX512VL-NEXT:    vpsrlvq %xmm4, %xmm1, %xmm1
113 ; AVX512VL-NEXT:    vpand %xmm3, %xmm2, %xmm2
114 ; AVX512VL-NEXT:    vpsllvq %xmm2, %xmm0, %xmm0
115 ; AVX512VL-NEXT:    vpor %xmm1, %xmm0, %xmm0
116 ; AVX512VL-NEXT:    retq
118 ; AVX512BW-LABEL: var_funnnel_v2i64:
119 ; AVX512BW:       # %bb.0:
120 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm3 = [63,63]
121 ; AVX512BW-NEXT:    vpandn %xmm3, %xmm2, %xmm4
122 ; AVX512BW-NEXT:    vpsrlq $1, %xmm1, %xmm1
123 ; AVX512BW-NEXT:    vpsrlvq %xmm4, %xmm1, %xmm1
124 ; AVX512BW-NEXT:    vpand %xmm3, %xmm2, %xmm2
125 ; AVX512BW-NEXT:    vpsllvq %xmm2, %xmm0, %xmm0
126 ; AVX512BW-NEXT:    vpor %xmm1, %xmm0, %xmm0
127 ; AVX512BW-NEXT:    retq
129 ; AVX512VBMI2-LABEL: var_funnnel_v2i64:
130 ; AVX512VBMI2:       # %bb.0:
131 ; AVX512VBMI2-NEXT:    # kill: def $xmm2 killed $xmm2 def $zmm2
132 ; AVX512VBMI2-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
133 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
134 ; AVX512VBMI2-NEXT:    vpshldvq %zmm2, %zmm1, %zmm0
135 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
136 ; AVX512VBMI2-NEXT:    vzeroupper
137 ; AVX512VBMI2-NEXT:    retq
139 ; AVX512VLBW-LABEL: var_funnnel_v2i64:
140 ; AVX512VLBW:       # %bb.0:
141 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm3 = [63,63]
142 ; AVX512VLBW-NEXT:    vpandn %xmm3, %xmm2, %xmm4
143 ; AVX512VLBW-NEXT:    vpsrlq $1, %xmm1, %xmm1
144 ; AVX512VLBW-NEXT:    vpsrlvq %xmm4, %xmm1, %xmm1
145 ; AVX512VLBW-NEXT:    vpand %xmm3, %xmm2, %xmm2
146 ; AVX512VLBW-NEXT:    vpsllvq %xmm2, %xmm0, %xmm0
147 ; AVX512VLBW-NEXT:    vpor %xmm1, %xmm0, %xmm0
148 ; AVX512VLBW-NEXT:    retq
150 ; AVX512VLVBMI2-LABEL: var_funnnel_v2i64:
151 ; AVX512VLVBMI2:       # %bb.0:
152 ; AVX512VLVBMI2-NEXT:    vpshldvq %xmm2, %xmm1, %xmm0
153 ; AVX512VLVBMI2-NEXT:    retq
155 ; XOPAVX1-LABEL: var_funnnel_v2i64:
156 ; XOPAVX1:       # %bb.0:
157 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [63,63]
158 ; XOPAVX1-NEXT:    vpand %xmm3, %xmm2, %xmm4
159 ; XOPAVX1-NEXT:    vpshlq %xmm4, %xmm0, %xmm0
160 ; XOPAVX1-NEXT:    vpandn %xmm3, %xmm2, %xmm2
161 ; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
162 ; XOPAVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm2
163 ; XOPAVX1-NEXT:    vpsrlq $1, %xmm1, %xmm1
164 ; XOPAVX1-NEXT:    vpshlq %xmm2, %xmm1, %xmm1
165 ; XOPAVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
166 ; XOPAVX1-NEXT:    retq
168 ; XOPAVX2-LABEL: var_funnnel_v2i64:
169 ; XOPAVX2:       # %bb.0:
170 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [63,63]
171 ; XOPAVX2-NEXT:    vpandn %xmm3, %xmm2, %xmm4
172 ; XOPAVX2-NEXT:    vpsrlq $1, %xmm1, %xmm1
173 ; XOPAVX2-NEXT:    vpsrlvq %xmm4, %xmm1, %xmm1
174 ; XOPAVX2-NEXT:    vpand %xmm3, %xmm2, %xmm2
175 ; XOPAVX2-NEXT:    vpsllvq %xmm2, %xmm0, %xmm0
176 ; XOPAVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
177 ; XOPAVX2-NEXT:    retq
179 ; X86-SSE2-LABEL: var_funnnel_v2i64:
180 ; X86-SSE2:       # %bb.0:
181 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [63,0,63,0]
182 ; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
183 ; X86-SSE2-NEXT:    pandn %xmm3, %xmm4
184 ; X86-SSE2-NEXT:    psrlq $1, %xmm1
185 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm5
186 ; X86-SSE2-NEXT:    psrlq %xmm4, %xmm5
187 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[2,3,2,3]
188 ; X86-SSE2-NEXT:    psrlq %xmm4, %xmm1
189 ; X86-SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm5[0],xmm1[1]
190 ; X86-SSE2-NEXT:    pand %xmm3, %xmm2
191 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
192 ; X86-SSE2-NEXT:    psllq %xmm2, %xmm3
193 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]
194 ; X86-SSE2-NEXT:    psllq %xmm2, %xmm0
195 ; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm3[0],xmm0[1]
196 ; X86-SSE2-NEXT:    orpd %xmm1, %xmm0
197 ; X86-SSE2-NEXT:    retl
198   %res = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> %x, <2 x i64> %y, <2 x i64> %amt)
199   ret <2 x i64> %res
202 define <4 x i32> @var_funnnel_v4i32(<4 x i32> %x, <4 x i32> %y, <4 x i32> %amt) nounwind {
203 ; SSE2-LABEL: var_funnnel_v4i32:
204 ; SSE2:       # %bb.0:
205 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [31,31,31,31]
206 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
207 ; SSE2-NEXT:    pandn %xmm4, %xmm5
208 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm5[2,3,3,3,4,5,6,7]
209 ; SSE2-NEXT:    psrld $1, %xmm1
210 ; SSE2-NEXT:    movdqa %xmm1, %xmm6
211 ; SSE2-NEXT:    psrld %xmm3, %xmm6
212 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm7 = xmm5[0,1,1,1,4,5,6,7]
213 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
214 ; SSE2-NEXT:    psrld %xmm7, %xmm3
215 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm6[0]
216 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[2,3,2,3]
217 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
218 ; SSE2-NEXT:    movdqa %xmm1, %xmm7
219 ; SSE2-NEXT:    psrld %xmm6, %xmm7
220 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
221 ; SSE2-NEXT:    psrld %xmm5, %xmm1
222 ; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm7[1]
223 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,3],xmm1[0,3]
224 ; SSE2-NEXT:    pand %xmm4, %xmm2
225 ; SSE2-NEXT:    pslld $23, %xmm2
226 ; SSE2-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
227 ; SSE2-NEXT:    cvttps2dq %xmm2, %xmm1
228 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
229 ; SSE2-NEXT:    pmuludq %xmm1, %xmm0
230 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
231 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
232 ; SSE2-NEXT:    pmuludq %xmm2, %xmm1
233 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
234 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
235 ; SSE2-NEXT:    por %xmm3, %xmm0
236 ; SSE2-NEXT:    retq
238 ; SSE41-LABEL: var_funnnel_v4i32:
239 ; SSE41:       # %bb.0:
240 ; SSE41-NEXT:    movdqa {{.*#+}} xmm8 = [31,31,31,31]
241 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
242 ; SSE41-NEXT:    pandn %xmm8, %xmm4
243 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm5 = xmm4[2,3,3,3,4,5,6,7]
244 ; SSE41-NEXT:    psrld $1, %xmm1
245 ; SSE41-NEXT:    movdqa %xmm1, %xmm6
246 ; SSE41-NEXT:    psrld %xmm5, %xmm6
247 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[2,3,2,3]
248 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm7 = xmm5[2,3,3,3,4,5,6,7]
249 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
250 ; SSE41-NEXT:    psrld %xmm7, %xmm3
251 ; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm6[0,1,2,3],xmm3[4,5,6,7]
252 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[0,1,1,1,4,5,6,7]
253 ; SSE41-NEXT:    movdqa %xmm1, %xmm6
254 ; SSE41-NEXT:    psrld %xmm4, %xmm6
255 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm4 = xmm5[0,1,1,1,4,5,6,7]
256 ; SSE41-NEXT:    psrld %xmm4, %xmm1
257 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm6[0,1,2,3],xmm1[4,5,6,7]
258 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]
259 ; SSE41-NEXT:    pand %xmm8, %xmm2
260 ; SSE41-NEXT:    pslld $23, %xmm2
261 ; SSE41-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
262 ; SSE41-NEXT:    cvttps2dq %xmm2, %xmm2
263 ; SSE41-NEXT:    pmulld %xmm2, %xmm0
264 ; SSE41-NEXT:    por %xmm1, %xmm0
265 ; SSE41-NEXT:    retq
267 ; AVX1-LABEL: var_funnnel_v4i32:
268 ; AVX1:       # %bb.0:
269 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [31,31,31,31]
270 ; AVX1-NEXT:    vpandn %xmm3, %xmm2, %xmm4
271 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm5 = xmm4[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
272 ; AVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
273 ; AVX1-NEXT:    vpsrld %xmm5, %xmm1, %xmm5
274 ; AVX1-NEXT:    vpsrlq $32, %xmm4, %xmm6
275 ; AVX1-NEXT:    vpsrld %xmm6, %xmm1, %xmm6
276 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm5 = xmm6[0,1,2,3],xmm5[4,5,6,7]
277 ; AVX1-NEXT:    vpxor %xmm6, %xmm6, %xmm6
278 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm6 = xmm4[2],xmm6[2],xmm4[3],xmm6[3]
279 ; AVX1-NEXT:    vpsrld %xmm6, %xmm1, %xmm6
280 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
281 ; AVX1-NEXT:    vpsrld %xmm4, %xmm1, %xmm1
282 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm6[4,5,6,7]
283 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm5[2,3],xmm1[4,5],xmm5[6,7]
284 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
285 ; AVX1-NEXT:    vpslld $23, %xmm2, %xmm2
286 ; AVX1-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
287 ; AVX1-NEXT:    vcvttps2dq %xmm2, %xmm2
288 ; AVX1-NEXT:    vpmulld %xmm2, %xmm0, %xmm0
289 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
290 ; AVX1-NEXT:    retq
292 ; AVX2-LABEL: var_funnnel_v4i32:
293 ; AVX2:       # %bb.0:
294 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]
295 ; AVX2-NEXT:    vpandn %xmm3, %xmm2, %xmm4
296 ; AVX2-NEXT:    vpsrld $1, %xmm1, %xmm1
297 ; AVX2-NEXT:    vpsrlvd %xmm4, %xmm1, %xmm1
298 ; AVX2-NEXT:    vpand %xmm3, %xmm2, %xmm2
299 ; AVX2-NEXT:    vpsllvd %xmm2, %xmm0, %xmm0
300 ; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
301 ; AVX2-NEXT:    retq
303 ; AVX512F-LABEL: var_funnnel_v4i32:
304 ; AVX512F:       # %bb.0:
305 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]
306 ; AVX512F-NEXT:    vpandn %xmm3, %xmm2, %xmm4
307 ; AVX512F-NEXT:    vpsrld $1, %xmm1, %xmm1
308 ; AVX512F-NEXT:    vpsrlvd %xmm4, %xmm1, %xmm1
309 ; AVX512F-NEXT:    vpand %xmm3, %xmm2, %xmm2
310 ; AVX512F-NEXT:    vpsllvd %xmm2, %xmm0, %xmm0
311 ; AVX512F-NEXT:    vpor %xmm1, %xmm0, %xmm0
312 ; AVX512F-NEXT:    retq
314 ; AVX512VL-LABEL: var_funnnel_v4i32:
315 ; AVX512VL:       # %bb.0:
316 ; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]
317 ; AVX512VL-NEXT:    vpandn %xmm3, %xmm2, %xmm4
318 ; AVX512VL-NEXT:    vpsrld $1, %xmm1, %xmm1
319 ; AVX512VL-NEXT:    vpsrlvd %xmm4, %xmm1, %xmm1
320 ; AVX512VL-NEXT:    vpand %xmm3, %xmm2, %xmm2
321 ; AVX512VL-NEXT:    vpsllvd %xmm2, %xmm0, %xmm0
322 ; AVX512VL-NEXT:    vpor %xmm1, %xmm0, %xmm0
323 ; AVX512VL-NEXT:    retq
325 ; AVX512BW-LABEL: var_funnnel_v4i32:
326 ; AVX512BW:       # %bb.0:
327 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]
328 ; AVX512BW-NEXT:    vpandn %xmm3, %xmm2, %xmm4
329 ; AVX512BW-NEXT:    vpsrld $1, %xmm1, %xmm1
330 ; AVX512BW-NEXT:    vpsrlvd %xmm4, %xmm1, %xmm1
331 ; AVX512BW-NEXT:    vpand %xmm3, %xmm2, %xmm2
332 ; AVX512BW-NEXT:    vpsllvd %xmm2, %xmm0, %xmm0
333 ; AVX512BW-NEXT:    vpor %xmm1, %xmm0, %xmm0
334 ; AVX512BW-NEXT:    retq
336 ; AVX512VBMI2-LABEL: var_funnnel_v4i32:
337 ; AVX512VBMI2:       # %bb.0:
338 ; AVX512VBMI2-NEXT:    # kill: def $xmm2 killed $xmm2 def $zmm2
339 ; AVX512VBMI2-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
340 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
341 ; AVX512VBMI2-NEXT:    vpshldvd %zmm2, %zmm1, %zmm0
342 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
343 ; AVX512VBMI2-NEXT:    vzeroupper
344 ; AVX512VBMI2-NEXT:    retq
346 ; AVX512VLBW-LABEL: var_funnnel_v4i32:
347 ; AVX512VLBW:       # %bb.0:
348 ; AVX512VLBW-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]
349 ; AVX512VLBW-NEXT:    vpandn %xmm3, %xmm2, %xmm4
350 ; AVX512VLBW-NEXT:    vpsrld $1, %xmm1, %xmm1
351 ; AVX512VLBW-NEXT:    vpsrlvd %xmm4, %xmm1, %xmm1
352 ; AVX512VLBW-NEXT:    vpand %xmm3, %xmm2, %xmm2
353 ; AVX512VLBW-NEXT:    vpsllvd %xmm2, %xmm0, %xmm0
354 ; AVX512VLBW-NEXT:    vpor %xmm1, %xmm0, %xmm0
355 ; AVX512VLBW-NEXT:    retq
357 ; AVX512VLVBMI2-LABEL: var_funnnel_v4i32:
358 ; AVX512VLVBMI2:       # %bb.0:
359 ; AVX512VLVBMI2-NEXT:    vpshldvd %xmm2, %xmm1, %xmm0
360 ; AVX512VLVBMI2-NEXT:    retq
362 ; XOPAVX1-LABEL: var_funnnel_v4i32:
363 ; XOPAVX1:       # %bb.0:
364 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [31,31,31,31]
365 ; XOPAVX1-NEXT:    vpand %xmm3, %xmm2, %xmm4
366 ; XOPAVX1-NEXT:    vpshld %xmm4, %xmm0, %xmm0
367 ; XOPAVX1-NEXT:    vpandn %xmm3, %xmm2, %xmm2
368 ; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
369 ; XOPAVX1-NEXT:    vpsubd %xmm2, %xmm3, %xmm2
370 ; XOPAVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
371 ; XOPAVX1-NEXT:    vpshld %xmm2, %xmm1, %xmm1
372 ; XOPAVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
373 ; XOPAVX1-NEXT:    retq
375 ; XOPAVX2-LABEL: var_funnnel_v4i32:
376 ; XOPAVX2:       # %bb.0:
377 ; XOPAVX2-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]
378 ; XOPAVX2-NEXT:    vpandn %xmm3, %xmm2, %xmm4
379 ; XOPAVX2-NEXT:    vpsrld $1, %xmm1, %xmm1
380 ; XOPAVX2-NEXT:    vpsrlvd %xmm4, %xmm1, %xmm1
381 ; XOPAVX2-NEXT:    vpand %xmm3, %xmm2, %xmm2
382 ; XOPAVX2-NEXT:    vpsllvd %xmm2, %xmm0, %xmm0
383 ; XOPAVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
384 ; XOPAVX2-NEXT:    retq
386 ; X86-SSE2-LABEL: var_funnnel_v4i32:
387 ; X86-SSE2:       # %bb.0:
388 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [31,31,31,31]
389 ; X86-SSE2-NEXT:    movdqa %xmm2, %xmm5
390 ; X86-SSE2-NEXT:    pandn %xmm4, %xmm5
391 ; X86-SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm5[2,3,3,3,4,5,6,7]
392 ; X86-SSE2-NEXT:    psrld $1, %xmm1
393 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm6
394 ; X86-SSE2-NEXT:    psrld %xmm3, %xmm6
395 ; X86-SSE2-NEXT:    pshuflw {{.*#+}} xmm7 = xmm5[0,1,1,1,4,5,6,7]
396 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm3
397 ; X86-SSE2-NEXT:    psrld %xmm7, %xmm3
398 ; X86-SSE2-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm6[0]
399 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[2,3,2,3]
400 ; X86-SSE2-NEXT:    pshuflw {{.*#+}} xmm6 = xmm5[2,3,3,3,4,5,6,7]
401 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm7
402 ; X86-SSE2-NEXT:    psrld %xmm6, %xmm7
403 ; X86-SSE2-NEXT:    pshuflw {{.*#+}} xmm5 = xmm5[0,1,1,1,4,5,6,7]
404 ; X86-SSE2-NEXT:    psrld %xmm5, %xmm1
405 ; X86-SSE2-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm7[1]
406 ; X86-SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,3],xmm1[0,3]
407 ; X86-SSE2-NEXT:    pand %xmm4, %xmm2
408 ; X86-SSE2-NEXT:    pslld $23, %xmm2
409 ; X86-SSE2-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
410 ; X86-SSE2-NEXT:    cvttps2dq %xmm2, %xmm1
411 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
412 ; X86-SSE2-NEXT:    pmuludq %xmm1, %xmm0
413 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
414 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
415 ; X86-SSE2-NEXT:    pmuludq %xmm2, %xmm1
416 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
417 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
418 ; X86-SSE2-NEXT:    por %xmm3, %xmm0
419 ; X86-SSE2-NEXT:    retl
420   %res = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %y, <4 x i32> %amt)
421   ret <4 x i32> %res
424 define <8 x i16> @var_funnnel_v8i16(<8 x i16> %x, <8 x i16> %y, <8 x i16> %amt) nounwind {
425 ; SSE2-LABEL: var_funnnel_v8i16:
426 ; SSE2:       # %bb.0:
427 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
428 ; SSE2-NEXT:    pxor %xmm2, %xmm4
429 ; SSE2-NEXT:    psllw $12, %xmm4
430 ; SSE2-NEXT:    movdqa %xmm4, %xmm3
431 ; SSE2-NEXT:    psraw $15, %xmm3
432 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
433 ; SSE2-NEXT:    psrlw $1, %xmm5
434 ; SSE2-NEXT:    psrlw $9, %xmm1
435 ; SSE2-NEXT:    pand %xmm3, %xmm1
436 ; SSE2-NEXT:    pandn %xmm5, %xmm3
437 ; SSE2-NEXT:    por %xmm1, %xmm3
438 ; SSE2-NEXT:    paddw %xmm4, %xmm4
439 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
440 ; SSE2-NEXT:    psraw $15, %xmm1
441 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
442 ; SSE2-NEXT:    pandn %xmm3, %xmm5
443 ; SSE2-NEXT:    psrlw $4, %xmm3
444 ; SSE2-NEXT:    pand %xmm1, %xmm3
445 ; SSE2-NEXT:    por %xmm5, %xmm3
446 ; SSE2-NEXT:    paddw %xmm4, %xmm4
447 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
448 ; SSE2-NEXT:    psraw $15, %xmm1
449 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
450 ; SSE2-NEXT:    pandn %xmm3, %xmm5
451 ; SSE2-NEXT:    psrlw $2, %xmm3
452 ; SSE2-NEXT:    pand %xmm1, %xmm3
453 ; SSE2-NEXT:    por %xmm5, %xmm3
454 ; SSE2-NEXT:    paddw %xmm4, %xmm4
455 ; SSE2-NEXT:    psraw $15, %xmm4
456 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
457 ; SSE2-NEXT:    pandn %xmm3, %xmm5
458 ; SSE2-NEXT:    psrlw $1, %xmm3
459 ; SSE2-NEXT:    pand %xmm4, %xmm3
460 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
461 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
462 ; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
463 ; SSE2-NEXT:    pslld $23, %xmm1
464 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [1065353216,1065353216,1065353216,1065353216]
465 ; SSE2-NEXT:    paddd %xmm4, %xmm1
466 ; SSE2-NEXT:    cvttps2dq %xmm1, %xmm1
467 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
468 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,6,6,7]
469 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[0,2,2,3]
470 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]
471 ; SSE2-NEXT:    pslld $23, %xmm2
472 ; SSE2-NEXT:    paddd %xmm4, %xmm2
473 ; SSE2-NEXT:    cvttps2dq %xmm2, %xmm1
474 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
475 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,6,6,7]
476 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
477 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm6[0]
478 ; SSE2-NEXT:    pmullw %xmm0, %xmm1
479 ; SSE2-NEXT:    por %xmm5, %xmm1
480 ; SSE2-NEXT:    por %xmm3, %xmm1
481 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
482 ; SSE2-NEXT:    retq
484 ; SSE41-LABEL: var_funnnel_v8i16:
485 ; SSE41:       # %bb.0:
486 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
487 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15]
488 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
489 ; SSE41-NEXT:    pandn %xmm5, %xmm0
490 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
491 ; SSE41-NEXT:    psllw $12, %xmm4
492 ; SSE41-NEXT:    psllw $4, %xmm0
493 ; SSE41-NEXT:    por %xmm4, %xmm0
494 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
495 ; SSE41-NEXT:    paddw %xmm0, %xmm4
496 ; SSE41-NEXT:    movdqa %xmm1, %xmm6
497 ; SSE41-NEXT:    psrlw $9, %xmm6
498 ; SSE41-NEXT:    psrlw $1, %xmm1
499 ; SSE41-NEXT:    pblendvb %xmm0, %xmm6, %xmm1
500 ; SSE41-NEXT:    movdqa %xmm1, %xmm6
501 ; SSE41-NEXT:    psrlw $4, %xmm6
502 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
503 ; SSE41-NEXT:    pblendvb %xmm0, %xmm6, %xmm1
504 ; SSE41-NEXT:    movdqa %xmm1, %xmm6
505 ; SSE41-NEXT:    psrlw $2, %xmm6
506 ; SSE41-NEXT:    paddw %xmm4, %xmm4
507 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
508 ; SSE41-NEXT:    pblendvb %xmm0, %xmm6, %xmm1
509 ; SSE41-NEXT:    movdqa %xmm1, %xmm6
510 ; SSE41-NEXT:    psrlw $1, %xmm6
511 ; SSE41-NEXT:    paddw %xmm4, %xmm4
512 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
513 ; SSE41-NEXT:    pblendvb %xmm0, %xmm6, %xmm1
514 ; SSE41-NEXT:    pand %xmm5, %xmm2
515 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero
516 ; SSE41-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]
517 ; SSE41-NEXT:    pslld $23, %xmm2
518 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [1065353216,1065353216,1065353216,1065353216]
519 ; SSE41-NEXT:    paddd %xmm4, %xmm2
520 ; SSE41-NEXT:    cvttps2dq %xmm2, %xmm2
521 ; SSE41-NEXT:    pslld $23, %xmm0
522 ; SSE41-NEXT:    paddd %xmm4, %xmm0
523 ; SSE41-NEXT:    cvttps2dq %xmm0, %xmm0
524 ; SSE41-NEXT:    packusdw %xmm2, %xmm0
525 ; SSE41-NEXT:    pmullw %xmm0, %xmm3
526 ; SSE41-NEXT:    por %xmm1, %xmm3
527 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
528 ; SSE41-NEXT:    retq
530 ; AVX1-LABEL: var_funnnel_v8i16:
531 ; AVX1:       # %bb.0:
532 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15]
533 ; AVX1-NEXT:    vpandn %xmm3, %xmm2, %xmm4
534 ; AVX1-NEXT:    vpsllw $12, %xmm4, %xmm5
535 ; AVX1-NEXT:    vpsllw $4, %xmm4, %xmm4
536 ; AVX1-NEXT:    vpor %xmm5, %xmm4, %xmm4
537 ; AVX1-NEXT:    vpaddw %xmm4, %xmm4, %xmm5
538 ; AVX1-NEXT:    vpsrlw $9, %xmm1, %xmm6
539 ; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm1
540 ; AVX1-NEXT:    vpblendvb %xmm4, %xmm6, %xmm1, %xmm1
541 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm4
542 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm4, %xmm1, %xmm1
543 ; AVX1-NEXT:    vpsrlw $2, %xmm1, %xmm4
544 ; AVX1-NEXT:    vpaddw %xmm5, %xmm5, %xmm5
545 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm4, %xmm1, %xmm1
546 ; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm4
547 ; AVX1-NEXT:    vpaddw %xmm5, %xmm5, %xmm5
548 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm4, %xmm1, %xmm1
549 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
550 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm3 = xmm2[4,4,5,5,6,6,7,7]
551 ; AVX1-NEXT:    vpslld $23, %xmm3, %xmm3
552 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [1065353216,1065353216,1065353216,1065353216]
553 ; AVX1-NEXT:    vpaddd %xmm4, %xmm3, %xmm3
554 ; AVX1-NEXT:    vcvttps2dq %xmm3, %xmm3
555 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero
556 ; AVX1-NEXT:    vpslld $23, %xmm2, %xmm2
557 ; AVX1-NEXT:    vpaddd %xmm4, %xmm2, %xmm2
558 ; AVX1-NEXT:    vcvttps2dq %xmm2, %xmm2
559 ; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
560 ; AVX1-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
561 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
562 ; AVX1-NEXT:    retq
564 ; AVX2-LABEL: var_funnnel_v8i16:
565 ; AVX2:       # %bb.0:
566 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15]
567 ; AVX2-NEXT:    vpandn %xmm3, %xmm2, %xmm4
568 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero
569 ; AVX2-NEXT:    vpsrlw $1, %xmm1, %xmm1
570 ; 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
571 ; AVX2-NEXT:    vpsrlvd %ymm4, %ymm1, %ymm1
572 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm4
573 ; AVX2-NEXT:    vpackusdw %xmm4, %xmm1, %xmm1
574 ; AVX2-NEXT:    vpand %xmm3, %xmm2, %xmm2
575 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
576 ; 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
577 ; AVX2-NEXT:    vpsllvd %ymm2, %ymm0, %ymm0
578 ; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
579 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
580 ; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
581 ; AVX2-NEXT:    vzeroupper
582 ; AVX2-NEXT:    retq
584 ; AVX512F-LABEL: var_funnnel_v8i16:
585 ; AVX512F:       # %bb.0:
586 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15]
587 ; AVX512F-NEXT:    vpandn %xmm3, %xmm2, %xmm4
588 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} ymm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero
589 ; AVX512F-NEXT:    vpsrlw $1, %xmm1, %xmm1
590 ; 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
591 ; AVX512F-NEXT:    vpsrlvd %ymm4, %ymm1, %ymm1
592 ; AVX512F-NEXT:    vpand %xmm3, %xmm2, %xmm2
593 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
594 ; 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
595 ; AVX512F-NEXT:    vpsllvd %ymm2, %ymm0, %ymm0
596 ; AVX512F-NEXT:    vpor %ymm1, %ymm0, %ymm0
597 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
598 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
599 ; AVX512F-NEXT:    vzeroupper
600 ; AVX512F-NEXT:    retq
602 ; AVX512VL-LABEL: var_funnnel_v8i16:
603 ; AVX512VL:       # %bb.0:
604 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15]
605 ; AVX512VL-NEXT:    vpandn %xmm3, %xmm2, %xmm4
606 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} ymm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero
607 ; AVX512VL-NEXT:    vpsrlw $1, %xmm1, %xmm1
608 ; 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
609 ; AVX512VL-NEXT:    vpsrlvd %ymm4, %ymm1, %ymm1
610 ; AVX512VL-NEXT:    vpand %xmm3, %xmm2, %xmm2
611 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
612 ; 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
613 ; AVX512VL-NEXT:    vpsllvd %ymm2, %ymm0, %ymm0
614 ; AVX512VL-NEXT:    vpor %ymm1, %ymm0, %ymm0
615 ; AVX512VL-NEXT:    vpmovdw %ymm0, %xmm0
616 ; AVX512VL-NEXT:    vzeroupper
617 ; AVX512VL-NEXT:    retq
619 ; AVX512BW-LABEL: var_funnnel_v8i16:
620 ; AVX512BW:       # %bb.0:
621 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
622 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15]
623 ; AVX512BW-NEXT:    vpandn %xmm3, %xmm2, %xmm4
624 ; AVX512BW-NEXT:    vpsrlw $1, %xmm1, %xmm1
625 ; AVX512BW-NEXT:    vpsrlvw %zmm4, %zmm1, %zmm1
626 ; AVX512BW-NEXT:    vpand %xmm3, %xmm2, %xmm2
627 ; AVX512BW-NEXT:    vpsllvw %zmm2, %zmm0, %zmm0
628 ; AVX512BW-NEXT:    vpor %xmm1, %xmm0, %xmm0
629 ; AVX512BW-NEXT:    vzeroupper
630 ; AVX512BW-NEXT:    retq
632 ; AVX512VBMI2-LABEL: var_funnnel_v8i16:
633 ; AVX512VBMI2:       # %bb.0:
634 ; AVX512VBMI2-NEXT:    # kill: def $xmm2 killed $xmm2 def $zmm2
635 ; AVX512VBMI2-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
636 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
637 ; AVX512VBMI2-NEXT:    vpshldvw %zmm2, %zmm1, %zmm0
638 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
639 ; AVX512VBMI2-NEXT:    vzeroupper
640 ; AVX512VBMI2-NEXT:    retq
642 ; AVX512VLBW-LABEL: var_funnnel_v8i16:
643 ; AVX512VLBW:       # %bb.0:
644 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15]
645 ; AVX512VLBW-NEXT:    vpandn %xmm3, %xmm2, %xmm4
646 ; AVX512VLBW-NEXT:    vpsrlw $1, %xmm1, %xmm1
647 ; AVX512VLBW-NEXT:    vpsrlvw %xmm4, %xmm1, %xmm1
648 ; AVX512VLBW-NEXT:    vpand %xmm3, %xmm2, %xmm2
649 ; AVX512VLBW-NEXT:    vpsllvw %xmm2, %xmm0, %xmm0
650 ; AVX512VLBW-NEXT:    vpor %xmm1, %xmm0, %xmm0
651 ; AVX512VLBW-NEXT:    retq
653 ; AVX512VLVBMI2-LABEL: var_funnnel_v8i16:
654 ; AVX512VLVBMI2:       # %bb.0:
655 ; AVX512VLVBMI2-NEXT:    vpshldvw %xmm2, %xmm1, %xmm0
656 ; AVX512VLVBMI2-NEXT:    retq
658 ; XOP-LABEL: var_funnnel_v8i16:
659 ; XOP:       # %bb.0:
660 ; XOP-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15]
661 ; XOP-NEXT:    vpand %xmm3, %xmm2, %xmm4
662 ; XOP-NEXT:    vpshlw %xmm4, %xmm0, %xmm0
663 ; XOP-NEXT:    vpandn %xmm3, %xmm2, %xmm2
664 ; XOP-NEXT:    vpxor %xmm3, %xmm3, %xmm3
665 ; XOP-NEXT:    vpsubw %xmm2, %xmm3, %xmm2
666 ; XOP-NEXT:    vpsrlw $1, %xmm1, %xmm1
667 ; XOP-NEXT:    vpshlw %xmm2, %xmm1, %xmm1
668 ; XOP-NEXT:    vpor %xmm1, %xmm0, %xmm0
669 ; XOP-NEXT:    retq
671 ; X86-SSE2-LABEL: var_funnnel_v8i16:
672 ; X86-SSE2:       # %bb.0:
673 ; X86-SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
674 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm4
675 ; X86-SSE2-NEXT:    psllw $12, %xmm4
676 ; X86-SSE2-NEXT:    movdqa %xmm4, %xmm3
677 ; X86-SSE2-NEXT:    psraw $15, %xmm3
678 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm5
679 ; X86-SSE2-NEXT:    psrlw $1, %xmm5
680 ; X86-SSE2-NEXT:    psrlw $9, %xmm1
681 ; X86-SSE2-NEXT:    pand %xmm3, %xmm1
682 ; X86-SSE2-NEXT:    pandn %xmm5, %xmm3
683 ; X86-SSE2-NEXT:    por %xmm1, %xmm3
684 ; X86-SSE2-NEXT:    paddw %xmm4, %xmm4
685 ; X86-SSE2-NEXT:    movdqa %xmm4, %xmm1
686 ; X86-SSE2-NEXT:    psraw $15, %xmm1
687 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm5
688 ; X86-SSE2-NEXT:    pandn %xmm3, %xmm5
689 ; X86-SSE2-NEXT:    psrlw $4, %xmm3
690 ; X86-SSE2-NEXT:    pand %xmm1, %xmm3
691 ; X86-SSE2-NEXT:    por %xmm5, %xmm3
692 ; X86-SSE2-NEXT:    paddw %xmm4, %xmm4
693 ; X86-SSE2-NEXT:    movdqa %xmm4, %xmm1
694 ; X86-SSE2-NEXT:    psraw $15, %xmm1
695 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm5
696 ; X86-SSE2-NEXT:    pandn %xmm3, %xmm5
697 ; X86-SSE2-NEXT:    psrlw $2, %xmm3
698 ; X86-SSE2-NEXT:    pand %xmm1, %xmm3
699 ; X86-SSE2-NEXT:    por %xmm5, %xmm3
700 ; X86-SSE2-NEXT:    paddw %xmm4, %xmm4
701 ; X86-SSE2-NEXT:    psraw $15, %xmm4
702 ; X86-SSE2-NEXT:    movdqa %xmm4, %xmm5
703 ; X86-SSE2-NEXT:    pandn %xmm3, %xmm5
704 ; X86-SSE2-NEXT:    psrlw $1, %xmm3
705 ; X86-SSE2-NEXT:    pand %xmm4, %xmm3
706 ; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
707 ; X86-SSE2-NEXT:    movdqa %xmm2, %xmm1
708 ; X86-SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
709 ; X86-SSE2-NEXT:    pslld $23, %xmm1
710 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [1065353216,1065353216,1065353216,1065353216]
711 ; X86-SSE2-NEXT:    paddd %xmm4, %xmm1
712 ; X86-SSE2-NEXT:    cvttps2dq %xmm1, %xmm1
713 ; X86-SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
714 ; X86-SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,6,6,7]
715 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[0,2,2,3]
716 ; X86-SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]
717 ; X86-SSE2-NEXT:    pslld $23, %xmm2
718 ; X86-SSE2-NEXT:    paddd %xmm4, %xmm2
719 ; X86-SSE2-NEXT:    cvttps2dq %xmm2, %xmm1
720 ; X86-SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
721 ; X86-SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,4,6,6,7]
722 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
723 ; X86-SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm6[0]
724 ; X86-SSE2-NEXT:    pmullw %xmm0, %xmm1
725 ; X86-SSE2-NEXT:    por %xmm5, %xmm1
726 ; X86-SSE2-NEXT:    por %xmm3, %xmm1
727 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
728 ; X86-SSE2-NEXT:    retl
729   %res = call <8 x i16> @llvm.fshl.v8i16(<8 x i16> %x, <8 x i16> %y, <8 x i16> %amt)
730   ret <8 x i16> %res
733 define <16 x i8> @var_funnnel_v16i8(<16 x i8> %x, <16 x i8> %y, <16 x i8> %amt) nounwind {
734 ; SSE2-LABEL: var_funnnel_v16i8:
735 ; SSE2:       # %bb.0:
736 ; SSE2-NEXT:    psrlw $1, %xmm1
737 ; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
738 ; SSE2-NEXT:    pand %xmm6, %xmm1
739 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
740 ; SSE2-NEXT:    movdqa %xmm2, %xmm7
741 ; SSE2-NEXT:    pandn %xmm8, %xmm7
742 ; SSE2-NEXT:    psllw $5, %xmm7
743 ; SSE2-NEXT:    pxor %xmm3, %xmm3
744 ; SSE2-NEXT:    pxor %xmm4, %xmm4
745 ; SSE2-NEXT:    pcmpgtb %xmm7, %xmm4
746 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
747 ; SSE2-NEXT:    pandn %xmm1, %xmm5
748 ; SSE2-NEXT:    psrlw $4, %xmm1
749 ; SSE2-NEXT:    pand %xmm4, %xmm1
750 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
751 ; SSE2-NEXT:    por %xmm5, %xmm1
752 ; SSE2-NEXT:    paddb %xmm7, %xmm7
753 ; SSE2-NEXT:    pxor %xmm4, %xmm4
754 ; SSE2-NEXT:    pcmpgtb %xmm7, %xmm4
755 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
756 ; SSE2-NEXT:    pandn %xmm1, %xmm5
757 ; SSE2-NEXT:    psrlw $2, %xmm1
758 ; SSE2-NEXT:    pand %xmm4, %xmm1
759 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
760 ; SSE2-NEXT:    por %xmm5, %xmm1
761 ; SSE2-NEXT:    paddb %xmm7, %xmm7
762 ; SSE2-NEXT:    pxor %xmm4, %xmm4
763 ; SSE2-NEXT:    pcmpgtb %xmm7, %xmm4
764 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
765 ; SSE2-NEXT:    pandn %xmm1, %xmm5
766 ; SSE2-NEXT:    psrlw $1, %xmm1
767 ; SSE2-NEXT:    pand %xmm6, %xmm4
768 ; SSE2-NEXT:    pand %xmm1, %xmm4
769 ; SSE2-NEXT:    por %xmm5, %xmm4
770 ; SSE2-NEXT:    pand %xmm8, %xmm2
771 ; SSE2-NEXT:    psllw $5, %xmm2
772 ; SSE2-NEXT:    pxor %xmm1, %xmm1
773 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm1
774 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
775 ; SSE2-NEXT:    pandn %xmm0, %xmm5
776 ; SSE2-NEXT:    psllw $4, %xmm0
777 ; SSE2-NEXT:    pand %xmm1, %xmm0
778 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
779 ; SSE2-NEXT:    por %xmm5, %xmm0
780 ; SSE2-NEXT:    paddb %xmm2, %xmm2
781 ; SSE2-NEXT:    pxor %xmm1, %xmm1
782 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm1
783 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
784 ; SSE2-NEXT:    pandn %xmm0, %xmm5
785 ; SSE2-NEXT:    psllw $2, %xmm0
786 ; SSE2-NEXT:    pand %xmm1, %xmm0
787 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
788 ; SSE2-NEXT:    por %xmm5, %xmm0
789 ; SSE2-NEXT:    paddb %xmm2, %xmm2
790 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm3
791 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
792 ; SSE2-NEXT:    pandn %xmm0, %xmm1
793 ; SSE2-NEXT:    por %xmm4, %xmm1
794 ; SSE2-NEXT:    paddb %xmm0, %xmm0
795 ; SSE2-NEXT:    pand %xmm3, %xmm0
796 ; SSE2-NEXT:    por %xmm1, %xmm0
797 ; SSE2-NEXT:    retq
799 ; SSE41-LABEL: var_funnnel_v16i8:
800 ; SSE41:       # %bb.0:
801 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
802 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
803 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
804 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
805 ; SSE41-NEXT:    pandn %xmm4, %xmm0
806 ; SSE41-NEXT:    psllw $5, %xmm0
807 ; SSE41-NEXT:    psrlw $1, %xmm1
808 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
809 ; SSE41-NEXT:    pand %xmm5, %xmm1
810 ; SSE41-NEXT:    movdqa %xmm1, %xmm6
811 ; SSE41-NEXT:    psrlw $4, %xmm6
812 ; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6
813 ; SSE41-NEXT:    pblendvb %xmm0, %xmm6, %xmm1
814 ; SSE41-NEXT:    movdqa %xmm1, %xmm6
815 ; SSE41-NEXT:    psrlw $2, %xmm6
816 ; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6
817 ; SSE41-NEXT:    paddb %xmm0, %xmm0
818 ; SSE41-NEXT:    pblendvb %xmm0, %xmm6, %xmm1
819 ; SSE41-NEXT:    movdqa %xmm1, %xmm6
820 ; SSE41-NEXT:    psrlw $1, %xmm6
821 ; SSE41-NEXT:    pand %xmm5, %xmm6
822 ; SSE41-NEXT:    paddb %xmm0, %xmm0
823 ; SSE41-NEXT:    pblendvb %xmm0, %xmm6, %xmm1
824 ; SSE41-NEXT:    pand %xmm4, %xmm3
825 ; SSE41-NEXT:    psllw $5, %xmm3
826 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
827 ; SSE41-NEXT:    paddb %xmm3, %xmm4
828 ; SSE41-NEXT:    movdqa %xmm2, %xmm5
829 ; SSE41-NEXT:    psllw $4, %xmm5
830 ; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5
831 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
832 ; SSE41-NEXT:    pblendvb %xmm0, %xmm5, %xmm2
833 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
834 ; SSE41-NEXT:    psllw $2, %xmm3
835 ; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
836 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
837 ; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm2
838 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
839 ; SSE41-NEXT:    paddb %xmm2, %xmm3
840 ; SSE41-NEXT:    paddb %xmm4, %xmm4
841 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
842 ; SSE41-NEXT:    pblendvb %xmm0, %xmm3, %xmm2
843 ; SSE41-NEXT:    por %xmm1, %xmm2
844 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
845 ; SSE41-NEXT:    retq
847 ; AVX-LABEL: var_funnnel_v16i8:
848 ; AVX:       # %bb.0:
849 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
850 ; AVX-NEXT:    vpandn %xmm3, %xmm2, %xmm4
851 ; AVX-NEXT:    vpsllw $5, %xmm4, %xmm4
852 ; AVX-NEXT:    vpsrlw $1, %xmm1, %xmm1
853 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm5 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
854 ; AVX-NEXT:    vpand %xmm5, %xmm1, %xmm1
855 ; AVX-NEXT:    vpsrlw $4, %xmm1, %xmm6
856 ; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6, %xmm6
857 ; AVX-NEXT:    vpblendvb %xmm4, %xmm6, %xmm1, %xmm1
858 ; AVX-NEXT:    vpsrlw $2, %xmm1, %xmm6
859 ; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6, %xmm6
860 ; AVX-NEXT:    vpaddb %xmm4, %xmm4, %xmm4
861 ; AVX-NEXT:    vpblendvb %xmm4, %xmm6, %xmm1, %xmm1
862 ; AVX-NEXT:    vpsrlw $1, %xmm1, %xmm6
863 ; AVX-NEXT:    vpand %xmm5, %xmm6, %xmm5
864 ; AVX-NEXT:    vpaddb %xmm4, %xmm4, %xmm4
865 ; AVX-NEXT:    vpblendvb %xmm4, %xmm5, %xmm1, %xmm1
866 ; AVX-NEXT:    vpand %xmm3, %xmm2, %xmm2
867 ; AVX-NEXT:    vpsllw $5, %xmm2, %xmm2
868 ; AVX-NEXT:    vpaddb %xmm2, %xmm2, %xmm3
869 ; AVX-NEXT:    vpsllw $4, %xmm0, %xmm4
870 ; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4
871 ; AVX-NEXT:    vpblendvb %xmm2, %xmm4, %xmm0, %xmm0
872 ; AVX-NEXT:    vpsllw $2, %xmm0, %xmm2
873 ; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
874 ; AVX-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
875 ; AVX-NEXT:    vpaddb %xmm0, %xmm0, %xmm2
876 ; AVX-NEXT:    vpaddb %xmm3, %xmm3, %xmm3
877 ; AVX-NEXT:    vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
878 ; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
879 ; AVX-NEXT:    retq
881 ; AVX512F-LABEL: var_funnnel_v16i8:
882 ; AVX512F:       # %bb.0:
883 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
884 ; AVX512F-NEXT:    vpand %xmm3, %xmm2, %xmm4
885 ; AVX512F-NEXT:    vpmovzxbd {{.*#+}} zmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero,xmm4[2],zero,zero,zero,xmm4[3],zero,zero,zero,xmm4[4],zero,zero,zero,xmm4[5],zero,zero,zero,xmm4[6],zero,zero,zero,xmm4[7],zero,zero,zero,xmm4[8],zero,zero,zero,xmm4[9],zero,zero,zero,xmm4[10],zero,zero,zero,xmm4[11],zero,zero,zero,xmm4[12],zero,zero,zero,xmm4[13],zero,zero,zero,xmm4[14],zero,zero,zero,xmm4[15],zero,zero,zero
886 ; 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
887 ; AVX512F-NEXT:    vpsllvd %zmm4, %zmm0, %zmm0
888 ; AVX512F-NEXT:    vpandn %xmm3, %xmm2, %xmm2
889 ; AVX512F-NEXT:    vpmovzxbd {{.*#+}} zmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero,xmm2[4],zero,zero,zero,xmm2[5],zero,zero,zero,xmm2[6],zero,zero,zero,xmm2[7],zero,zero,zero,xmm2[8],zero,zero,zero,xmm2[9],zero,zero,zero,xmm2[10],zero,zero,zero,xmm2[11],zero,zero,zero,xmm2[12],zero,zero,zero,xmm2[13],zero,zero,zero,xmm2[14],zero,zero,zero,xmm2[15],zero,zero,zero
890 ; AVX512F-NEXT:    vpsrlw $1, %xmm1, %xmm1
891 ; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
892 ; 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
893 ; AVX512F-NEXT:    vpsrlvd %zmm2, %zmm1, %zmm1
894 ; AVX512F-NEXT:    vpord %zmm1, %zmm0, %zmm0
895 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
896 ; AVX512F-NEXT:    vzeroupper
897 ; AVX512F-NEXT:    retq
899 ; AVX512VL-LABEL: var_funnnel_v16i8:
900 ; AVX512VL:       # %bb.0:
901 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
902 ; AVX512VL-NEXT:    vpand %xmm3, %xmm2, %xmm4
903 ; AVX512VL-NEXT:    vpmovzxbd {{.*#+}} zmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero,xmm4[2],zero,zero,zero,xmm4[3],zero,zero,zero,xmm4[4],zero,zero,zero,xmm4[5],zero,zero,zero,xmm4[6],zero,zero,zero,xmm4[7],zero,zero,zero,xmm4[8],zero,zero,zero,xmm4[9],zero,zero,zero,xmm4[10],zero,zero,zero,xmm4[11],zero,zero,zero,xmm4[12],zero,zero,zero,xmm4[13],zero,zero,zero,xmm4[14],zero,zero,zero,xmm4[15],zero,zero,zero
904 ; 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
905 ; AVX512VL-NEXT:    vpsllvd %zmm4, %zmm0, %zmm0
906 ; AVX512VL-NEXT:    vpandn %xmm3, %xmm2, %xmm2
907 ; AVX512VL-NEXT:    vpmovzxbd {{.*#+}} zmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero,xmm2[4],zero,zero,zero,xmm2[5],zero,zero,zero,xmm2[6],zero,zero,zero,xmm2[7],zero,zero,zero,xmm2[8],zero,zero,zero,xmm2[9],zero,zero,zero,xmm2[10],zero,zero,zero,xmm2[11],zero,zero,zero,xmm2[12],zero,zero,zero,xmm2[13],zero,zero,zero,xmm2[14],zero,zero,zero,xmm2[15],zero,zero,zero
908 ; AVX512VL-NEXT:    vpsrlw $1, %xmm1, %xmm1
909 ; AVX512VL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
910 ; 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
911 ; AVX512VL-NEXT:    vpsrlvd %zmm2, %zmm1, %zmm1
912 ; AVX512VL-NEXT:    vpord %zmm1, %zmm0, %zmm0
913 ; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
914 ; AVX512VL-NEXT:    vzeroupper
915 ; AVX512VL-NEXT:    retq
917 ; AVX512BW-LABEL: var_funnnel_v16i8:
918 ; AVX512BW:       # %bb.0:
919 ; 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
920 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
921 ; AVX512BW-NEXT:    vpand %xmm3, %xmm2, %xmm4
922 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero,xmm4[8],zero,xmm4[9],zero,xmm4[10],zero,xmm4[11],zero,xmm4[12],zero,xmm4[13],zero,xmm4[14],zero,xmm4[15],zero
923 ; AVX512BW-NEXT:    vpsllvw %zmm4, %zmm0, %zmm0
924 ; AVX512BW-NEXT:    vpandn %xmm3, %xmm2, %xmm2
925 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
926 ; AVX512BW-NEXT:    vpsrlw $1, %xmm1, %xmm1
927 ; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
928 ; 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
929 ; AVX512BW-NEXT:    vpsrlvw %zmm2, %zmm1, %zmm1
930 ; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm0
931 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
932 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
933 ; AVX512BW-NEXT:    vzeroupper
934 ; AVX512BW-NEXT:    retq
936 ; AVX512VBMI2-LABEL: var_funnnel_v16i8:
937 ; AVX512VBMI2:       # %bb.0:
938 ; AVX512VBMI2-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
939 ; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
940 ; AVX512VBMI2-NEXT:    vpand %xmm3, %xmm2, %xmm4
941 ; AVX512VBMI2-NEXT:    vpmovzxbw {{.*#+}} ymm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero,xmm4[8],zero,xmm4[9],zero,xmm4[10],zero,xmm4[11],zero,xmm4[12],zero,xmm4[13],zero,xmm4[14],zero,xmm4[15],zero
942 ; AVX512VBMI2-NEXT:    vpsllvw %zmm4, %zmm0, %zmm0
943 ; AVX512VBMI2-NEXT:    vpandn %xmm3, %xmm2, %xmm2
944 ; AVX512VBMI2-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
945 ; AVX512VBMI2-NEXT:    vpsrlw $1, %xmm1, %xmm1
946 ; AVX512VBMI2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
947 ; AVX512VBMI2-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
948 ; AVX512VBMI2-NEXT:    vpsrlvw %zmm2, %zmm1, %zmm1
949 ; AVX512VBMI2-NEXT:    vpor %ymm1, %ymm0, %ymm0
950 ; AVX512VBMI2-NEXT:    vpmovwb %zmm0, %ymm0
951 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
952 ; AVX512VBMI2-NEXT:    vzeroupper
953 ; AVX512VBMI2-NEXT:    retq
955 ; AVX512VLBW-LABEL: var_funnnel_v16i8:
956 ; AVX512VLBW:       # %bb.0:
957 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
958 ; AVX512VLBW-NEXT:    vpand %xmm3, %xmm2, %xmm4
959 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} ymm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero,xmm4[8],zero,xmm4[9],zero,xmm4[10],zero,xmm4[11],zero,xmm4[12],zero,xmm4[13],zero,xmm4[14],zero,xmm4[15],zero
960 ; 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
961 ; AVX512VLBW-NEXT:    vpsllvw %ymm4, %ymm0, %ymm0
962 ; AVX512VLBW-NEXT:    vpandn %xmm3, %xmm2, %xmm2
963 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
964 ; AVX512VLBW-NEXT:    vpsrlw $1, %xmm1, %xmm1
965 ; AVX512VLBW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
966 ; 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
967 ; AVX512VLBW-NEXT:    vpsrlvw %ymm2, %ymm1, %ymm1
968 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm0
969 ; AVX512VLBW-NEXT:    vpmovwb %ymm0, %xmm0
970 ; AVX512VLBW-NEXT:    vzeroupper
971 ; AVX512VLBW-NEXT:    retq
973 ; AVX512VLVBMI2-LABEL: var_funnnel_v16i8:
974 ; AVX512VLVBMI2:       # %bb.0:
975 ; AVX512VLVBMI2-NEXT:    vmovdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
976 ; AVX512VLVBMI2-NEXT:    vpand %xmm3, %xmm2, %xmm4
977 ; AVX512VLVBMI2-NEXT:    vpmovzxbw {{.*#+}} ymm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero,xmm4[8],zero,xmm4[9],zero,xmm4[10],zero,xmm4[11],zero,xmm4[12],zero,xmm4[13],zero,xmm4[14],zero,xmm4[15],zero
978 ; AVX512VLVBMI2-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
979 ; AVX512VLVBMI2-NEXT:    vpsllvw %ymm4, %ymm0, %ymm0
980 ; AVX512VLVBMI2-NEXT:    vpandn %xmm3, %xmm2, %xmm2
981 ; AVX512VLVBMI2-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
982 ; AVX512VLVBMI2-NEXT:    vpsrlw $1, %xmm1, %xmm1
983 ; AVX512VLVBMI2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
984 ; AVX512VLVBMI2-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
985 ; AVX512VLVBMI2-NEXT:    vpsrlvw %ymm2, %ymm1, %ymm1
986 ; AVX512VLVBMI2-NEXT:    vpor %ymm1, %ymm0, %ymm0
987 ; AVX512VLVBMI2-NEXT:    vpmovwb %ymm0, %xmm0
988 ; AVX512VLVBMI2-NEXT:    vzeroupper
989 ; AVX512VLVBMI2-NEXT:    retq
991 ; XOP-LABEL: var_funnnel_v16i8:
992 ; XOP:       # %bb.0:
993 ; XOP-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
994 ; XOP-NEXT:    vpshlb %xmm3, %xmm1, %xmm1
995 ; XOP-NEXT:    vmovdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
996 ; XOP-NEXT:    vpandn %xmm3, %xmm2, %xmm4
997 ; XOP-NEXT:    vpxor %xmm5, %xmm5, %xmm5
998 ; XOP-NEXT:    vpsubb %xmm4, %xmm5, %xmm4
999 ; XOP-NEXT:    vpshlb %xmm4, %xmm1, %xmm1
1000 ; XOP-NEXT:    vpand %xmm3, %xmm2, %xmm2
1001 ; XOP-NEXT:    vpshlb %xmm2, %xmm0, %xmm0
1002 ; XOP-NEXT:    vpor %xmm1, %xmm0, %xmm0
1003 ; XOP-NEXT:    retq
1005 ; X86-SSE2-LABEL: var_funnnel_v16i8:
1006 ; X86-SSE2:       # %bb.0:
1007 ; X86-SSE2-NEXT:    psrlw $1, %xmm1
1008 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
1009 ; X86-SSE2-NEXT:    pand %xmm5, %xmm1
1010 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1011 ; X86-SSE2-NEXT:    movdqa %xmm2, %xmm6
1012 ; X86-SSE2-NEXT:    pandn %xmm4, %xmm6
1013 ; X86-SSE2-NEXT:    psllw $5, %xmm6
1014 ; X86-SSE2-NEXT:    pxor %xmm3, %xmm3
1015 ; X86-SSE2-NEXT:    pcmpgtb %xmm6, %xmm3
1016 ; X86-SSE2-NEXT:    movdqa %xmm3, %xmm7
1017 ; X86-SSE2-NEXT:    pandn %xmm1, %xmm7
1018 ; X86-SSE2-NEXT:    psrlw $4, %xmm1
1019 ; X86-SSE2-NEXT:    pand %xmm3, %xmm1
1020 ; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1021 ; X86-SSE2-NEXT:    por %xmm7, %xmm1
1022 ; X86-SSE2-NEXT:    paddb %xmm6, %xmm6
1023 ; X86-SSE2-NEXT:    pxor %xmm3, %xmm3
1024 ; X86-SSE2-NEXT:    pcmpgtb %xmm6, %xmm3
1025 ; X86-SSE2-NEXT:    movdqa %xmm3, %xmm7
1026 ; X86-SSE2-NEXT:    pandn %xmm1, %xmm7
1027 ; X86-SSE2-NEXT:    psrlw $2, %xmm1
1028 ; X86-SSE2-NEXT:    pand %xmm3, %xmm1
1029 ; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1030 ; X86-SSE2-NEXT:    por %xmm7, %xmm1
1031 ; X86-SSE2-NEXT:    paddb %xmm6, %xmm6
1032 ; X86-SSE2-NEXT:    pxor %xmm3, %xmm3
1033 ; X86-SSE2-NEXT:    pcmpgtb %xmm6, %xmm3
1034 ; X86-SSE2-NEXT:    movdqa %xmm3, %xmm6
1035 ; X86-SSE2-NEXT:    pand %xmm5, %xmm3
1036 ; X86-SSE2-NEXT:    pandn %xmm1, %xmm6
1037 ; X86-SSE2-NEXT:    psrlw $1, %xmm1
1038 ; X86-SSE2-NEXT:    pand %xmm1, %xmm3
1039 ; X86-SSE2-NEXT:    por %xmm6, %xmm3
1040 ; X86-SSE2-NEXT:    pand %xmm4, %xmm2
1041 ; X86-SSE2-NEXT:    psllw $5, %xmm2
1042 ; X86-SSE2-NEXT:    pxor %xmm1, %xmm1
1043 ; X86-SSE2-NEXT:    pcmpgtb %xmm2, %xmm1
1044 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm4
1045 ; X86-SSE2-NEXT:    pandn %xmm0, %xmm4
1046 ; X86-SSE2-NEXT:    psllw $4, %xmm0
1047 ; X86-SSE2-NEXT:    pand %xmm1, %xmm0
1048 ; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1049 ; X86-SSE2-NEXT:    por %xmm4, %xmm0
1050 ; X86-SSE2-NEXT:    paddb %xmm2, %xmm2
1051 ; X86-SSE2-NEXT:    pxor %xmm1, %xmm1
1052 ; X86-SSE2-NEXT:    pcmpgtb %xmm2, %xmm1
1053 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm4
1054 ; X86-SSE2-NEXT:    pandn %xmm0, %xmm4
1055 ; X86-SSE2-NEXT:    psllw $2, %xmm0
1056 ; X86-SSE2-NEXT:    pand %xmm1, %xmm0
1057 ; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1058 ; X86-SSE2-NEXT:    por %xmm4, %xmm0
1059 ; X86-SSE2-NEXT:    pxor %xmm1, %xmm1
1060 ; X86-SSE2-NEXT:    paddb %xmm2, %xmm2
1061 ; X86-SSE2-NEXT:    pcmpgtb %xmm2, %xmm1
1062 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
1063 ; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
1064 ; X86-SSE2-NEXT:    por %xmm3, %xmm2
1065 ; X86-SSE2-NEXT:    paddb %xmm0, %xmm0
1066 ; X86-SSE2-NEXT:    pand %xmm1, %xmm0
1067 ; X86-SSE2-NEXT:    por %xmm2, %xmm0
1068 ; X86-SSE2-NEXT:    retl
1069   %res = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %x, <16 x i8> %y, <16 x i8> %amt)
1070   ret <16 x i8> %res
1074 ; Uniform Variable Shifts
1077 define <2 x i64> @splatvar_funnnel_v2i64(<2 x i64> %x, <2 x i64> %y, <2 x i64> %amt) nounwind {
1078 ; SSE-LABEL: splatvar_funnnel_v2i64:
1079 ; SSE:       # %bb.0:
1080 ; SSE-NEXT:    movdqa {{.*#+}} xmm3 = [63,63]
1081 ; SSE-NEXT:    movdqa %xmm2, %xmm4
1082 ; SSE-NEXT:    pandn %xmm3, %xmm4
1083 ; SSE-NEXT:    psrlq $1, %xmm1
1084 ; SSE-NEXT:    psrlq %xmm4, %xmm1
1085 ; SSE-NEXT:    pand %xmm3, %xmm2
1086 ; SSE-NEXT:    psllq %xmm2, %xmm0
1087 ; SSE-NEXT:    por %xmm1, %xmm0
1088 ; SSE-NEXT:    retq
1090 ; AVX-LABEL: splatvar_funnnel_v2i64:
1091 ; AVX:       # %bb.0:
1092 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [63,63]
1093 ; AVX-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1094 ; AVX-NEXT:    vpsrlq $1, %xmm1, %xmm1
1095 ; AVX-NEXT:    vpsrlq %xmm4, %xmm1, %xmm1
1096 ; AVX-NEXT:    vpand %xmm3, %xmm2, %xmm2
1097 ; AVX-NEXT:    vpsllq %xmm2, %xmm0, %xmm0
1098 ; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1099 ; AVX-NEXT:    retq
1101 ; AVX512F-LABEL: splatvar_funnnel_v2i64:
1102 ; AVX512F:       # %bb.0:
1103 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm3 = [63,63]
1104 ; AVX512F-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1105 ; AVX512F-NEXT:    vpsrlq $1, %xmm1, %xmm1
1106 ; AVX512F-NEXT:    vpsrlq %xmm4, %xmm1, %xmm1
1107 ; AVX512F-NEXT:    vpand %xmm3, %xmm2, %xmm2
1108 ; AVX512F-NEXT:    vpsllq %xmm2, %xmm0, %xmm0
1109 ; AVX512F-NEXT:    vpor %xmm1, %xmm0, %xmm0
1110 ; AVX512F-NEXT:    retq
1112 ; AVX512VL-LABEL: splatvar_funnnel_v2i64:
1113 ; AVX512VL:       # %bb.0:
1114 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm3 = [63,63]
1115 ; AVX512VL-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1116 ; AVX512VL-NEXT:    vpsrlq $1, %xmm1, %xmm1
1117 ; AVX512VL-NEXT:    vpsrlq %xmm4, %xmm1, %xmm1
1118 ; AVX512VL-NEXT:    vpand %xmm3, %xmm2, %xmm2
1119 ; AVX512VL-NEXT:    vpsllq %xmm2, %xmm0, %xmm0
1120 ; AVX512VL-NEXT:    vpor %xmm1, %xmm0, %xmm0
1121 ; AVX512VL-NEXT:    retq
1123 ; AVX512BW-LABEL: splatvar_funnnel_v2i64:
1124 ; AVX512BW:       # %bb.0:
1125 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm3 = [63,63]
1126 ; AVX512BW-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1127 ; AVX512BW-NEXT:    vpsrlq $1, %xmm1, %xmm1
1128 ; AVX512BW-NEXT:    vpsrlq %xmm4, %xmm1, %xmm1
1129 ; AVX512BW-NEXT:    vpand %xmm3, %xmm2, %xmm2
1130 ; AVX512BW-NEXT:    vpsllq %xmm2, %xmm0, %xmm0
1131 ; AVX512BW-NEXT:    vpor %xmm1, %xmm0, %xmm0
1132 ; AVX512BW-NEXT:    retq
1134 ; AVX512VBMI2-LABEL: splatvar_funnnel_v2i64:
1135 ; AVX512VBMI2:       # %bb.0:
1136 ; AVX512VBMI2-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
1137 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1138 ; AVX512VBMI2-NEXT:    vpbroadcastq %xmm2, %xmm2
1139 ; AVX512VBMI2-NEXT:    vpshldvq %zmm2, %zmm1, %zmm0
1140 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1141 ; AVX512VBMI2-NEXT:    vzeroupper
1142 ; AVX512VBMI2-NEXT:    retq
1144 ; AVX512VLBW-LABEL: splatvar_funnnel_v2i64:
1145 ; AVX512VLBW:       # %bb.0:
1146 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm3 = [63,63]
1147 ; AVX512VLBW-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1148 ; AVX512VLBW-NEXT:    vpsrlq $1, %xmm1, %xmm1
1149 ; AVX512VLBW-NEXT:    vpsrlq %xmm4, %xmm1, %xmm1
1150 ; AVX512VLBW-NEXT:    vpand %xmm3, %xmm2, %xmm2
1151 ; AVX512VLBW-NEXT:    vpsllq %xmm2, %xmm0, %xmm0
1152 ; AVX512VLBW-NEXT:    vpor %xmm1, %xmm0, %xmm0
1153 ; AVX512VLBW-NEXT:    retq
1155 ; AVX512VLVBMI2-LABEL: splatvar_funnnel_v2i64:
1156 ; AVX512VLVBMI2:       # %bb.0:
1157 ; AVX512VLVBMI2-NEXT:    vpbroadcastq %xmm2, %xmm2
1158 ; AVX512VLVBMI2-NEXT:    vpshldvq %xmm2, %xmm1, %xmm0
1159 ; AVX512VLVBMI2-NEXT:    retq
1161 ; XOP-LABEL: splatvar_funnnel_v2i64:
1162 ; XOP:       # %bb.0:
1163 ; XOP-NEXT:    vmovdqa {{.*#+}} xmm3 = [63,63]
1164 ; XOP-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1165 ; XOP-NEXT:    vpsrlq $1, %xmm1, %xmm1
1166 ; XOP-NEXT:    vpsrlq %xmm4, %xmm1, %xmm1
1167 ; XOP-NEXT:    vpand %xmm3, %xmm2, %xmm2
1168 ; XOP-NEXT:    vpsllq %xmm2, %xmm0, %xmm0
1169 ; XOP-NEXT:    vpor %xmm1, %xmm0, %xmm0
1170 ; XOP-NEXT:    retq
1172 ; X86-SSE2-LABEL: splatvar_funnnel_v2i64:
1173 ; X86-SSE2:       # %bb.0:
1174 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,1,0,1]
1175 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [63,0,63,0]
1176 ; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
1177 ; X86-SSE2-NEXT:    pandn %xmm3, %xmm4
1178 ; X86-SSE2-NEXT:    psrlq $1, %xmm1
1179 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm5
1180 ; X86-SSE2-NEXT:    psrlq %xmm4, %xmm5
1181 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[2,3,2,3]
1182 ; X86-SSE2-NEXT:    psrlq %xmm4, %xmm1
1183 ; X86-SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm5[0],xmm1[1]
1184 ; X86-SSE2-NEXT:    pand %xmm3, %xmm2
1185 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
1186 ; X86-SSE2-NEXT:    psllq %xmm2, %xmm3
1187 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]
1188 ; X86-SSE2-NEXT:    psllq %xmm2, %xmm0
1189 ; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm3[0],xmm0[1]
1190 ; X86-SSE2-NEXT:    orpd %xmm1, %xmm0
1191 ; X86-SSE2-NEXT:    retl
1192   %splat = shufflevector <2 x i64> %amt, <2 x i64> undef, <2 x i32> zeroinitializer
1193   %res = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> %x, <2 x i64> %y, <2 x i64> %splat)
1194   ret <2 x i64> %res
1197 define <4 x i32> @splatvar_funnnel_v4i32(<4 x i32> %x, <4 x i32> %y, <4 x i32> %amt) nounwind {
1198 ; SSE2-LABEL: splatvar_funnnel_v4i32:
1199 ; SSE2:       # %bb.0:
1200 ; SSE2-NEXT:    movd %xmm2, %eax
1201 ; SSE2-NEXT:    movl %eax, %ecx
1202 ; SSE2-NEXT:    andl $31, %ecx
1203 ; SSE2-NEXT:    movd %ecx, %xmm2
1204 ; SSE2-NEXT:    pslld %xmm2, %xmm0
1205 ; SSE2-NEXT:    psrld $1, %xmm1
1206 ; SSE2-NEXT:    notl %eax
1207 ; SSE2-NEXT:    andl $31, %eax
1208 ; SSE2-NEXT:    movd %eax, %xmm2
1209 ; SSE2-NEXT:    psrld %xmm2, %xmm1
1210 ; SSE2-NEXT:    por %xmm1, %xmm0
1211 ; SSE2-NEXT:    retq
1213 ; SSE41-LABEL: splatvar_funnnel_v4i32:
1214 ; SSE41:       # %bb.0:
1215 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [31,31,31,31]
1216 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
1217 ; SSE41-NEXT:    pandn %xmm3, %xmm4
1218 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
1219 ; SSE41-NEXT:    psrld $1, %xmm1
1220 ; SSE41-NEXT:    psrld %xmm4, %xmm1
1221 ; SSE41-NEXT:    pand %xmm3, %xmm2
1222 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero
1223 ; SSE41-NEXT:    pslld %xmm2, %xmm0
1224 ; SSE41-NEXT:    por %xmm1, %xmm0
1225 ; SSE41-NEXT:    retq
1227 ; AVX1-LABEL: splatvar_funnnel_v4i32:
1228 ; AVX1:       # %bb.0:
1229 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [31,31,31,31]
1230 ; AVX1-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1231 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
1232 ; AVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
1233 ; AVX1-NEXT:    vpsrld %xmm4, %xmm1, %xmm1
1234 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
1235 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero
1236 ; AVX1-NEXT:    vpslld %xmm2, %xmm0, %xmm0
1237 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
1238 ; AVX1-NEXT:    retq
1240 ; AVX2-LABEL: splatvar_funnnel_v4i32:
1241 ; AVX2:       # %bb.0:
1242 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]
1243 ; AVX2-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1244 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
1245 ; AVX2-NEXT:    vpsrld $1, %xmm1, %xmm1
1246 ; AVX2-NEXT:    vpsrld %xmm4, %xmm1, %xmm1
1247 ; AVX2-NEXT:    vpand %xmm3, %xmm2, %xmm2
1248 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero
1249 ; AVX2-NEXT:    vpslld %xmm2, %xmm0, %xmm0
1250 ; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
1251 ; AVX2-NEXT:    retq
1253 ; AVX512F-LABEL: splatvar_funnnel_v4i32:
1254 ; AVX512F:       # %bb.0:
1255 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]
1256 ; AVX512F-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1257 ; AVX512F-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
1258 ; AVX512F-NEXT:    vpsrld $1, %xmm1, %xmm1
1259 ; AVX512F-NEXT:    vpsrld %xmm4, %xmm1, %xmm1
1260 ; AVX512F-NEXT:    vpand %xmm3, %xmm2, %xmm2
1261 ; AVX512F-NEXT:    vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero
1262 ; AVX512F-NEXT:    vpslld %xmm2, %xmm0, %xmm0
1263 ; AVX512F-NEXT:    vpor %xmm1, %xmm0, %xmm0
1264 ; AVX512F-NEXT:    retq
1266 ; AVX512VL-LABEL: splatvar_funnnel_v4i32:
1267 ; AVX512VL:       # %bb.0:
1268 ; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]
1269 ; AVX512VL-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1270 ; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
1271 ; AVX512VL-NEXT:    vpsrld $1, %xmm1, %xmm1
1272 ; AVX512VL-NEXT:    vpsrld %xmm4, %xmm1, %xmm1
1273 ; AVX512VL-NEXT:    vpand %xmm3, %xmm2, %xmm2
1274 ; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero
1275 ; AVX512VL-NEXT:    vpslld %xmm2, %xmm0, %xmm0
1276 ; AVX512VL-NEXT:    vpor %xmm1, %xmm0, %xmm0
1277 ; AVX512VL-NEXT:    retq
1279 ; AVX512BW-LABEL: splatvar_funnnel_v4i32:
1280 ; AVX512BW:       # %bb.0:
1281 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]
1282 ; AVX512BW-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1283 ; AVX512BW-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
1284 ; AVX512BW-NEXT:    vpsrld $1, %xmm1, %xmm1
1285 ; AVX512BW-NEXT:    vpsrld %xmm4, %xmm1, %xmm1
1286 ; AVX512BW-NEXT:    vpand %xmm3, %xmm2, %xmm2
1287 ; AVX512BW-NEXT:    vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero
1288 ; AVX512BW-NEXT:    vpslld %xmm2, %xmm0, %xmm0
1289 ; AVX512BW-NEXT:    vpor %xmm1, %xmm0, %xmm0
1290 ; AVX512BW-NEXT:    retq
1292 ; AVX512VBMI2-LABEL: splatvar_funnnel_v4i32:
1293 ; AVX512VBMI2:       # %bb.0:
1294 ; AVX512VBMI2-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
1295 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1296 ; AVX512VBMI2-NEXT:    vpbroadcastd %xmm2, %xmm2
1297 ; AVX512VBMI2-NEXT:    vpshldvd %zmm2, %zmm1, %zmm0
1298 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1299 ; AVX512VBMI2-NEXT:    vzeroupper
1300 ; AVX512VBMI2-NEXT:    retq
1302 ; AVX512VLBW-LABEL: splatvar_funnnel_v4i32:
1303 ; AVX512VLBW:       # %bb.0:
1304 ; AVX512VLBW-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]
1305 ; AVX512VLBW-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1306 ; AVX512VLBW-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
1307 ; AVX512VLBW-NEXT:    vpsrld $1, %xmm1, %xmm1
1308 ; AVX512VLBW-NEXT:    vpsrld %xmm4, %xmm1, %xmm1
1309 ; AVX512VLBW-NEXT:    vpand %xmm3, %xmm2, %xmm2
1310 ; AVX512VLBW-NEXT:    vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero
1311 ; AVX512VLBW-NEXT:    vpslld %xmm2, %xmm0, %xmm0
1312 ; AVX512VLBW-NEXT:    vpor %xmm1, %xmm0, %xmm0
1313 ; AVX512VLBW-NEXT:    retq
1315 ; AVX512VLVBMI2-LABEL: splatvar_funnnel_v4i32:
1316 ; AVX512VLVBMI2:       # %bb.0:
1317 ; AVX512VLVBMI2-NEXT:    vpbroadcastd %xmm2, %xmm2
1318 ; AVX512VLVBMI2-NEXT:    vpshldvd %xmm2, %xmm1, %xmm0
1319 ; AVX512VLVBMI2-NEXT:    retq
1321 ; XOPAVX1-LABEL: splatvar_funnnel_v4i32:
1322 ; XOPAVX1:       # %bb.0:
1323 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [31,31,31,31]
1324 ; XOPAVX1-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1325 ; XOPAVX1-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
1326 ; XOPAVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
1327 ; XOPAVX1-NEXT:    vpsrld %xmm4, %xmm1, %xmm1
1328 ; XOPAVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
1329 ; XOPAVX1-NEXT:    vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero
1330 ; XOPAVX1-NEXT:    vpslld %xmm2, %xmm0, %xmm0
1331 ; XOPAVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
1332 ; XOPAVX1-NEXT:    retq
1334 ; XOPAVX2-LABEL: splatvar_funnnel_v4i32:
1335 ; XOPAVX2:       # %bb.0:
1336 ; XOPAVX2-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [31,31,31,31]
1337 ; XOPAVX2-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1338 ; XOPAVX2-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
1339 ; XOPAVX2-NEXT:    vpsrld $1, %xmm1, %xmm1
1340 ; XOPAVX2-NEXT:    vpsrld %xmm4, %xmm1, %xmm1
1341 ; XOPAVX2-NEXT:    vpand %xmm3, %xmm2, %xmm2
1342 ; XOPAVX2-NEXT:    vpmovzxdq {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero
1343 ; XOPAVX2-NEXT:    vpslld %xmm2, %xmm0, %xmm0
1344 ; XOPAVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
1345 ; XOPAVX2-NEXT:    retq
1347 ; X86-SSE2-LABEL: splatvar_funnnel_v4i32:
1348 ; X86-SSE2:       # %bb.0:
1349 ; X86-SSE2-NEXT:    movd %xmm2, %eax
1350 ; X86-SSE2-NEXT:    movl %eax, %ecx
1351 ; X86-SSE2-NEXT:    andl $31, %ecx
1352 ; X86-SSE2-NEXT:    movd %ecx, %xmm2
1353 ; X86-SSE2-NEXT:    pslld %xmm2, %xmm0
1354 ; X86-SSE2-NEXT:    psrld $1, %xmm1
1355 ; X86-SSE2-NEXT:    notl %eax
1356 ; X86-SSE2-NEXT:    andl $31, %eax
1357 ; X86-SSE2-NEXT:    movd %eax, %xmm2
1358 ; X86-SSE2-NEXT:    psrld %xmm2, %xmm1
1359 ; X86-SSE2-NEXT:    por %xmm1, %xmm0
1360 ; X86-SSE2-NEXT:    retl
1361   %splat = shufflevector <4 x i32> %amt, <4 x i32> undef, <4 x i32> zeroinitializer
1362   %res = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %y, <4 x i32> %splat)
1363   ret <4 x i32> %res
1366 define <8 x i16> @splatvar_funnnel_v8i16(<8 x i16> %x, <8 x i16> %y, <8 x i16> %amt) nounwind {
1367 ; SSE2-LABEL: splatvar_funnnel_v8i16:
1368 ; SSE2:       # %bb.0:
1369 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15]
1370 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1371 ; SSE2-NEXT:    pandn %xmm3, %xmm4
1372 ; SSE2-NEXT:    pslldq {{.*#+}} xmm4 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm4[0,1]
1373 ; SSE2-NEXT:    psrldq {{.*#+}} xmm4 = xmm4[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1374 ; SSE2-NEXT:    psrlw $1, %xmm1
1375 ; SSE2-NEXT:    psrlw %xmm4, %xmm1
1376 ; SSE2-NEXT:    pand %xmm3, %xmm2
1377 ; SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1]
1378 ; SSE2-NEXT:    psrldq {{.*#+}} xmm2 = xmm2[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1379 ; SSE2-NEXT:    psllw %xmm2, %xmm0
1380 ; SSE2-NEXT:    por %xmm1, %xmm0
1381 ; SSE2-NEXT:    retq
1383 ; SSE41-LABEL: splatvar_funnnel_v8i16:
1384 ; SSE41:       # %bb.0:
1385 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15]
1386 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
1387 ; SSE41-NEXT:    pandn %xmm3, %xmm4
1388 ; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1389 ; SSE41-NEXT:    psrlw $1, %xmm1
1390 ; SSE41-NEXT:    psrlw %xmm4, %xmm1
1391 ; SSE41-NEXT:    pand %xmm3, %xmm2
1392 ; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
1393 ; SSE41-NEXT:    psllw %xmm2, %xmm0
1394 ; SSE41-NEXT:    por %xmm1, %xmm0
1395 ; SSE41-NEXT:    retq
1397 ; AVX-LABEL: splatvar_funnnel_v8i16:
1398 ; AVX:       # %bb.0:
1399 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15]
1400 ; AVX-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1401 ; AVX-NEXT:    vpmovzxwq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1402 ; AVX-NEXT:    vpsrlw $1, %xmm1, %xmm1
1403 ; AVX-NEXT:    vpsrlw %xmm4, %xmm1, %xmm1
1404 ; AVX-NEXT:    vpand %xmm3, %xmm2, %xmm2
1405 ; AVX-NEXT:    vpmovzxwq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
1406 ; AVX-NEXT:    vpsllw %xmm2, %xmm0, %xmm0
1407 ; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
1408 ; AVX-NEXT:    retq
1410 ; AVX512F-LABEL: splatvar_funnnel_v8i16:
1411 ; AVX512F:       # %bb.0:
1412 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15]
1413 ; AVX512F-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1414 ; AVX512F-NEXT:    vpmovzxwq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1415 ; AVX512F-NEXT:    vpsrlw $1, %xmm1, %xmm1
1416 ; AVX512F-NEXT:    vpsrlw %xmm4, %xmm1, %xmm1
1417 ; AVX512F-NEXT:    vpand %xmm3, %xmm2, %xmm2
1418 ; AVX512F-NEXT:    vpmovzxwq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
1419 ; AVX512F-NEXT:    vpsllw %xmm2, %xmm0, %xmm0
1420 ; AVX512F-NEXT:    vpor %xmm1, %xmm0, %xmm0
1421 ; AVX512F-NEXT:    retq
1423 ; AVX512VL-LABEL: splatvar_funnnel_v8i16:
1424 ; AVX512VL:       # %bb.0:
1425 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15]
1426 ; AVX512VL-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1427 ; AVX512VL-NEXT:    vpmovzxwq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1428 ; AVX512VL-NEXT:    vpsrlw $1, %xmm1, %xmm1
1429 ; AVX512VL-NEXT:    vpsrlw %xmm4, %xmm1, %xmm1
1430 ; AVX512VL-NEXT:    vpand %xmm3, %xmm2, %xmm2
1431 ; AVX512VL-NEXT:    vpmovzxwq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
1432 ; AVX512VL-NEXT:    vpsllw %xmm2, %xmm0, %xmm0
1433 ; AVX512VL-NEXT:    vpor %xmm1, %xmm0, %xmm0
1434 ; AVX512VL-NEXT:    retq
1436 ; AVX512BW-LABEL: splatvar_funnnel_v8i16:
1437 ; AVX512BW:       # %bb.0:
1438 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15]
1439 ; AVX512BW-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1440 ; AVX512BW-NEXT:    vpmovzxwq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1441 ; AVX512BW-NEXT:    vpsrlw $1, %xmm1, %xmm1
1442 ; AVX512BW-NEXT:    vpsrlw %xmm4, %xmm1, %xmm1
1443 ; AVX512BW-NEXT:    vpand %xmm3, %xmm2, %xmm2
1444 ; AVX512BW-NEXT:    vpmovzxwq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
1445 ; AVX512BW-NEXT:    vpsllw %xmm2, %xmm0, %xmm0
1446 ; AVX512BW-NEXT:    vpor %xmm1, %xmm0, %xmm0
1447 ; AVX512BW-NEXT:    retq
1449 ; AVX512VBMI2-LABEL: splatvar_funnnel_v8i16:
1450 ; AVX512VBMI2:       # %bb.0:
1451 ; AVX512VBMI2-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
1452 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1453 ; AVX512VBMI2-NEXT:    vpbroadcastw %xmm2, %xmm2
1454 ; AVX512VBMI2-NEXT:    vpshldvw %zmm2, %zmm1, %zmm0
1455 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
1456 ; AVX512VBMI2-NEXT:    vzeroupper
1457 ; AVX512VBMI2-NEXT:    retq
1459 ; AVX512VLBW-LABEL: splatvar_funnnel_v8i16:
1460 ; AVX512VLBW:       # %bb.0:
1461 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15]
1462 ; AVX512VLBW-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1463 ; AVX512VLBW-NEXT:    vpmovzxwq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1464 ; AVX512VLBW-NEXT:    vpsrlw $1, %xmm1, %xmm1
1465 ; AVX512VLBW-NEXT:    vpsrlw %xmm4, %xmm1, %xmm1
1466 ; AVX512VLBW-NEXT:    vpand %xmm3, %xmm2, %xmm2
1467 ; AVX512VLBW-NEXT:    vpmovzxwq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
1468 ; AVX512VLBW-NEXT:    vpsllw %xmm2, %xmm0, %xmm0
1469 ; AVX512VLBW-NEXT:    vpor %xmm1, %xmm0, %xmm0
1470 ; AVX512VLBW-NEXT:    retq
1472 ; AVX512VLVBMI2-LABEL: splatvar_funnnel_v8i16:
1473 ; AVX512VLVBMI2:       # %bb.0:
1474 ; AVX512VLVBMI2-NEXT:    vpbroadcastw %xmm2, %xmm2
1475 ; AVX512VLVBMI2-NEXT:    vpshldvw %xmm2, %xmm1, %xmm0
1476 ; AVX512VLVBMI2-NEXT:    retq
1478 ; XOP-LABEL: splatvar_funnnel_v8i16:
1479 ; XOP:       # %bb.0:
1480 ; XOP-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15]
1481 ; XOP-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1482 ; XOP-NEXT:    vpmovzxwq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1483 ; XOP-NEXT:    vpsrlw $1, %xmm1, %xmm1
1484 ; XOP-NEXT:    vpsrlw %xmm4, %xmm1, %xmm1
1485 ; XOP-NEXT:    vpand %xmm3, %xmm2, %xmm2
1486 ; XOP-NEXT:    vpmovzxwq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
1487 ; XOP-NEXT:    vpsllw %xmm2, %xmm0, %xmm0
1488 ; XOP-NEXT:    vpor %xmm1, %xmm0, %xmm0
1489 ; XOP-NEXT:    retq
1491 ; X86-SSE2-LABEL: splatvar_funnnel_v8i16:
1492 ; X86-SSE2:       # %bb.0:
1493 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15]
1494 ; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
1495 ; X86-SSE2-NEXT:    pandn %xmm3, %xmm4
1496 ; X86-SSE2-NEXT:    pslldq {{.*#+}} xmm4 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm4[0,1]
1497 ; X86-SSE2-NEXT:    psrldq {{.*#+}} xmm4 = xmm4[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1498 ; X86-SSE2-NEXT:    psrlw $1, %xmm1
1499 ; X86-SSE2-NEXT:    psrlw %xmm4, %xmm1
1500 ; X86-SSE2-NEXT:    pand %xmm3, %xmm2
1501 ; X86-SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1]
1502 ; X86-SSE2-NEXT:    psrldq {{.*#+}} xmm2 = xmm2[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1503 ; X86-SSE2-NEXT:    psllw %xmm2, %xmm0
1504 ; X86-SSE2-NEXT:    por %xmm1, %xmm0
1505 ; X86-SSE2-NEXT:    retl
1506   %splat = shufflevector <8 x i16> %amt, <8 x i16> undef, <8 x i32> zeroinitializer
1507   %res = call <8 x i16> @llvm.fshl.v8i16(<8 x i16> %x, <8 x i16> %y, <8 x i16> %splat)
1508   ret <8 x i16> %res
1511 define <16 x i8> @splatvar_funnnel_v16i8(<16 x i8> %x, <16 x i8> %y, <16 x i8> %amt) nounwind {
1512 ; SSE2-LABEL: splatvar_funnnel_v16i8:
1513 ; SSE2:       # %bb.0:
1514 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1515 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
1516 ; SSE2-NEXT:    pand %xmm3, %xmm4
1517 ; SSE2-NEXT:    pslldq {{.*#+}} xmm4 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm4[0]
1518 ; SSE2-NEXT:    psrldq {{.*#+}} xmm4 = xmm4[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1519 ; SSE2-NEXT:    psllw %xmm4, %xmm0
1520 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm5
1521 ; SSE2-NEXT:    pcmpeqd %xmm6, %xmm6
1522 ; SSE2-NEXT:    psllw %xmm4, %xmm6
1523 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1524 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm6[0,0,0,0,4,5,6,7]
1525 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,0,0,0]
1526 ; SSE2-NEXT:    pand %xmm4, %xmm0
1527 ; SSE2-NEXT:    pandn %xmm3, %xmm2
1528 ; SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0]
1529 ; SSE2-NEXT:    psrldq {{.*#+}} xmm2 = xmm2[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1530 ; SSE2-NEXT:    psrlw $1, %xmm1
1531 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1532 ; SSE2-NEXT:    psrlw %xmm2, %xmm1
1533 ; SSE2-NEXT:    psrlw %xmm2, %xmm5
1534 ; SSE2-NEXT:    psrlw $8, %xmm5
1535 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1536 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm5[0,0,0,0,4,5,6,7]
1537 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]
1538 ; SSE2-NEXT:    pand %xmm1, %xmm2
1539 ; SSE2-NEXT:    por %xmm2, %xmm0
1540 ; SSE2-NEXT:    retq
1542 ; SSE41-LABEL: splatvar_funnnel_v16i8:
1543 ; SSE41:       # %bb.0:
1544 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1545 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
1546 ; SSE41-NEXT:    pandn %xmm3, %xmm4
1547 ; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,zero,zero,zero,zero,xmm4[1],zero,zero,zero,zero,zero,zero,zero
1548 ; SSE41-NEXT:    psrlw $1, %xmm1
1549 ; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1550 ; SSE41-NEXT:    psrlw %xmm4, %xmm1
1551 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm5
1552 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm6
1553 ; SSE41-NEXT:    psrlw %xmm4, %xmm6
1554 ; SSE41-NEXT:    pshufb {{.*#+}} xmm6 = xmm6[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1555 ; SSE41-NEXT:    pand %xmm1, %xmm6
1556 ; SSE41-NEXT:    pand %xmm3, %xmm2
1557 ; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm1 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero
1558 ; SSE41-NEXT:    psllw %xmm1, %xmm0
1559 ; SSE41-NEXT:    psllw %xmm1, %xmm5
1560 ; SSE41-NEXT:    pxor %xmm1, %xmm1
1561 ; SSE41-NEXT:    pshufb %xmm1, %xmm5
1562 ; SSE41-NEXT:    pand %xmm5, %xmm0
1563 ; SSE41-NEXT:    por %xmm6, %xmm0
1564 ; SSE41-NEXT:    retq
1566 ; AVX1-LABEL: splatvar_funnnel_v16i8:
1567 ; AVX1:       # %bb.0:
1568 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1569 ; AVX1-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1570 ; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,zero,zero,zero,zero,xmm4[1],zero,zero,zero,zero,zero,zero,zero
1571 ; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm1
1572 ; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1573 ; AVX1-NEXT:    vpsrlw %xmm4, %xmm1, %xmm1
1574 ; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
1575 ; AVX1-NEXT:    vpsrlw %xmm4, %xmm5, %xmm4
1576 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm4 = xmm4[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1577 ; AVX1-NEXT:    vpand %xmm4, %xmm1, %xmm1
1578 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
1579 ; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero
1580 ; AVX1-NEXT:    vpsllw %xmm2, %xmm0, %xmm0
1581 ; AVX1-NEXT:    vpsllw %xmm2, %xmm5, %xmm2
1582 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1583 ; AVX1-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
1584 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
1585 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
1586 ; AVX1-NEXT:    retq
1588 ; AVX2-LABEL: splatvar_funnnel_v16i8:
1589 ; AVX2:       # %bb.0:
1590 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1591 ; AVX2-NEXT:    vpand %xmm3, %xmm2, %xmm4
1592 ; AVX2-NEXT:    vpmovzxbq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,zero,zero,zero,zero,xmm4[1],zero,zero,zero,zero,zero,zero,zero
1593 ; AVX2-NEXT:    vpsllw %xmm4, %xmm0, %xmm0
1594 ; AVX2-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
1595 ; AVX2-NEXT:    vpsllw %xmm4, %xmm5, %xmm4
1596 ; AVX2-NEXT:    vpbroadcastb %xmm4, %xmm4
1597 ; AVX2-NEXT:    vpand %xmm4, %xmm0, %xmm0
1598 ; AVX2-NEXT:    vpandn %xmm3, %xmm2, %xmm2
1599 ; AVX2-NEXT:    vpmovzxbq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero
1600 ; AVX2-NEXT:    vpsrlw $1, %xmm1, %xmm1
1601 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1602 ; AVX2-NEXT:    vpsrlw %xmm2, %xmm1, %xmm1
1603 ; AVX2-NEXT:    vpsrlw %xmm2, %xmm5, %xmm2
1604 ; AVX2-NEXT:    vpsrlw $8, %xmm2, %xmm2
1605 ; AVX2-NEXT:    vpbroadcastb %xmm2, %xmm2
1606 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
1607 ; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
1608 ; AVX2-NEXT:    retq
1610 ; AVX512F-LABEL: splatvar_funnnel_v16i8:
1611 ; AVX512F:       # %bb.0:
1612 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1613 ; AVX512F-NEXT:    vpand %xmm3, %xmm2, %xmm4
1614 ; AVX512F-NEXT:    vpmovzxbq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,zero,zero,zero,zero,xmm4[1],zero,zero,zero,zero,zero,zero,zero
1615 ; 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
1616 ; AVX512F-NEXT:    vpslld %xmm4, %zmm0, %zmm0
1617 ; AVX512F-NEXT:    vpandn %xmm3, %xmm2, %xmm2
1618 ; AVX512F-NEXT:    vpmovzxbq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero
1619 ; AVX512F-NEXT:    vpsrlw $1, %xmm1, %xmm1
1620 ; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1621 ; 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
1622 ; AVX512F-NEXT:    vpsrld %xmm2, %zmm1, %zmm1
1623 ; AVX512F-NEXT:    vpord %zmm1, %zmm0, %zmm0
1624 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
1625 ; AVX512F-NEXT:    vzeroupper
1626 ; AVX512F-NEXT:    retq
1628 ; AVX512VL-LABEL: splatvar_funnnel_v16i8:
1629 ; AVX512VL:       # %bb.0:
1630 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1631 ; AVX512VL-NEXT:    vpand %xmm3, %xmm2, %xmm4
1632 ; AVX512VL-NEXT:    vpmovzxbq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,zero,zero,zero,zero,xmm4[1],zero,zero,zero,zero,zero,zero,zero
1633 ; 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
1634 ; AVX512VL-NEXT:    vpslld %xmm4, %zmm0, %zmm0
1635 ; AVX512VL-NEXT:    vpandn %xmm3, %xmm2, %xmm2
1636 ; AVX512VL-NEXT:    vpmovzxbq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero
1637 ; AVX512VL-NEXT:    vpsrlw $1, %xmm1, %xmm1
1638 ; AVX512VL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1639 ; 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
1640 ; AVX512VL-NEXT:    vpsrld %xmm2, %zmm1, %zmm1
1641 ; AVX512VL-NEXT:    vpord %zmm1, %zmm0, %zmm0
1642 ; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
1643 ; AVX512VL-NEXT:    vzeroupper
1644 ; AVX512VL-NEXT:    retq
1646 ; AVX512BW-LABEL: splatvar_funnnel_v16i8:
1647 ; AVX512BW:       # %bb.0:
1648 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1649 ; AVX512BW-NEXT:    vpand %xmm3, %xmm2, %xmm4
1650 ; AVX512BW-NEXT:    vpmovzxbq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,zero,zero,zero,zero,xmm4[1],zero,zero,zero,zero,zero,zero,zero
1651 ; 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
1652 ; AVX512BW-NEXT:    vpsllw %xmm4, %ymm0, %ymm0
1653 ; AVX512BW-NEXT:    vpandn %xmm3, %xmm2, %xmm2
1654 ; AVX512BW-NEXT:    vpmovzxbq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero
1655 ; AVX512BW-NEXT:    vpsrlw $1, %xmm1, %xmm1
1656 ; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1657 ; 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
1658 ; AVX512BW-NEXT:    vpsrlw %xmm2, %ymm1, %ymm1
1659 ; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm0
1660 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
1661 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1662 ; AVX512BW-NEXT:    vzeroupper
1663 ; AVX512BW-NEXT:    retq
1665 ; AVX512VBMI2-LABEL: splatvar_funnnel_v16i8:
1666 ; AVX512VBMI2:       # %bb.0:
1667 ; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1668 ; AVX512VBMI2-NEXT:    vpand %xmm3, %xmm2, %xmm4
1669 ; AVX512VBMI2-NEXT:    vpmovzxbq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,zero,zero,zero,zero,xmm4[1],zero,zero,zero,zero,zero,zero,zero
1670 ; AVX512VBMI2-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
1671 ; AVX512VBMI2-NEXT:    vpsllw %xmm4, %ymm0, %ymm0
1672 ; AVX512VBMI2-NEXT:    vpandn %xmm3, %xmm2, %xmm2
1673 ; AVX512VBMI2-NEXT:    vpmovzxbq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero
1674 ; AVX512VBMI2-NEXT:    vpsrlw $1, %xmm1, %xmm1
1675 ; AVX512VBMI2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1676 ; AVX512VBMI2-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
1677 ; AVX512VBMI2-NEXT:    vpsrlw %xmm2, %ymm1, %ymm1
1678 ; AVX512VBMI2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1679 ; AVX512VBMI2-NEXT:    vpmovwb %zmm0, %ymm0
1680 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1681 ; AVX512VBMI2-NEXT:    vzeroupper
1682 ; AVX512VBMI2-NEXT:    retq
1684 ; AVX512VLBW-LABEL: splatvar_funnnel_v16i8:
1685 ; AVX512VLBW:       # %bb.0:
1686 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1687 ; AVX512VLBW-NEXT:    vpand %xmm3, %xmm2, %xmm4
1688 ; AVX512VLBW-NEXT:    vpmovzxbq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,zero,zero,zero,zero,xmm4[1],zero,zero,zero,zero,zero,zero,zero
1689 ; 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
1690 ; AVX512VLBW-NEXT:    vpsllw %xmm4, %ymm0, %ymm0
1691 ; AVX512VLBW-NEXT:    vpandn %xmm3, %xmm2, %xmm2
1692 ; AVX512VLBW-NEXT:    vpmovzxbq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero
1693 ; AVX512VLBW-NEXT:    vpsrlw $1, %xmm1, %xmm1
1694 ; AVX512VLBW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1695 ; 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
1696 ; AVX512VLBW-NEXT:    vpsrlw %xmm2, %ymm1, %ymm1
1697 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm0
1698 ; AVX512VLBW-NEXT:    vpmovwb %ymm0, %xmm0
1699 ; AVX512VLBW-NEXT:    vzeroupper
1700 ; AVX512VLBW-NEXT:    retq
1702 ; AVX512VLVBMI2-LABEL: splatvar_funnnel_v16i8:
1703 ; AVX512VLVBMI2:       # %bb.0:
1704 ; AVX512VLVBMI2-NEXT:    vmovdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1705 ; AVX512VLVBMI2-NEXT:    vpand %xmm3, %xmm2, %xmm4
1706 ; AVX512VLVBMI2-NEXT:    vpmovzxbq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,zero,zero,zero,zero,xmm4[1],zero,zero,zero,zero,zero,zero,zero
1707 ; AVX512VLVBMI2-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
1708 ; AVX512VLVBMI2-NEXT:    vpsllw %xmm4, %ymm0, %ymm0
1709 ; AVX512VLVBMI2-NEXT:    vpandn %xmm3, %xmm2, %xmm2
1710 ; AVX512VLVBMI2-NEXT:    vpmovzxbq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero
1711 ; AVX512VLVBMI2-NEXT:    vpsrlw $1, %xmm1, %xmm1
1712 ; AVX512VLVBMI2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1713 ; AVX512VLVBMI2-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
1714 ; AVX512VLVBMI2-NEXT:    vpsrlw %xmm2, %ymm1, %ymm1
1715 ; AVX512VLVBMI2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1716 ; AVX512VLVBMI2-NEXT:    vpmovwb %ymm0, %xmm0
1717 ; AVX512VLVBMI2-NEXT:    vzeroupper
1718 ; AVX512VLVBMI2-NEXT:    retq
1720 ; XOPAVX1-LABEL: splatvar_funnnel_v16i8:
1721 ; XOPAVX1:       # %bb.0:
1722 ; XOPAVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1723 ; XOPAVX1-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
1724 ; XOPAVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
1725 ; XOPAVX1-NEXT:    vpshlb %xmm4, %xmm1, %xmm1
1726 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1727 ; XOPAVX1-NEXT:    vpandn %xmm4, %xmm2, %xmm5
1728 ; XOPAVX1-NEXT:    vpsubb %xmm5, %xmm3, %xmm3
1729 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm1, %xmm1
1730 ; XOPAVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
1731 ; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm0, %xmm0
1732 ; XOPAVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
1733 ; XOPAVX1-NEXT:    retq
1735 ; XOPAVX2-LABEL: splatvar_funnnel_v16i8:
1736 ; XOPAVX2:       # %bb.0:
1737 ; XOPAVX2-NEXT:    vpbroadcastb %xmm2, %xmm2
1738 ; XOPAVX2-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
1739 ; XOPAVX2-NEXT:    vpshlb %xmm3, %xmm1, %xmm1
1740 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1741 ; XOPAVX2-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1742 ; XOPAVX2-NEXT:    vpxor %xmm5, %xmm5, %xmm5
1743 ; XOPAVX2-NEXT:    vpsubb %xmm4, %xmm5, %xmm4
1744 ; XOPAVX2-NEXT:    vpshlb %xmm4, %xmm1, %xmm1
1745 ; XOPAVX2-NEXT:    vpand %xmm3, %xmm2, %xmm2
1746 ; XOPAVX2-NEXT:    vpshlb %xmm2, %xmm0, %xmm0
1747 ; XOPAVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
1748 ; XOPAVX2-NEXT:    retq
1750 ; X86-SSE2-LABEL: splatvar_funnnel_v16i8:
1751 ; X86-SSE2:       # %bb.0:
1752 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1753 ; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
1754 ; X86-SSE2-NEXT:    pand %xmm3, %xmm4
1755 ; X86-SSE2-NEXT:    pslldq {{.*#+}} xmm4 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm4[0]
1756 ; X86-SSE2-NEXT:    psrldq {{.*#+}} xmm4 = xmm4[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1757 ; X86-SSE2-NEXT:    psllw %xmm4, %xmm0
1758 ; X86-SSE2-NEXT:    pcmpeqd %xmm5, %xmm5
1759 ; X86-SSE2-NEXT:    pcmpeqd %xmm6, %xmm6
1760 ; X86-SSE2-NEXT:    psllw %xmm4, %xmm6
1761 ; X86-SSE2-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1762 ; X86-SSE2-NEXT:    pshuflw {{.*#+}} xmm4 = xmm6[0,0,0,0,4,5,6,7]
1763 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,0,0,0]
1764 ; X86-SSE2-NEXT:    pand %xmm4, %xmm0
1765 ; X86-SSE2-NEXT:    pandn %xmm3, %xmm2
1766 ; X86-SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0]
1767 ; X86-SSE2-NEXT:    psrldq {{.*#+}} xmm2 = xmm2[15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1768 ; X86-SSE2-NEXT:    psrlw $1, %xmm1
1769 ; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
1770 ; X86-SSE2-NEXT:    psrlw %xmm2, %xmm1
1771 ; X86-SSE2-NEXT:    psrlw %xmm2, %xmm5
1772 ; X86-SSE2-NEXT:    psrlw $8, %xmm5
1773 ; X86-SSE2-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1774 ; X86-SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm5[0,0,0,0,4,5,6,7]
1775 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]
1776 ; X86-SSE2-NEXT:    pand %xmm1, %xmm2
1777 ; X86-SSE2-NEXT:    por %xmm2, %xmm0
1778 ; X86-SSE2-NEXT:    retl
1779   %splat = shufflevector <16 x i8> %amt, <16 x i8> undef, <16 x i32> zeroinitializer
1780   %res = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %x, <16 x i8> %y, <16 x i8> %splat)
1781   ret <16 x i8> %res
1784 ; CGP should allow a cross-block splat shift amount to be seen in SDAG.
1785 ; PR37426 - https://bugs.llvm.org/show_bug.cgi?id=37426
1787 define void @sink_splatvar(i32* %p, i32 %shift_amt) {
1788 ; SSE2-LABEL: sink_splatvar:
1789 ; SSE2:       # %bb.0: # %entry
1790 ; SSE2-NEXT:    movd %esi, %xmm0
1791 ; SSE2-NEXT:    movq $-1024, %rax # imm = 0xFC00
1792 ; SSE2-NEXT:    movd %xmm0, %ecx
1793 ; SSE2-NEXT:    andl $31, %ecx
1794 ; SSE2-NEXT:    movl $32, %edx
1795 ; SSE2-NEXT:    subl %ecx, %edx
1796 ; SSE2-NEXT:    movd %edx, %xmm0
1797 ; SSE2-NEXT:    movd %ecx, %xmm1
1798 ; SSE2-NEXT:    .p2align 4, 0x90
1799 ; SSE2-NEXT:  .LBB8_1: # %loop
1800 ; SSE2-NEXT:    # =>This Inner Loop Header: Depth=1
1801 ; SSE2-NEXT:    movdqu 1024(%rdi,%rax), %xmm2
1802 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
1803 ; SSE2-NEXT:    psrld %xmm0, %xmm3
1804 ; SSE2-NEXT:    pslld %xmm1, %xmm2
1805 ; SSE2-NEXT:    por %xmm3, %xmm2
1806 ; SSE2-NEXT:    movdqu %xmm2, 1024(%rdi,%rax)
1807 ; SSE2-NEXT:    addq $16, %rax
1808 ; SSE2-NEXT:    jne .LBB8_1
1809 ; SSE2-NEXT:  # %bb.2: # %end
1810 ; SSE2-NEXT:    retq
1812 ; SSE41-LABEL: sink_splatvar:
1813 ; SSE41:       # %bb.0: # %entry
1814 ; SSE41-NEXT:    movd %esi, %xmm1
1815 ; SSE41-NEXT:    movq $-1024, %rax # imm = 0xFC00
1816 ; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1817 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [32,32,32,32]
1818 ; SSE41-NEXT:    psubd %xmm1, %xmm0
1819 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1820 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
1821 ; SSE41-NEXT:    .p2align 4, 0x90
1822 ; SSE41-NEXT:  .LBB8_1: # %loop
1823 ; SSE41-NEXT:    # =>This Inner Loop Header: Depth=1
1824 ; SSE41-NEXT:    movdqu 1024(%rdi,%rax), %xmm2
1825 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
1826 ; SSE41-NEXT:    psrld %xmm0, %xmm3
1827 ; SSE41-NEXT:    pslld %xmm1, %xmm2
1828 ; SSE41-NEXT:    por %xmm3, %xmm2
1829 ; SSE41-NEXT:    movdqu %xmm2, 1024(%rdi,%rax)
1830 ; SSE41-NEXT:    addq $16, %rax
1831 ; SSE41-NEXT:    jne .LBB8_1
1832 ; SSE41-NEXT:  # %bb.2: # %end
1833 ; SSE41-NEXT:    retq
1835 ; AVX1-LABEL: sink_splatvar:
1836 ; AVX1:       # %bb.0: # %entry
1837 ; AVX1-NEXT:    vmovd %esi, %xmm0
1838 ; AVX1-NEXT:    movq $-1024, %rax # imm = 0xFC00
1839 ; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
1840 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm0 = [32,32,32,32]
1841 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
1842 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1843 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
1844 ; AVX1-NEXT:    .p2align 4, 0x90
1845 ; AVX1-NEXT:  .LBB8_1: # %loop
1846 ; AVX1-NEXT:    # =>This Inner Loop Header: Depth=1
1847 ; AVX1-NEXT:    vmovdqu 1024(%rdi,%rax), %xmm2
1848 ; AVX1-NEXT:    vpsrld %xmm0, %xmm2, %xmm3
1849 ; AVX1-NEXT:    vpslld %xmm1, %xmm2, %xmm2
1850 ; AVX1-NEXT:    vpor %xmm3, %xmm2, %xmm2
1851 ; AVX1-NEXT:    vmovdqu %xmm2, 1024(%rdi,%rax)
1852 ; AVX1-NEXT:    addq $16, %rax
1853 ; AVX1-NEXT:    jne .LBB8_1
1854 ; AVX1-NEXT:  # %bb.2: # %end
1855 ; AVX1-NEXT:    retq
1857 ; AVX2-LABEL: sink_splatvar:
1858 ; AVX2:       # %bb.0: # %entry
1859 ; AVX2-NEXT:    vmovd %esi, %xmm0
1860 ; AVX2-NEXT:    vpbroadcastd %xmm0, %xmm0
1861 ; AVX2-NEXT:    movq $-1024, %rax # imm = 0xFC00
1862 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [31,31,31,31]
1863 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
1864 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [32,32,32,32]
1865 ; AVX2-NEXT:    vpsubd %xmm0, %xmm1, %xmm1
1866 ; AVX2-NEXT:    .p2align 4, 0x90
1867 ; AVX2-NEXT:  .LBB8_1: # %loop
1868 ; AVX2-NEXT:    # =>This Inner Loop Header: Depth=1
1869 ; AVX2-NEXT:    vmovdqu 1024(%rdi,%rax), %xmm2
1870 ; AVX2-NEXT:    vpsllvd %xmm0, %xmm2, %xmm3
1871 ; AVX2-NEXT:    vpsrlvd %xmm1, %xmm2, %xmm2
1872 ; AVX2-NEXT:    vpor %xmm2, %xmm3, %xmm2
1873 ; AVX2-NEXT:    vmovdqu %xmm2, 1024(%rdi,%rax)
1874 ; AVX2-NEXT:    addq $16, %rax
1875 ; AVX2-NEXT:    jne .LBB8_1
1876 ; AVX2-NEXT:  # %bb.2: # %end
1877 ; AVX2-NEXT:    retq
1879 ; AVX512F-LABEL: sink_splatvar:
1880 ; AVX512F:       # %bb.0: # %entry
1881 ; AVX512F-NEXT:    vmovd %esi, %xmm0
1882 ; AVX512F-NEXT:    vpbroadcastd %xmm0, %xmm0
1883 ; AVX512F-NEXT:    movq $-1024, %rax # imm = 0xFC00
1884 ; AVX512F-NEXT:    .p2align 4, 0x90
1885 ; AVX512F-NEXT:  .LBB8_1: # %loop
1886 ; AVX512F-NEXT:    # =>This Inner Loop Header: Depth=1
1887 ; AVX512F-NEXT:    vmovdqu 1024(%rdi,%rax), %xmm1
1888 ; AVX512F-NEXT:    vprolvd %zmm0, %zmm1, %zmm1
1889 ; AVX512F-NEXT:    vmovdqu %xmm1, 1024(%rdi,%rax)
1890 ; AVX512F-NEXT:    addq $16, %rax
1891 ; AVX512F-NEXT:    jne .LBB8_1
1892 ; AVX512F-NEXT:  # %bb.2: # %end
1893 ; AVX512F-NEXT:    vzeroupper
1894 ; AVX512F-NEXT:    retq
1896 ; AVX512VL-LABEL: sink_splatvar:
1897 ; AVX512VL:       # %bb.0: # %entry
1898 ; AVX512VL-NEXT:    vpbroadcastd %esi, %xmm0
1899 ; AVX512VL-NEXT:    movq $-1024, %rax # imm = 0xFC00
1900 ; AVX512VL-NEXT:    .p2align 4, 0x90
1901 ; AVX512VL-NEXT:  .LBB8_1: # %loop
1902 ; AVX512VL-NEXT:    # =>This Inner Loop Header: Depth=1
1903 ; AVX512VL-NEXT:    vmovdqu 1024(%rdi,%rax), %xmm1
1904 ; AVX512VL-NEXT:    vprolvd %xmm0, %xmm1, %xmm1
1905 ; AVX512VL-NEXT:    vmovdqu %xmm1, 1024(%rdi,%rax)
1906 ; AVX512VL-NEXT:    addq $16, %rax
1907 ; AVX512VL-NEXT:    jne .LBB8_1
1908 ; AVX512VL-NEXT:  # %bb.2: # %end
1909 ; AVX512VL-NEXT:    retq
1911 ; AVX512BW-LABEL: sink_splatvar:
1912 ; AVX512BW:       # %bb.0: # %entry
1913 ; AVX512BW-NEXT:    vmovd %esi, %xmm0
1914 ; AVX512BW-NEXT:    vpbroadcastd %xmm0, %xmm0
1915 ; AVX512BW-NEXT:    movq $-1024, %rax # imm = 0xFC00
1916 ; AVX512BW-NEXT:    .p2align 4, 0x90
1917 ; AVX512BW-NEXT:  .LBB8_1: # %loop
1918 ; AVX512BW-NEXT:    # =>This Inner Loop Header: Depth=1
1919 ; AVX512BW-NEXT:    vmovdqu 1024(%rdi,%rax), %xmm1
1920 ; AVX512BW-NEXT:    vprolvd %zmm0, %zmm1, %zmm1
1921 ; AVX512BW-NEXT:    vmovdqu %xmm1, 1024(%rdi,%rax)
1922 ; AVX512BW-NEXT:    addq $16, %rax
1923 ; AVX512BW-NEXT:    jne .LBB8_1
1924 ; AVX512BW-NEXT:  # %bb.2: # %end
1925 ; AVX512BW-NEXT:    vzeroupper
1926 ; AVX512BW-NEXT:    retq
1928 ; AVX512VBMI2-LABEL: sink_splatvar:
1929 ; AVX512VBMI2:       # %bb.0: # %entry
1930 ; AVX512VBMI2-NEXT:    vmovd %esi, %xmm0
1931 ; AVX512VBMI2-NEXT:    vpbroadcastd %xmm0, %xmm0
1932 ; AVX512VBMI2-NEXT:    movq $-1024, %rax # imm = 0xFC00
1933 ; AVX512VBMI2-NEXT:    .p2align 4, 0x90
1934 ; AVX512VBMI2-NEXT:  .LBB8_1: # %loop
1935 ; AVX512VBMI2-NEXT:    # =>This Inner Loop Header: Depth=1
1936 ; AVX512VBMI2-NEXT:    vmovdqu 1024(%rdi,%rax), %xmm1
1937 ; AVX512VBMI2-NEXT:    vprolvd %zmm0, %zmm1, %zmm1
1938 ; AVX512VBMI2-NEXT:    vmovdqu %xmm1, 1024(%rdi,%rax)
1939 ; AVX512VBMI2-NEXT:    addq $16, %rax
1940 ; AVX512VBMI2-NEXT:    jne .LBB8_1
1941 ; AVX512VBMI2-NEXT:  # %bb.2: # %end
1942 ; AVX512VBMI2-NEXT:    vzeroupper
1943 ; AVX512VBMI2-NEXT:    retq
1945 ; AVX512VLBW-LABEL: sink_splatvar:
1946 ; AVX512VLBW:       # %bb.0: # %entry
1947 ; AVX512VLBW-NEXT:    vpbroadcastd %esi, %xmm0
1948 ; AVX512VLBW-NEXT:    movq $-1024, %rax # imm = 0xFC00
1949 ; AVX512VLBW-NEXT:    .p2align 4, 0x90
1950 ; AVX512VLBW-NEXT:  .LBB8_1: # %loop
1951 ; AVX512VLBW-NEXT:    # =>This Inner Loop Header: Depth=1
1952 ; AVX512VLBW-NEXT:    vmovdqu 1024(%rdi,%rax), %xmm1
1953 ; AVX512VLBW-NEXT:    vprolvd %xmm0, %xmm1, %xmm1
1954 ; AVX512VLBW-NEXT:    vmovdqu %xmm1, 1024(%rdi,%rax)
1955 ; AVX512VLBW-NEXT:    addq $16, %rax
1956 ; AVX512VLBW-NEXT:    jne .LBB8_1
1957 ; AVX512VLBW-NEXT:  # %bb.2: # %end
1958 ; AVX512VLBW-NEXT:    retq
1960 ; AVX512VLVBMI2-LABEL: sink_splatvar:
1961 ; AVX512VLVBMI2:       # %bb.0: # %entry
1962 ; AVX512VLVBMI2-NEXT:    vpbroadcastd %esi, %xmm0
1963 ; AVX512VLVBMI2-NEXT:    movq $-1024, %rax # imm = 0xFC00
1964 ; AVX512VLVBMI2-NEXT:    .p2align 4, 0x90
1965 ; AVX512VLVBMI2-NEXT:  .LBB8_1: # %loop
1966 ; AVX512VLVBMI2-NEXT:    # =>This Inner Loop Header: Depth=1
1967 ; AVX512VLVBMI2-NEXT:    vmovdqu 1024(%rdi,%rax), %xmm1
1968 ; AVX512VLVBMI2-NEXT:    vprolvd %xmm0, %xmm1, %xmm1
1969 ; AVX512VLVBMI2-NEXT:    vmovdqu %xmm1, 1024(%rdi,%rax)
1970 ; AVX512VLVBMI2-NEXT:    addq $16, %rax
1971 ; AVX512VLVBMI2-NEXT:    jne .LBB8_1
1972 ; AVX512VLVBMI2-NEXT:  # %bb.2: # %end
1973 ; AVX512VLVBMI2-NEXT:    retq
1975 ; XOPAVX1-LABEL: sink_splatvar:
1976 ; XOPAVX1:       # %bb.0: # %entry
1977 ; XOPAVX1-NEXT:    vmovd %esi, %xmm0
1978 ; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
1979 ; XOPAVX1-NEXT:    movq $-1024, %rax # imm = 0xFC00
1980 ; XOPAVX1-NEXT:    .p2align 4, 0x90
1981 ; XOPAVX1-NEXT:  .LBB8_1: # %loop
1982 ; XOPAVX1-NEXT:    # =>This Inner Loop Header: Depth=1
1983 ; XOPAVX1-NEXT:    vprotd %xmm0, 1024(%rdi,%rax), %xmm1
1984 ; XOPAVX1-NEXT:    vmovdqu %xmm1, 1024(%rdi,%rax)
1985 ; XOPAVX1-NEXT:    addq $16, %rax
1986 ; XOPAVX1-NEXT:    jne .LBB8_1
1987 ; XOPAVX1-NEXT:  # %bb.2: # %end
1988 ; XOPAVX1-NEXT:    retq
1990 ; XOPAVX2-LABEL: sink_splatvar:
1991 ; XOPAVX2:       # %bb.0: # %entry
1992 ; XOPAVX2-NEXT:    vmovd %esi, %xmm0
1993 ; XOPAVX2-NEXT:    vpbroadcastd %xmm0, %xmm0
1994 ; XOPAVX2-NEXT:    movq $-1024, %rax # imm = 0xFC00
1995 ; XOPAVX2-NEXT:    .p2align 4, 0x90
1996 ; XOPAVX2-NEXT:  .LBB8_1: # %loop
1997 ; XOPAVX2-NEXT:    # =>This Inner Loop Header: Depth=1
1998 ; XOPAVX2-NEXT:    vprotd %xmm0, 1024(%rdi,%rax), %xmm1
1999 ; XOPAVX2-NEXT:    vmovdqu %xmm1, 1024(%rdi,%rax)
2000 ; XOPAVX2-NEXT:    addq $16, %rax
2001 ; XOPAVX2-NEXT:    jne .LBB8_1
2002 ; XOPAVX2-NEXT:  # %bb.2: # %end
2003 ; XOPAVX2-NEXT:    retq
2005 ; X86-SSE2-LABEL: sink_splatvar:
2006 ; X86-SSE2:       # %bb.0: # %entry
2007 ; X86-SSE2-NEXT:    pushl %esi
2008 ; X86-SSE2-NEXT:    .cfi_def_cfa_offset 8
2009 ; X86-SSE2-NEXT:    .cfi_offset %esi, -8
2010 ; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
2011 ; X86-SSE2-NEXT:    xorl %ecx, %ecx
2012 ; X86-SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2013 ; X86-SSE2-NEXT:    movd %xmm0, %edx
2014 ; X86-SSE2-NEXT:    andl $31, %edx
2015 ; X86-SSE2-NEXT:    movl $32, %esi
2016 ; X86-SSE2-NEXT:    subl %edx, %esi
2017 ; X86-SSE2-NEXT:    movd %esi, %xmm0
2018 ; X86-SSE2-NEXT:    movd %edx, %xmm1
2019 ; X86-SSE2-NEXT:    xorl %edx, %edx
2020 ; X86-SSE2-NEXT:    .p2align 4, 0x90
2021 ; X86-SSE2-NEXT:  .LBB8_1: # %loop
2022 ; X86-SSE2-NEXT:    # =>This Inner Loop Header: Depth=1
2023 ; X86-SSE2-NEXT:    movdqu (%eax,%ecx,4), %xmm2
2024 ; X86-SSE2-NEXT:    movdqa %xmm2, %xmm3
2025 ; X86-SSE2-NEXT:    psrld %xmm0, %xmm3
2026 ; X86-SSE2-NEXT:    pslld %xmm1, %xmm2
2027 ; X86-SSE2-NEXT:    por %xmm3, %xmm2
2028 ; X86-SSE2-NEXT:    movdqu %xmm2, (%eax,%ecx,4)
2029 ; X86-SSE2-NEXT:    addl $4, %ecx
2030 ; X86-SSE2-NEXT:    adcl $0, %edx
2031 ; X86-SSE2-NEXT:    movl %ecx, %esi
2032 ; X86-SSE2-NEXT:    xorl $256, %esi # imm = 0x100
2033 ; X86-SSE2-NEXT:    orl %edx, %esi
2034 ; X86-SSE2-NEXT:    jne .LBB8_1
2035 ; X86-SSE2-NEXT:  # %bb.2: # %end
2036 ; X86-SSE2-NEXT:    popl %esi
2037 ; X86-SSE2-NEXT:    .cfi_def_cfa_offset 4
2038 ; X86-SSE2-NEXT:    retl
2039 entry:
2040   %ins = insertelement <4 x i32> undef, i32 %shift_amt, i32 0
2041   %splat = shufflevector <4 x i32> %ins, <4 x i32> undef, <4 x i32> zeroinitializer
2042   br label %loop
2044 loop:
2045   %index = phi i64 [ 0, %entry ], [ %inc, %loop ]
2046   %addr = getelementptr inbounds i32, i32* %p, i64 %index
2047   %addr_vec = bitcast i32* %addr to <4 x i32>*
2048   %x = load <4 x i32>, <4 x i32>* %addr_vec, align 4
2049   %fsh = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %x, <4 x i32> %splat)
2050   store <4 x i32> %fsh, <4 x i32>* %addr_vec, align 4
2051   %inc = add i64 %index, 4
2052   %iv = icmp eq i64 %inc, 256
2053   br i1 %iv, label %end, label %loop
2055 end:
2056   ret void
2060 ; Constant Shifts
2063 define <2 x i64> @constant_funnnel_v2i64(<2 x i64> %x, <2 x i64> %y) nounwind {
2064 ; SSE2-LABEL: constant_funnnel_v2i64:
2065 ; SSE2:       # %bb.0:
2066 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
2067 ; SSE2-NEXT:    psrlq $60, %xmm2
2068 ; SSE2-NEXT:    psrlq $50, %xmm1
2069 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
2070 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
2071 ; SSE2-NEXT:    psllq $4, %xmm2
2072 ; SSE2-NEXT:    psllq $14, %xmm0
2073 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]
2074 ; SSE2-NEXT:    orpd %xmm1, %xmm0
2075 ; SSE2-NEXT:    retq
2077 ; SSE41-LABEL: constant_funnnel_v2i64:
2078 ; SSE41:       # %bb.0:
2079 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
2080 ; SSE41-NEXT:    psrlq $50, %xmm2
2081 ; SSE41-NEXT:    psrlq $60, %xmm1
2082 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
2083 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
2084 ; SSE41-NEXT:    psllq $14, %xmm2
2085 ; SSE41-NEXT:    psllq $4, %xmm0
2086 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
2087 ; SSE41-NEXT:    por %xmm1, %xmm0
2088 ; SSE41-NEXT:    retq
2090 ; AVX1-LABEL: constant_funnnel_v2i64:
2091 ; AVX1:       # %bb.0:
2092 ; AVX1-NEXT:    vpsrlq $50, %xmm1, %xmm2
2093 ; AVX1-NEXT:    vpsrlq $60, %xmm1, %xmm1
2094 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
2095 ; AVX1-NEXT:    vpsllq $14, %xmm0, %xmm2
2096 ; AVX1-NEXT:    vpsllq $4, %xmm0, %xmm0
2097 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
2098 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
2099 ; AVX1-NEXT:    retq
2101 ; AVX2-LABEL: constant_funnnel_v2i64:
2102 ; AVX2:       # %bb.0:
2103 ; AVX2-NEXT:    vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2104 ; AVX2-NEXT:    vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2105 ; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
2106 ; AVX2-NEXT:    retq
2108 ; AVX512F-LABEL: constant_funnnel_v2i64:
2109 ; AVX512F:       # %bb.0:
2110 ; AVX512F-NEXT:    vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2111 ; AVX512F-NEXT:    vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2112 ; AVX512F-NEXT:    vpor %xmm1, %xmm0, %xmm0
2113 ; AVX512F-NEXT:    retq
2115 ; AVX512VL-LABEL: constant_funnnel_v2i64:
2116 ; AVX512VL:       # %bb.0:
2117 ; AVX512VL-NEXT:    vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2118 ; AVX512VL-NEXT:    vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2119 ; AVX512VL-NEXT:    vpor %xmm1, %xmm0, %xmm0
2120 ; AVX512VL-NEXT:    retq
2122 ; AVX512BW-LABEL: constant_funnnel_v2i64:
2123 ; AVX512BW:       # %bb.0:
2124 ; AVX512BW-NEXT:    vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2125 ; AVX512BW-NEXT:    vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2126 ; AVX512BW-NEXT:    vpor %xmm1, %xmm0, %xmm0
2127 ; AVX512BW-NEXT:    retq
2129 ; AVX512VBMI2-LABEL: constant_funnnel_v2i64:
2130 ; AVX512VBMI2:       # %bb.0:
2131 ; AVX512VBMI2-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2132 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2133 ; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} xmm2 = [4,14]
2134 ; AVX512VBMI2-NEXT:    vpshldvq %zmm2, %zmm1, %zmm0
2135 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2136 ; AVX512VBMI2-NEXT:    vzeroupper
2137 ; AVX512VBMI2-NEXT:    retq
2139 ; AVX512VLBW-LABEL: constant_funnnel_v2i64:
2140 ; AVX512VLBW:       # %bb.0:
2141 ; AVX512VLBW-NEXT:    vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2142 ; AVX512VLBW-NEXT:    vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2143 ; AVX512VLBW-NEXT:    vpor %xmm1, %xmm0, %xmm0
2144 ; AVX512VLBW-NEXT:    retq
2146 ; AVX512VLVBMI2-LABEL: constant_funnnel_v2i64:
2147 ; AVX512VLVBMI2:       # %bb.0:
2148 ; AVX512VLVBMI2-NEXT:    vpshldvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm0
2149 ; AVX512VLVBMI2-NEXT:    retq
2151 ; XOPAVX1-LABEL: constant_funnnel_v2i64:
2152 ; XOPAVX1:       # %bb.0:
2153 ; XOPAVX1-NEXT:    vpshlq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2154 ; XOPAVX1-NEXT:    vpshlq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2155 ; XOPAVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
2156 ; XOPAVX1-NEXT:    retq
2158 ; XOPAVX2-LABEL: constant_funnnel_v2i64:
2159 ; XOPAVX2:       # %bb.0:
2160 ; XOPAVX2-NEXT:    vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2161 ; XOPAVX2-NEXT:    vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2162 ; XOPAVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
2163 ; XOPAVX2-NEXT:    retq
2165 ; X86-SSE2-LABEL: constant_funnnel_v2i64:
2166 ; X86-SSE2:       # %bb.0:
2167 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [63,0,63,0]
2168 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = <4,u,14,u>
2169 ; X86-SSE2-NEXT:    movdqa %xmm3, %xmm4
2170 ; X86-SSE2-NEXT:    pandn %xmm2, %xmm4
2171 ; X86-SSE2-NEXT:    psrlq $1, %xmm1
2172 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm5
2173 ; X86-SSE2-NEXT:    psrlq %xmm4, %xmm5
2174 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[2,3,2,3]
2175 ; X86-SSE2-NEXT:    psrlq %xmm4, %xmm1
2176 ; X86-SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm5[0],xmm1[1]
2177 ; X86-SSE2-NEXT:    pand %xmm2, %xmm3
2178 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
2179 ; X86-SSE2-NEXT:    psllq %xmm3, %xmm2
2180 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]
2181 ; X86-SSE2-NEXT:    psllq %xmm3, %xmm0
2182 ; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]
2183 ; X86-SSE2-NEXT:    orpd %xmm1, %xmm0
2184 ; X86-SSE2-NEXT:    retl
2185   %res = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> %x, <2 x i64> %y, <2 x i64> <i64 4, i64 14>)
2186   ret <2 x i64> %res
2189 define <4 x i32> @constant_funnnel_v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {
2190 ; SSE2-LABEL: constant_funnnel_v4i32:
2191 ; SSE2:       # %bb.0:
2192 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
2193 ; SSE2-NEXT:    psrld $25, %xmm2
2194 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
2195 ; SSE2-NEXT:    psrld $26, %xmm3
2196 ; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm3 = xmm3[1],xmm2[1]
2197 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
2198 ; SSE2-NEXT:    psrld $27, %xmm2
2199 ; SSE2-NEXT:    psrld $28, %xmm1
2200 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
2201 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,3],xmm3[0,3]
2202 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [16,32,64,128]
2203 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
2204 ; SSE2-NEXT:    pmuludq %xmm2, %xmm0
2205 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2206 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2207 ; SSE2-NEXT:    pmuludq %xmm3, %xmm2
2208 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
2209 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2210 ; SSE2-NEXT:    por %xmm1, %xmm0
2211 ; SSE2-NEXT:    retq
2213 ; SSE41-LABEL: constant_funnnel_v4i32:
2214 ; SSE41:       # %bb.0:
2215 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
2216 ; SSE41-NEXT:    psrld $25, %xmm2
2217 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
2218 ; SSE41-NEXT:    psrld $27, %xmm3
2219 ; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0,1,2,3],xmm2[4,5,6,7]
2220 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
2221 ; SSE41-NEXT:    psrld $26, %xmm2
2222 ; SSE41-NEXT:    psrld $28, %xmm1
2223 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
2224 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]
2225 ; SSE41-NEXT:    pmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2226 ; SSE41-NEXT:    por %xmm1, %xmm0
2227 ; SSE41-NEXT:    retq
2229 ; AVX1-LABEL: constant_funnnel_v4i32:
2230 ; AVX1:       # %bb.0:
2231 ; AVX1-NEXT:    vpsrld $25, %xmm1, %xmm2
2232 ; AVX1-NEXT:    vpsrld $27, %xmm1, %xmm3
2233 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
2234 ; AVX1-NEXT:    vpsrld $26, %xmm1, %xmm3
2235 ; AVX1-NEXT:    vpsrld $28, %xmm1, %xmm1
2236 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm3[4,5,6,7]
2237 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
2238 ; AVX1-NEXT:    vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2239 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
2240 ; AVX1-NEXT:    retq
2242 ; AVX2-LABEL: constant_funnnel_v4i32:
2243 ; AVX2:       # %bb.0:
2244 ; AVX2-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2245 ; AVX2-NEXT:    vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2246 ; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
2247 ; AVX2-NEXT:    retq
2249 ; AVX512F-LABEL: constant_funnnel_v4i32:
2250 ; AVX512F:       # %bb.0:
2251 ; AVX512F-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2252 ; AVX512F-NEXT:    vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2253 ; AVX512F-NEXT:    vpor %xmm1, %xmm0, %xmm0
2254 ; AVX512F-NEXT:    retq
2256 ; AVX512VL-LABEL: constant_funnnel_v4i32:
2257 ; AVX512VL:       # %bb.0:
2258 ; AVX512VL-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2259 ; AVX512VL-NEXT:    vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2260 ; AVX512VL-NEXT:    vpor %xmm1, %xmm0, %xmm0
2261 ; AVX512VL-NEXT:    retq
2263 ; AVX512BW-LABEL: constant_funnnel_v4i32:
2264 ; AVX512BW:       # %bb.0:
2265 ; AVX512BW-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2266 ; AVX512BW-NEXT:    vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2267 ; AVX512BW-NEXT:    vpor %xmm1, %xmm0, %xmm0
2268 ; AVX512BW-NEXT:    retq
2270 ; AVX512VBMI2-LABEL: constant_funnnel_v4i32:
2271 ; AVX512VBMI2:       # %bb.0:
2272 ; AVX512VBMI2-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2273 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2274 ; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} xmm2 = [4,5,6,7]
2275 ; AVX512VBMI2-NEXT:    vpshldvd %zmm2, %zmm1, %zmm0
2276 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2277 ; AVX512VBMI2-NEXT:    vzeroupper
2278 ; AVX512VBMI2-NEXT:    retq
2280 ; AVX512VLBW-LABEL: constant_funnnel_v4i32:
2281 ; AVX512VLBW:       # %bb.0:
2282 ; AVX512VLBW-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2283 ; AVX512VLBW-NEXT:    vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2284 ; AVX512VLBW-NEXT:    vpor %xmm1, %xmm0, %xmm0
2285 ; AVX512VLBW-NEXT:    retq
2287 ; AVX512VLVBMI2-LABEL: constant_funnnel_v4i32:
2288 ; AVX512VLVBMI2:       # %bb.0:
2289 ; AVX512VLVBMI2-NEXT:    vpshldvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm0
2290 ; AVX512VLVBMI2-NEXT:    retq
2292 ; XOPAVX1-LABEL: constant_funnnel_v4i32:
2293 ; XOPAVX1:       # %bb.0:
2294 ; XOPAVX1-NEXT:    vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2295 ; XOPAVX1-NEXT:    vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2296 ; XOPAVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
2297 ; XOPAVX1-NEXT:    retq
2299 ; XOPAVX2-LABEL: constant_funnnel_v4i32:
2300 ; XOPAVX2:       # %bb.0:
2301 ; XOPAVX2-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2302 ; XOPAVX2-NEXT:    vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2303 ; XOPAVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
2304 ; XOPAVX2-NEXT:    retq
2306 ; X86-SSE2-LABEL: constant_funnnel_v4i32:
2307 ; X86-SSE2:       # %bb.0:
2308 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
2309 ; X86-SSE2-NEXT:    psrld $25, %xmm2
2310 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm3
2311 ; X86-SSE2-NEXT:    psrld $26, %xmm3
2312 ; X86-SSE2-NEXT:    punpckhqdq {{.*#+}} xmm3 = xmm3[1],xmm2[1]
2313 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
2314 ; X86-SSE2-NEXT:    psrld $27, %xmm2
2315 ; X86-SSE2-NEXT:    psrld $28, %xmm1
2316 ; X86-SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
2317 ; X86-SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,3],xmm3[0,3]
2318 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [16,32,64,128]
2319 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
2320 ; X86-SSE2-NEXT:    pmuludq %xmm2, %xmm0
2321 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2322 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2323 ; X86-SSE2-NEXT:    pmuludq %xmm3, %xmm2
2324 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
2325 ; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
2326 ; X86-SSE2-NEXT:    por %xmm1, %xmm0
2327 ; X86-SSE2-NEXT:    retl
2328   %res = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %y, <4 x i32> <i32 4, i32 5, i32 6, i32 7>)
2329   ret <4 x i32> %res
2332 define <8 x i16> @constant_funnnel_v8i16(<8 x i16> %x, <8 x i16> %y) nounwind {
2333 ; SSE-LABEL: constant_funnnel_v8i16:
2334 ; SSE:       # %bb.0:
2335 ; SSE-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2336 ; SSE-NEXT:    psrlw $1, %xmm1
2337 ; SSE-NEXT:    pmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2338 ; SSE-NEXT:    por %xmm1, %xmm0
2339 ; SSE-NEXT:    retq
2341 ; AVX-LABEL: constant_funnnel_v8i16:
2342 ; AVX:       # %bb.0:
2343 ; AVX-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2344 ; AVX-NEXT:    vpsrlw $1, %xmm1, %xmm1
2345 ; AVX-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2346 ; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
2347 ; AVX-NEXT:    retq
2349 ; AVX512F-LABEL: constant_funnnel_v8i16:
2350 ; AVX512F:       # %bb.0:
2351 ; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2352 ; AVX512F-NEXT:    vpsrlw $1, %xmm1, %xmm1
2353 ; AVX512F-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2354 ; AVX512F-NEXT:    vpor %xmm1, %xmm0, %xmm0
2355 ; AVX512F-NEXT:    retq
2357 ; AVX512VL-LABEL: constant_funnnel_v8i16:
2358 ; AVX512VL:       # %bb.0:
2359 ; AVX512VL-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2360 ; AVX512VL-NEXT:    vpsrlw $1, %xmm1, %xmm1
2361 ; AVX512VL-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2362 ; AVX512VL-NEXT:    vpor %xmm1, %xmm0, %xmm0
2363 ; AVX512VL-NEXT:    retq
2365 ; AVX512BW-LABEL: constant_funnnel_v8i16:
2366 ; AVX512BW:       # %bb.0:
2367 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2368 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7]
2369 ; AVX512BW-NEXT:    vpsllvw %zmm2, %zmm0, %zmm0
2370 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = [15,14,13,12,11,10,9,8]
2371 ; AVX512BW-NEXT:    vpsrlw $1, %xmm1, %xmm1
2372 ; AVX512BW-NEXT:    vpsrlvw %zmm2, %zmm1, %zmm1
2373 ; AVX512BW-NEXT:    vpor %xmm1, %xmm0, %xmm0
2374 ; AVX512BW-NEXT:    vzeroupper
2375 ; AVX512BW-NEXT:    retq
2377 ; AVX512VBMI2-LABEL: constant_funnnel_v8i16:
2378 ; AVX512VBMI2:       # %bb.0:
2379 ; AVX512VBMI2-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2380 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2381 ; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7]
2382 ; AVX512VBMI2-NEXT:    vpshldvw %zmm2, %zmm1, %zmm0
2383 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2384 ; AVX512VBMI2-NEXT:    vzeroupper
2385 ; AVX512VBMI2-NEXT:    retq
2387 ; AVX512VLBW-LABEL: constant_funnnel_v8i16:
2388 ; AVX512VLBW:       # %bb.0:
2389 ; AVX512VLBW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2390 ; AVX512VLBW-NEXT:    vpsrlw $1, %xmm1, %xmm1
2391 ; AVX512VLBW-NEXT:    vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2392 ; AVX512VLBW-NEXT:    vpor %xmm1, %xmm0, %xmm0
2393 ; AVX512VLBW-NEXT:    retq
2395 ; AVX512VLVBMI2-LABEL: constant_funnnel_v8i16:
2396 ; AVX512VLVBMI2:       # %bb.0:
2397 ; AVX512VLVBMI2-NEXT:    vpshldvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm0
2398 ; AVX512VLVBMI2-NEXT:    retq
2400 ; XOP-LABEL: constant_funnnel_v8i16:
2401 ; XOP:       # %bb.0:
2402 ; XOP-NEXT:    vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2403 ; XOP-NEXT:    vpsrlw $1, %xmm1, %xmm1
2404 ; XOP-NEXT:    vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2405 ; XOP-NEXT:    vpor %xmm1, %xmm0, %xmm0
2406 ; XOP-NEXT:    retq
2408 ; X86-SSE2-LABEL: constant_funnnel_v8i16:
2409 ; X86-SSE2:       # %bb.0:
2410 ; X86-SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2411 ; X86-SSE2-NEXT:    psrlw $1, %xmm1
2412 ; X86-SSE2-NEXT:    pmulhuw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
2413 ; X86-SSE2-NEXT:    por %xmm1, %xmm0
2414 ; X86-SSE2-NEXT:    retl
2415   %res = call <8 x i16> @llvm.fshl.v8i16(<8 x i16> %x, <8 x i16> %y, <8 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7>)
2416   ret <8 x i16> %res
2419 define <16 x i8> @constant_funnnel_v16i8(<16 x i8> %x, <16 x i8> %y) nounwind {
2420 ; SSE2-LABEL: constant_funnnel_v16i8:
2421 ; SSE2:       # %bb.0:
2422 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
2423 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2424 ; SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
2425 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
2426 ; SSE2-NEXT:    pand %xmm3, %xmm2
2427 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2428 ; SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2429 ; SSE2-NEXT:    pand %xmm3, %xmm0
2430 ; SSE2-NEXT:    packuswb %xmm2, %xmm0
2431 ; SSE2-NEXT:    psrlw $1, %xmm1
2432 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2433 ; SSE2-NEXT:    pxor %xmm2, %xmm2
2434 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
2435 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15]
2436 ; SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2437 ; SSE2-NEXT:    psrlw $8, %xmm3
2438 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
2439 ; SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2440 ; SSE2-NEXT:    psrlw $8, %xmm1
2441 ; SSE2-NEXT:    packuswb %xmm3, %xmm1
2442 ; SSE2-NEXT:    por %xmm1, %xmm0
2443 ; SSE2-NEXT:    retq
2445 ; SSE41-LABEL: constant_funnnel_v16i8:
2446 ; SSE41:       # %bb.0:
2447 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2448 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2449 ; SSE41-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2450 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
2451 ; SSE41-NEXT:    pand %xmm3, %xmm0
2452 ; SSE41-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
2453 ; SSE41-NEXT:    pand %xmm3, %xmm2
2454 ; SSE41-NEXT:    packuswb %xmm0, %xmm2
2455 ; SSE41-NEXT:    psrlw $1, %xmm1
2456 ; SSE41-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2457 ; SSE41-NEXT:    pxor %xmm3, %xmm3
2458 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2459 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm3[8],xmm1[9],xmm3[9],xmm1[10],xmm3[10],xmm1[11],xmm3[11],xmm1[12],xmm3[12],xmm1[13],xmm3[13],xmm1[14],xmm3[14],xmm1[15],xmm3[15]
2460 ; SSE41-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2461 ; SSE41-NEXT:    psrlw $8, %xmm1
2462 ; SSE41-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2463 ; SSE41-NEXT:    psrlw $8, %xmm0
2464 ; SSE41-NEXT:    packuswb %xmm1, %xmm0
2465 ; SSE41-NEXT:    por %xmm2, %xmm0
2466 ; SSE41-NEXT:    retq
2468 ; AVX1-LABEL: constant_funnnel_v16i8:
2469 ; AVX1:       # %bb.0:
2470 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2471 ; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
2472 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
2473 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
2474 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2475 ; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2476 ; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
2477 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
2478 ; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm1
2479 ; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2480 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2481 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]
2482 ; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
2483 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
2484 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2485 ; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2486 ; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1
2487 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
2488 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
2489 ; AVX1-NEXT:    retq
2491 ; AVX2-LABEL: constant_funnnel_v16i8:
2492 ; AVX2:       # %bb.0:
2493 ; 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
2494 ; AVX2-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2495 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2496 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
2497 ; AVX2-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
2498 ; AVX2-NEXT:    vpsrlw $1, %xmm1, %xmm1
2499 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2500 ; AVX2-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
2501 ; AVX2-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2502 ; AVX2-NEXT:    vpsrlw $8, %ymm1, %ymm1
2503 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
2504 ; AVX2-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
2505 ; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
2506 ; AVX2-NEXT:    vzeroupper
2507 ; AVX2-NEXT:    retq
2509 ; AVX512F-LABEL: constant_funnnel_v16i8:
2510 ; AVX512F:       # %bb.0:
2511 ; 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
2512 ; AVX512F-NEXT:    vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
2513 ; AVX512F-NEXT:    vpsrlw $1, %xmm1, %xmm1
2514 ; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2515 ; 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
2516 ; AVX512F-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1
2517 ; AVX512F-NEXT:    vpord %zmm1, %zmm0, %zmm0
2518 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
2519 ; AVX512F-NEXT:    vzeroupper
2520 ; AVX512F-NEXT:    retq
2522 ; AVX512VL-LABEL: constant_funnnel_v16i8:
2523 ; AVX512VL:       # %bb.0:
2524 ; 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
2525 ; AVX512VL-NEXT:    vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
2526 ; AVX512VL-NEXT:    vpsrlw $1, %xmm1, %xmm1
2527 ; AVX512VL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2528 ; 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
2529 ; AVX512VL-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1
2530 ; AVX512VL-NEXT:    vpord %zmm1, %zmm0, %zmm0
2531 ; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
2532 ; AVX512VL-NEXT:    vzeroupper
2533 ; AVX512VL-NEXT:    retq
2535 ; AVX512BW-LABEL: constant_funnnel_v16i8:
2536 ; AVX512BW:       # %bb.0:
2537 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,0,7,6,5,4,3,2,1]
2538 ; 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
2539 ; AVX512BW-NEXT:    vpsllvw %zmm2, %zmm0, %zmm0
2540 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm2 = [7,6,5,4,3,2,1,0,7,0,1,2,3,4,5,6]
2541 ; AVX512BW-NEXT:    vpsrlw $1, %xmm1, %xmm1
2542 ; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2543 ; 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
2544 ; AVX512BW-NEXT:    vpsrlvw %zmm2, %zmm1, %zmm1
2545 ; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm0
2546 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
2547 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2548 ; AVX512BW-NEXT:    vzeroupper
2549 ; AVX512BW-NEXT:    retq
2551 ; AVX512VBMI2-LABEL: constant_funnnel_v16i8:
2552 ; AVX512VBMI2:       # %bb.0:
2553 ; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,0,7,6,5,4,3,2,1]
2554 ; AVX512VBMI2-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
2555 ; AVX512VBMI2-NEXT:    vpsllvw %zmm2, %zmm0, %zmm0
2556 ; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} ymm2 = [7,6,5,4,3,2,1,0,7,0,1,2,3,4,5,6]
2557 ; AVX512VBMI2-NEXT:    vpsrlw $1, %xmm1, %xmm1
2558 ; AVX512VBMI2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2559 ; AVX512VBMI2-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
2560 ; AVX512VBMI2-NEXT:    vpsrlvw %zmm2, %zmm1, %zmm1
2561 ; AVX512VBMI2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2562 ; AVX512VBMI2-NEXT:    vpmovwb %zmm0, %ymm0
2563 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2564 ; AVX512VBMI2-NEXT:    vzeroupper
2565 ; AVX512VBMI2-NEXT:    retq
2567 ; AVX512VLBW-LABEL: constant_funnnel_v16i8:
2568 ; AVX512VLBW:       # %bb.0:
2569 ; 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
2570 ; AVX512VLBW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2571 ; AVX512VLBW-NEXT:    vpsrlw $1, %xmm1, %xmm1
2572 ; AVX512VLBW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2573 ; 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
2574 ; AVX512VLBW-NEXT:    vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2575 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm0
2576 ; AVX512VLBW-NEXT:    vpmovwb %ymm0, %xmm0
2577 ; AVX512VLBW-NEXT:    vzeroupper
2578 ; AVX512VLBW-NEXT:    retq
2580 ; AVX512VLVBMI2-LABEL: constant_funnnel_v16i8:
2581 ; AVX512VLVBMI2:       # %bb.0:
2582 ; AVX512VLVBMI2-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
2583 ; AVX512VLVBMI2-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2584 ; AVX512VLVBMI2-NEXT:    vpsrlw $1, %xmm1, %xmm1
2585 ; AVX512VLVBMI2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2586 ; AVX512VLVBMI2-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
2587 ; AVX512VLVBMI2-NEXT:    vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2588 ; AVX512VLVBMI2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2589 ; AVX512VLVBMI2-NEXT:    vpmovwb %ymm0, %xmm0
2590 ; AVX512VLVBMI2-NEXT:    vzeroupper
2591 ; AVX512VLVBMI2-NEXT:    retq
2593 ; XOP-LABEL: constant_funnnel_v16i8:
2594 ; XOP:       # %bb.0:
2595 ; XOP-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
2596 ; XOP-NEXT:    vpshlb %xmm2, %xmm1, %xmm1
2597 ; XOP-NEXT:    vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2598 ; XOP-NEXT:    vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2599 ; XOP-NEXT:    vpor %xmm1, %xmm0, %xmm0
2600 ; XOP-NEXT:    retq
2602 ; X86-SSE2-LABEL: constant_funnnel_v16i8:
2603 ; X86-SSE2:       # %bb.0:
2604 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
2605 ; X86-SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2606 ; X86-SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
2607 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
2608 ; X86-SSE2-NEXT:    pand %xmm3, %xmm2
2609 ; X86-SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2610 ; X86-SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2611 ; X86-SSE2-NEXT:    pand %xmm3, %xmm0
2612 ; X86-SSE2-NEXT:    packuswb %xmm2, %xmm0
2613 ; X86-SSE2-NEXT:    psrlw $1, %xmm1
2614 ; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
2615 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm2
2616 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm3
2617 ; X86-SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15]
2618 ; X86-SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm3
2619 ; X86-SSE2-NEXT:    psrlw $8, %xmm3
2620 ; X86-SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
2621 ; X86-SSE2-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
2622 ; X86-SSE2-NEXT:    psrlw $8, %xmm1
2623 ; X86-SSE2-NEXT:    packuswb %xmm3, %xmm1
2624 ; X86-SSE2-NEXT:    por %xmm1, %xmm0
2625 ; X86-SSE2-NEXT:    retl
2626   %res = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %x, <16 x i8> %y, <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>)
2627   ret <16 x i8> %res
2631 ; Uniform Constant Shifts
2634 define <2 x i64> @splatconstant_funnnel_v2i64(<2 x i64> %x, <2 x i64> %y) nounwind {
2635 ; SSE-LABEL: splatconstant_funnnel_v2i64:
2636 ; SSE:       # %bb.0:
2637 ; SSE-NEXT:    psrlq $50, %xmm1
2638 ; SSE-NEXT:    psllq $14, %xmm0
2639 ; SSE-NEXT:    por %xmm1, %xmm0
2640 ; SSE-NEXT:    retq
2642 ; AVX-LABEL: splatconstant_funnnel_v2i64:
2643 ; AVX:       # %bb.0:
2644 ; AVX-NEXT:    vpsrlq $50, %xmm1, %xmm1
2645 ; AVX-NEXT:    vpsllq $14, %xmm0, %xmm0
2646 ; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
2647 ; AVX-NEXT:    retq
2649 ; AVX512F-LABEL: splatconstant_funnnel_v2i64:
2650 ; AVX512F:       # %bb.0:
2651 ; AVX512F-NEXT:    vpsrlq $50, %xmm1, %xmm1
2652 ; AVX512F-NEXT:    vpsllq $14, %xmm0, %xmm0
2653 ; AVX512F-NEXT:    vpor %xmm1, %xmm0, %xmm0
2654 ; AVX512F-NEXT:    retq
2656 ; AVX512VL-LABEL: splatconstant_funnnel_v2i64:
2657 ; AVX512VL:       # %bb.0:
2658 ; AVX512VL-NEXT:    vpsrlq $50, %xmm1, %xmm1
2659 ; AVX512VL-NEXT:    vpsllq $14, %xmm0, %xmm0
2660 ; AVX512VL-NEXT:    vpor %xmm1, %xmm0, %xmm0
2661 ; AVX512VL-NEXT:    retq
2663 ; AVX512BW-LABEL: splatconstant_funnnel_v2i64:
2664 ; AVX512BW:       # %bb.0:
2665 ; AVX512BW-NEXT:    vpsrlq $50, %xmm1, %xmm1
2666 ; AVX512BW-NEXT:    vpsllq $14, %xmm0, %xmm0
2667 ; AVX512BW-NEXT:    vpor %xmm1, %xmm0, %xmm0
2668 ; AVX512BW-NEXT:    retq
2670 ; AVX512VBMI2-LABEL: splatconstant_funnnel_v2i64:
2671 ; AVX512VBMI2:       # %bb.0:
2672 ; AVX512VBMI2-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2673 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2674 ; AVX512VBMI2-NEXT:    vpshldq $14, %zmm1, %zmm0, %zmm0
2675 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2676 ; AVX512VBMI2-NEXT:    vzeroupper
2677 ; AVX512VBMI2-NEXT:    retq
2679 ; AVX512VLBW-LABEL: splatconstant_funnnel_v2i64:
2680 ; AVX512VLBW:       # %bb.0:
2681 ; AVX512VLBW-NEXT:    vpsrlq $50, %xmm1, %xmm1
2682 ; AVX512VLBW-NEXT:    vpsllq $14, %xmm0, %xmm0
2683 ; AVX512VLBW-NEXT:    vpor %xmm1, %xmm0, %xmm0
2684 ; AVX512VLBW-NEXT:    retq
2686 ; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v2i64:
2687 ; AVX512VLVBMI2:       # %bb.0:
2688 ; AVX512VLVBMI2-NEXT:    vpshldq $14, %xmm1, %xmm0, %xmm0
2689 ; AVX512VLVBMI2-NEXT:    retq
2691 ; XOP-LABEL: splatconstant_funnnel_v2i64:
2692 ; XOP:       # %bb.0:
2693 ; XOP-NEXT:    vpsrlq $50, %xmm1, %xmm1
2694 ; XOP-NEXT:    vpsllq $14, %xmm0, %xmm0
2695 ; XOP-NEXT:    vpor %xmm1, %xmm0, %xmm0
2696 ; XOP-NEXT:    retq
2698 ; X86-SSE2-LABEL: splatconstant_funnnel_v2i64:
2699 ; X86-SSE2:       # %bb.0:
2700 ; X86-SSE2-NEXT:    psrlq $50, %xmm1
2701 ; X86-SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm1[0,1]
2702 ; X86-SSE2-NEXT:    psllq $14, %xmm0
2703 ; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm0[0,1]
2704 ; X86-SSE2-NEXT:    orpd %xmm1, %xmm0
2705 ; X86-SSE2-NEXT:    retl
2706   %res = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> %x, <2 x i64> %y, <2 x i64> <i64 14, i64 14>)
2707   ret <2 x i64> %res
2710 define <4 x i32> @splatconstant_funnnel_v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {
2711 ; SSE-LABEL: splatconstant_funnnel_v4i32:
2712 ; SSE:       # %bb.0:
2713 ; SSE-NEXT:    psrld $28, %xmm1
2714 ; SSE-NEXT:    pslld $4, %xmm0
2715 ; SSE-NEXT:    por %xmm1, %xmm0
2716 ; SSE-NEXT:    retq
2718 ; AVX-LABEL: splatconstant_funnnel_v4i32:
2719 ; AVX:       # %bb.0:
2720 ; AVX-NEXT:    vpsrld $28, %xmm1, %xmm1
2721 ; AVX-NEXT:    vpslld $4, %xmm0, %xmm0
2722 ; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
2723 ; AVX-NEXT:    retq
2725 ; AVX512F-LABEL: splatconstant_funnnel_v4i32:
2726 ; AVX512F:       # %bb.0:
2727 ; AVX512F-NEXT:    vpsrld $28, %xmm1, %xmm1
2728 ; AVX512F-NEXT:    vpslld $4, %xmm0, %xmm0
2729 ; AVX512F-NEXT:    vpor %xmm1, %xmm0, %xmm0
2730 ; AVX512F-NEXT:    retq
2732 ; AVX512VL-LABEL: splatconstant_funnnel_v4i32:
2733 ; AVX512VL:       # %bb.0:
2734 ; AVX512VL-NEXT:    vpsrld $28, %xmm1, %xmm1
2735 ; AVX512VL-NEXT:    vpslld $4, %xmm0, %xmm0
2736 ; AVX512VL-NEXT:    vpor %xmm1, %xmm0, %xmm0
2737 ; AVX512VL-NEXT:    retq
2739 ; AVX512BW-LABEL: splatconstant_funnnel_v4i32:
2740 ; AVX512BW:       # %bb.0:
2741 ; AVX512BW-NEXT:    vpsrld $28, %xmm1, %xmm1
2742 ; AVX512BW-NEXT:    vpslld $4, %xmm0, %xmm0
2743 ; AVX512BW-NEXT:    vpor %xmm1, %xmm0, %xmm0
2744 ; AVX512BW-NEXT:    retq
2746 ; AVX512VBMI2-LABEL: splatconstant_funnnel_v4i32:
2747 ; AVX512VBMI2:       # %bb.0:
2748 ; AVX512VBMI2-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2749 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2750 ; AVX512VBMI2-NEXT:    vpshldd $4, %zmm1, %zmm0, %zmm0
2751 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2752 ; AVX512VBMI2-NEXT:    vzeroupper
2753 ; AVX512VBMI2-NEXT:    retq
2755 ; AVX512VLBW-LABEL: splatconstant_funnnel_v4i32:
2756 ; AVX512VLBW:       # %bb.0:
2757 ; AVX512VLBW-NEXT:    vpsrld $28, %xmm1, %xmm1
2758 ; AVX512VLBW-NEXT:    vpslld $4, %xmm0, %xmm0
2759 ; AVX512VLBW-NEXT:    vpor %xmm1, %xmm0, %xmm0
2760 ; AVX512VLBW-NEXT:    retq
2762 ; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v4i32:
2763 ; AVX512VLVBMI2:       # %bb.0:
2764 ; AVX512VLVBMI2-NEXT:    vpshldd $4, %xmm1, %xmm0, %xmm0
2765 ; AVX512VLVBMI2-NEXT:    retq
2767 ; XOP-LABEL: splatconstant_funnnel_v4i32:
2768 ; XOP:       # %bb.0:
2769 ; XOP-NEXT:    vpsrld $28, %xmm1, %xmm1
2770 ; XOP-NEXT:    vpslld $4, %xmm0, %xmm0
2771 ; XOP-NEXT:    vpor %xmm1, %xmm0, %xmm0
2772 ; XOP-NEXT:    retq
2774 ; X86-SSE2-LABEL: splatconstant_funnnel_v4i32:
2775 ; X86-SSE2:       # %bb.0:
2776 ; X86-SSE2-NEXT:    psrld $28, %xmm1
2777 ; X86-SSE2-NEXT:    pslld $4, %xmm0
2778 ; X86-SSE2-NEXT:    por %xmm1, %xmm0
2779 ; X86-SSE2-NEXT:    retl
2780   %res = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %y, <4 x i32> <i32 4, i32 4, i32 4, i32 4>)
2781   ret <4 x i32> %res
2784 define <8 x i16> @splatconstant_funnnel_v8i16(<8 x i16> %x, <8 x i16> %y) nounwind {
2785 ; SSE-LABEL: splatconstant_funnnel_v8i16:
2786 ; SSE:       # %bb.0:
2787 ; SSE-NEXT:    psrlw $9, %xmm1
2788 ; SSE-NEXT:    psllw $7, %xmm0
2789 ; SSE-NEXT:    por %xmm1, %xmm0
2790 ; SSE-NEXT:    retq
2792 ; AVX-LABEL: splatconstant_funnnel_v8i16:
2793 ; AVX:       # %bb.0:
2794 ; AVX-NEXT:    vpsrlw $9, %xmm1, %xmm1
2795 ; AVX-NEXT:    vpsllw $7, %xmm0, %xmm0
2796 ; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
2797 ; AVX-NEXT:    retq
2799 ; AVX512F-LABEL: splatconstant_funnnel_v8i16:
2800 ; AVX512F:       # %bb.0:
2801 ; AVX512F-NEXT:    vpsrlw $9, %xmm1, %xmm1
2802 ; AVX512F-NEXT:    vpsllw $7, %xmm0, %xmm0
2803 ; AVX512F-NEXT:    vpor %xmm1, %xmm0, %xmm0
2804 ; AVX512F-NEXT:    retq
2806 ; AVX512VL-LABEL: splatconstant_funnnel_v8i16:
2807 ; AVX512VL:       # %bb.0:
2808 ; AVX512VL-NEXT:    vpsrlw $9, %xmm1, %xmm1
2809 ; AVX512VL-NEXT:    vpsllw $7, %xmm0, %xmm0
2810 ; AVX512VL-NEXT:    vpor %xmm1, %xmm0, %xmm0
2811 ; AVX512VL-NEXT:    retq
2813 ; AVX512BW-LABEL: splatconstant_funnnel_v8i16:
2814 ; AVX512BW:       # %bb.0:
2815 ; AVX512BW-NEXT:    vpsrlw $9, %xmm1, %xmm1
2816 ; AVX512BW-NEXT:    vpsllw $7, %xmm0, %xmm0
2817 ; AVX512BW-NEXT:    vpor %xmm1, %xmm0, %xmm0
2818 ; AVX512BW-NEXT:    retq
2820 ; AVX512VBMI2-LABEL: splatconstant_funnnel_v8i16:
2821 ; AVX512VBMI2:       # %bb.0:
2822 ; AVX512VBMI2-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2823 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2824 ; AVX512VBMI2-NEXT:    vpshldw $7, %zmm1, %zmm0, %zmm0
2825 ; AVX512VBMI2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0
2826 ; AVX512VBMI2-NEXT:    vzeroupper
2827 ; AVX512VBMI2-NEXT:    retq
2829 ; AVX512VLBW-LABEL: splatconstant_funnnel_v8i16:
2830 ; AVX512VLBW:       # %bb.0:
2831 ; AVX512VLBW-NEXT:    vpsrlw $9, %xmm1, %xmm1
2832 ; AVX512VLBW-NEXT:    vpsllw $7, %xmm0, %xmm0
2833 ; AVX512VLBW-NEXT:    vpor %xmm1, %xmm0, %xmm0
2834 ; AVX512VLBW-NEXT:    retq
2836 ; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v8i16:
2837 ; AVX512VLVBMI2:       # %bb.0:
2838 ; AVX512VLVBMI2-NEXT:    vpshldw $7, %xmm1, %xmm0, %xmm0
2839 ; AVX512VLVBMI2-NEXT:    retq
2841 ; XOP-LABEL: splatconstant_funnnel_v8i16:
2842 ; XOP:       # %bb.0:
2843 ; XOP-NEXT:    vpsrlw $9, %xmm1, %xmm1
2844 ; XOP-NEXT:    vpsllw $7, %xmm0, %xmm0
2845 ; XOP-NEXT:    vpor %xmm1, %xmm0, %xmm0
2846 ; XOP-NEXT:    retq
2848 ; X86-SSE2-LABEL: splatconstant_funnnel_v8i16:
2849 ; X86-SSE2:       # %bb.0:
2850 ; X86-SSE2-NEXT:    psrlw $9, %xmm1
2851 ; X86-SSE2-NEXT:    psllw $7, %xmm0
2852 ; X86-SSE2-NEXT:    por %xmm1, %xmm0
2853 ; X86-SSE2-NEXT:    retl
2854   %res = call <8 x i16> @llvm.fshl.v8i16(<8 x i16> %x, <8 x i16> %y, <8 x i16> <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>)
2855   ret <8 x i16> %res
2858 define <16 x i8> @splatconstant_funnnel_v16i8(<16 x i8> %x, <16 x i8> %y) nounwind {
2859 ; SSE-LABEL: splatconstant_funnnel_v16i8:
2860 ; SSE:       # %bb.0:
2861 ; SSE-NEXT:    psrlw $4, %xmm1
2862 ; SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2863 ; SSE-NEXT:    psllw $4, %xmm0
2864 ; SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2865 ; SSE-NEXT:    por %xmm1, %xmm0
2866 ; SSE-NEXT:    retq
2868 ; AVX-LABEL: splatconstant_funnnel_v16i8:
2869 ; AVX:       # %bb.0:
2870 ; AVX-NEXT:    vpsrlw $4, %xmm1, %xmm1
2871 ; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2872 ; AVX-NEXT:    vpsllw $4, %xmm0, %xmm0
2873 ; AVX-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2874 ; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
2875 ; AVX-NEXT:    retq
2877 ; AVX512F-LABEL: splatconstant_funnnel_v16i8:
2878 ; AVX512F:       # %bb.0:
2879 ; AVX512F-NEXT:    vpsrlw $4, %xmm1, %xmm1
2880 ; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2881 ; AVX512F-NEXT:    vpsllw $4, %xmm0, %xmm0
2882 ; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2883 ; AVX512F-NEXT:    vpor %xmm1, %xmm0, %xmm0
2884 ; AVX512F-NEXT:    retq
2886 ; AVX512VL-LABEL: splatconstant_funnnel_v16i8:
2887 ; AVX512VL:       # %bb.0:
2888 ; AVX512VL-NEXT:    vpsllw $4, %xmm0, %xmm2
2889 ; AVX512VL-NEXT:    vpsrlw $4, %xmm1, %xmm0
2890 ; AVX512VL-NEXT:    vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm0
2891 ; AVX512VL-NEXT:    retq
2893 ; AVX512BW-LABEL: splatconstant_funnnel_v16i8:
2894 ; AVX512BW:       # %bb.0:
2895 ; AVX512BW-NEXT:    vpsrlw $4, %xmm1, %xmm1
2896 ; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2897 ; AVX512BW-NEXT:    vpsllw $4, %xmm0, %xmm0
2898 ; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2899 ; AVX512BW-NEXT:    vpor %xmm1, %xmm0, %xmm0
2900 ; AVX512BW-NEXT:    retq
2902 ; AVX512VBMI2-LABEL: splatconstant_funnnel_v16i8:
2903 ; AVX512VBMI2:       # %bb.0:
2904 ; AVX512VBMI2-NEXT:    vpsrlw $4, %xmm1, %xmm1
2905 ; AVX512VBMI2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2906 ; AVX512VBMI2-NEXT:    vpsllw $4, %xmm0, %xmm0
2907 ; AVX512VBMI2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2908 ; AVX512VBMI2-NEXT:    vpor %xmm1, %xmm0, %xmm0
2909 ; AVX512VBMI2-NEXT:    retq
2911 ; AVX512VLBW-LABEL: splatconstant_funnnel_v16i8:
2912 ; AVX512VLBW:       # %bb.0:
2913 ; AVX512VLBW-NEXT:    vpsllw $4, %xmm0, %xmm2
2914 ; AVX512VLBW-NEXT:    vpsrlw $4, %xmm1, %xmm0
2915 ; AVX512VLBW-NEXT:    vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm0
2916 ; AVX512VLBW-NEXT:    retq
2918 ; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v16i8:
2919 ; AVX512VLVBMI2:       # %bb.0:
2920 ; AVX512VLVBMI2-NEXT:    vpsllw $4, %xmm0, %xmm2
2921 ; AVX512VLVBMI2-NEXT:    vpsrlw $4, %xmm1, %xmm0
2922 ; AVX512VLVBMI2-NEXT:    vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm0
2923 ; AVX512VLVBMI2-NEXT:    retq
2925 ; XOP-LABEL: splatconstant_funnnel_v16i8:
2926 ; XOP:       # %bb.0:
2927 ; XOP-NEXT:    vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
2928 ; XOP-NEXT:    vpshlb {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2929 ; XOP-NEXT:    vpor %xmm1, %xmm0, %xmm0
2930 ; XOP-NEXT:    retq
2932 ; X86-SSE2-LABEL: splatconstant_funnnel_v16i8:
2933 ; X86-SSE2:       # %bb.0:
2934 ; X86-SSE2-NEXT:    psrlw $4, %xmm1
2935 ; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
2936 ; X86-SSE2-NEXT:    psllw $4, %xmm0
2937 ; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2938 ; X86-SSE2-NEXT:    por %xmm1, %xmm0
2939 ; X86-SSE2-NEXT:    retl
2940   %res = call <16 x i8> @llvm.fshl.v16i8(<16 x i8> %x, <16 x i8> %y, <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>)
2941   ret <16 x i8> %res