[PowerPC] Fix CR Bit spill pseudo expansion
[llvm-core.git] / test / CodeGen / X86 / vector-fshl-256.ll
blobaac4662cff0bf82630135ff00afa4fb54c2569c3
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX512,AVX512F
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VL
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512BW
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VLBW
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefixes=XOP,XOPAVX1
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefixes=XOP,XOPAVX2
11 declare <4 x i64> @llvm.fshl.v4i64(<4 x i64>, <4 x i64>, <4 x i64>)
12 declare <8 x i32> @llvm.fshl.v8i32(<8 x i32>, <8 x i32>, <8 x i32>)
13 declare <16 x i16> @llvm.fshl.v16i16(<16 x i16>, <16 x i16>, <16 x i16>)
14 declare <32 x i8> @llvm.fshl.v32i8(<32 x i8>, <32 x i8>, <32 x i8>)
17 ; Variable Shifts
20 define <4 x i64> @var_funnnel_v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> %amt) nounwind {
21 ; AVX1-LABEL: var_funnnel_v4i64:
22 ; AVX1:       # %bb.0:
23 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
24 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
25 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
26 ; AVX1-NEXT:    vpsllq %xmm4, %xmm3, %xmm5
27 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm4[2,3,0,1]
28 ; AVX1-NEXT:    vpsllq %xmm6, %xmm3, %xmm3
29 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm5[0,1,2,3],xmm3[4,5,6,7]
30 ; AVX1-NEXT:    vpsllq %xmm2, %xmm0, %xmm5
31 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm2[2,3,0,1]
32 ; AVX1-NEXT:    vpsllq %xmm6, %xmm0, %xmm6
33 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm5 = xmm5[0,1,2,3],xmm6[4,5,6,7]
34 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm5, %ymm3
35 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm8 = [64,64]
36 ; AVX1-NEXT:    vpsubq %xmm4, %xmm8, %xmm6
37 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
38 ; AVX1-NEXT:    vpsrlq %xmm6, %xmm7, %xmm5
39 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm6[2,3,0,1]
40 ; AVX1-NEXT:    vpsrlq %xmm6, %xmm7, %xmm6
41 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm5 = xmm5[0,1,2,3],xmm6[4,5,6,7]
42 ; AVX1-NEXT:    vpsubq %xmm2, %xmm8, %xmm6
43 ; AVX1-NEXT:    vpsrlq %xmm6, %xmm1, %xmm7
44 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm6[2,3,0,1]
45 ; AVX1-NEXT:    vpsrlq %xmm6, %xmm1, %xmm1
46 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm7[0,1,2,3],xmm1[4,5,6,7]
47 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm1, %ymm1
48 ; AVX1-NEXT:    vorps %ymm1, %ymm3, %ymm1
49 ; AVX1-NEXT:    vxorps %xmm3, %xmm3, %xmm3
50 ; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm4, %xmm4
51 ; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm2, %xmm2
52 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
53 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
54 ; AVX1-NEXT:    retq
56 ; AVX2-LABEL: var_funnnel_v4i64:
57 ; AVX2:       # %bb.0:
58 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
59 ; AVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
60 ; AVX2-NEXT:    vpsllvq %ymm2, %ymm0, %ymm3
61 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [64,64,64,64]
62 ; AVX2-NEXT:    vpsubq %ymm2, %ymm4, %ymm4
63 ; AVX2-NEXT:    vpsrlvq %ymm4, %ymm1, %ymm1
64 ; AVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
65 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
66 ; AVX2-NEXT:    vpcmpeqq %ymm3, %ymm2, %ymm2
67 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
68 ; AVX2-NEXT:    retq
70 ; AVX512F-LABEL: var_funnnel_v4i64:
71 ; AVX512F:       # %bb.0:
72 ; AVX512F-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
73 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
74 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
75 ; AVX512F-NEXT:    vpand %ymm3, %ymm2, %ymm4
76 ; AVX512F-NEXT:    vpsllvq %ymm4, %ymm0, %ymm5
77 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm6 = [64,64,64,64]
78 ; AVX512F-NEXT:    vpsubq %ymm4, %ymm6, %ymm4
79 ; AVX512F-NEXT:    vpsrlvq %ymm4, %ymm1, %ymm1
80 ; AVX512F-NEXT:    vpor %ymm1, %ymm5, %ymm1
81 ; AVX512F-NEXT:    vptestnmq %zmm3, %zmm2, %k1
82 ; AVX512F-NEXT:    vmovdqa64 %zmm0, %zmm1 {%k1}
83 ; AVX512F-NEXT:    vmovdqa %ymm1, %ymm0
84 ; AVX512F-NEXT:    retq
86 ; AVX512VL-LABEL: var_funnnel_v4i64:
87 ; AVX512VL:       # %bb.0:
88 ; AVX512VL-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
89 ; AVX512VL-NEXT:    vpand %ymm3, %ymm2, %ymm4
90 ; AVX512VL-NEXT:    vpsllvq %ymm4, %ymm0, %ymm5
91 ; AVX512VL-NEXT:    vpbroadcastq {{.*#+}} ymm6 = [64,64,64,64]
92 ; AVX512VL-NEXT:    vpsubq %ymm4, %ymm6, %ymm4
93 ; AVX512VL-NEXT:    vpsrlvq %ymm4, %ymm1, %ymm1
94 ; AVX512VL-NEXT:    vpor %ymm1, %ymm5, %ymm1
95 ; AVX512VL-NEXT:    vptestnmq %ymm3, %ymm2, %k1
96 ; AVX512VL-NEXT:    vmovdqa64 %ymm0, %ymm1 {%k1}
97 ; AVX512VL-NEXT:    vmovdqa %ymm1, %ymm0
98 ; AVX512VL-NEXT:    retq
100 ; AVX512BW-LABEL: var_funnnel_v4i64:
101 ; AVX512BW:       # %bb.0:
102 ; AVX512BW-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
103 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
104 ; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
105 ; AVX512BW-NEXT:    vpand %ymm3, %ymm2, %ymm4
106 ; AVX512BW-NEXT:    vpsllvq %ymm4, %ymm0, %ymm5
107 ; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} ymm6 = [64,64,64,64]
108 ; AVX512BW-NEXT:    vpsubq %ymm4, %ymm6, %ymm4
109 ; AVX512BW-NEXT:    vpsrlvq %ymm4, %ymm1, %ymm1
110 ; AVX512BW-NEXT:    vpor %ymm1, %ymm5, %ymm1
111 ; AVX512BW-NEXT:    vptestnmq %zmm3, %zmm2, %k1
112 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, %zmm1 {%k1}
113 ; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm0
114 ; AVX512BW-NEXT:    retq
116 ; AVX512VLBW-LABEL: var_funnnel_v4i64:
117 ; AVX512VLBW:       # %bb.0:
118 ; AVX512VLBW-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
119 ; AVX512VLBW-NEXT:    vpand %ymm3, %ymm2, %ymm4
120 ; AVX512VLBW-NEXT:    vpsllvq %ymm4, %ymm0, %ymm5
121 ; AVX512VLBW-NEXT:    vpbroadcastq {{.*#+}} ymm6 = [64,64,64,64]
122 ; AVX512VLBW-NEXT:    vpsubq %ymm4, %ymm6, %ymm4
123 ; AVX512VLBW-NEXT:    vpsrlvq %ymm4, %ymm1, %ymm1
124 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm5, %ymm1
125 ; AVX512VLBW-NEXT:    vptestnmq %ymm3, %ymm2, %k1
126 ; AVX512VLBW-NEXT:    vmovdqa64 %ymm0, %ymm1 {%k1}
127 ; AVX512VLBW-NEXT:    vmovdqa %ymm1, %ymm0
128 ; AVX512VLBW-NEXT:    retq
130 ; XOPAVX1-LABEL: var_funnnel_v4i64:
131 ; XOPAVX1:       # %bb.0:
132 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
133 ; XOPAVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
134 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
135 ; XOPAVX1-NEXT:    vpshlq %xmm4, %xmm3, %xmm3
136 ; XOPAVX1-NEXT:    vpshlq %xmm2, %xmm0, %xmm5
137 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm5, %ymm3
138 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [64,64]
139 ; XOPAVX1-NEXT:    vpsubq %xmm5, %xmm4, %xmm6
140 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
141 ; XOPAVX1-NEXT:    vpshlq %xmm6, %xmm7, %xmm6
142 ; XOPAVX1-NEXT:    vpsubq %xmm5, %xmm2, %xmm5
143 ; XOPAVX1-NEXT:    vpshlq %xmm5, %xmm1, %xmm1
144 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1
145 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm3, %ymm1
146 ; XOPAVX1-NEXT:    vxorps %xmm3, %xmm3, %xmm3
147 ; XOPAVX1-NEXT:    vpcomeqq %xmm3, %xmm4, %xmm4
148 ; XOPAVX1-NEXT:    vpcomeqq %xmm3, %xmm2, %xmm2
149 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
150 ; XOPAVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
151 ; XOPAVX1-NEXT:    retq
153 ; XOPAVX2-LABEL: var_funnnel_v4i64:
154 ; XOPAVX2:       # %bb.0:
155 ; XOPAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
156 ; XOPAVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
157 ; XOPAVX2-NEXT:    vpsllvq %ymm2, %ymm0, %ymm3
158 ; XOPAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [64,64,64,64]
159 ; XOPAVX2-NEXT:    vpsubq %ymm2, %ymm4, %ymm4
160 ; XOPAVX2-NEXT:    vpsrlvq %ymm4, %ymm1, %ymm1
161 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
162 ; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
163 ; XOPAVX2-NEXT:    vpcmpeqq %ymm3, %ymm2, %ymm2
164 ; XOPAVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
165 ; XOPAVX2-NEXT:    retq
166   %res = call <4 x i64> @llvm.fshl.v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> %amt)
167   ret <4 x i64> %res
170 define <8 x i32> @var_funnnel_v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i32> %amt) nounwind {
171 ; AVX1-LABEL: var_funnnel_v8i32:
172 ; AVX1:       # %bb.0:
173 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
174 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
175 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm8 = [32,32,32,32]
176 ; AVX1-NEXT:    vpsubd %xmm3, %xmm8, %xmm6
177 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm4 = xmm6[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
178 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
179 ; AVX1-NEXT:    vpsrld %xmm4, %xmm7, %xmm4
180 ; AVX1-NEXT:    vpsrlq $32, %xmm6, %xmm5
181 ; AVX1-NEXT:    vpsrld %xmm5, %xmm7, %xmm5
182 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm5 = xmm5[0,1,2,3],xmm4[4,5,6,7]
183 ; AVX1-NEXT:    vpxor %xmm9, %xmm9, %xmm9
184 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm4 = xmm6[2],xmm9[2],xmm6[3],xmm9[3]
185 ; AVX1-NEXT:    vpsrld %xmm4, %xmm7, %xmm4
186 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm6 = xmm6[0],zero,xmm6[1],zero
187 ; AVX1-NEXT:    vpsrld %xmm6, %xmm7, %xmm6
188 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm6[0,1,2,3],xmm4[4,5,6,7]
189 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7]
190 ; AVX1-NEXT:    vpsubd %xmm2, %xmm8, %xmm5
191 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm6 = xmm5[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
192 ; AVX1-NEXT:    vpsrld %xmm6, %xmm1, %xmm6
193 ; AVX1-NEXT:    vpsrlq $32, %xmm5, %xmm7
194 ; AVX1-NEXT:    vpsrld %xmm7, %xmm1, %xmm7
195 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm6 = xmm7[0,1,2,3],xmm6[4,5,6,7]
196 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm7 = xmm5[2],xmm9[2],xmm5[3],xmm9[3]
197 ; AVX1-NEXT:    vpsrld %xmm7, %xmm1, %xmm7
198 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm5 = xmm5[0],zero,xmm5[1],zero
199 ; AVX1-NEXT:    vpsrld %xmm5, %xmm1, %xmm1
200 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm7[4,5,6,7]
201 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm6[2,3],xmm1[4,5],xmm6[6,7]
202 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm1
203 ; AVX1-NEXT:    vpslld $23, %xmm3, %xmm4
204 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [1065353216,1065353216,1065353216,1065353216]
205 ; AVX1-NEXT:    vpaddd %xmm5, %xmm4, %xmm4
206 ; AVX1-NEXT:    vcvttps2dq %xmm4, %xmm4
207 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
208 ; AVX1-NEXT:    vpmulld %xmm4, %xmm6, %xmm4
209 ; AVX1-NEXT:    vpslld $23, %xmm2, %xmm6
210 ; AVX1-NEXT:    vpaddd %xmm5, %xmm6, %xmm5
211 ; AVX1-NEXT:    vcvttps2dq %xmm5, %xmm5
212 ; AVX1-NEXT:    vpmulld %xmm5, %xmm0, %xmm5
213 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm5, %ymm4
214 ; AVX1-NEXT:    vorps %ymm1, %ymm4, %ymm1
215 ; AVX1-NEXT:    vpcmpeqd %xmm9, %xmm3, %xmm3
216 ; AVX1-NEXT:    vpcmpeqd %xmm9, %xmm2, %xmm2
217 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
218 ; AVX1-NEXT:    vblendvps %ymm2, %ymm0, %ymm1, %ymm0
219 ; AVX1-NEXT:    retq
221 ; AVX2-LABEL: var_funnnel_v8i32:
222 ; AVX2:       # %bb.0:
223 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
224 ; AVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
225 ; AVX2-NEXT:    vpsllvd %ymm2, %ymm0, %ymm3
226 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm4 = [32,32,32,32,32,32,32,32]
227 ; AVX2-NEXT:    vpsubd %ymm2, %ymm4, %ymm4
228 ; AVX2-NEXT:    vpsrlvd %ymm4, %ymm1, %ymm1
229 ; AVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
230 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
231 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm2, %ymm2
232 ; AVX2-NEXT:    vblendvps %ymm2, %ymm0, %ymm1, %ymm0
233 ; AVX2-NEXT:    retq
235 ; AVX512F-LABEL: var_funnnel_v8i32:
236 ; AVX512F:       # %bb.0:
237 ; AVX512F-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
238 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
239 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
240 ; AVX512F-NEXT:    vpand %ymm3, %ymm2, %ymm4
241 ; AVX512F-NEXT:    vpsllvd %ymm4, %ymm0, %ymm5
242 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm6 = [32,32,32,32,32,32,32,32]
243 ; AVX512F-NEXT:    vpsubd %ymm4, %ymm6, %ymm4
244 ; AVX512F-NEXT:    vpsrlvd %ymm4, %ymm1, %ymm1
245 ; AVX512F-NEXT:    vpor %ymm1, %ymm5, %ymm1
246 ; AVX512F-NEXT:    vptestnmd %zmm3, %zmm2, %k1
247 ; AVX512F-NEXT:    vmovdqa32 %zmm0, %zmm1 {%k1}
248 ; AVX512F-NEXT:    vmovdqa %ymm1, %ymm0
249 ; AVX512F-NEXT:    retq
251 ; AVX512VL-LABEL: var_funnnel_v8i32:
252 ; AVX512VL:       # %bb.0:
253 ; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
254 ; AVX512VL-NEXT:    vpand %ymm3, %ymm2, %ymm4
255 ; AVX512VL-NEXT:    vpsllvd %ymm4, %ymm0, %ymm5
256 ; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} ymm6 = [32,32,32,32,32,32,32,32]
257 ; AVX512VL-NEXT:    vpsubd %ymm4, %ymm6, %ymm4
258 ; AVX512VL-NEXT:    vpsrlvd %ymm4, %ymm1, %ymm1
259 ; AVX512VL-NEXT:    vpor %ymm1, %ymm5, %ymm1
260 ; AVX512VL-NEXT:    vptestnmd %ymm3, %ymm2, %k1
261 ; AVX512VL-NEXT:    vmovdqa32 %ymm0, %ymm1 {%k1}
262 ; AVX512VL-NEXT:    vmovdqa %ymm1, %ymm0
263 ; AVX512VL-NEXT:    retq
265 ; AVX512BW-LABEL: var_funnnel_v8i32:
266 ; AVX512BW:       # %bb.0:
267 ; AVX512BW-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
268 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
269 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
270 ; AVX512BW-NEXT:    vpand %ymm3, %ymm2, %ymm4
271 ; AVX512BW-NEXT:    vpsllvd %ymm4, %ymm0, %ymm5
272 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} ymm6 = [32,32,32,32,32,32,32,32]
273 ; AVX512BW-NEXT:    vpsubd %ymm4, %ymm6, %ymm4
274 ; AVX512BW-NEXT:    vpsrlvd %ymm4, %ymm1, %ymm1
275 ; AVX512BW-NEXT:    vpor %ymm1, %ymm5, %ymm1
276 ; AVX512BW-NEXT:    vptestnmd %zmm3, %zmm2, %k1
277 ; AVX512BW-NEXT:    vmovdqa32 %zmm0, %zmm1 {%k1}
278 ; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm0
279 ; AVX512BW-NEXT:    retq
281 ; AVX512VLBW-LABEL: var_funnnel_v8i32:
282 ; AVX512VLBW:       # %bb.0:
283 ; AVX512VLBW-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
284 ; AVX512VLBW-NEXT:    vpand %ymm3, %ymm2, %ymm4
285 ; AVX512VLBW-NEXT:    vpsllvd %ymm4, %ymm0, %ymm5
286 ; AVX512VLBW-NEXT:    vpbroadcastd {{.*#+}} ymm6 = [32,32,32,32,32,32,32,32]
287 ; AVX512VLBW-NEXT:    vpsubd %ymm4, %ymm6, %ymm4
288 ; AVX512VLBW-NEXT:    vpsrlvd %ymm4, %ymm1, %ymm1
289 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm5, %ymm1
290 ; AVX512VLBW-NEXT:    vptestnmd %ymm3, %ymm2, %k1
291 ; AVX512VLBW-NEXT:    vmovdqa32 %ymm0, %ymm1 {%k1}
292 ; AVX512VLBW-NEXT:    vmovdqa %ymm1, %ymm0
293 ; AVX512VLBW-NEXT:    retq
295 ; XOPAVX1-LABEL: var_funnnel_v8i32:
296 ; XOPAVX1:       # %bb.0:
297 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
298 ; XOPAVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
299 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
300 ; XOPAVX1-NEXT:    vpshld %xmm4, %xmm3, %xmm3
301 ; XOPAVX1-NEXT:    vpshld %xmm2, %xmm0, %xmm5
302 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm5, %ymm3
303 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [32,32,32,32]
304 ; XOPAVX1-NEXT:    vpsubd %xmm5, %xmm4, %xmm6
305 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
306 ; XOPAVX1-NEXT:    vpshld %xmm6, %xmm7, %xmm6
307 ; XOPAVX1-NEXT:    vpsubd %xmm5, %xmm2, %xmm5
308 ; XOPAVX1-NEXT:    vpshld %xmm5, %xmm1, %xmm1
309 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1
310 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm3, %ymm1
311 ; XOPAVX1-NEXT:    vxorps %xmm3, %xmm3, %xmm3
312 ; XOPAVX1-NEXT:    vpcomeqd %xmm3, %xmm4, %xmm4
313 ; XOPAVX1-NEXT:    vpcomeqd %xmm3, %xmm2, %xmm2
314 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
315 ; XOPAVX1-NEXT:    vblendvps %ymm2, %ymm0, %ymm1, %ymm0
316 ; XOPAVX1-NEXT:    retq
318 ; XOPAVX2-LABEL: var_funnnel_v8i32:
319 ; XOPAVX2:       # %bb.0:
320 ; XOPAVX2-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
321 ; XOPAVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
322 ; XOPAVX2-NEXT:    vpsllvd %ymm2, %ymm0, %ymm3
323 ; XOPAVX2-NEXT:    vpbroadcastd {{.*#+}} ymm4 = [32,32,32,32,32,32,32,32]
324 ; XOPAVX2-NEXT:    vpsubd %ymm2, %ymm4, %ymm4
325 ; XOPAVX2-NEXT:    vpsrlvd %ymm4, %ymm1, %ymm1
326 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
327 ; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
328 ; XOPAVX2-NEXT:    vpcmpeqd %ymm3, %ymm2, %ymm2
329 ; XOPAVX2-NEXT:    vblendvps %ymm2, %ymm0, %ymm1, %ymm0
330 ; XOPAVX2-NEXT:    retq
331   %res = call <8 x i32> @llvm.fshl.v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i32> %amt)
332   ret <8 x i32> %res
335 define <16 x i16> @var_funnnel_v16i16(<16 x i16> %x, <16 x i16> %y, <16 x i16> %amt) nounwind {
336 ; AVX1-LABEL: var_funnnel_v16i16:
337 ; AVX1:       # %bb.0:
338 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
339 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
340 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm8 = [16,16,16,16,16,16,16,16]
341 ; AVX1-NEXT:    vpsubw %xmm3, %xmm8, %xmm5
342 ; AVX1-NEXT:    vpsllw $12, %xmm5, %xmm6
343 ; AVX1-NEXT:    vpsllw $4, %xmm5, %xmm5
344 ; AVX1-NEXT:    vpor %xmm6, %xmm5, %xmm5
345 ; AVX1-NEXT:    vpaddw %xmm5, %xmm5, %xmm6
346 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
347 ; AVX1-NEXT:    vpsrlw $8, %xmm7, %xmm4
348 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm4, %xmm7, %xmm4
349 ; AVX1-NEXT:    vpsrlw $4, %xmm4, %xmm5
350 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm4, %xmm4
351 ; AVX1-NEXT:    vpsrlw $2, %xmm4, %xmm5
352 ; AVX1-NEXT:    vpaddw %xmm6, %xmm6, %xmm6
353 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm4, %xmm4
354 ; AVX1-NEXT:    vpsrlw $1, %xmm4, %xmm5
355 ; AVX1-NEXT:    vpaddw %xmm6, %xmm6, %xmm6
356 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm4, %xmm4
357 ; AVX1-NEXT:    vpsubw %xmm2, %xmm8, %xmm5
358 ; AVX1-NEXT:    vpsllw $12, %xmm5, %xmm6
359 ; AVX1-NEXT:    vpsllw $4, %xmm5, %xmm5
360 ; AVX1-NEXT:    vpor %xmm6, %xmm5, %xmm5
361 ; AVX1-NEXT:    vpaddw %xmm5, %xmm5, %xmm6
362 ; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm7
363 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm7, %xmm1, %xmm1
364 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm5
365 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm1, %xmm1
366 ; AVX1-NEXT:    vpsrlw $2, %xmm1, %xmm5
367 ; AVX1-NEXT:    vpaddw %xmm6, %xmm6, %xmm6
368 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm1, %xmm1
369 ; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm5
370 ; AVX1-NEXT:    vpaddw %xmm6, %xmm6, %xmm6
371 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm1, %xmm1
372 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm8
373 ; AVX1-NEXT:    vpxor %xmm4, %xmm4, %xmm4
374 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm5 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
375 ; AVX1-NEXT:    vpslld $23, %xmm5, %xmm5
376 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [1065353216,1065353216,1065353216,1065353216]
377 ; AVX1-NEXT:    vpaddd %xmm6, %xmm5, %xmm5
378 ; AVX1-NEXT:    vcvttps2dq %xmm5, %xmm5
379 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm7 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero
380 ; AVX1-NEXT:    vpslld $23, %xmm7, %xmm7
381 ; AVX1-NEXT:    vpaddd %xmm6, %xmm7, %xmm7
382 ; AVX1-NEXT:    vcvttps2dq %xmm7, %xmm7
383 ; AVX1-NEXT:    vpackusdw %xmm5, %xmm7, %xmm5
384 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
385 ; AVX1-NEXT:    vpmullw %xmm5, %xmm7, %xmm5
386 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm7 = xmm2[4],xmm4[4],xmm2[5],xmm4[5],xmm2[6],xmm4[6],xmm2[7],xmm4[7]
387 ; AVX1-NEXT:    vpslld $23, %xmm7, %xmm7
388 ; AVX1-NEXT:    vpaddd %xmm6, %xmm7, %xmm7
389 ; AVX1-NEXT:    vcvttps2dq %xmm7, %xmm7
390 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm1 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero
391 ; AVX1-NEXT:    vpslld $23, %xmm1, %xmm1
392 ; AVX1-NEXT:    vpaddd %xmm6, %xmm1, %xmm1
393 ; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1
394 ; AVX1-NEXT:    vpackusdw %xmm7, %xmm1, %xmm1
395 ; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm1
396 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm1, %ymm1
397 ; AVX1-NEXT:    vorps %ymm8, %ymm1, %ymm1
398 ; AVX1-NEXT:    vpcmpeqw %xmm4, %xmm3, %xmm3
399 ; AVX1-NEXT:    vpcmpeqw %xmm4, %xmm2, %xmm2
400 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
401 ; AVX1-NEXT:    vandnps %ymm1, %ymm2, %ymm1
402 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
403 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
404 ; AVX1-NEXT:    retq
406 ; AVX2-LABEL: var_funnnel_v16i16:
407 ; AVX2:       # %bb.0:
408 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
409 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm3[4],ymm0[4],ymm3[5],ymm0[5],ymm3[6],ymm0[6],ymm3[7],ymm0[7],ymm3[12],ymm0[12],ymm3[13],ymm0[13],ymm3[14],ymm0[14],ymm3[15],ymm0[15]
410 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
411 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm5 = ymm2[4],ymm3[4],ymm2[5],ymm3[5],ymm2[6],ymm3[6],ymm2[7],ymm3[7],ymm2[12],ymm3[12],ymm2[13],ymm3[13],ymm2[14],ymm3[14],ymm2[15],ymm3[15]
412 ; AVX2-NEXT:    vpsllvd %ymm5, %ymm4, %ymm4
413 ; AVX2-NEXT:    vpsrld $16, %ymm4, %ymm4
414 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm5 = ymm3[0],ymm0[0],ymm3[1],ymm0[1],ymm3[2],ymm0[2],ymm3[3],ymm0[3],ymm3[8],ymm0[8],ymm3[9],ymm0[9],ymm3[10],ymm0[10],ymm3[11],ymm0[11]
415 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm6 = ymm2[0],ymm3[0],ymm2[1],ymm3[1],ymm2[2],ymm3[2],ymm2[3],ymm3[3],ymm2[8],ymm3[8],ymm2[9],ymm3[9],ymm2[10],ymm3[10],ymm2[11],ymm3[11]
416 ; AVX2-NEXT:    vpsllvd %ymm6, %ymm5, %ymm5
417 ; AVX2-NEXT:    vpsrld $16, %ymm5, %ymm5
418 ; AVX2-NEXT:    vpackusdw %ymm4, %ymm5, %ymm4
419 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm5 = ymm3[4],ymm1[4],ymm3[5],ymm1[5],ymm3[6],ymm1[6],ymm3[7],ymm1[7],ymm3[12],ymm1[12],ymm3[13],ymm1[13],ymm3[14],ymm1[14],ymm3[15],ymm1[15]
420 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm6 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
421 ; AVX2-NEXT:    vpsubw %ymm2, %ymm6, %ymm6
422 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm7 = ymm6[4],ymm3[4],ymm6[5],ymm3[5],ymm6[6],ymm3[6],ymm6[7],ymm3[7],ymm6[12],ymm3[12],ymm6[13],ymm3[13],ymm6[14],ymm3[14],ymm6[15],ymm3[15]
423 ; AVX2-NEXT:    vpsrlvd %ymm7, %ymm5, %ymm5
424 ; AVX2-NEXT:    vpsrld $16, %ymm5, %ymm5
425 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm1 = ymm3[0],ymm1[0],ymm3[1],ymm1[1],ymm3[2],ymm1[2],ymm3[3],ymm1[3],ymm3[8],ymm1[8],ymm3[9],ymm1[9],ymm3[10],ymm1[10],ymm3[11],ymm1[11]
426 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm6 = ymm6[0],ymm3[0],ymm6[1],ymm3[1],ymm6[2],ymm3[2],ymm6[3],ymm3[3],ymm6[8],ymm3[8],ymm6[9],ymm3[9],ymm6[10],ymm3[10],ymm6[11],ymm3[11]
427 ; AVX2-NEXT:    vpsrlvd %ymm6, %ymm1, %ymm1
428 ; AVX2-NEXT:    vpsrld $16, %ymm1, %ymm1
429 ; AVX2-NEXT:    vpackusdw %ymm5, %ymm1, %ymm1
430 ; AVX2-NEXT:    vpor %ymm1, %ymm4, %ymm1
431 ; AVX2-NEXT:    vpcmpeqw %ymm3, %ymm2, %ymm2
432 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
433 ; AVX2-NEXT:    retq
435 ; AVX512F-LABEL: var_funnnel_v16i16:
436 ; AVX512F:       # %bb.0:
437 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm3 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
438 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
439 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm4 = ymm2[0],zero,ymm2[1],zero,ymm2[2],zero,ymm2[3],zero,ymm2[4],zero,ymm2[5],zero,ymm2[6],zero,ymm2[7],zero,ymm2[8],zero,ymm2[9],zero,ymm2[10],zero,ymm2[11],zero,ymm2[12],zero,ymm2[13],zero,ymm2[14],zero,ymm2[15],zero
440 ; AVX512F-NEXT:    vpsllvd %zmm4, %zmm3, %zmm3
441 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm4 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
442 ; AVX512F-NEXT:    vpsubw %ymm2, %ymm4, %ymm4
443 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm4 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero
444 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
445 ; AVX512F-NEXT:    vpsrlvd %zmm4, %zmm1, %zmm1
446 ; AVX512F-NEXT:    vpord %zmm1, %zmm3, %zmm1
447 ; AVX512F-NEXT:    vpmovdw %zmm1, %ymm1
448 ; AVX512F-NEXT:    vpxor %xmm3, %xmm3, %xmm3
449 ; AVX512F-NEXT:    vpcmpeqw %ymm3, %ymm2, %ymm2
450 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
451 ; AVX512F-NEXT:    retq
453 ; AVX512VL-LABEL: var_funnnel_v16i16:
454 ; AVX512VL:       # %bb.0:
455 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm3 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
456 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
457 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm4 = ymm2[0],zero,ymm2[1],zero,ymm2[2],zero,ymm2[3],zero,ymm2[4],zero,ymm2[5],zero,ymm2[6],zero,ymm2[7],zero,ymm2[8],zero,ymm2[9],zero,ymm2[10],zero,ymm2[11],zero,ymm2[12],zero,ymm2[13],zero,ymm2[14],zero,ymm2[15],zero
458 ; AVX512VL-NEXT:    vpsllvd %zmm4, %zmm3, %zmm3
459 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm4 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
460 ; AVX512VL-NEXT:    vpsubw %ymm2, %ymm4, %ymm4
461 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm4 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero
462 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
463 ; AVX512VL-NEXT:    vpsrlvd %zmm4, %zmm1, %zmm1
464 ; AVX512VL-NEXT:    vpord %zmm1, %zmm3, %zmm1
465 ; AVX512VL-NEXT:    vpmovdw %zmm1, %ymm1
466 ; AVX512VL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
467 ; AVX512VL-NEXT:    vpcmpeqw %ymm3, %ymm2, %ymm2
468 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
469 ; AVX512VL-NEXT:    retq
471 ; AVX512BW-LABEL: var_funnnel_v16i16:
472 ; AVX512BW:       # %bb.0:
473 ; AVX512BW-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
474 ; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
475 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
476 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
477 ; AVX512BW-NEXT:    vpand %ymm3, %ymm2, %ymm4
478 ; AVX512BW-NEXT:    vpsllvw %zmm4, %zmm0, %zmm5
479 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm6 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
480 ; AVX512BW-NEXT:    vpsubw %ymm4, %ymm6, %ymm4
481 ; AVX512BW-NEXT:    vpsrlvw %zmm4, %zmm1, %zmm1
482 ; AVX512BW-NEXT:    vpor %ymm1, %ymm5, %ymm1
483 ; AVX512BW-NEXT:    vptestnmw %zmm3, %zmm2, %k1
484 ; AVX512BW-NEXT:    vmovdqu16 %zmm0, %zmm1 {%k1}
485 ; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm0
486 ; AVX512BW-NEXT:    retq
488 ; AVX512VLBW-LABEL: var_funnnel_v16i16:
489 ; AVX512VLBW:       # %bb.0:
490 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
491 ; AVX512VLBW-NEXT:    vpand %ymm3, %ymm2, %ymm4
492 ; AVX512VLBW-NEXT:    vpsllvw %ymm4, %ymm0, %ymm5
493 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} ymm6 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
494 ; AVX512VLBW-NEXT:    vpsubw %ymm4, %ymm6, %ymm4
495 ; AVX512VLBW-NEXT:    vpsrlvw %ymm4, %ymm1, %ymm1
496 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm5, %ymm1
497 ; AVX512VLBW-NEXT:    vptestnmw %ymm3, %ymm2, %k1
498 ; AVX512VLBW-NEXT:    vmovdqu16 %ymm0, %ymm1 {%k1}
499 ; AVX512VLBW-NEXT:    vmovdqa %ymm1, %ymm0
500 ; AVX512VLBW-NEXT:    retq
502 ; XOPAVX1-LABEL: var_funnnel_v16i16:
503 ; XOPAVX1:       # %bb.0:
504 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
505 ; XOPAVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
506 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
507 ; XOPAVX1-NEXT:    vpshlw %xmm4, %xmm3, %xmm3
508 ; XOPAVX1-NEXT:    vpshlw %xmm2, %xmm0, %xmm5
509 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm5, %ymm3
510 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [16,16,16,16,16,16,16,16]
511 ; XOPAVX1-NEXT:    vpsubw %xmm5, %xmm4, %xmm6
512 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
513 ; XOPAVX1-NEXT:    vpshlw %xmm6, %xmm7, %xmm6
514 ; XOPAVX1-NEXT:    vpsubw %xmm5, %xmm2, %xmm5
515 ; XOPAVX1-NEXT:    vpshlw %xmm5, %xmm1, %xmm1
516 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1
517 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm3, %ymm1
518 ; XOPAVX1-NEXT:    vxorps %xmm3, %xmm3, %xmm3
519 ; XOPAVX1-NEXT:    vpcomeqw %xmm3, %xmm4, %xmm4
520 ; XOPAVX1-NEXT:    vpcomeqw %xmm3, %xmm2, %xmm2
521 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
522 ; XOPAVX1-NEXT:    vpcmov %ymm2, %ymm1, %ymm0, %ymm0
523 ; XOPAVX1-NEXT:    retq
525 ; XOPAVX2-LABEL: var_funnnel_v16i16:
526 ; XOPAVX2:       # %bb.0:
527 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
528 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
529 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm2, %xmm4
530 ; XOPAVX2-NEXT:    vpshlw %xmm4, %xmm3, %xmm3
531 ; XOPAVX2-NEXT:    vpshlw %xmm2, %xmm0, %xmm4
532 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm3, %ymm4, %ymm3
533 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
534 ; XOPAVX2-NEXT:    vpsubw %ymm2, %ymm4, %ymm4
535 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm4, %xmm5
536 ; XOPAVX2-NEXT:    vpxor %xmm6, %xmm6, %xmm6
537 ; XOPAVX2-NEXT:    vpsubw %xmm5, %xmm6, %xmm5
538 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm7
539 ; XOPAVX2-NEXT:    vpshlw %xmm5, %xmm7, %xmm5
540 ; XOPAVX2-NEXT:    vpsubw %xmm4, %xmm6, %xmm4
541 ; XOPAVX2-NEXT:    vpshlw %xmm4, %xmm1, %xmm1
542 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm5, %ymm1, %ymm1
543 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
544 ; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
545 ; XOPAVX2-NEXT:    vpcmpeqw %ymm3, %ymm2, %ymm2
546 ; XOPAVX2-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
547 ; XOPAVX2-NEXT:    retq
548   %res = call <16 x i16> @llvm.fshl.v16i16(<16 x i16> %x, <16 x i16> %y, <16 x i16> %amt)
549   ret <16 x i16> %res
552 define <32 x i8> @var_funnnel_v32i8(<32 x i8> %x, <32 x i8> %y, <32 x i8> %amt) nounwind {
553 ; AVX1-LABEL: var_funnnel_v32i8:
554 ; AVX1:       # %bb.0:
555 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
556 ; AVX1-NEXT:    vpsrlw $4, %xmm4, %xmm3
557 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm8 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
558 ; AVX1-NEXT:    vpand %xmm8, %xmm3, %xmm6
559 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
560 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
561 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm9 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
562 ; AVX1-NEXT:    vpsubb %xmm3, %xmm9, %xmm5
563 ; AVX1-NEXT:    vpsllw $5, %xmm5, %xmm5
564 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm6, %xmm4, %xmm4
565 ; AVX1-NEXT:    vpsrlw $2, %xmm4, %xmm6
566 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm10 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
567 ; AVX1-NEXT:    vpand %xmm10, %xmm6, %xmm6
568 ; AVX1-NEXT:    vpaddb %xmm5, %xmm5, %xmm5
569 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm6, %xmm4, %xmm4
570 ; AVX1-NEXT:    vpsrlw $1, %xmm4, %xmm6
571 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
572 ; AVX1-NEXT:    vpand %xmm7, %xmm6, %xmm6
573 ; AVX1-NEXT:    vpaddb %xmm5, %xmm5, %xmm5
574 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm6, %xmm4, %xmm4
575 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm5
576 ; AVX1-NEXT:    vpand %xmm8, %xmm5, %xmm5
577 ; AVX1-NEXT:    vpsubb %xmm2, %xmm9, %xmm6
578 ; AVX1-NEXT:    vpsllw $5, %xmm6, %xmm6
579 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm1, %xmm1
580 ; AVX1-NEXT:    vpsrlw $2, %xmm1, %xmm5
581 ; AVX1-NEXT:    vpand %xmm10, %xmm5, %xmm5
582 ; AVX1-NEXT:    vpaddb %xmm6, %xmm6, %xmm6
583 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm1, %xmm1
584 ; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm5
585 ; AVX1-NEXT:    vpand %xmm7, %xmm5, %xmm5
586 ; AVX1-NEXT:    vpaddb %xmm6, %xmm6, %xmm6
587 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm1, %xmm1
588 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm8
589 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
590 ; AVX1-NEXT:    vpsllw $4, %xmm4, %xmm5
591 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
592 ; AVX1-NEXT:    vpand %xmm6, %xmm5, %xmm5
593 ; AVX1-NEXT:    vpsllw $5, %xmm3, %xmm7
594 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm5, %xmm4, %xmm4
595 ; AVX1-NEXT:    vpsllw $2, %xmm4, %xmm5
596 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
597 ; AVX1-NEXT:    vpand %xmm1, %xmm5, %xmm5
598 ; AVX1-NEXT:    vpaddb %xmm7, %xmm7, %xmm7
599 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm5, %xmm4, %xmm4
600 ; AVX1-NEXT:    vpaddb %xmm4, %xmm4, %xmm5
601 ; AVX1-NEXT:    vpaddb %xmm7, %xmm7, %xmm7
602 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm5, %xmm4, %xmm4
603 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm5
604 ; AVX1-NEXT:    vpand %xmm6, %xmm5, %xmm5
605 ; AVX1-NEXT:    vpsllw $5, %xmm2, %xmm6
606 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm0, %xmm5
607 ; AVX1-NEXT:    vpsllw $2, %xmm5, %xmm7
608 ; AVX1-NEXT:    vpand %xmm1, %xmm7, %xmm1
609 ; AVX1-NEXT:    vpaddb %xmm6, %xmm6, %xmm6
610 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm1, %xmm5, %xmm1
611 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm5
612 ; AVX1-NEXT:    vpaddb %xmm6, %xmm6, %xmm6
613 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm1, %xmm1
614 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm1
615 ; AVX1-NEXT:    vorps %ymm8, %ymm1, %ymm1
616 ; AVX1-NEXT:    vpxor %xmm4, %xmm4, %xmm4
617 ; AVX1-NEXT:    vpcmpeqb %xmm4, %xmm3, %xmm3
618 ; AVX1-NEXT:    vpcmpeqb %xmm4, %xmm2, %xmm2
619 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
620 ; AVX1-NEXT:    vandnps %ymm1, %ymm2, %ymm1
621 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
622 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
623 ; AVX1-NEXT:    retq
625 ; AVX2-LABEL: var_funnnel_v32i8:
626 ; AVX2:       # %bb.0:
627 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
628 ; AVX2-NEXT:    vpsllw $5, %ymm2, %ymm3
629 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm4
630 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
631 ; AVX2-NEXT:    vpblendvb %ymm3, %ymm4, %ymm0, %ymm4
632 ; AVX2-NEXT:    vpsllw $2, %ymm4, %ymm5
633 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm5, %ymm5
634 ; AVX2-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
635 ; AVX2-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm4
636 ; AVX2-NEXT:    vpaddb %ymm4, %ymm4, %ymm5
637 ; AVX2-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
638 ; AVX2-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm3
639 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
640 ; AVX2-NEXT:    vpsubb %ymm2, %ymm4, %ymm4
641 ; AVX2-NEXT:    vpsllw $5, %ymm4, %ymm4
642 ; AVX2-NEXT:    vpaddb %ymm4, %ymm4, %ymm5
643 ; AVX2-NEXT:    vpsrlw $4, %ymm1, %ymm6
644 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm6, %ymm6
645 ; AVX2-NEXT:    vpblendvb %ymm4, %ymm6, %ymm1, %ymm1
646 ; AVX2-NEXT:    vpsrlw $2, %ymm1, %ymm4
647 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
648 ; AVX2-NEXT:    vpblendvb %ymm5, %ymm4, %ymm1, %ymm1
649 ; AVX2-NEXT:    vpsrlw $1, %ymm1, %ymm4
650 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
651 ; AVX2-NEXT:    vpaddb %ymm5, %ymm5, %ymm5
652 ; AVX2-NEXT:    vpblendvb %ymm5, %ymm4, %ymm1, %ymm1
653 ; AVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
654 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
655 ; AVX2-NEXT:    vpcmpeqb %ymm3, %ymm2, %ymm2
656 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
657 ; AVX2-NEXT:    retq
659 ; AVX512F-LABEL: var_funnnel_v32i8:
660 ; AVX512F:       # %bb.0:
661 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
662 ; AVX512F-NEXT:    vpsllw $5, %ymm2, %ymm3
663 ; AVX512F-NEXT:    vpsllw $4, %ymm0, %ymm4
664 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
665 ; AVX512F-NEXT:    vpblendvb %ymm3, %ymm4, %ymm0, %ymm4
666 ; AVX512F-NEXT:    vpsllw $2, %ymm4, %ymm5
667 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm5, %ymm5
668 ; AVX512F-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
669 ; AVX512F-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm4
670 ; AVX512F-NEXT:    vpaddb %ymm4, %ymm4, %ymm5
671 ; AVX512F-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
672 ; AVX512F-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm3
673 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
674 ; AVX512F-NEXT:    vpsubb %ymm2, %ymm4, %ymm4
675 ; AVX512F-NEXT:    vpsllw $5, %ymm4, %ymm4
676 ; AVX512F-NEXT:    vpaddb %ymm4, %ymm4, %ymm5
677 ; AVX512F-NEXT:    vpsrlw $4, %ymm1, %ymm6
678 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm6, %ymm6
679 ; AVX512F-NEXT:    vpblendvb %ymm4, %ymm6, %ymm1, %ymm1
680 ; AVX512F-NEXT:    vpsrlw $2, %ymm1, %ymm4
681 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
682 ; AVX512F-NEXT:    vpblendvb %ymm5, %ymm4, %ymm1, %ymm1
683 ; AVX512F-NEXT:    vpsrlw $1, %ymm1, %ymm4
684 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
685 ; AVX512F-NEXT:    vpaddb %ymm5, %ymm5, %ymm5
686 ; AVX512F-NEXT:    vpblendvb %ymm5, %ymm4, %ymm1, %ymm1
687 ; AVX512F-NEXT:    vpor %ymm1, %ymm3, %ymm1
688 ; AVX512F-NEXT:    vpxor %xmm3, %xmm3, %xmm3
689 ; AVX512F-NEXT:    vpcmpeqb %ymm3, %ymm2, %ymm2
690 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
691 ; AVX512F-NEXT:    retq
693 ; AVX512VL-LABEL: var_funnnel_v32i8:
694 ; AVX512VL:       # %bb.0:
695 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
696 ; AVX512VL-NEXT:    vpsllw $5, %ymm2, %ymm3
697 ; AVX512VL-NEXT:    vpsllw $4, %ymm0, %ymm4
698 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
699 ; AVX512VL-NEXT:    vpblendvb %ymm3, %ymm4, %ymm0, %ymm4
700 ; AVX512VL-NEXT:    vpsllw $2, %ymm4, %ymm5
701 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm5, %ymm5
702 ; AVX512VL-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
703 ; AVX512VL-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm4
704 ; AVX512VL-NEXT:    vpaddb %ymm4, %ymm4, %ymm5
705 ; AVX512VL-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
706 ; AVX512VL-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm3
707 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
708 ; AVX512VL-NEXT:    vpsubb %ymm2, %ymm4, %ymm4
709 ; AVX512VL-NEXT:    vpsllw $5, %ymm4, %ymm4
710 ; AVX512VL-NEXT:    vpaddb %ymm4, %ymm4, %ymm5
711 ; AVX512VL-NEXT:    vpsrlw $4, %ymm1, %ymm6
712 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm6, %ymm6
713 ; AVX512VL-NEXT:    vpblendvb %ymm4, %ymm6, %ymm1, %ymm1
714 ; AVX512VL-NEXT:    vpsrlw $2, %ymm1, %ymm4
715 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
716 ; AVX512VL-NEXT:    vpblendvb %ymm5, %ymm4, %ymm1, %ymm1
717 ; AVX512VL-NEXT:    vpsrlw $1, %ymm1, %ymm4
718 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
719 ; AVX512VL-NEXT:    vpaddb %ymm5, %ymm5, %ymm5
720 ; AVX512VL-NEXT:    vpblendvb %ymm5, %ymm4, %ymm1, %ymm1
721 ; AVX512VL-NEXT:    vpor %ymm1, %ymm3, %ymm1
722 ; AVX512VL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
723 ; AVX512VL-NEXT:    vpcmpeqb %ymm3, %ymm2, %ymm2
724 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
725 ; AVX512VL-NEXT:    retq
727 ; AVX512BW-LABEL: var_funnnel_v32i8:
728 ; AVX512BW:       # %bb.0:
729 ; AVX512BW-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
730 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
731 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
732 ; AVX512BW-NEXT:    vpand %ymm3, %ymm2, %ymm4
733 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm5 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero,ymm4[16],zero,ymm4[17],zero,ymm4[18],zero,ymm4[19],zero,ymm4[20],zero,ymm4[21],zero,ymm4[22],zero,ymm4[23],zero,ymm4[24],zero,ymm4[25],zero,ymm4[26],zero,ymm4[27],zero,ymm4[28],zero,ymm4[29],zero,ymm4[30],zero,ymm4[31],zero
734 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm6 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
735 ; AVX512BW-NEXT:    vpsllvw %zmm5, %zmm6, %zmm5
736 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm6 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
737 ; AVX512BW-NEXT:    vpsubb %ymm4, %ymm6, %ymm4
738 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm4 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero,ymm4[16],zero,ymm4[17],zero,ymm4[18],zero,ymm4[19],zero,ymm4[20],zero,ymm4[21],zero,ymm4[22],zero,ymm4[23],zero,ymm4[24],zero,ymm4[25],zero,ymm4[26],zero,ymm4[27],zero,ymm4[28],zero,ymm4[29],zero,ymm4[30],zero,ymm4[31],zero
739 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
740 ; AVX512BW-NEXT:    vpsrlvw %zmm4, %zmm1, %zmm1
741 ; AVX512BW-NEXT:    vporq %zmm1, %zmm5, %zmm1
742 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
743 ; AVX512BW-NEXT:    vptestnmb %zmm3, %zmm2, %k1
744 ; AVX512BW-NEXT:    vmovdqu8 %zmm0, %zmm1 {%k1}
745 ; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm0
746 ; AVX512BW-NEXT:    retq
748 ; AVX512VLBW-LABEL: var_funnnel_v32i8:
749 ; AVX512VLBW:       # %bb.0:
750 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} ymm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
751 ; AVX512VLBW-NEXT:    vpand %ymm3, %ymm2, %ymm4
752 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm5 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero,ymm4[16],zero,ymm4[17],zero,ymm4[18],zero,ymm4[19],zero,ymm4[20],zero,ymm4[21],zero,ymm4[22],zero,ymm4[23],zero,ymm4[24],zero,ymm4[25],zero,ymm4[26],zero,ymm4[27],zero,ymm4[28],zero,ymm4[29],zero,ymm4[30],zero,ymm4[31],zero
753 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm6 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
754 ; AVX512VLBW-NEXT:    vpsllvw %zmm5, %zmm6, %zmm5
755 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} ymm6 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
756 ; AVX512VLBW-NEXT:    vpsubb %ymm4, %ymm6, %ymm4
757 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm4 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero,ymm4[16],zero,ymm4[17],zero,ymm4[18],zero,ymm4[19],zero,ymm4[20],zero,ymm4[21],zero,ymm4[22],zero,ymm4[23],zero,ymm4[24],zero,ymm4[25],zero,ymm4[26],zero,ymm4[27],zero,ymm4[28],zero,ymm4[29],zero,ymm4[30],zero,ymm4[31],zero
758 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
759 ; AVX512VLBW-NEXT:    vpsrlvw %zmm4, %zmm1, %zmm1
760 ; AVX512VLBW-NEXT:    vporq %zmm1, %zmm5, %zmm1
761 ; AVX512VLBW-NEXT:    vpmovwb %zmm1, %ymm1
762 ; AVX512VLBW-NEXT:    vptestnmb %ymm3, %ymm2, %k1
763 ; AVX512VLBW-NEXT:    vmovdqu8 %ymm0, %ymm1 {%k1}
764 ; AVX512VLBW-NEXT:    vmovdqa %ymm1, %ymm0
765 ; AVX512VLBW-NEXT:    retq
767 ; XOPAVX1-LABEL: var_funnnel_v32i8:
768 ; XOPAVX1:       # %bb.0:
769 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
770 ; XOPAVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
771 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
772 ; XOPAVX1-NEXT:    vpshlb %xmm4, %xmm3, %xmm3
773 ; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm0, %xmm5
774 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm5, %ymm3
775 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
776 ; XOPAVX1-NEXT:    vpsubb %xmm5, %xmm4, %xmm6
777 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
778 ; XOPAVX1-NEXT:    vpshlb %xmm6, %xmm7, %xmm6
779 ; XOPAVX1-NEXT:    vpsubb %xmm5, %xmm2, %xmm5
780 ; XOPAVX1-NEXT:    vpshlb %xmm5, %xmm1, %xmm1
781 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1
782 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm3, %ymm1
783 ; XOPAVX1-NEXT:    vxorps %xmm3, %xmm3, %xmm3
784 ; XOPAVX1-NEXT:    vpcomeqb %xmm3, %xmm4, %xmm4
785 ; XOPAVX1-NEXT:    vpcomeqb %xmm3, %xmm2, %xmm2
786 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
787 ; XOPAVX1-NEXT:    vpcmov %ymm2, %ymm1, %ymm0, %ymm0
788 ; XOPAVX1-NEXT:    retq
790 ; XOPAVX2-LABEL: var_funnnel_v32i8:
791 ; XOPAVX2:       # %bb.0:
792 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
793 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
794 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm2, %xmm4
795 ; XOPAVX2-NEXT:    vpshlb %xmm4, %xmm3, %xmm3
796 ; XOPAVX2-NEXT:    vpshlb %xmm2, %xmm0, %xmm4
797 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm3, %ymm4, %ymm3
798 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
799 ; XOPAVX2-NEXT:    vpsubb %ymm2, %ymm4, %ymm4
800 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm4, %xmm5
801 ; XOPAVX2-NEXT:    vpxor %xmm6, %xmm6, %xmm6
802 ; XOPAVX2-NEXT:    vpsubb %xmm5, %xmm6, %xmm5
803 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm7
804 ; XOPAVX2-NEXT:    vpshlb %xmm5, %xmm7, %xmm5
805 ; XOPAVX2-NEXT:    vpsubb %xmm4, %xmm6, %xmm4
806 ; XOPAVX2-NEXT:    vpshlb %xmm4, %xmm1, %xmm1
807 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm5, %ymm1, %ymm1
808 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
809 ; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
810 ; XOPAVX2-NEXT:    vpcmpeqb %ymm3, %ymm2, %ymm2
811 ; XOPAVX2-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
812 ; XOPAVX2-NEXT:    retq
813   %res = call <32 x i8> @llvm.fshl.v32i8(<32 x i8> %x, <32 x i8> %y, <32 x i8> %amt)
814   ret <32 x i8> %res
818 ; Uniform Variable Shifts
821 define <4 x i64> @splatvar_funnnel_v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> %amt) nounwind {
822 ; AVX1-LABEL: splatvar_funnnel_v4i64:
823 ; AVX1:       # %bb.0:
824 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = xmm2[0,0]
825 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm2, %ymm2
826 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
827 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
828 ; AVX1-NEXT:    vpsllq %xmm2, %xmm3, %xmm3
829 ; AVX1-NEXT:    vpsllq %xmm2, %xmm0, %xmm4
830 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
831 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
832 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [64,64]
833 ; AVX1-NEXT:    vpsubq %xmm4, %xmm5, %xmm6
834 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
835 ; AVX1-NEXT:    vpsrlq %xmm6, %xmm7, %xmm6
836 ; AVX1-NEXT:    vpsubq %xmm2, %xmm5, %xmm5
837 ; AVX1-NEXT:    vpsrlq %xmm5, %xmm1, %xmm1
838 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1
839 ; AVX1-NEXT:    vorps %ymm1, %ymm3, %ymm1
840 ; AVX1-NEXT:    vxorps %xmm3, %xmm3, %xmm3
841 ; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm4, %xmm4
842 ; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm2, %xmm2
843 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
844 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
845 ; AVX1-NEXT:    retq
847 ; AVX2-LABEL: splatvar_funnnel_v4i64:
848 ; AVX2:       # %bb.0:
849 ; AVX2-NEXT:    vpbroadcastq %xmm2, %ymm2
850 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
851 ; AVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
852 ; AVX2-NEXT:    vpsllq %xmm2, %ymm0, %ymm3
853 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm4 = [64,64]
854 ; AVX2-NEXT:    vpsubq %xmm2, %xmm4, %xmm4
855 ; AVX2-NEXT:    vpsrlq %xmm4, %ymm1, %ymm1
856 ; AVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
857 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
858 ; AVX2-NEXT:    vpcmpeqq %ymm3, %ymm2, %ymm2
859 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
860 ; AVX2-NEXT:    retq
862 ; AVX512F-LABEL: splatvar_funnnel_v4i64:
863 ; AVX512F:       # %bb.0:
864 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
865 ; AVX512F-NEXT:    vpbroadcastq %xmm2, %ymm2
866 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
867 ; AVX512F-NEXT:    vpand %ymm3, %ymm2, %ymm4
868 ; AVX512F-NEXT:    vpsllq %xmm4, %ymm0, %ymm5
869 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm6 = [64,64]
870 ; AVX512F-NEXT:    vpsubq %xmm4, %xmm6, %xmm4
871 ; AVX512F-NEXT:    vpsrlq %xmm4, %ymm1, %ymm1
872 ; AVX512F-NEXT:    vpor %ymm1, %ymm5, %ymm1
873 ; AVX512F-NEXT:    vptestnmq %zmm3, %zmm2, %k1
874 ; AVX512F-NEXT:    vmovdqa64 %zmm0, %zmm1 {%k1}
875 ; AVX512F-NEXT:    vmovdqa %ymm1, %ymm0
876 ; AVX512F-NEXT:    retq
878 ; AVX512VL-LABEL: splatvar_funnnel_v4i64:
879 ; AVX512VL:       # %bb.0:
880 ; AVX512VL-NEXT:    vpbroadcastq %xmm2, %ymm2
881 ; AVX512VL-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
882 ; AVX512VL-NEXT:    vpand %ymm3, %ymm2, %ymm4
883 ; AVX512VL-NEXT:    vpsllq %xmm4, %ymm0, %ymm5
884 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm6 = [64,64]
885 ; AVX512VL-NEXT:    vpsubq %xmm4, %xmm6, %xmm4
886 ; AVX512VL-NEXT:    vpsrlq %xmm4, %ymm1, %ymm1
887 ; AVX512VL-NEXT:    vpor %ymm1, %ymm5, %ymm1
888 ; AVX512VL-NEXT:    vptestnmq %ymm3, %ymm2, %k1
889 ; AVX512VL-NEXT:    vmovdqa64 %ymm0, %ymm1 {%k1}
890 ; AVX512VL-NEXT:    vmovdqa %ymm1, %ymm0
891 ; AVX512VL-NEXT:    retq
893 ; AVX512BW-LABEL: splatvar_funnnel_v4i64:
894 ; AVX512BW:       # %bb.0:
895 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
896 ; AVX512BW-NEXT:    vpbroadcastq %xmm2, %ymm2
897 ; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
898 ; AVX512BW-NEXT:    vpand %ymm3, %ymm2, %ymm4
899 ; AVX512BW-NEXT:    vpsllq %xmm4, %ymm0, %ymm5
900 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm6 = [64,64]
901 ; AVX512BW-NEXT:    vpsubq %xmm4, %xmm6, %xmm4
902 ; AVX512BW-NEXT:    vpsrlq %xmm4, %ymm1, %ymm1
903 ; AVX512BW-NEXT:    vpor %ymm1, %ymm5, %ymm1
904 ; AVX512BW-NEXT:    vptestnmq %zmm3, %zmm2, %k1
905 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, %zmm1 {%k1}
906 ; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm0
907 ; AVX512BW-NEXT:    retq
909 ; AVX512VLBW-LABEL: splatvar_funnnel_v4i64:
910 ; AVX512VLBW:       # %bb.0:
911 ; AVX512VLBW-NEXT:    vpbroadcastq %xmm2, %ymm2
912 ; AVX512VLBW-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
913 ; AVX512VLBW-NEXT:    vpand %ymm3, %ymm2, %ymm4
914 ; AVX512VLBW-NEXT:    vpsllq %xmm4, %ymm0, %ymm5
915 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm6 = [64,64]
916 ; AVX512VLBW-NEXT:    vpsubq %xmm4, %xmm6, %xmm4
917 ; AVX512VLBW-NEXT:    vpsrlq %xmm4, %ymm1, %ymm1
918 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm5, %ymm1
919 ; AVX512VLBW-NEXT:    vptestnmq %ymm3, %ymm2, %k1
920 ; AVX512VLBW-NEXT:    vmovdqa64 %ymm0, %ymm1 {%k1}
921 ; AVX512VLBW-NEXT:    vmovdqa %ymm1, %ymm0
922 ; AVX512VLBW-NEXT:    retq
924 ; XOPAVX1-LABEL: splatvar_funnnel_v4i64:
925 ; XOPAVX1:       # %bb.0:
926 ; XOPAVX1-NEXT:    vmovddup {{.*#+}} xmm2 = xmm2[0,0]
927 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm2, %ymm2
928 ; XOPAVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
929 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
930 ; XOPAVX1-NEXT:    vpsllq %xmm2, %xmm3, %xmm3
931 ; XOPAVX1-NEXT:    vpsllq %xmm2, %xmm0, %xmm4
932 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
933 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
934 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [64,64]
935 ; XOPAVX1-NEXT:    vpsubq %xmm4, %xmm5, %xmm6
936 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
937 ; XOPAVX1-NEXT:    vpsrlq %xmm6, %xmm7, %xmm6
938 ; XOPAVX1-NEXT:    vpsubq %xmm2, %xmm5, %xmm5
939 ; XOPAVX1-NEXT:    vpsrlq %xmm5, %xmm1, %xmm1
940 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1
941 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm3, %ymm1
942 ; XOPAVX1-NEXT:    vxorps %xmm3, %xmm3, %xmm3
943 ; XOPAVX1-NEXT:    vpcomeqq %xmm3, %xmm4, %xmm4
944 ; XOPAVX1-NEXT:    vpcomeqq %xmm3, %xmm2, %xmm2
945 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
946 ; XOPAVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
947 ; XOPAVX1-NEXT:    retq
949 ; XOPAVX2-LABEL: splatvar_funnnel_v4i64:
950 ; XOPAVX2:       # %bb.0:
951 ; XOPAVX2-NEXT:    vpbroadcastq %xmm2, %ymm2
952 ; XOPAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
953 ; XOPAVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
954 ; XOPAVX2-NEXT:    vpsllq %xmm2, %ymm0, %ymm3
955 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm4 = [64,64]
956 ; XOPAVX2-NEXT:    vpsubq %xmm2, %xmm4, %xmm4
957 ; XOPAVX2-NEXT:    vpsrlq %xmm4, %ymm1, %ymm1
958 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
959 ; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
960 ; XOPAVX2-NEXT:    vpcmpeqq %ymm3, %ymm2, %ymm2
961 ; XOPAVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
962 ; XOPAVX2-NEXT:    retq
963   %splat = shufflevector <4 x i64> %amt, <4 x i64> undef, <4 x i32> zeroinitializer
964   %res = call <4 x i64> @llvm.fshl.v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> %splat)
965   ret <4 x i64> %res
968 define <8 x i32> @splatvar_funnnel_v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i32> %amt) nounwind {
969 ; AVX1-LABEL: splatvar_funnnel_v8i32:
970 ; AVX1:       # %bb.0:
971 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm2 = xmm2[0,0,0,0]
972 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm2, %ymm2
973 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
974 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm3 = xmm2[0],zero,xmm2[1],zero
975 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
976 ; AVX1-NEXT:    vpslld %xmm3, %xmm4, %xmm4
977 ; AVX1-NEXT:    vpslld %xmm3, %xmm0, %xmm3
978 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm3
979 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
980 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [32,32,32,32]
981 ; AVX1-NEXT:    vpsubd %xmm4, %xmm5, %xmm6
982 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm6 = xmm6[0],zero,xmm6[1],zero
983 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
984 ; AVX1-NEXT:    vpsrld %xmm6, %xmm7, %xmm6
985 ; AVX1-NEXT:    vpsubd %xmm2, %xmm5, %xmm5
986 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm5 = xmm5[0],zero,xmm5[1],zero
987 ; AVX1-NEXT:    vpsrld %xmm5, %xmm1, %xmm1
988 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1
989 ; AVX1-NEXT:    vorps %ymm1, %ymm3, %ymm1
990 ; AVX1-NEXT:    vxorps %xmm3, %xmm3, %xmm3
991 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm4, %xmm4
992 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm2
993 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
994 ; AVX1-NEXT:    vblendvps %ymm2, %ymm0, %ymm1, %ymm0
995 ; AVX1-NEXT:    retq
997 ; AVX2-LABEL: splatvar_funnnel_v8i32:
998 ; AVX2:       # %bb.0:
999 ; AVX2-NEXT:    vpbroadcastd %xmm2, %ymm2
1000 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
1001 ; AVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
1002 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm3 = xmm2[0],zero,xmm2[1],zero
1003 ; AVX2-NEXT:    vpslld %xmm3, %ymm0, %ymm3
1004 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm4 = [32,32,32,32]
1005 ; AVX2-NEXT:    vpsubd %xmm2, %xmm4, %xmm4
1006 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
1007 ; AVX2-NEXT:    vpsrld %xmm4, %ymm1, %ymm1
1008 ; AVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
1009 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1010 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm2, %ymm2
1011 ; AVX2-NEXT:    vblendvps %ymm2, %ymm0, %ymm1, %ymm0
1012 ; AVX2-NEXT:    retq
1014 ; AVX512F-LABEL: splatvar_funnnel_v8i32:
1015 ; AVX512F:       # %bb.0:
1016 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1017 ; AVX512F-NEXT:    vpbroadcastd %xmm2, %ymm2
1018 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
1019 ; AVX512F-NEXT:    vpand %ymm3, %ymm2, %ymm4
1020 ; AVX512F-NEXT:    vpmovzxdq {{.*#+}} xmm5 = xmm4[0],zero,xmm4[1],zero
1021 ; AVX512F-NEXT:    vpslld %xmm5, %ymm0, %ymm5
1022 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} xmm6 = [32,32,32,32]
1023 ; AVX512F-NEXT:    vpsubd %xmm4, %xmm6, %xmm4
1024 ; AVX512F-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
1025 ; AVX512F-NEXT:    vpsrld %xmm4, %ymm1, %ymm1
1026 ; AVX512F-NEXT:    vpor %ymm1, %ymm5, %ymm1
1027 ; AVX512F-NEXT:    vptestnmd %zmm3, %zmm2, %k1
1028 ; AVX512F-NEXT:    vmovdqa32 %zmm0, %zmm1 {%k1}
1029 ; AVX512F-NEXT:    vmovdqa %ymm1, %ymm0
1030 ; AVX512F-NEXT:    retq
1032 ; AVX512VL-LABEL: splatvar_funnnel_v8i32:
1033 ; AVX512VL:       # %bb.0:
1034 ; AVX512VL-NEXT:    vpbroadcastd %xmm2, %ymm2
1035 ; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
1036 ; AVX512VL-NEXT:    vpand %ymm3, %ymm2, %ymm4
1037 ; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm5 = xmm4[0],zero,xmm4[1],zero
1038 ; AVX512VL-NEXT:    vpslld %xmm5, %ymm0, %ymm5
1039 ; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} xmm6 = [32,32,32,32]
1040 ; AVX512VL-NEXT:    vpsubd %xmm4, %xmm6, %xmm4
1041 ; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
1042 ; AVX512VL-NEXT:    vpsrld %xmm4, %ymm1, %ymm1
1043 ; AVX512VL-NEXT:    vpor %ymm1, %ymm5, %ymm1
1044 ; AVX512VL-NEXT:    vptestnmd %ymm3, %ymm2, %k1
1045 ; AVX512VL-NEXT:    vmovdqa32 %ymm0, %ymm1 {%k1}
1046 ; AVX512VL-NEXT:    vmovdqa %ymm1, %ymm0
1047 ; AVX512VL-NEXT:    retq
1049 ; AVX512BW-LABEL: splatvar_funnnel_v8i32:
1050 ; AVX512BW:       # %bb.0:
1051 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1052 ; AVX512BW-NEXT:    vpbroadcastd %xmm2, %ymm2
1053 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
1054 ; AVX512BW-NEXT:    vpand %ymm3, %ymm2, %ymm4
1055 ; AVX512BW-NEXT:    vpmovzxdq {{.*#+}} xmm5 = xmm4[0],zero,xmm4[1],zero
1056 ; AVX512BW-NEXT:    vpslld %xmm5, %ymm0, %ymm5
1057 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} xmm6 = [32,32,32,32]
1058 ; AVX512BW-NEXT:    vpsubd %xmm4, %xmm6, %xmm4
1059 ; AVX512BW-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
1060 ; AVX512BW-NEXT:    vpsrld %xmm4, %ymm1, %ymm1
1061 ; AVX512BW-NEXT:    vpor %ymm1, %ymm5, %ymm1
1062 ; AVX512BW-NEXT:    vptestnmd %zmm3, %zmm2, %k1
1063 ; AVX512BW-NEXT:    vmovdqa32 %zmm0, %zmm1 {%k1}
1064 ; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm0
1065 ; AVX512BW-NEXT:    retq
1067 ; AVX512VLBW-LABEL: splatvar_funnnel_v8i32:
1068 ; AVX512VLBW:       # %bb.0:
1069 ; AVX512VLBW-NEXT:    vpbroadcastd %xmm2, %ymm2
1070 ; AVX512VLBW-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
1071 ; AVX512VLBW-NEXT:    vpand %ymm3, %ymm2, %ymm4
1072 ; AVX512VLBW-NEXT:    vpmovzxdq {{.*#+}} xmm5 = xmm4[0],zero,xmm4[1],zero
1073 ; AVX512VLBW-NEXT:    vpslld %xmm5, %ymm0, %ymm5
1074 ; AVX512VLBW-NEXT:    vpbroadcastd {{.*#+}} xmm6 = [32,32,32,32]
1075 ; AVX512VLBW-NEXT:    vpsubd %xmm4, %xmm6, %xmm4
1076 ; AVX512VLBW-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
1077 ; AVX512VLBW-NEXT:    vpsrld %xmm4, %ymm1, %ymm1
1078 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm5, %ymm1
1079 ; AVX512VLBW-NEXT:    vptestnmd %ymm3, %ymm2, %k1
1080 ; AVX512VLBW-NEXT:    vmovdqa32 %ymm0, %ymm1 {%k1}
1081 ; AVX512VLBW-NEXT:    vmovdqa %ymm1, %ymm0
1082 ; AVX512VLBW-NEXT:    retq
1084 ; XOPAVX1-LABEL: splatvar_funnnel_v8i32:
1085 ; XOPAVX1:       # %bb.0:
1086 ; XOPAVX1-NEXT:    vpermilps {{.*#+}} xmm2 = xmm2[0,0,0,0]
1087 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm2, %ymm2
1088 ; XOPAVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
1089 ; XOPAVX1-NEXT:    vpmovzxdq {{.*#+}} xmm3 = xmm2[0],zero,xmm2[1],zero
1090 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
1091 ; XOPAVX1-NEXT:    vpslld %xmm3, %xmm4, %xmm4
1092 ; XOPAVX1-NEXT:    vpslld %xmm3, %xmm0, %xmm3
1093 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm3
1094 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1095 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [32,32,32,32]
1096 ; XOPAVX1-NEXT:    vpsubd %xmm4, %xmm5, %xmm6
1097 ; XOPAVX1-NEXT:    vpmovzxdq {{.*#+}} xmm6 = xmm6[0],zero,xmm6[1],zero
1098 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
1099 ; XOPAVX1-NEXT:    vpsrld %xmm6, %xmm7, %xmm6
1100 ; XOPAVX1-NEXT:    vpsubd %xmm2, %xmm5, %xmm5
1101 ; XOPAVX1-NEXT:    vpmovzxdq {{.*#+}} xmm5 = xmm5[0],zero,xmm5[1],zero
1102 ; XOPAVX1-NEXT:    vpsrld %xmm5, %xmm1, %xmm1
1103 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1
1104 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm3, %ymm1
1105 ; XOPAVX1-NEXT:    vxorps %xmm3, %xmm3, %xmm3
1106 ; XOPAVX1-NEXT:    vpcomeqd %xmm3, %xmm4, %xmm4
1107 ; XOPAVX1-NEXT:    vpcomeqd %xmm3, %xmm2, %xmm2
1108 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
1109 ; XOPAVX1-NEXT:    vblendvps %ymm2, %ymm0, %ymm1, %ymm0
1110 ; XOPAVX1-NEXT:    retq
1112 ; XOPAVX2-LABEL: splatvar_funnnel_v8i32:
1113 ; XOPAVX2:       # %bb.0:
1114 ; XOPAVX2-NEXT:    vpbroadcastd %xmm2, %ymm2
1115 ; XOPAVX2-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
1116 ; XOPAVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
1117 ; XOPAVX2-NEXT:    vpmovzxdq {{.*#+}} xmm3 = xmm2[0],zero,xmm2[1],zero
1118 ; XOPAVX2-NEXT:    vpslld %xmm3, %ymm0, %ymm3
1119 ; XOPAVX2-NEXT:    vpbroadcastd {{.*#+}} xmm4 = [32,32,32,32]
1120 ; XOPAVX2-NEXT:    vpsubd %xmm2, %xmm4, %xmm4
1121 ; XOPAVX2-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
1122 ; XOPAVX2-NEXT:    vpsrld %xmm4, %ymm1, %ymm1
1123 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
1124 ; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1125 ; XOPAVX2-NEXT:    vpcmpeqd %ymm3, %ymm2, %ymm2
1126 ; XOPAVX2-NEXT:    vblendvps %ymm2, %ymm0, %ymm1, %ymm0
1127 ; XOPAVX2-NEXT:    retq
1128   %splat = shufflevector <8 x i32> %amt, <8 x i32> undef, <8 x i32> zeroinitializer
1129   %res = call <8 x i32> @llvm.fshl.v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i32> %splat)
1130   ret <8 x i32> %res
1133 define <16 x i16> @splatvar_funnnel_v16i16(<16 x i16> %x, <16 x i16> %y, <16 x i16> %amt) nounwind {
1134 ; AVX1-LABEL: splatvar_funnnel_v16i16:
1135 ; AVX1:       # %bb.0:
1136 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm2 = xmm2[0,0,2,3,4,5,6,7]
1137 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]
1138 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm2, %ymm2
1139 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
1140 ; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm3 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
1141 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
1142 ; AVX1-NEXT:    vpsllw %xmm3, %xmm4, %xmm4
1143 ; AVX1-NEXT:    vpsllw %xmm3, %xmm0, %xmm3
1144 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm3
1145 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1146 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [16,16,16,16,16,16,16,16]
1147 ; AVX1-NEXT:    vpsubw %xmm4, %xmm5, %xmm6
1148 ; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm6 = xmm6[0],zero,zero,zero,xmm6[1],zero,zero,zero
1149 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
1150 ; AVX1-NEXT:    vpsrlw %xmm6, %xmm7, %xmm6
1151 ; AVX1-NEXT:    vpsubw %xmm2, %xmm5, %xmm5
1152 ; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm5 = xmm5[0],zero,zero,zero,xmm5[1],zero,zero,zero
1153 ; AVX1-NEXT:    vpsrlw %xmm5, %xmm1, %xmm1
1154 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1
1155 ; AVX1-NEXT:    vorps %ymm1, %ymm3, %ymm1
1156 ; AVX1-NEXT:    vxorps %xmm3, %xmm3, %xmm3
1157 ; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm4, %xmm4
1158 ; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm2, %xmm2
1159 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
1160 ; AVX1-NEXT:    vandnps %ymm1, %ymm2, %ymm1
1161 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
1162 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1163 ; AVX1-NEXT:    retq
1165 ; AVX2-LABEL: splatvar_funnnel_v16i16:
1166 ; AVX2:       # %bb.0:
1167 ; AVX2-NEXT:    vpbroadcastw %xmm2, %ymm2
1168 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
1169 ; AVX2-NEXT:    vpmovzxwq {{.*#+}} xmm3 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
1170 ; AVX2-NEXT:    vpsllw %xmm3, %ymm0, %ymm3
1171 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm4 = [16,16,16,16,16,16,16,16]
1172 ; AVX2-NEXT:    vpsubw %xmm2, %xmm4, %xmm4
1173 ; AVX2-NEXT:    vpmovzxwq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1174 ; AVX2-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1175 ; AVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
1176 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1177 ; AVX2-NEXT:    vpcmpeqw %ymm3, %ymm2, %ymm2
1178 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1179 ; AVX2-NEXT:    retq
1181 ; AVX512F-LABEL: splatvar_funnnel_v16i16:
1182 ; AVX512F:       # %bb.0:
1183 ; AVX512F-NEXT:    vpbroadcastw %xmm2, %ymm2
1184 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
1185 ; AVX512F-NEXT:    vpmovzxwq {{.*#+}} xmm3 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
1186 ; AVX512F-NEXT:    vpsllw %xmm3, %ymm0, %ymm3
1187 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm4 = [16,16,16,16,16,16,16,16]
1188 ; AVX512F-NEXT:    vpsubw %xmm2, %xmm4, %xmm4
1189 ; AVX512F-NEXT:    vpmovzxwq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1190 ; AVX512F-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1191 ; AVX512F-NEXT:    vpor %ymm1, %ymm3, %ymm1
1192 ; AVX512F-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1193 ; AVX512F-NEXT:    vpcmpeqw %ymm3, %ymm2, %ymm2
1194 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1195 ; AVX512F-NEXT:    retq
1197 ; AVX512VL-LABEL: splatvar_funnnel_v16i16:
1198 ; AVX512VL:       # %bb.0:
1199 ; AVX512VL-NEXT:    vpbroadcastw %xmm2, %ymm2
1200 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
1201 ; AVX512VL-NEXT:    vpmovzxwq {{.*#+}} xmm3 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
1202 ; AVX512VL-NEXT:    vpsllw %xmm3, %ymm0, %ymm3
1203 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm4 = [16,16,16,16,16,16,16,16]
1204 ; AVX512VL-NEXT:    vpsubw %xmm2, %xmm4, %xmm4
1205 ; AVX512VL-NEXT:    vpmovzxwq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1206 ; AVX512VL-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1207 ; AVX512VL-NEXT:    vpor %ymm1, %ymm3, %ymm1
1208 ; AVX512VL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1209 ; AVX512VL-NEXT:    vpcmpeqw %ymm3, %ymm2, %ymm2
1210 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1211 ; AVX512VL-NEXT:    retq
1213 ; AVX512BW-LABEL: splatvar_funnnel_v16i16:
1214 ; AVX512BW:       # %bb.0:
1215 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1216 ; AVX512BW-NEXT:    vpbroadcastw %xmm2, %ymm2
1217 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1218 ; AVX512BW-NEXT:    vpand %ymm3, %ymm2, %ymm4
1219 ; AVX512BW-NEXT:    vpmovzxwq {{.*#+}} xmm5 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1220 ; AVX512BW-NEXT:    vpsllw %xmm5, %ymm0, %ymm5
1221 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm6 = [16,16,16,16,16,16,16,16]
1222 ; AVX512BW-NEXT:    vpsubw %xmm4, %xmm6, %xmm4
1223 ; AVX512BW-NEXT:    vpmovzxwq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1224 ; AVX512BW-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1225 ; AVX512BW-NEXT:    vpor %ymm1, %ymm5, %ymm1
1226 ; AVX512BW-NEXT:    vptestnmw %zmm3, %zmm2, %k1
1227 ; AVX512BW-NEXT:    vmovdqu16 %zmm0, %zmm1 {%k1}
1228 ; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm0
1229 ; AVX512BW-NEXT:    retq
1231 ; AVX512VLBW-LABEL: splatvar_funnnel_v16i16:
1232 ; AVX512VLBW:       # %bb.0:
1233 ; AVX512VLBW-NEXT:    vpbroadcastw %xmm2, %ymm2
1234 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1235 ; AVX512VLBW-NEXT:    vpand %ymm3, %ymm2, %ymm4
1236 ; AVX512VLBW-NEXT:    vpmovzxwq {{.*#+}} xmm5 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1237 ; AVX512VLBW-NEXT:    vpsllw %xmm5, %ymm0, %ymm5
1238 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm6 = [16,16,16,16,16,16,16,16]
1239 ; AVX512VLBW-NEXT:    vpsubw %xmm4, %xmm6, %xmm4
1240 ; AVX512VLBW-NEXT:    vpmovzxwq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1241 ; AVX512VLBW-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1242 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm5, %ymm1
1243 ; AVX512VLBW-NEXT:    vptestnmw %ymm3, %ymm2, %k1
1244 ; AVX512VLBW-NEXT:    vmovdqu16 %ymm0, %ymm1 {%k1}
1245 ; AVX512VLBW-NEXT:    vmovdqa %ymm1, %ymm0
1246 ; AVX512VLBW-NEXT:    retq
1248 ; XOPAVX1-LABEL: splatvar_funnnel_v16i16:
1249 ; XOPAVX1:       # %bb.0:
1250 ; XOPAVX1-NEXT:    vpshuflw {{.*#+}} xmm2 = xmm2[0,0,2,3,4,5,6,7]
1251 ; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]
1252 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm2, %ymm2
1253 ; XOPAVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
1254 ; XOPAVX1-NEXT:    vpmovzxwq {{.*#+}} xmm3 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
1255 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
1256 ; XOPAVX1-NEXT:    vpsllw %xmm3, %xmm4, %xmm4
1257 ; XOPAVX1-NEXT:    vpsllw %xmm3, %xmm0, %xmm3
1258 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm3
1259 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1260 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [16,16,16,16,16,16,16,16]
1261 ; XOPAVX1-NEXT:    vpsubw %xmm4, %xmm5, %xmm6
1262 ; XOPAVX1-NEXT:    vpmovzxwq {{.*#+}} xmm6 = xmm6[0],zero,zero,zero,xmm6[1],zero,zero,zero
1263 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
1264 ; XOPAVX1-NEXT:    vpsrlw %xmm6, %xmm7, %xmm6
1265 ; XOPAVX1-NEXT:    vpsubw %xmm2, %xmm5, %xmm5
1266 ; XOPAVX1-NEXT:    vpmovzxwq {{.*#+}} xmm5 = xmm5[0],zero,zero,zero,xmm5[1],zero,zero,zero
1267 ; XOPAVX1-NEXT:    vpsrlw %xmm5, %xmm1, %xmm1
1268 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1
1269 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm3, %ymm1
1270 ; XOPAVX1-NEXT:    vxorps %xmm3, %xmm3, %xmm3
1271 ; XOPAVX1-NEXT:    vpcomeqw %xmm3, %xmm4, %xmm4
1272 ; XOPAVX1-NEXT:    vpcomeqw %xmm3, %xmm2, %xmm2
1273 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
1274 ; XOPAVX1-NEXT:    vpcmov %ymm2, %ymm1, %ymm0, %ymm0
1275 ; XOPAVX1-NEXT:    retq
1277 ; XOPAVX2-LABEL: splatvar_funnnel_v16i16:
1278 ; XOPAVX2:       # %bb.0:
1279 ; XOPAVX2-NEXT:    vpbroadcastw %xmm2, %ymm2
1280 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
1281 ; XOPAVX2-NEXT:    vpmovzxwq {{.*#+}} xmm3 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
1282 ; XOPAVX2-NEXT:    vpsllw %xmm3, %ymm0, %ymm3
1283 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm4 = [16,16,16,16,16,16,16,16]
1284 ; XOPAVX2-NEXT:    vpsubw %xmm2, %xmm4, %xmm4
1285 ; XOPAVX2-NEXT:    vpmovzxwq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1286 ; XOPAVX2-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1287 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
1288 ; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1289 ; XOPAVX2-NEXT:    vpcmpeqw %ymm3, %ymm2, %ymm2
1290 ; XOPAVX2-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1291 ; XOPAVX2-NEXT:    retq
1292   %splat = shufflevector <16 x i16> %amt, <16 x i16> undef, <16 x i32> zeroinitializer
1293   %res = call <16 x i16> @llvm.fshl.v16i16(<16 x i16> %x, <16 x i16> %y, <16 x i16> %splat)
1294   ret <16 x i16> %res
1297 define <32 x i8> @splatvar_funnnel_v32i8(<32 x i8> %x, <32 x i8> %y, <32 x i8> %amt) nounwind {
1298 ; AVX1-LABEL: splatvar_funnnel_v32i8:
1299 ; AVX1:       # %bb.0:
1300 ; AVX1-NEXT:    vpxor %xmm8, %xmm8, %xmm8
1301 ; AVX1-NEXT:    vpshufb %xmm8, %xmm2, %xmm2
1302 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm2, %ymm2
1303 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
1304 ; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm4 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero
1305 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
1306 ; AVX1-NEXT:    vpsllw %xmm4, %xmm5, %xmm5
1307 ; AVX1-NEXT:    vpcmpeqd %xmm9, %xmm9, %xmm9
1308 ; AVX1-NEXT:    vpsllw %xmm4, %xmm9, %xmm7
1309 ; AVX1-NEXT:    vpshufb %xmm8, %xmm7, %xmm7
1310 ; AVX1-NEXT:    vpand %xmm7, %xmm5, %xmm5
1311 ; AVX1-NEXT:    vpsllw %xmm4, %xmm0, %xmm4
1312 ; AVX1-NEXT:    vpand %xmm7, %xmm4, %xmm4
1313 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm4, %ymm4
1314 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
1315 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm10 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1316 ; AVX1-NEXT:    vpsubb %xmm5, %xmm10, %xmm3
1317 ; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,zero,zero,zero,zero,xmm3[1],zero,zero,zero,zero,zero,zero,zero
1318 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm6
1319 ; AVX1-NEXT:    vpsrlw %xmm3, %xmm6, %xmm6
1320 ; AVX1-NEXT:    vpsrlw %xmm3, %xmm9, %xmm3
1321 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1322 ; AVX1-NEXT:    vpshufb %xmm7, %xmm3, %xmm3
1323 ; AVX1-NEXT:    vpand %xmm3, %xmm6, %xmm3
1324 ; AVX1-NEXT:    vpsubb %xmm2, %xmm10, %xmm6
1325 ; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm6 = xmm6[0],zero,zero,zero,zero,zero,zero,zero,xmm6[1],zero,zero,zero,zero,zero,zero,zero
1326 ; AVX1-NEXT:    vpsrlw %xmm6, %xmm1, %xmm1
1327 ; AVX1-NEXT:    vpsrlw %xmm6, %xmm9, %xmm6
1328 ; AVX1-NEXT:    vpshufb %xmm7, %xmm6, %xmm6
1329 ; AVX1-NEXT:    vpand %xmm6, %xmm1, %xmm1
1330 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1331 ; AVX1-NEXT:    vorps %ymm1, %ymm4, %ymm1
1332 ; AVX1-NEXT:    vpcmpeqb %xmm8, %xmm5, %xmm3
1333 ; AVX1-NEXT:    vpcmpeqb %xmm8, %xmm2, %xmm2
1334 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
1335 ; AVX1-NEXT:    vandnps %ymm1, %ymm2, %ymm1
1336 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
1337 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1338 ; AVX1-NEXT:    retq
1340 ; AVX2-LABEL: splatvar_funnnel_v32i8:
1341 ; AVX2:       # %bb.0:
1342 ; AVX2-NEXT:    vpbroadcastb %xmm2, %ymm2
1343 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
1344 ; AVX2-NEXT:    vpmovzxbq {{.*#+}} xmm3 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero
1345 ; AVX2-NEXT:    vpsllw %xmm3, %ymm0, %ymm4
1346 ; AVX2-NEXT:    vpcmpeqd %ymm5, %ymm5, %ymm5
1347 ; AVX2-NEXT:    vpsllw %xmm3, %ymm5, %ymm3
1348 ; AVX2-NEXT:    vpbroadcastb %xmm3, %ymm3
1349 ; AVX2-NEXT:    vpand %ymm3, %ymm4, %ymm3
1350 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1351 ; AVX2-NEXT:    vpsubb %xmm2, %xmm4, %xmm4
1352 ; AVX2-NEXT:    vpmovzxbq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,zero,zero,zero,zero,xmm4[1],zero,zero,zero,zero,zero,zero,zero
1353 ; AVX2-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1354 ; AVX2-NEXT:    vpsrlw %xmm4, %ymm5, %ymm4
1355 ; AVX2-NEXT:    vpsrlw $8, %ymm4, %ymm4
1356 ; AVX2-NEXT:    vpbroadcastb %xmm4, %ymm4
1357 ; AVX2-NEXT:    vpand %ymm4, %ymm1, %ymm1
1358 ; AVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
1359 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1360 ; AVX2-NEXT:    vpcmpeqb %ymm3, %ymm2, %ymm2
1361 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1362 ; AVX2-NEXT:    retq
1364 ; AVX512F-LABEL: splatvar_funnnel_v32i8:
1365 ; AVX512F:       # %bb.0:
1366 ; AVX512F-NEXT:    vpbroadcastb %xmm2, %ymm2
1367 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
1368 ; AVX512F-NEXT:    vpmovzxbq {{.*#+}} xmm3 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero
1369 ; AVX512F-NEXT:    vpsllw %xmm3, %ymm0, %ymm4
1370 ; AVX512F-NEXT:    vpcmpeqd %ymm5, %ymm5, %ymm5
1371 ; AVX512F-NEXT:    vpsllw %xmm3, %ymm5, %ymm3
1372 ; AVX512F-NEXT:    vpbroadcastb %xmm3, %ymm3
1373 ; AVX512F-NEXT:    vpand %ymm3, %ymm4, %ymm3
1374 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1375 ; AVX512F-NEXT:    vpsubb %xmm2, %xmm4, %xmm4
1376 ; AVX512F-NEXT:    vpmovzxbq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,zero,zero,zero,zero,xmm4[1],zero,zero,zero,zero,zero,zero,zero
1377 ; AVX512F-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1378 ; AVX512F-NEXT:    vpsrlw %xmm4, %ymm5, %ymm4
1379 ; AVX512F-NEXT:    vpsrlw $8, %ymm4, %ymm4
1380 ; AVX512F-NEXT:    vpbroadcastb %xmm4, %ymm4
1381 ; AVX512F-NEXT:    vpand %ymm4, %ymm1, %ymm1
1382 ; AVX512F-NEXT:    vpor %ymm1, %ymm3, %ymm1
1383 ; AVX512F-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1384 ; AVX512F-NEXT:    vpcmpeqb %ymm3, %ymm2, %ymm2
1385 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1386 ; AVX512F-NEXT:    retq
1388 ; AVX512VL-LABEL: splatvar_funnnel_v32i8:
1389 ; AVX512VL:       # %bb.0:
1390 ; AVX512VL-NEXT:    vpbroadcastb %xmm2, %ymm2
1391 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
1392 ; AVX512VL-NEXT:    vpmovzxbq {{.*#+}} xmm3 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero
1393 ; AVX512VL-NEXT:    vpsllw %xmm3, %ymm0, %ymm4
1394 ; AVX512VL-NEXT:    vpcmpeqd %ymm5, %ymm5, %ymm5
1395 ; AVX512VL-NEXT:    vpsllw %xmm3, %ymm5, %ymm3
1396 ; AVX512VL-NEXT:    vpbroadcastb %xmm3, %ymm3
1397 ; AVX512VL-NEXT:    vpand %ymm3, %ymm4, %ymm3
1398 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1399 ; AVX512VL-NEXT:    vpsubb %xmm2, %xmm4, %xmm4
1400 ; AVX512VL-NEXT:    vpmovzxbq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,zero,zero,zero,zero,xmm4[1],zero,zero,zero,zero,zero,zero,zero
1401 ; AVX512VL-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1402 ; AVX512VL-NEXT:    vpsrlw %xmm4, %ymm5, %ymm4
1403 ; AVX512VL-NEXT:    vpsrlw $8, %ymm4, %ymm4
1404 ; AVX512VL-NEXT:    vpbroadcastb %xmm4, %ymm4
1405 ; AVX512VL-NEXT:    vpand %ymm4, %ymm1, %ymm1
1406 ; AVX512VL-NEXT:    vpor %ymm1, %ymm3, %ymm1
1407 ; AVX512VL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1408 ; AVX512VL-NEXT:    vpcmpeqb %ymm3, %ymm2, %ymm2
1409 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1410 ; AVX512VL-NEXT:    retq
1412 ; AVX512BW-LABEL: splatvar_funnnel_v32i8:
1413 ; AVX512BW:       # %bb.0:
1414 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1415 ; AVX512BW-NEXT:    vpbroadcastb %xmm2, %ymm2
1416 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1417 ; AVX512BW-NEXT:    vpand %ymm3, %ymm2, %ymm4
1418 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm5 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero,ymm4[16],zero,ymm4[17],zero,ymm4[18],zero,ymm4[19],zero,ymm4[20],zero,ymm4[21],zero,ymm4[22],zero,ymm4[23],zero,ymm4[24],zero,ymm4[25],zero,ymm4[26],zero,ymm4[27],zero,ymm4[28],zero,ymm4[29],zero,ymm4[30],zero,ymm4[31],zero
1419 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm6 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
1420 ; AVX512BW-NEXT:    vpsllvw %zmm5, %zmm6, %zmm5
1421 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm6 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1422 ; AVX512BW-NEXT:    vpsubb %ymm4, %ymm6, %ymm4
1423 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm4 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero,ymm4[16],zero,ymm4[17],zero,ymm4[18],zero,ymm4[19],zero,ymm4[20],zero,ymm4[21],zero,ymm4[22],zero,ymm4[23],zero,ymm4[24],zero,ymm4[25],zero,ymm4[26],zero,ymm4[27],zero,ymm4[28],zero,ymm4[29],zero,ymm4[30],zero,ymm4[31],zero
1424 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
1425 ; AVX512BW-NEXT:    vpsrlvw %zmm4, %zmm1, %zmm1
1426 ; AVX512BW-NEXT:    vporq %zmm1, %zmm5, %zmm1
1427 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
1428 ; AVX512BW-NEXT:    vptestnmb %zmm3, %zmm2, %k1
1429 ; AVX512BW-NEXT:    vmovdqu8 %zmm0, %zmm1 {%k1}
1430 ; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm0
1431 ; AVX512BW-NEXT:    retq
1433 ; AVX512VLBW-LABEL: splatvar_funnnel_v32i8:
1434 ; AVX512VLBW:       # %bb.0:
1435 ; AVX512VLBW-NEXT:    vpbroadcastb %xmm2, %ymm2
1436 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} ymm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1437 ; AVX512VLBW-NEXT:    vpand %ymm3, %ymm2, %ymm4
1438 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm5 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero,ymm4[16],zero,ymm4[17],zero,ymm4[18],zero,ymm4[19],zero,ymm4[20],zero,ymm4[21],zero,ymm4[22],zero,ymm4[23],zero,ymm4[24],zero,ymm4[25],zero,ymm4[26],zero,ymm4[27],zero,ymm4[28],zero,ymm4[29],zero,ymm4[30],zero,ymm4[31],zero
1439 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm6 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
1440 ; AVX512VLBW-NEXT:    vpsllvw %zmm5, %zmm6, %zmm5
1441 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} ymm6 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1442 ; AVX512VLBW-NEXT:    vpsubb %ymm4, %ymm6, %ymm4
1443 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm4 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero,ymm4[16],zero,ymm4[17],zero,ymm4[18],zero,ymm4[19],zero,ymm4[20],zero,ymm4[21],zero,ymm4[22],zero,ymm4[23],zero,ymm4[24],zero,ymm4[25],zero,ymm4[26],zero,ymm4[27],zero,ymm4[28],zero,ymm4[29],zero,ymm4[30],zero,ymm4[31],zero
1444 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
1445 ; AVX512VLBW-NEXT:    vpsrlvw %zmm4, %zmm1, %zmm1
1446 ; AVX512VLBW-NEXT:    vporq %zmm1, %zmm5, %zmm1
1447 ; AVX512VLBW-NEXT:    vpmovwb %zmm1, %ymm1
1448 ; AVX512VLBW-NEXT:    vptestnmb %ymm3, %ymm2, %k1
1449 ; AVX512VLBW-NEXT:    vmovdqu8 %ymm0, %ymm1 {%k1}
1450 ; AVX512VLBW-NEXT:    vmovdqa %ymm1, %ymm0
1451 ; AVX512VLBW-NEXT:    retq
1453 ; XOPAVX1-LABEL: splatvar_funnnel_v32i8:
1454 ; XOPAVX1:       # %bb.0:
1455 ; XOPAVX1-NEXT:    vpxor %xmm8, %xmm8, %xmm8
1456 ; XOPAVX1-NEXT:    vpshufb %xmm8, %xmm2, %xmm2
1457 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm2, %ymm2
1458 ; XOPAVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
1459 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1460 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
1461 ; XOPAVX1-NEXT:    vpshlb %xmm4, %xmm5, %xmm5
1462 ; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm0, %xmm6
1463 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm6, %ymm5
1464 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1465 ; XOPAVX1-NEXT:    vpsubb %xmm6, %xmm4, %xmm7
1466 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1467 ; XOPAVX1-NEXT:    vpshlb %xmm7, %xmm3, %xmm3
1468 ; XOPAVX1-NEXT:    vpsubb %xmm6, %xmm2, %xmm6
1469 ; XOPAVX1-NEXT:    vpshlb %xmm6, %xmm1, %xmm1
1470 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1471 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm5, %ymm1
1472 ; XOPAVX1-NEXT:    vpcomeqb %xmm8, %xmm4, %xmm3
1473 ; XOPAVX1-NEXT:    vpcomeqb %xmm8, %xmm2, %xmm2
1474 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
1475 ; XOPAVX1-NEXT:    vpcmov %ymm2, %ymm1, %ymm0, %ymm0
1476 ; XOPAVX1-NEXT:    retq
1478 ; XOPAVX2-LABEL: splatvar_funnnel_v32i8:
1479 ; XOPAVX2:       # %bb.0:
1480 ; XOPAVX2-NEXT:    vpbroadcastb %xmm2, %ymm2
1481 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
1482 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
1483 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm2, %xmm4
1484 ; XOPAVX2-NEXT:    vpshlb %xmm4, %xmm3, %xmm3
1485 ; XOPAVX2-NEXT:    vpshlb %xmm2, %xmm0, %xmm4
1486 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm3, %ymm4, %ymm3
1487 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1488 ; XOPAVX2-NEXT:    vpsubb %ymm2, %ymm4, %ymm4
1489 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm4, %xmm5
1490 ; XOPAVX2-NEXT:    vpxor %xmm6, %xmm6, %xmm6
1491 ; XOPAVX2-NEXT:    vpsubb %xmm5, %xmm6, %xmm5
1492 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm7
1493 ; XOPAVX2-NEXT:    vpshlb %xmm5, %xmm7, %xmm5
1494 ; XOPAVX2-NEXT:    vpsubb %xmm4, %xmm6, %xmm4
1495 ; XOPAVX2-NEXT:    vpshlb %xmm4, %xmm1, %xmm1
1496 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm5, %ymm1, %ymm1
1497 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
1498 ; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1499 ; XOPAVX2-NEXT:    vpcmpeqb %ymm3, %ymm2, %ymm2
1500 ; XOPAVX2-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1501 ; XOPAVX2-NEXT:    retq
1502   %splat = shufflevector <32 x i8> %amt, <32 x i8> undef, <32 x i32> zeroinitializer
1503   %res = call <32 x i8> @llvm.fshl.v32i8(<32 x i8> %x, <32 x i8> %y, <32 x i8> %splat)
1504   ret <32 x i8> %res
1508 ; Constant Shifts
1511 define <4 x i64> @constant_funnnel_v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
1512 ; AVX1-LABEL: constant_funnnel_v4i64:
1513 ; AVX1:       # %bb.0:
1514 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1515 ; AVX1-NEXT:    vpsrlq $4, %xmm2, %xmm3
1516 ; AVX1-NEXT:    vpsrlq $14, %xmm2, %xmm2
1517 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm3[4,5,6,7]
1518 ; AVX1-NEXT:    vpsrlq $50, %xmm1, %xmm3
1519 ; AVX1-NEXT:    vpsrlq $60, %xmm1, %xmm1
1520 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm3[4,5,6,7]
1521 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1522 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1523 ; AVX1-NEXT:    vpsllq $60, %xmm2, %xmm3
1524 ; AVX1-NEXT:    vpsllq $50, %xmm2, %xmm2
1525 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm3[4,5,6,7]
1526 ; AVX1-NEXT:    vpsllq $14, %xmm0, %xmm3
1527 ; AVX1-NEXT:    vpsllq $4, %xmm0, %xmm0
1528 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]
1529 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1530 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1531 ; AVX1-NEXT:    retq
1533 ; AVX2-LABEL: constant_funnnel_v4i64:
1534 ; AVX2:       # %bb.0:
1535 ; AVX2-NEXT:    vpsrlvq {{.*}}(%rip), %ymm1, %ymm1
1536 ; AVX2-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
1537 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1538 ; AVX2-NEXT:    retq
1540 ; AVX512-LABEL: constant_funnnel_v4i64:
1541 ; AVX512:       # %bb.0:
1542 ; AVX512-NEXT:    vpsrlvq {{.*}}(%rip), %ymm1, %ymm1
1543 ; AVX512-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
1544 ; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
1545 ; AVX512-NEXT:    retq
1547 ; XOPAVX1-LABEL: constant_funnnel_v4i64:
1548 ; XOPAVX1:       # %bb.0:
1549 ; XOPAVX1-NEXT:    vpshlq {{.*}}(%rip), %xmm1, %xmm2
1550 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1551 ; XOPAVX1-NEXT:    vpshlq {{.*}}(%rip), %xmm1, %xmm1
1552 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
1553 ; XOPAVX1-NEXT:    vpshlq {{.*}}(%rip), %xmm0, %xmm2
1554 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1555 ; XOPAVX1-NEXT:    vpshlq {{.*}}(%rip), %xmm0, %xmm0
1556 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
1557 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1558 ; XOPAVX1-NEXT:    retq
1560 ; XOPAVX2-LABEL: constant_funnnel_v4i64:
1561 ; XOPAVX2:       # %bb.0:
1562 ; XOPAVX2-NEXT:    vpsrlvq {{.*}}(%rip), %ymm1, %ymm1
1563 ; XOPAVX2-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
1564 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1565 ; XOPAVX2-NEXT:    retq
1566   %res = call <4 x i64> @llvm.fshl.v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> <i64 4, i64 14, i64 50, i64 60>)
1567   ret <4 x i64> %res
1570 define <8 x i32> @constant_funnnel_v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
1571 ; AVX1-LABEL: constant_funnnel_v8i32:
1572 ; AVX1:       # %bb.0:
1573 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1574 ; AVX1-NEXT:    vpsrld $21, %xmm2, %xmm3
1575 ; AVX1-NEXT:    vpsrld $23, %xmm2, %xmm4
1576 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
1577 ; AVX1-NEXT:    vpsrld $22, %xmm2, %xmm4
1578 ; AVX1-NEXT:    vpsrld $24, %xmm2, %xmm2
1579 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm4[4,5,6,7]
1580 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
1581 ; AVX1-NEXT:    vpsrld $25, %xmm1, %xmm3
1582 ; AVX1-NEXT:    vpsrld $27, %xmm1, %xmm4
1583 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
1584 ; AVX1-NEXT:    vpsrld $26, %xmm1, %xmm4
1585 ; AVX1-NEXT:    vpsrld $28, %xmm1, %xmm1
1586 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm4[4,5,6,7]
1587 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]
1588 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1589 ; AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm2
1590 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1591 ; AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm0
1592 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
1593 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1594 ; AVX1-NEXT:    retq
1596 ; AVX2-LABEL: constant_funnnel_v8i32:
1597 ; AVX2:       # %bb.0:
1598 ; AVX2-NEXT:    vpsrlvd {{.*}}(%rip), %ymm1, %ymm1
1599 ; AVX2-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
1600 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1601 ; AVX2-NEXT:    retq
1603 ; AVX512-LABEL: constant_funnnel_v8i32:
1604 ; AVX512:       # %bb.0:
1605 ; AVX512-NEXT:    vpsrlvd {{.*}}(%rip), %ymm1, %ymm1
1606 ; AVX512-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
1607 ; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
1608 ; AVX512-NEXT:    retq
1610 ; XOPAVX1-LABEL: constant_funnnel_v8i32:
1611 ; XOPAVX1:       # %bb.0:
1612 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm1, %xmm2
1613 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1614 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm1, %xmm1
1615 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
1616 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm2
1617 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1618 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm0
1619 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
1620 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1621 ; XOPAVX1-NEXT:    retq
1623 ; XOPAVX2-LABEL: constant_funnnel_v8i32:
1624 ; XOPAVX2:       # %bb.0:
1625 ; XOPAVX2-NEXT:    vpsrlvd {{.*}}(%rip), %ymm1, %ymm1
1626 ; XOPAVX2-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
1627 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1628 ; XOPAVX2-NEXT:    retq
1629   %res = call <8 x i32> @llvm.fshl.v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11>)
1630   ret <8 x i32> %res
1633 define <16 x i16> @constant_funnnel_v16i16(<16 x i16> %x, <16 x i16> %y) nounwind {
1634 ; AVX1-LABEL: constant_funnnel_v16i16:
1635 ; AVX1:       # %bb.0:
1636 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1637 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [256,512,1024,2048,4096,8192,16384,32768]
1638 ; AVX1-NEXT:    vpmulhuw %xmm3, %xmm2, %xmm2
1639 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128]
1640 ; AVX1-NEXT:    vpmulhuw %xmm4, %xmm1, %xmm1
1641 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1642 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1643 ; AVX1-NEXT:    vpmullw %xmm3, %xmm2, %xmm2
1644 ; AVX1-NEXT:    vpmullw %xmm4, %xmm0, %xmm3
1645 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
1646 ; AVX1-NEXT:    vorps %ymm1, %ymm2, %ymm1
1647 ; AVX1-NEXT:    vmovaps {{.*#+}} ymm2 = [0,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535]
1648 ; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
1649 ; AVX1-NEXT:    vandnps %ymm0, %ymm2, %ymm0
1650 ; AVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
1651 ; AVX1-NEXT:    retq
1653 ; AVX2-LABEL: constant_funnnel_v16i16:
1654 ; AVX2:       # %bb.0:
1655 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
1656 ; AVX2-NEXT:    vpmulhuw %ymm2, %ymm1, %ymm1
1657 ; AVX2-NEXT:    vpmullw %ymm2, %ymm0, %ymm2
1658 ; AVX2-NEXT:    vpor %ymm1, %ymm2, %ymm1
1659 ; AVX2-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7],ymm0[8],ymm1[9,10,11,12,13,14,15]
1660 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
1661 ; AVX2-NEXT:    retq
1663 ; AVX512F-LABEL: constant_funnnel_v16i16:
1664 ; AVX512F:       # %bb.0:
1665 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
1666 ; AVX512F-NEXT:    vpmulhuw %ymm2, %ymm1, %ymm1
1667 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm0, %ymm2
1668 ; AVX512F-NEXT:    vpor %ymm1, %ymm2, %ymm1
1669 ; AVX512F-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7],ymm0[8],ymm1[9,10,11,12,13,14,15]
1670 ; AVX512F-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
1671 ; AVX512F-NEXT:    retq
1673 ; AVX512VL-LABEL: constant_funnnel_v16i16:
1674 ; AVX512VL:       # %bb.0:
1675 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
1676 ; AVX512VL-NEXT:    vpmulhuw %ymm2, %ymm1, %ymm1
1677 ; AVX512VL-NEXT:    vpmullw %ymm2, %ymm0, %ymm2
1678 ; AVX512VL-NEXT:    vpor %ymm1, %ymm2, %ymm1
1679 ; AVX512VL-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7],ymm0[8],ymm1[9,10,11,12,13,14,15]
1680 ; AVX512VL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
1681 ; AVX512VL-NEXT:    retq
1683 ; AVX512BW-LABEL: constant_funnnel_v16i16:
1684 ; AVX512BW:       # %bb.0:
1685 ; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1686 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1687 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm2 = [16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1]
1688 ; AVX512BW-NEXT:    vpsrlvw %zmm2, %zmm1, %zmm1
1689 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
1690 ; AVX512BW-NEXT:    vpsllvw %zmm2, %zmm0, %zmm2
1691 ; AVX512BW-NEXT:    vpor %ymm1, %ymm2, %ymm1
1692 ; AVX512BW-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7],ymm0[8],ymm1[9,10,11,12,13,14,15]
1693 ; AVX512BW-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
1694 ; AVX512BW-NEXT:    retq
1696 ; AVX512VLBW-LABEL: constant_funnnel_v16i16:
1697 ; AVX512VLBW:       # %bb.0:
1698 ; AVX512VLBW-NEXT:    vpsrlvw {{.*}}(%rip), %ymm1, %ymm1
1699 ; AVX512VLBW-NEXT:    vpsllvw {{.*}}(%rip), %ymm0, %ymm2
1700 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm2, %ymm1
1701 ; AVX512VLBW-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7],ymm0[8],ymm1[9,10,11,12,13,14,15]
1702 ; AVX512VLBW-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
1703 ; AVX512VLBW-NEXT:    retq
1705 ; XOPAVX1-LABEL: constant_funnnel_v16i16:
1706 ; XOPAVX1:       # %bb.0:
1707 ; XOPAVX1-NEXT:    vpshlw {{.*}}(%rip), %xmm1, %xmm2
1708 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1709 ; XOPAVX1-NEXT:    vpshlw {{.*}}(%rip), %xmm1, %xmm1
1710 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
1711 ; XOPAVX1-NEXT:    vpshlw {{.*}}(%rip), %xmm0, %xmm2
1712 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1713 ; XOPAVX1-NEXT:    vpshlw {{.*}}(%rip), %xmm3, %xmm3
1714 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
1715 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm2, %ymm1
1716 ; XOPAVX1-NEXT:    vpcmov {{.*}}(%rip), %ymm0, %ymm1, %ymm0
1717 ; XOPAVX1-NEXT:    retq
1719 ; XOPAVX2-LABEL: constant_funnnel_v16i16:
1720 ; XOPAVX2:       # %bb.0:
1721 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
1722 ; XOPAVX2-NEXT:    vpmulhuw %ymm2, %ymm1, %ymm1
1723 ; XOPAVX2-NEXT:    vpmullw %ymm2, %ymm0, %ymm2
1724 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm2, %ymm1
1725 ; XOPAVX2-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7],ymm0[8],ymm1[9,10,11,12,13,14,15]
1726 ; XOPAVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
1727 ; XOPAVX2-NEXT:    retq
1728   %res = call <16 x i16> @llvm.fshl.v16i16(<16 x i16> %x, <16 x i16> %y, <16 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>)
1729   ret <16 x i16> %res
1732 define <32 x i8> @constant_funnnel_v32i8(<32 x i8> %x, <32 x i8> %y) nounwind {
1733 ; AVX1-LABEL: constant_funnnel_v32i8:
1734 ; AVX1:       # %bb.0:
1735 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1736 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1737 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm2[8],xmm3[8],xmm2[9],xmm3[9],xmm2[10],xmm3[10],xmm2[11],xmm3[11],xmm2[12],xmm3[12],xmm2[13],xmm3[13],xmm2[14],xmm3[14],xmm2[15],xmm3[15]
1738 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [1,128,64,32,16,8,4,2]
1739 ; AVX1-NEXT:    vpmullw %xmm5, %xmm4, %xmm4
1740 ; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm4
1741 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
1742 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [1,2,4,8,16,32,64,128]
1743 ; AVX1-NEXT:    vpmullw %xmm6, %xmm2, %xmm2
1744 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
1745 ; AVX1-NEXT:    vpackuswb %xmm4, %xmm2, %xmm2
1746 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = 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]
1747 ; AVX1-NEXT:    vpmullw %xmm5, %xmm3, %xmm3
1748 ; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
1749 ; 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
1750 ; AVX1-NEXT:    vpmullw %xmm6, %xmm1, %xmm1
1751 ; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1
1752 ; AVX1-NEXT:    vpackuswb %xmm3, %xmm1, %xmm1
1753 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1754 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1755 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
1756 ; AVX1-NEXT:    vpmullw %xmm5, %xmm3, %xmm3
1757 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
1758 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
1759 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
1760 ; AVX1-NEXT:    vpmullw %xmm6, %xmm2, %xmm2
1761 ; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
1762 ; AVX1-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
1763 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1764 ; AVX1-NEXT:    vpmullw %xmm5, %xmm3, %xmm3
1765 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
1766 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1767 ; AVX1-NEXT:    vpmullw %xmm6, %xmm5, %xmm5
1768 ; AVX1-NEXT:    vpand %xmm4, %xmm5, %xmm4
1769 ; AVX1-NEXT:    vpackuswb %xmm3, %xmm4, %xmm3
1770 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
1771 ; AVX1-NEXT:    vorps %ymm1, %ymm2, %ymm1
1772 ; AVX1-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [NaN,NaN,NaN,NaN]
1773 ; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
1774 ; AVX1-NEXT:    vandnps %ymm0, %ymm2, %ymm0
1775 ; AVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
1776 ; AVX1-NEXT:    retq
1778 ; AVX2-LABEL: constant_funnnel_v32i8:
1779 ; AVX2:       # %bb.0:
1780 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm2
1781 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
1782 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [8192,24640,41088,57536,57344,41152,24704,8256,8192,24640,41088,57536,57344,41152,24704,8256]
1783 ; AVX2-NEXT:    vpblendvb %ymm3, %ymm2, %ymm0, %ymm2
1784 ; AVX2-NEXT:    vpsllw $2, %ymm2, %ymm4
1785 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
1786 ; AVX2-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
1787 ; AVX2-NEXT:    vpblendvb %ymm3, %ymm4, %ymm2, %ymm2
1788 ; AVX2-NEXT:    vpaddb %ymm2, %ymm2, %ymm4
1789 ; AVX2-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
1790 ; AVX2-NEXT:    vpblendvb %ymm3, %ymm4, %ymm2, %ymm2
1791 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1792 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm1[8],ymm3[8],ymm1[9],ymm3[9],ymm1[10],ymm3[10],ymm1[11],ymm3[11],ymm1[12],ymm3[12],ymm1[13],ymm3[13],ymm1[14],ymm3[14],ymm1[15],ymm3[15],ymm1[24],ymm3[24],ymm1[25],ymm3[25],ymm1[26],ymm3[26],ymm1[27],ymm3[27],ymm1[28],ymm3[28],ymm1[29],ymm3[29],ymm1[30],ymm3[30],ymm1[31],ymm3[31]
1793 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm4, %ymm4
1794 ; AVX2-NEXT:    vpsrlw $8, %ymm4, %ymm4
1795 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm3[0],ymm1[1],ymm3[1],ymm1[2],ymm3[2],ymm1[3],ymm3[3],ymm1[4],ymm3[4],ymm1[5],ymm3[5],ymm1[6],ymm3[6],ymm1[7],ymm3[7],ymm1[16],ymm3[16],ymm1[17],ymm3[17],ymm1[18],ymm3[18],ymm1[19],ymm3[19],ymm1[20],ymm3[20],ymm1[21],ymm3[21],ymm1[22],ymm3[22],ymm1[23],ymm3[23]
1796 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
1797 ; AVX2-NEXT:    vpsrlw $8, %ymm1, %ymm1
1798 ; AVX2-NEXT:    vpackuswb %ymm4, %ymm1, %ymm1
1799 ; AVX2-NEXT:    vpor %ymm1, %ymm2, %ymm1
1800 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255]
1801 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
1802 ; AVX2-NEXT:    retq
1804 ; AVX512F-LABEL: constant_funnnel_v32i8:
1805 ; AVX512F:       # %bb.0:
1806 ; AVX512F-NEXT:    vpsllw $4, %ymm0, %ymm2
1807 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
1808 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm3 = [8192,24640,41088,57536,57344,41152,24704,8256,8192,24640,41088,57536,57344,41152,24704,8256]
1809 ; AVX512F-NEXT:    vpblendvb %ymm3, %ymm2, %ymm0, %ymm2
1810 ; AVX512F-NEXT:    vpsllw $2, %ymm2, %ymm4
1811 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
1812 ; AVX512F-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
1813 ; AVX512F-NEXT:    vpblendvb %ymm3, %ymm4, %ymm2, %ymm2
1814 ; AVX512F-NEXT:    vpaddb %ymm2, %ymm2, %ymm4
1815 ; AVX512F-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
1816 ; AVX512F-NEXT:    vpblendvb %ymm3, %ymm4, %ymm2, %ymm2
1817 ; AVX512F-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1818 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm1[8],ymm3[8],ymm1[9],ymm3[9],ymm1[10],ymm3[10],ymm1[11],ymm3[11],ymm1[12],ymm3[12],ymm1[13],ymm3[13],ymm1[14],ymm3[14],ymm1[15],ymm3[15],ymm1[24],ymm3[24],ymm1[25],ymm3[25],ymm1[26],ymm3[26],ymm1[27],ymm3[27],ymm1[28],ymm3[28],ymm1[29],ymm3[29],ymm1[30],ymm3[30],ymm1[31],ymm3[31]
1819 ; AVX512F-NEXT:    vpmullw {{.*}}(%rip), %ymm4, %ymm4
1820 ; AVX512F-NEXT:    vpsrlw $8, %ymm4, %ymm4
1821 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm3[0],ymm1[1],ymm3[1],ymm1[2],ymm3[2],ymm1[3],ymm3[3],ymm1[4],ymm3[4],ymm1[5],ymm3[5],ymm1[6],ymm3[6],ymm1[7],ymm3[7],ymm1[16],ymm3[16],ymm1[17],ymm3[17],ymm1[18],ymm3[18],ymm1[19],ymm3[19],ymm1[20],ymm3[20],ymm1[21],ymm3[21],ymm1[22],ymm3[22],ymm1[23],ymm3[23]
1822 ; AVX512F-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
1823 ; AVX512F-NEXT:    vpsrlw $8, %ymm1, %ymm1
1824 ; AVX512F-NEXT:    vpackuswb %ymm4, %ymm1, %ymm1
1825 ; AVX512F-NEXT:    vpor %ymm1, %ymm2, %ymm1
1826 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255]
1827 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
1828 ; AVX512F-NEXT:    retq
1830 ; AVX512VL-LABEL: constant_funnnel_v32i8:
1831 ; AVX512VL:       # %bb.0:
1832 ; AVX512VL-NEXT:    vpsllw $4, %ymm0, %ymm2
1833 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
1834 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm3 = [8192,24640,41088,57536,57344,41152,24704,8256,8192,24640,41088,57536,57344,41152,24704,8256]
1835 ; AVX512VL-NEXT:    vpblendvb %ymm3, %ymm2, %ymm0, %ymm2
1836 ; AVX512VL-NEXT:    vpsllw $2, %ymm2, %ymm4
1837 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
1838 ; AVX512VL-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
1839 ; AVX512VL-NEXT:    vpblendvb %ymm3, %ymm4, %ymm2, %ymm2
1840 ; AVX512VL-NEXT:    vpaddb %ymm2, %ymm2, %ymm4
1841 ; AVX512VL-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
1842 ; AVX512VL-NEXT:    vpblendvb %ymm3, %ymm4, %ymm2, %ymm2
1843 ; AVX512VL-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
1844 ; AVX512VL-NEXT:    vpsrlw $8, %ymm3, %ymm3
1845 ; AVX512VL-NEXT:    vpmullw {{.*}}(%rip), %ymm3, %ymm3
1846 ; AVX512VL-NEXT:    vpsrlw $8, %ymm3, %ymm3
1847 ; AVX512VL-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
1848 ; AVX512VL-NEXT:    vpsrlw $8, %ymm1, %ymm1
1849 ; AVX512VL-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
1850 ; AVX512VL-NEXT:    vpsrlw $8, %ymm1, %ymm1
1851 ; AVX512VL-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
1852 ; AVX512VL-NEXT:    vpor %ymm1, %ymm2, %ymm1
1853 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255]
1854 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
1855 ; AVX512VL-NEXT:    retq
1857 ; AVX512BW-LABEL: constant_funnnel_v32i8:
1858 ; AVX512BW:       # %bb.0:
1859 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
1860 ; AVX512BW-NEXT:    vpsrlvw {{.*}}(%rip), %zmm1, %zmm1
1861 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm2 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
1862 ; AVX512BW-NEXT:    vpsllvw {{.*}}(%rip), %zmm2, %zmm2
1863 ; AVX512BW-NEXT:    vporq %zmm1, %zmm2, %zmm1
1864 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
1865 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255]
1866 ; AVX512BW-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
1867 ; AVX512BW-NEXT:    retq
1869 ; AVX512VLBW-LABEL: constant_funnnel_v32i8:
1870 ; AVX512VLBW:       # %bb.0:
1871 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
1872 ; AVX512VLBW-NEXT:    vpsrlvw {{.*}}(%rip), %zmm1, %zmm1
1873 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm2 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
1874 ; AVX512VLBW-NEXT:    vpsllvw {{.*}}(%rip), %zmm2, %zmm2
1875 ; AVX512VLBW-NEXT:    vporq %zmm1, %zmm2, %zmm1
1876 ; AVX512VLBW-NEXT:    vpmovwb %zmm1, %ymm1
1877 ; AVX512VLBW-NEXT:    movl $16843009, %eax # imm = 0x1010101
1878 ; AVX512VLBW-NEXT:    kmovd %eax, %k1
1879 ; AVX512VLBW-NEXT:    vmovdqu8 %ymm0, %ymm1 {%k1}
1880 ; AVX512VLBW-NEXT:    vmovdqa %ymm1, %ymm0
1881 ; AVX512VLBW-NEXT:    retq
1883 ; XOPAVX1-LABEL: constant_funnnel_v32i8:
1884 ; XOPAVX1:       # %bb.0:
1885 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1886 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [248,249,250,251,252,253,254,255,248,255,254,253,252,251,250,249]
1887 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm2, %xmm2
1888 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm1, %xmm1
1889 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1890 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1891 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,2,3,4,5,6,7,0,7,6,5,4,3,2,1]
1892 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm2, %xmm2
1893 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm0, %xmm3
1894 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
1895 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm2, %ymm1
1896 ; XOPAVX1-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [NaN,NaN,NaN,NaN]
1897 ; XOPAVX1-NEXT:    vpcmov %ymm2, %ymm0, %ymm1, %ymm0
1898 ; XOPAVX1-NEXT:    retq
1900 ; XOPAVX2-LABEL: constant_funnnel_v32i8:
1901 ; XOPAVX2:       # %bb.0:
1902 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
1903 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [248,249,250,251,252,253,254,255,248,255,254,253,252,251,250,249]
1904 ; XOPAVX2-NEXT:    vpshlb %xmm3, %xmm2, %xmm2
1905 ; XOPAVX2-NEXT:    vpshlb %xmm3, %xmm1, %xmm1
1906 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
1907 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
1908 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,2,3,4,5,6,7,0,7,6,5,4,3,2,1]
1909 ; XOPAVX2-NEXT:    vpshlb %xmm3, %xmm2, %xmm2
1910 ; XOPAVX2-NEXT:    vpshlb %xmm3, %xmm0, %xmm3
1911 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm3, %ymm2
1912 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm2, %ymm1
1913 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255]
1914 ; XOPAVX2-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
1915 ; XOPAVX2-NEXT:    retq
1916   %res = call <32 x i8> @llvm.fshl.v32i8(<32 x i8> %x, <32 x i8> %y, <32 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1>)
1917   ret <32 x i8> %res
1921 ; Uniform Constant Shifts
1924 define <4 x i64> @splatconstant_funnnel_v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
1925 ; AVX1-LABEL: splatconstant_funnnel_v4i64:
1926 ; AVX1:       # %bb.0:
1927 ; AVX1-NEXT:    vpsrlq $50, %xmm1, %xmm2
1928 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1929 ; AVX1-NEXT:    vpsrlq $50, %xmm1, %xmm1
1930 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
1931 ; AVX1-NEXT:    vpsllq $14, %xmm0, %xmm2
1932 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1933 ; AVX1-NEXT:    vpsllq $14, %xmm0, %xmm0
1934 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
1935 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1936 ; AVX1-NEXT:    retq
1938 ; AVX2-LABEL: splatconstant_funnnel_v4i64:
1939 ; AVX2:       # %bb.0:
1940 ; AVX2-NEXT:    vpsrlq $50, %ymm1, %ymm1
1941 ; AVX2-NEXT:    vpsllq $14, %ymm0, %ymm0
1942 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1943 ; AVX2-NEXT:    retq
1945 ; AVX512-LABEL: splatconstant_funnnel_v4i64:
1946 ; AVX512:       # %bb.0:
1947 ; AVX512-NEXT:    vpsrlq $50, %ymm1, %ymm1
1948 ; AVX512-NEXT:    vpsllq $14, %ymm0, %ymm0
1949 ; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
1950 ; AVX512-NEXT:    retq
1952 ; XOPAVX1-LABEL: splatconstant_funnnel_v4i64:
1953 ; XOPAVX1:       # %bb.0:
1954 ; XOPAVX1-NEXT:    vpsrlq $50, %xmm1, %xmm2
1955 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1956 ; XOPAVX1-NEXT:    vpsrlq $50, %xmm1, %xmm1
1957 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
1958 ; XOPAVX1-NEXT:    vpsllq $14, %xmm0, %xmm2
1959 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1960 ; XOPAVX1-NEXT:    vpsllq $14, %xmm0, %xmm0
1961 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
1962 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1963 ; XOPAVX1-NEXT:    retq
1965 ; XOPAVX2-LABEL: splatconstant_funnnel_v4i64:
1966 ; XOPAVX2:       # %bb.0:
1967 ; XOPAVX2-NEXT:    vpsrlq $50, %ymm1, %ymm1
1968 ; XOPAVX2-NEXT:    vpsllq $14, %ymm0, %ymm0
1969 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1970 ; XOPAVX2-NEXT:    retq
1971   %res = call <4 x i64> @llvm.fshl.v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> <i64 14, i64 14, i64 14, i64 14>)
1972   ret <4 x i64> %res
1975 define <8 x i32> @splatconstant_funnnel_v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
1976 ; AVX1-LABEL: splatconstant_funnnel_v8i32:
1977 ; AVX1:       # %bb.0:
1978 ; AVX1-NEXT:    vpsrld $28, %xmm1, %xmm2
1979 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1980 ; AVX1-NEXT:    vpsrld $28, %xmm1, %xmm1
1981 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
1982 ; AVX1-NEXT:    vpslld $4, %xmm0, %xmm2
1983 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1984 ; AVX1-NEXT:    vpslld $4, %xmm0, %xmm0
1985 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
1986 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1987 ; AVX1-NEXT:    retq
1989 ; AVX2-LABEL: splatconstant_funnnel_v8i32:
1990 ; AVX2:       # %bb.0:
1991 ; AVX2-NEXT:    vpsrld $28, %ymm1, %ymm1
1992 ; AVX2-NEXT:    vpslld $4, %ymm0, %ymm0
1993 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1994 ; AVX2-NEXT:    retq
1996 ; AVX512-LABEL: splatconstant_funnnel_v8i32:
1997 ; AVX512:       # %bb.0:
1998 ; AVX512-NEXT:    vpsrld $28, %ymm1, %ymm1
1999 ; AVX512-NEXT:    vpslld $4, %ymm0, %ymm0
2000 ; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
2001 ; AVX512-NEXT:    retq
2003 ; XOPAVX1-LABEL: splatconstant_funnnel_v8i32:
2004 ; XOPAVX1:       # %bb.0:
2005 ; XOPAVX1-NEXT:    vpsrld $28, %xmm1, %xmm2
2006 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2007 ; XOPAVX1-NEXT:    vpsrld $28, %xmm1, %xmm1
2008 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
2009 ; XOPAVX1-NEXT:    vpslld $4, %xmm0, %xmm2
2010 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2011 ; XOPAVX1-NEXT:    vpslld $4, %xmm0, %xmm0
2012 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
2013 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2014 ; XOPAVX1-NEXT:    retq
2016 ; XOPAVX2-LABEL: splatconstant_funnnel_v8i32:
2017 ; XOPAVX2:       # %bb.0:
2018 ; XOPAVX2-NEXT:    vpsrld $28, %ymm1, %ymm1
2019 ; XOPAVX2-NEXT:    vpslld $4, %ymm0, %ymm0
2020 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2021 ; XOPAVX2-NEXT:    retq
2022   %res = call <8 x i32> @llvm.fshl.v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i32> <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>)
2023   ret <8 x i32> %res
2026 define <16 x i16> @splatconstant_funnnel_v16i16(<16 x i16> %x, <16 x i16> %y) nounwind {
2027 ; AVX1-LABEL: splatconstant_funnnel_v16i16:
2028 ; AVX1:       # %bb.0:
2029 ; AVX1-NEXT:    vpsrlw $9, %xmm1, %xmm2
2030 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2031 ; AVX1-NEXT:    vpsrlw $9, %xmm1, %xmm1
2032 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
2033 ; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm2
2034 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2035 ; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
2036 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
2037 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2038 ; AVX1-NEXT:    retq
2040 ; AVX2-LABEL: splatconstant_funnnel_v16i16:
2041 ; AVX2:       # %bb.0:
2042 ; AVX2-NEXT:    vpsrlw $9, %ymm1, %ymm1
2043 ; AVX2-NEXT:    vpsllw $7, %ymm0, %ymm0
2044 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2045 ; AVX2-NEXT:    retq
2047 ; AVX512-LABEL: splatconstant_funnnel_v16i16:
2048 ; AVX512:       # %bb.0:
2049 ; AVX512-NEXT:    vpsrlw $9, %ymm1, %ymm1
2050 ; AVX512-NEXT:    vpsllw $7, %ymm0, %ymm0
2051 ; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
2052 ; AVX512-NEXT:    retq
2054 ; XOPAVX1-LABEL: splatconstant_funnnel_v16i16:
2055 ; XOPAVX1:       # %bb.0:
2056 ; XOPAVX1-NEXT:    vpsrlw $9, %xmm1, %xmm2
2057 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2058 ; XOPAVX1-NEXT:    vpsrlw $9, %xmm1, %xmm1
2059 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
2060 ; XOPAVX1-NEXT:    vpsllw $7, %xmm0, %xmm2
2061 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2062 ; XOPAVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
2063 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
2064 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2065 ; XOPAVX1-NEXT:    retq
2067 ; XOPAVX2-LABEL: splatconstant_funnnel_v16i16:
2068 ; XOPAVX2:       # %bb.0:
2069 ; XOPAVX2-NEXT:    vpsrlw $9, %ymm1, %ymm1
2070 ; XOPAVX2-NEXT:    vpsllw $7, %ymm0, %ymm0
2071 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2072 ; XOPAVX2-NEXT:    retq
2073   %res = call <16 x i16> @llvm.fshl.v16i16(<16 x i16> %x, <16 x i16> %y, <16 x i16> <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>)
2074   ret <16 x i16> %res
2077 define <32 x i8> @splatconstant_funnnel_v32i8(<32 x i8> %x, <32 x i8> %y) nounwind {
2078 ; AVX1-LABEL: splatconstant_funnnel_v32i8:
2079 ; AVX1:       # %bb.0:
2080 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2081 ; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm2
2082 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
2083 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
2084 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
2085 ; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
2086 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2087 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2088 ; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm2
2089 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
2090 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
2091 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm0
2092 ; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
2093 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2094 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2095 ; AVX1-NEXT:    retq
2097 ; AVX2-LABEL: splatconstant_funnnel_v32i8:
2098 ; AVX2:       # %bb.0:
2099 ; AVX2-NEXT:    vpsrlw $4, %ymm1, %ymm1
2100 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
2101 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm0
2102 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
2103 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2104 ; AVX2-NEXT:    retq
2106 ; AVX512-LABEL: splatconstant_funnnel_v32i8:
2107 ; AVX512:       # %bb.0:
2108 ; AVX512-NEXT:    vpsrlw $4, %ymm1, %ymm1
2109 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
2110 ; AVX512-NEXT:    vpsllw $4, %ymm0, %ymm0
2111 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
2112 ; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
2113 ; AVX512-NEXT:    retq
2115 ; XOPAVX1-LABEL: splatconstant_funnnel_v32i8:
2116 ; XOPAVX1:       # %bb.0:
2117 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2118 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
2119 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm2, %xmm2
2120 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm1, %xmm1
2121 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2122 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2123 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4]
2124 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm2, %xmm2
2125 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm0, %xmm0
2126 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2127 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2128 ; XOPAVX1-NEXT:    retq
2130 ; XOPAVX2-LABEL: splatconstant_funnnel_v32i8:
2131 ; XOPAVX2:       # %bb.0:
2132 ; XOPAVX2-NEXT:    vpsrlw $4, %ymm1, %ymm1
2133 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
2134 ; XOPAVX2-NEXT:    vpsllw $4, %ymm0, %ymm0
2135 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
2136 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2137 ; XOPAVX2-NEXT:    retq
2138   %res = call <32 x i8> @llvm.fshl.v32i8(<32 x i8> %x, <32 x i8> %y, <32 x i8> <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>)
2139   ret <32 x i8> %res