[X86] X86DAGToDAGISel - attempt to merge XMM/YMM loads with YMM/ZMM loads of the...
[llvm-project.git] / llvm / test / CodeGen / X86 / vector-fshl-256.ll
blob790c9d013efac47a9546d713e2cf8424233f40a6
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=AVX1
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX2
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX512F
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=AVX512VL
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512BW
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vbmi,+avx512vbmi2 | FileCheck %s --check-prefixes=AVX512VBMI2
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512VLBW
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vbmi,+avx512vbmi2,+avx512vl | FileCheck %s --check-prefixes=AVX512VLVBMI2
10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefixes=XOPAVX1
11 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefixes=XOPAVX2
13 declare <4 x i64> @llvm.fshl.v4i64(<4 x i64>, <4 x i64>, <4 x i64>)
14 declare <8 x i32> @llvm.fshl.v8i32(<8 x i32>, <8 x i32>, <8 x i32>)
15 declare <16 x i16> @llvm.fshl.v16i16(<16 x i16>, <16 x i16>, <16 x i16>)
16 declare <32 x i8> @llvm.fshl.v32i8(<32 x i8>, <32 x i8>, <32 x i8>)
19 ; Variable Shifts
22 define <4 x i64> @var_funnnel_v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> %amt) nounwind {
23 ; AVX1-LABEL: var_funnnel_v4i64:
24 ; AVX1:       # %bb.0:
25 ; AVX1-NEXT:    vbroadcastsd {{.*#+}} ymm3 = [63,63,63,63]
26 ; AVX1-NEXT:    vandnps %ymm3, %ymm2, %ymm4
27 ; AVX1-NEXT:    vextractf128 $1, %ymm4, %xmm5
28 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm6
29 ; AVX1-NEXT:    vpsrlq $1, %xmm6, %xmm6
30 ; AVX1-NEXT:    vpsrlq %xmm5, %xmm6, %xmm7
31 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm5[2,3,2,3]
32 ; AVX1-NEXT:    vpsrlq %xmm5, %xmm6, %xmm5
33 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm5 = xmm7[0,1,2,3],xmm5[4,5,6,7]
34 ; AVX1-NEXT:    vpsrlq $1, %xmm1, %xmm1
35 ; AVX1-NEXT:    vpsrlq %xmm4, %xmm1, %xmm6
36 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[2,3,2,3]
37 ; AVX1-NEXT:    vpsrlq %xmm4, %xmm1, %xmm1
38 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm6[0,1,2,3],xmm1[4,5,6,7]
39 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm1, %ymm1
40 ; AVX1-NEXT:    vandps %ymm3, %ymm2, %ymm2
41 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
42 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
43 ; AVX1-NEXT:    vpsllq %xmm3, %xmm4, %xmm5
44 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]
45 ; AVX1-NEXT:    vpsllq %xmm3, %xmm4, %xmm3
46 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm5[0,1,2,3],xmm3[4,5,6,7]
47 ; AVX1-NEXT:    vpsllq %xmm2, %xmm0, %xmm4
48 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]
49 ; AVX1-NEXT:    vpsllq %xmm2, %xmm0, %xmm0
50 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm4[0,1,2,3],xmm0[4,5,6,7]
51 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
52 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
53 ; AVX1-NEXT:    retq
55 ; AVX2-LABEL: var_funnnel_v4i64:
56 ; AVX2:       # %bb.0:
57 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
58 ; AVX2-NEXT:    vpandn %ymm3, %ymm2, %ymm4
59 ; AVX2-NEXT:    vpsrlq $1, %ymm1, %ymm1
60 ; AVX2-NEXT:    vpsrlvq %ymm4, %ymm1, %ymm1
61 ; AVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
62 ; AVX2-NEXT:    vpsllvq %ymm2, %ymm0, %ymm0
63 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
64 ; AVX2-NEXT:    retq
66 ; AVX512F-LABEL: var_funnnel_v4i64:
67 ; AVX512F:       # %bb.0:
68 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
69 ; AVX512F-NEXT:    vpandn %ymm3, %ymm2, %ymm4
70 ; AVX512F-NEXT:    vpsrlq $1, %ymm1, %ymm1
71 ; AVX512F-NEXT:    vpsrlvq %ymm4, %ymm1, %ymm1
72 ; AVX512F-NEXT:    vpand %ymm3, %ymm2, %ymm2
73 ; AVX512F-NEXT:    vpsllvq %ymm2, %ymm0, %ymm0
74 ; AVX512F-NEXT:    vpor %ymm1, %ymm0, %ymm0
75 ; AVX512F-NEXT:    retq
77 ; AVX512VL-LABEL: var_funnnel_v4i64:
78 ; AVX512VL:       # %bb.0:
79 ; AVX512VL-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
80 ; AVX512VL-NEXT:    vpandn %ymm3, %ymm2, %ymm4
81 ; AVX512VL-NEXT:    vpsrlq $1, %ymm1, %ymm1
82 ; AVX512VL-NEXT:    vpsrlvq %ymm4, %ymm1, %ymm1
83 ; AVX512VL-NEXT:    vpand %ymm3, %ymm2, %ymm2
84 ; AVX512VL-NEXT:    vpsllvq %ymm2, %ymm0, %ymm0
85 ; AVX512VL-NEXT:    vpor %ymm1, %ymm0, %ymm0
86 ; AVX512VL-NEXT:    retq
88 ; AVX512BW-LABEL: var_funnnel_v4i64:
89 ; AVX512BW:       # %bb.0:
90 ; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
91 ; AVX512BW-NEXT:    vpandn %ymm3, %ymm2, %ymm4
92 ; AVX512BW-NEXT:    vpsrlq $1, %ymm1, %ymm1
93 ; AVX512BW-NEXT:    vpsrlvq %ymm4, %ymm1, %ymm1
94 ; AVX512BW-NEXT:    vpand %ymm3, %ymm2, %ymm2
95 ; AVX512BW-NEXT:    vpsllvq %ymm2, %ymm0, %ymm0
96 ; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm0
97 ; AVX512BW-NEXT:    retq
99 ; AVX512VBMI2-LABEL: var_funnnel_v4i64:
100 ; AVX512VBMI2:       # %bb.0:
101 ; AVX512VBMI2-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
102 ; AVX512VBMI2-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
103 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
104 ; AVX512VBMI2-NEXT:    vpshldvq %zmm2, %zmm1, %zmm0
105 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
106 ; AVX512VBMI2-NEXT:    retq
108 ; AVX512VLBW-LABEL: var_funnnel_v4i64:
109 ; AVX512VLBW:       # %bb.0:
110 ; AVX512VLBW-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
111 ; AVX512VLBW-NEXT:    vpandn %ymm3, %ymm2, %ymm4
112 ; AVX512VLBW-NEXT:    vpsrlq $1, %ymm1, %ymm1
113 ; AVX512VLBW-NEXT:    vpsrlvq %ymm4, %ymm1, %ymm1
114 ; AVX512VLBW-NEXT:    vpand %ymm3, %ymm2, %ymm2
115 ; AVX512VLBW-NEXT:    vpsllvq %ymm2, %ymm0, %ymm0
116 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm0
117 ; AVX512VLBW-NEXT:    retq
119 ; AVX512VLVBMI2-LABEL: var_funnnel_v4i64:
120 ; AVX512VLVBMI2:       # %bb.0:
121 ; AVX512VLVBMI2-NEXT:    vpshldvq %ymm2, %ymm1, %ymm0
122 ; AVX512VLVBMI2-NEXT:    retq
124 ; XOPAVX1-LABEL: var_funnnel_v4i64:
125 ; XOPAVX1:       # %bb.0:
126 ; XOPAVX1-NEXT:    vbroadcastsd {{.*#+}} ymm3 = [63,63,63,63]
127 ; XOPAVX1-NEXT:    vandps %ymm3, %ymm2, %ymm4
128 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm4, %xmm5
129 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
130 ; XOPAVX1-NEXT:    vpshlq %xmm5, %xmm6, %xmm5
131 ; XOPAVX1-NEXT:    vpshlq %xmm4, %xmm0, %xmm0
132 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm0, %ymm0
133 ; XOPAVX1-NEXT:    vandnps %ymm3, %ymm2, %ymm2
134 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
135 ; XOPAVX1-NEXT:    vpxor %xmm4, %xmm4, %xmm4
136 ; XOPAVX1-NEXT:    vpsubq %xmm3, %xmm4, %xmm3
137 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
138 ; XOPAVX1-NEXT:    vpsrlq $1, %xmm5, %xmm5
139 ; XOPAVX1-NEXT:    vpshlq %xmm3, %xmm5, %xmm3
140 ; XOPAVX1-NEXT:    vpsubq %xmm2, %xmm4, %xmm2
141 ; XOPAVX1-NEXT:    vpsrlq $1, %xmm1, %xmm1
142 ; XOPAVX1-NEXT:    vpshlq %xmm2, %xmm1, %xmm1
143 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
144 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
145 ; XOPAVX1-NEXT:    retq
147 ; XOPAVX2-LABEL: var_funnnel_v4i64:
148 ; XOPAVX2:       # %bb.0:
149 ; XOPAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
150 ; XOPAVX2-NEXT:    vpandn %ymm3, %ymm2, %ymm4
151 ; XOPAVX2-NEXT:    vpsrlq $1, %ymm1, %ymm1
152 ; XOPAVX2-NEXT:    vpsrlvq %ymm4, %ymm1, %ymm1
153 ; XOPAVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
154 ; XOPAVX2-NEXT:    vpsllvq %ymm2, %ymm0, %ymm0
155 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
156 ; XOPAVX2-NEXT:    retq
157   %res = call <4 x i64> @llvm.fshl.v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> %amt)
158   ret <4 x i64> %res
161 define <8 x i32> @var_funnnel_v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i32> %amt) nounwind {
162 ; AVX1-LABEL: var_funnnel_v8i32:
163 ; AVX1:       # %bb.0:
164 ; AVX1-NEXT:    vbroadcastss {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
165 ; AVX1-NEXT:    vandps %ymm3, %ymm2, %ymm2
166 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
167 ; AVX1-NEXT:    vxorps %xmm3, %xmm4, %xmm5
168 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm6 = xmm5[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
169 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
170 ; AVX1-NEXT:    vpsrld $1, %xmm7, %xmm7
171 ; AVX1-NEXT:    vpsrld %xmm6, %xmm7, %xmm6
172 ; AVX1-NEXT:    vpsrlq $32, %xmm5, %xmm8
173 ; AVX1-NEXT:    vpsrld %xmm8, %xmm7, %xmm8
174 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm6 = xmm8[0,1,2,3],xmm6[4,5,6,7]
175 ; AVX1-NEXT:    vpxor %xmm8, %xmm8, %xmm8
176 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm9 = xmm5[2],xmm8[2],xmm5[3],xmm8[3]
177 ; AVX1-NEXT:    vpsrld %xmm9, %xmm7, %xmm9
178 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm5 = xmm5[0],zero,xmm5[1],zero
179 ; AVX1-NEXT:    vpsrld %xmm5, %xmm7, %xmm5
180 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm5 = xmm5[0,1,2,3],xmm9[4,5,6,7]
181 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm5 = xmm5[0,1],xmm6[2,3],xmm5[4,5],xmm6[6,7]
182 ; AVX1-NEXT:    vpslld $23, %xmm4, %xmm4
183 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm6 = [1065353216,1065353216,1065353216,1065353216]
184 ; AVX1-NEXT:    vpaddd %xmm6, %xmm4, %xmm4
185 ; AVX1-NEXT:    vcvttps2dq %xmm4, %xmm4
186 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
187 ; AVX1-NEXT:    vpmulld %xmm4, %xmm7, %xmm4
188 ; AVX1-NEXT:    vpor %xmm5, %xmm4, %xmm4
189 ; AVX1-NEXT:    vxorps %xmm3, %xmm2, %xmm3
190 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm5 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
191 ; AVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
192 ; AVX1-NEXT:    vpsrld %xmm5, %xmm1, %xmm5
193 ; AVX1-NEXT:    vpsrlq $32, %xmm3, %xmm7
194 ; AVX1-NEXT:    vpsrld %xmm7, %xmm1, %xmm7
195 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm5 = xmm7[0,1,2,3],xmm5[4,5,6,7]
196 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm7 = xmm3[2],xmm8[2],xmm3[3],xmm8[3]
197 ; AVX1-NEXT:    vpsrld %xmm7, %xmm1, %xmm7
198 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero
199 ; AVX1-NEXT:    vpsrld %xmm3, %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],xmm5[2,3],xmm1[4,5],xmm5[6,7]
202 ; AVX1-NEXT:    vpslld $23, %xmm2, %xmm2
203 ; AVX1-NEXT:    vpaddd %xmm6, %xmm2, %xmm2
204 ; AVX1-NEXT:    vcvttps2dq %xmm2, %xmm2
205 ; AVX1-NEXT:    vpmulld %xmm2, %xmm0, %xmm0
206 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
207 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
208 ; AVX1-NEXT:    retq
210 ; AVX2-LABEL: var_funnnel_v8i32:
211 ; AVX2:       # %bb.0:
212 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
213 ; AVX2-NEXT:    vpandn %ymm3, %ymm2, %ymm4
214 ; AVX2-NEXT:    vpsrld $1, %ymm1, %ymm1
215 ; AVX2-NEXT:    vpsrlvd %ymm4, %ymm1, %ymm1
216 ; AVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
217 ; AVX2-NEXT:    vpsllvd %ymm2, %ymm0, %ymm0
218 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
219 ; AVX2-NEXT:    retq
221 ; AVX512F-LABEL: var_funnnel_v8i32:
222 ; AVX512F:       # %bb.0:
223 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
224 ; AVX512F-NEXT:    vpandn %ymm3, %ymm2, %ymm4
225 ; AVX512F-NEXT:    vpsrld $1, %ymm1, %ymm1
226 ; AVX512F-NEXT:    vpsrlvd %ymm4, %ymm1, %ymm1
227 ; AVX512F-NEXT:    vpand %ymm3, %ymm2, %ymm2
228 ; AVX512F-NEXT:    vpsllvd %ymm2, %ymm0, %ymm0
229 ; AVX512F-NEXT:    vpor %ymm1, %ymm0, %ymm0
230 ; AVX512F-NEXT:    retq
232 ; AVX512VL-LABEL: var_funnnel_v8i32:
233 ; AVX512VL:       # %bb.0:
234 ; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
235 ; AVX512VL-NEXT:    vpandn %ymm3, %ymm2, %ymm4
236 ; AVX512VL-NEXT:    vpsrld $1, %ymm1, %ymm1
237 ; AVX512VL-NEXT:    vpsrlvd %ymm4, %ymm1, %ymm1
238 ; AVX512VL-NEXT:    vpand %ymm3, %ymm2, %ymm2
239 ; AVX512VL-NEXT:    vpsllvd %ymm2, %ymm0, %ymm0
240 ; AVX512VL-NEXT:    vpor %ymm1, %ymm0, %ymm0
241 ; AVX512VL-NEXT:    retq
243 ; AVX512BW-LABEL: var_funnnel_v8i32:
244 ; AVX512BW:       # %bb.0:
245 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
246 ; AVX512BW-NEXT:    vpandn %ymm3, %ymm2, %ymm4
247 ; AVX512BW-NEXT:    vpsrld $1, %ymm1, %ymm1
248 ; AVX512BW-NEXT:    vpsrlvd %ymm4, %ymm1, %ymm1
249 ; AVX512BW-NEXT:    vpand %ymm3, %ymm2, %ymm2
250 ; AVX512BW-NEXT:    vpsllvd %ymm2, %ymm0, %ymm0
251 ; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm0
252 ; AVX512BW-NEXT:    retq
254 ; AVX512VBMI2-LABEL: var_funnnel_v8i32:
255 ; AVX512VBMI2:       # %bb.0:
256 ; AVX512VBMI2-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
257 ; AVX512VBMI2-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
258 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
259 ; AVX512VBMI2-NEXT:    vpshldvd %zmm2, %zmm1, %zmm0
260 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
261 ; AVX512VBMI2-NEXT:    retq
263 ; AVX512VLBW-LABEL: var_funnnel_v8i32:
264 ; AVX512VLBW:       # %bb.0:
265 ; AVX512VLBW-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
266 ; AVX512VLBW-NEXT:    vpandn %ymm3, %ymm2, %ymm4
267 ; AVX512VLBW-NEXT:    vpsrld $1, %ymm1, %ymm1
268 ; AVX512VLBW-NEXT:    vpsrlvd %ymm4, %ymm1, %ymm1
269 ; AVX512VLBW-NEXT:    vpand %ymm3, %ymm2, %ymm2
270 ; AVX512VLBW-NEXT:    vpsllvd %ymm2, %ymm0, %ymm0
271 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm0
272 ; AVX512VLBW-NEXT:    retq
274 ; AVX512VLVBMI2-LABEL: var_funnnel_v8i32:
275 ; AVX512VLVBMI2:       # %bb.0:
276 ; AVX512VLVBMI2-NEXT:    vpshldvd %ymm2, %ymm1, %ymm0
277 ; AVX512VLVBMI2-NEXT:    retq
279 ; XOPAVX1-LABEL: var_funnnel_v8i32:
280 ; XOPAVX1:       # %bb.0:
281 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
282 ; XOPAVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
283 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
284 ; XOPAVX1-NEXT:    vpshld %xmm4, %xmm3, %xmm3
285 ; XOPAVX1-NEXT:    vbroadcastss {{.*#+}} xmm5 = [4294967265,4294967265,4294967265,4294967265]
286 ; XOPAVX1-NEXT:    vpaddd %xmm5, %xmm4, %xmm4
287 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm6
288 ; XOPAVX1-NEXT:    vpsrld $1, %xmm6, %xmm6
289 ; XOPAVX1-NEXT:    vpshld %xmm4, %xmm6, %xmm4
290 ; XOPAVX1-NEXT:    vpor %xmm4, %xmm3, %xmm3
291 ; XOPAVX1-NEXT:    vpshld %xmm2, %xmm0, %xmm0
292 ; XOPAVX1-NEXT:    vpaddd %xmm5, %xmm2, %xmm2
293 ; XOPAVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
294 ; XOPAVX1-NEXT:    vpshld %xmm2, %xmm1, %xmm1
295 ; XOPAVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
296 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
297 ; XOPAVX1-NEXT:    retq
299 ; XOPAVX2-LABEL: var_funnnel_v8i32:
300 ; XOPAVX2:       # %bb.0:
301 ; XOPAVX2-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
302 ; XOPAVX2-NEXT:    vpandn %ymm3, %ymm2, %ymm4
303 ; XOPAVX2-NEXT:    vpsrld $1, %ymm1, %ymm1
304 ; XOPAVX2-NEXT:    vpsrlvd %ymm4, %ymm1, %ymm1
305 ; XOPAVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
306 ; XOPAVX2-NEXT:    vpsllvd %ymm2, %ymm0, %ymm0
307 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
308 ; XOPAVX2-NEXT:    retq
309   %res = call <8 x i32> @llvm.fshl.v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i32> %amt)
310   ret <8 x i32> %res
313 define <16 x i16> @var_funnnel_v16i16(<16 x i16> %x, <16 x i16> %y, <16 x i16> %amt) nounwind {
314 ; AVX1-LABEL: var_funnnel_v16i16:
315 ; AVX1:       # %bb.0:
316 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
317 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
318 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm5 = xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]
319 ; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
320 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm6
321 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm7 = xmm6[4,4,5,5,6,6,7,7]
322 ; AVX1-NEXT:    vpslld $23, %xmm7, %xmm7
323 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm8 = [1065353216,1065353216,1065353216,1065353216]
324 ; AVX1-NEXT:    vpaddd %xmm7, %xmm8, %xmm7
325 ; AVX1-NEXT:    vcvttps2dq %xmm7, %xmm7
326 ; AVX1-NEXT:    vpmulld %xmm7, %xmm5, %xmm5
327 ; AVX1-NEXT:    vpsrld $16, %xmm5, %xmm5
328 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm3 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]
329 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm4 = xmm6[0],zero,xmm6[1],zero,xmm6[2],zero,xmm6[3],zero
330 ; AVX1-NEXT:    vpslld $23, %xmm4, %xmm4
331 ; AVX1-NEXT:    vpaddd %xmm4, %xmm8, %xmm4
332 ; AVX1-NEXT:    vcvttps2dq %xmm4, %xmm4
333 ; AVX1-NEXT:    vpmulld %xmm4, %xmm3, %xmm3
334 ; AVX1-NEXT:    vpsrld $16, %xmm3, %xmm3
335 ; AVX1-NEXT:    vpackusdw %xmm5, %xmm3, %xmm3
336 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm4 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
337 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm5 = xmm2[4,4,5,5,6,6,7,7]
338 ; AVX1-NEXT:    vpslld $23, %xmm5, %xmm5
339 ; AVX1-NEXT:    vpaddd %xmm5, %xmm8, %xmm5
340 ; AVX1-NEXT:    vcvttps2dq %xmm5, %xmm5
341 ; AVX1-NEXT:    vpmulld %xmm5, %xmm4, %xmm4
342 ; AVX1-NEXT:    vpsrld $16, %xmm4, %xmm4
343 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
344 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm1 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero
345 ; AVX1-NEXT:    vpslld $23, %xmm1, %xmm1
346 ; AVX1-NEXT:    vpaddd %xmm1, %xmm8, %xmm1
347 ; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1
348 ; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
349 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
350 ; AVX1-NEXT:    vpackusdw %xmm4, %xmm0, %xmm0
351 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
352 ; AVX1-NEXT:    retq
354 ; AVX2-LABEL: var_funnnel_v16i16:
355 ; AVX2:       # %bb.0:
356 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15]
357 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
358 ; AVX2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
359 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm5 = ymm2[4],ymm4[4],ymm2[5],ymm4[5],ymm2[6],ymm4[6],ymm2[7],ymm4[7],ymm2[12],ymm4[12],ymm2[13],ymm4[13],ymm2[14],ymm4[14],ymm2[15],ymm4[15]
360 ; AVX2-NEXT:    vpsllvd %ymm5, %ymm3, %ymm3
361 ; AVX2-NEXT:    vpsrld $16, %ymm3, %ymm3
362 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11]
363 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm1 = ymm2[0],ymm4[0],ymm2[1],ymm4[1],ymm2[2],ymm4[2],ymm2[3],ymm4[3],ymm2[8],ymm4[8],ymm2[9],ymm4[9],ymm2[10],ymm4[10],ymm2[11],ymm4[11]
364 ; AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm0
365 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
366 ; AVX2-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
367 ; AVX2-NEXT:    retq
369 ; AVX512F-LABEL: var_funnnel_v16i16:
370 ; AVX512F:       # %bb.0:
371 ; 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
372 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
373 ; AVX512F-NEXT:    vpslld $16, %zmm0, %zmm0
374 ; AVX512F-NEXT:    vpord %zmm1, %zmm0, %zmm0
375 ; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm1
376 ; 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
377 ; AVX512F-NEXT:    vpsllvd %zmm1, %zmm0, %zmm0
378 ; AVX512F-NEXT:    vpsrld $16, %zmm0, %zmm0
379 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
380 ; AVX512F-NEXT:    retq
382 ; AVX512VL-LABEL: var_funnnel_v16i16:
383 ; AVX512VL:       # %bb.0:
384 ; 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
385 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
386 ; AVX512VL-NEXT:    vpslld $16, %zmm0, %zmm0
387 ; AVX512VL-NEXT:    vpord %zmm1, %zmm0, %zmm0
388 ; AVX512VL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm2, %ymm1
389 ; 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
390 ; AVX512VL-NEXT:    vpsllvd %zmm1, %zmm0, %zmm0
391 ; AVX512VL-NEXT:    vpsrld $16, %zmm0, %zmm0
392 ; AVX512VL-NEXT:    vpmovdw %zmm0, %ymm0
393 ; AVX512VL-NEXT:    retq
395 ; AVX512BW-LABEL: var_funnnel_v16i16:
396 ; AVX512BW:       # %bb.0:
397 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
398 ; AVX512BW-NEXT:    vpbroadcastw {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
399 ; AVX512BW-NEXT:    vpandn %ymm3, %ymm2, %ymm4
400 ; AVX512BW-NEXT:    vpsrlw $1, %ymm1, %ymm1
401 ; AVX512BW-NEXT:    vpsrlvw %zmm4, %zmm1, %zmm1
402 ; AVX512BW-NEXT:    vpand %ymm3, %ymm2, %ymm2
403 ; AVX512BW-NEXT:    vpsllvw %zmm2, %zmm0, %zmm0
404 ; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm0
405 ; AVX512BW-NEXT:    retq
407 ; AVX512VBMI2-LABEL: var_funnnel_v16i16:
408 ; AVX512VBMI2:       # %bb.0:
409 ; AVX512VBMI2-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
410 ; AVX512VBMI2-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
411 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
412 ; AVX512VBMI2-NEXT:    vpshldvw %zmm2, %zmm1, %zmm0
413 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
414 ; AVX512VBMI2-NEXT:    retq
416 ; AVX512VLBW-LABEL: var_funnnel_v16i16:
417 ; AVX512VLBW:       # %bb.0:
418 ; AVX512VLBW-NEXT:    vpbroadcastw {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
419 ; AVX512VLBW-NEXT:    vpandn %ymm3, %ymm2, %ymm4
420 ; AVX512VLBW-NEXT:    vpsrlw $1, %ymm1, %ymm1
421 ; AVX512VLBW-NEXT:    vpsrlvw %ymm4, %ymm1, %ymm1
422 ; AVX512VLBW-NEXT:    vpand %ymm3, %ymm2, %ymm2
423 ; AVX512VLBW-NEXT:    vpsllvw %ymm2, %ymm0, %ymm0
424 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm0
425 ; AVX512VLBW-NEXT:    retq
427 ; AVX512VLVBMI2-LABEL: var_funnnel_v16i16:
428 ; AVX512VLVBMI2:       # %bb.0:
429 ; AVX512VLVBMI2-NEXT:    vpshldvw %ymm2, %ymm1, %ymm0
430 ; AVX512VLVBMI2-NEXT:    retq
432 ; XOPAVX1-LABEL: var_funnnel_v16i16:
433 ; XOPAVX1:       # %bb.0:
434 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
435 ; XOPAVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
436 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
437 ; XOPAVX1-NEXT:    vpshlw %xmm4, %xmm3, %xmm3
438 ; XOPAVX1-NEXT:    vbroadcastss {{.*#+}} xmm5 = [65521,65521,65521,65521,65521,65521,65521,65521]
439 ; XOPAVX1-NEXT:    vpaddw %xmm5, %xmm4, %xmm4
440 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm6
441 ; XOPAVX1-NEXT:    vpsrlw $1, %xmm6, %xmm6
442 ; XOPAVX1-NEXT:    vpshlw %xmm4, %xmm6, %xmm4
443 ; XOPAVX1-NEXT:    vpor %xmm4, %xmm3, %xmm3
444 ; XOPAVX1-NEXT:    vpshlw %xmm2, %xmm0, %xmm0
445 ; XOPAVX1-NEXT:    vpaddw %xmm5, %xmm2, %xmm2
446 ; XOPAVX1-NEXT:    vpsrlw $1, %xmm1, %xmm1
447 ; XOPAVX1-NEXT:    vpshlw %xmm2, %xmm1, %xmm1
448 ; XOPAVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
449 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
450 ; XOPAVX1-NEXT:    retq
452 ; XOPAVX2-LABEL: var_funnnel_v16i16:
453 ; XOPAVX2:       # %bb.0:
454 ; XOPAVX2-NEXT:    vpbroadcastw {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
455 ; XOPAVX2-NEXT:    vpand %ymm3, %ymm2, %ymm4
456 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm4, %xmm5
457 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm6
458 ; XOPAVX2-NEXT:    vpshlw %xmm5, %xmm6, %xmm5
459 ; XOPAVX2-NEXT:    vpshlw %xmm4, %xmm0, %xmm0
460 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm5, %ymm0, %ymm0
461 ; XOPAVX2-NEXT:    vpandn %ymm3, %ymm2, %ymm2
462 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm2, %xmm3
463 ; XOPAVX2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
464 ; XOPAVX2-NEXT:    vpsubw %xmm3, %xmm4, %xmm3
465 ; XOPAVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
466 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm5
467 ; XOPAVX2-NEXT:    vpshlw %xmm3, %xmm5, %xmm3
468 ; XOPAVX2-NEXT:    vpsubw %xmm2, %xmm4, %xmm2
469 ; XOPAVX2-NEXT:    vpshlw %xmm2, %xmm1, %xmm1
470 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm3, %ymm1, %ymm1
471 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
472 ; XOPAVX2-NEXT:    retq
473   %res = call <16 x i16> @llvm.fshl.v16i16(<16 x i16> %x, <16 x i16> %y, <16 x i16> %amt)
474   ret <16 x i16> %res
477 define <32 x i8> @var_funnnel_v32i8(<32 x i8> %x, <32 x i8> %y, <32 x i8> %amt) nounwind {
478 ; AVX1-LABEL: var_funnnel_v32i8:
479 ; AVX1:       # %bb.0:
480 ; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
481 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
482 ; AVX1-NEXT:    vpxor %xmm5, %xmm5, %xmm5
483 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm4[8],xmm5[8],xmm4[9],xmm5[9],xmm4[10],xmm5[10],xmm4[11],xmm5[11],xmm4[12],xmm5[12],xmm4[13],xmm5[13],xmm4[14],xmm5[14],xmm4[15],xmm5[15]
484 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm3 = xmm6[4,4,5,5,6,6,7,7]
485 ; AVX1-NEXT:    vpslld $23, %xmm3, %xmm7
486 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]
487 ; AVX1-NEXT:    vpaddd %xmm3, %xmm7, %xmm7
488 ; AVX1-NEXT:    vcvttps2dq %xmm7, %xmm7
489 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm6 = xmm6[0],zero,xmm6[1],zero,xmm6[2],zero,xmm6[3],zero
490 ; AVX1-NEXT:    vpslld $23, %xmm6, %xmm6
491 ; AVX1-NEXT:    vpaddd %xmm3, %xmm6, %xmm6
492 ; AVX1-NEXT:    vcvttps2dq %xmm6, %xmm6
493 ; AVX1-NEXT:    vpackusdw %xmm7, %xmm6, %xmm6
494 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
495 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm8
496 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm9 = xmm8[8],xmm7[8],xmm8[9],xmm7[9],xmm8[10],xmm7[10],xmm8[11],xmm7[11],xmm8[12],xmm7[12],xmm8[13],xmm7[13],xmm8[14],xmm7[14],xmm8[15],xmm7[15]
497 ; AVX1-NEXT:    vpmullw %xmm6, %xmm9, %xmm6
498 ; AVX1-NEXT:    vpsrlw $8, %xmm6, %xmm6
499 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm9 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero,xmm4[2],zero,zero,zero,xmm4[3],zero,zero,zero
500 ; AVX1-NEXT:    vpslld $23, %xmm9, %xmm9
501 ; AVX1-NEXT:    vpaddd %xmm3, %xmm9, %xmm9
502 ; AVX1-NEXT:    vcvttps2dq %xmm9, %xmm9
503 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero
504 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm4 = xmm4[4,4,5,5,6,6,7,7]
505 ; AVX1-NEXT:    vpslld $23, %xmm4, %xmm4
506 ; AVX1-NEXT:    vpaddd %xmm3, %xmm4, %xmm4
507 ; AVX1-NEXT:    vcvttps2dq %xmm4, %xmm4
508 ; AVX1-NEXT:    vpackusdw %xmm4, %xmm9, %xmm4
509 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm7 = xmm8[0],xmm7[0],xmm8[1],xmm7[1],xmm8[2],xmm7[2],xmm8[3],xmm7[3],xmm8[4],xmm7[4],xmm8[5],xmm7[5],xmm8[6],xmm7[6],xmm8[7],xmm7[7]
510 ; AVX1-NEXT:    vpmullw %xmm4, %xmm7, %xmm4
511 ; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm4
512 ; AVX1-NEXT:    vpackuswb %xmm6, %xmm4, %xmm4
513 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm2[8],xmm5[8],xmm2[9],xmm5[9],xmm2[10],xmm5[10],xmm2[11],xmm5[11],xmm2[12],xmm5[12],xmm2[13],xmm5[13],xmm2[14],xmm5[14],xmm2[15],xmm5[15]
514 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm6 = xmm5[4,4,5,5,6,6,7,7]
515 ; AVX1-NEXT:    vpslld $23, %xmm6, %xmm6
516 ; AVX1-NEXT:    vpaddd %xmm3, %xmm6, %xmm6
517 ; AVX1-NEXT:    vcvttps2dq %xmm6, %xmm6
518 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero
519 ; AVX1-NEXT:    vpslld $23, %xmm5, %xmm5
520 ; AVX1-NEXT:    vpaddd %xmm3, %xmm5, %xmm5
521 ; AVX1-NEXT:    vcvttps2dq %xmm5, %xmm5
522 ; AVX1-NEXT:    vpackusdw %xmm6, %xmm5, %xmm5
523 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
524 ; AVX1-NEXT:    vpmullw %xmm5, %xmm6, %xmm5
525 ; AVX1-NEXT:    vpsrlw $8, %xmm5, %xmm5
526 ; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm6 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
527 ; AVX1-NEXT:    vpslld $23, %xmm6, %xmm6
528 ; AVX1-NEXT:    vpaddd %xmm3, %xmm6, %xmm6
529 ; AVX1-NEXT:    vcvttps2dq %xmm6, %xmm6
530 ; 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
531 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]
532 ; AVX1-NEXT:    vpslld $23, %xmm2, %xmm2
533 ; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm2
534 ; AVX1-NEXT:    vcvttps2dq %xmm2, %xmm2
535 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm6, %xmm2
536 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
537 ; AVX1-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
538 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
539 ; AVX1-NEXT:    vpackuswb %xmm5, %xmm0, %xmm0
540 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
541 ; AVX1-NEXT:    retq
543 ; AVX2-LABEL: var_funnnel_v32i8:
544 ; AVX2:       # %bb.0:
545 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
546 ; AVX2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
547 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm5 = ymm4[4],ymm3[4],ymm4[5],ymm3[5],ymm4[6],ymm3[6],ymm4[7],ymm3[7],ymm4[12],ymm3[12],ymm4[13],ymm3[13],ymm4[14],ymm3[14],ymm4[15],ymm3[15]
548 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
549 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm6 = ymm2[8],ymm4[8],ymm2[9],ymm4[9],ymm2[10],ymm4[10],ymm2[11],ymm4[11],ymm2[12],ymm4[12],ymm2[13],ymm4[13],ymm2[14],ymm4[14],ymm2[15],ymm4[15],ymm2[24],ymm4[24],ymm2[25],ymm4[25],ymm2[26],ymm4[26],ymm2[27],ymm4[27],ymm2[28],ymm4[28],ymm2[29],ymm4[29],ymm2[30],ymm4[30],ymm2[31],ymm4[31]
550 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm7 = ymm6[4],ymm4[4],ymm6[5],ymm4[5],ymm6[6],ymm4[6],ymm6[7],ymm4[7],ymm6[12],ymm4[12],ymm6[13],ymm4[13],ymm6[14],ymm4[14],ymm6[15],ymm4[15]
551 ; AVX2-NEXT:    vpsllvd %ymm7, %ymm5, %ymm5
552 ; AVX2-NEXT:    vpsrld $16, %ymm5, %ymm5
553 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm3 = ymm4[0],ymm3[0],ymm4[1],ymm3[1],ymm4[2],ymm3[2],ymm4[3],ymm3[3],ymm4[8],ymm3[8],ymm4[9],ymm3[9],ymm4[10],ymm3[10],ymm4[11],ymm3[11]
554 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm6 = ymm6[0],ymm4[0],ymm6[1],ymm4[1],ymm6[2],ymm4[2],ymm6[3],ymm4[3],ymm6[8],ymm4[8],ymm6[9],ymm4[9],ymm6[10],ymm4[10],ymm6[11],ymm4[11]
555 ; AVX2-NEXT:    vpsllvd %ymm6, %ymm3, %ymm3
556 ; AVX2-NEXT:    vpsrld $16, %ymm3, %ymm3
557 ; AVX2-NEXT:    vpackusdw %ymm5, %ymm3, %ymm3
558 ; AVX2-NEXT:    vpsrlw $8, %ymm3, %ymm3
559 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
560 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm1 = ymm4[4],ymm0[4],ymm4[5],ymm0[5],ymm4[6],ymm0[6],ymm4[7],ymm0[7],ymm4[12],ymm0[12],ymm4[13],ymm0[13],ymm4[14],ymm0[14],ymm4[15],ymm0[15]
561 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0],ymm4[0],ymm2[1],ymm4[1],ymm2[2],ymm4[2],ymm2[3],ymm4[3],ymm2[4],ymm4[4],ymm2[5],ymm4[5],ymm2[6],ymm4[6],ymm2[7],ymm4[7],ymm2[16],ymm4[16],ymm2[17],ymm4[17],ymm2[18],ymm4[18],ymm2[19],ymm4[19],ymm2[20],ymm4[20],ymm2[21],ymm4[21],ymm2[22],ymm4[22],ymm2[23],ymm4[23]
562 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm5 = ymm2[4],ymm4[4],ymm2[5],ymm4[5],ymm2[6],ymm4[6],ymm2[7],ymm4[7],ymm2[12],ymm4[12],ymm2[13],ymm4[13],ymm2[14],ymm4[14],ymm2[15],ymm4[15]
563 ; AVX2-NEXT:    vpsllvd %ymm5, %ymm1, %ymm1
564 ; AVX2-NEXT:    vpsrld $16, %ymm1, %ymm1
565 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm0 = ymm4[0],ymm0[0],ymm4[1],ymm0[1],ymm4[2],ymm0[2],ymm4[3],ymm0[3],ymm4[8],ymm0[8],ymm4[9],ymm0[9],ymm4[10],ymm0[10],ymm4[11],ymm0[11]
566 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm2 = ymm2[0],ymm4[0],ymm2[1],ymm4[1],ymm2[2],ymm4[2],ymm2[3],ymm4[3],ymm2[8],ymm4[8],ymm2[9],ymm4[9],ymm2[10],ymm4[10],ymm2[11],ymm4[11]
567 ; AVX2-NEXT:    vpsllvd %ymm2, %ymm0, %ymm0
568 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
569 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
570 ; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
571 ; AVX2-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
572 ; AVX2-NEXT:    retq
574 ; AVX512F-LABEL: var_funnnel_v32i8:
575 ; AVX512F:       # %bb.0:
576 ; AVX512F-NEXT:    vpbroadcastb {{.*#+}} 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]
577 ; AVX512F-NEXT:    vpandn %ymm3, %ymm2, %ymm4
578 ; AVX512F-NEXT:    vpsllw $5, %ymm4, %ymm4
579 ; AVX512F-NEXT:    vpsrlw $1, %ymm1, %ymm1
580 ; AVX512F-NEXT:    vpbroadcastb {{.*#+}} ymm5 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
581 ; AVX512F-NEXT:    vpand %ymm5, %ymm1, %ymm1
582 ; AVX512F-NEXT:    vpsrlw $4, %ymm1, %ymm6
583 ; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm6, %ymm6
584 ; AVX512F-NEXT:    vpblendvb %ymm4, %ymm6, %ymm1, %ymm1
585 ; AVX512F-NEXT:    vpsrlw $2, %ymm1, %ymm6
586 ; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm6, %ymm6
587 ; AVX512F-NEXT:    vpaddb %ymm4, %ymm4, %ymm4
588 ; AVX512F-NEXT:    vpblendvb %ymm4, %ymm6, %ymm1, %ymm1
589 ; AVX512F-NEXT:    vpsrlw $1, %ymm1, %ymm6
590 ; AVX512F-NEXT:    vpand %ymm5, %ymm6, %ymm5
591 ; AVX512F-NEXT:    vpaddb %ymm4, %ymm4, %ymm4
592 ; AVX512F-NEXT:    vpblendvb %ymm4, %ymm5, %ymm1, %ymm1
593 ; AVX512F-NEXT:    vpand %ymm3, %ymm2, %ymm2
594 ; AVX512F-NEXT:    vpsllw $5, %ymm2, %ymm2
595 ; AVX512F-NEXT:    vpaddb %ymm2, %ymm2, %ymm3
596 ; AVX512F-NEXT:    vpsllw $4, %ymm0, %ymm4
597 ; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4
598 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm4, %ymm0, %ymm0
599 ; AVX512F-NEXT:    vpsllw $2, %ymm0, %ymm2
600 ; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
601 ; AVX512F-NEXT:    vpblendvb %ymm3, %ymm2, %ymm0, %ymm0
602 ; AVX512F-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
603 ; AVX512F-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
604 ; AVX512F-NEXT:    vpblendvb %ymm3, %ymm2, %ymm0, %ymm0
605 ; AVX512F-NEXT:    vpor %ymm1, %ymm0, %ymm0
606 ; AVX512F-NEXT:    retq
608 ; AVX512VL-LABEL: var_funnnel_v32i8:
609 ; AVX512VL:       # %bb.0:
610 ; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} 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]
611 ; AVX512VL-NEXT:    vpandn %ymm3, %ymm2, %ymm4
612 ; AVX512VL-NEXT:    vpsllw $5, %ymm4, %ymm4
613 ; AVX512VL-NEXT:    vpsrlw $1, %ymm1, %ymm1
614 ; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} ymm5 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
615 ; AVX512VL-NEXT:    vpand %ymm5, %ymm1, %ymm1
616 ; AVX512VL-NEXT:    vpsrlw $4, %ymm1, %ymm6
617 ; AVX512VL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm6, %ymm6
618 ; AVX512VL-NEXT:    vpblendvb %ymm4, %ymm6, %ymm1, %ymm1
619 ; AVX512VL-NEXT:    vpsrlw $2, %ymm1, %ymm6
620 ; AVX512VL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm6, %ymm6
621 ; AVX512VL-NEXT:    vpaddb %ymm4, %ymm4, %ymm4
622 ; AVX512VL-NEXT:    vpblendvb %ymm4, %ymm6, %ymm1, %ymm1
623 ; AVX512VL-NEXT:    vpsrlw $1, %ymm1, %ymm6
624 ; AVX512VL-NEXT:    vpand %ymm5, %ymm6, %ymm5
625 ; AVX512VL-NEXT:    vpaddb %ymm4, %ymm4, %ymm4
626 ; AVX512VL-NEXT:    vpblendvb %ymm4, %ymm5, %ymm1, %ymm1
627 ; AVX512VL-NEXT:    vpand %ymm3, %ymm2, %ymm2
628 ; AVX512VL-NEXT:    vpsllw $5, %ymm2, %ymm2
629 ; AVX512VL-NEXT:    vpaddb %ymm2, %ymm2, %ymm3
630 ; AVX512VL-NEXT:    vpsllw $4, %ymm0, %ymm4
631 ; AVX512VL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm4, %ymm4
632 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm4, %ymm0, %ymm0
633 ; AVX512VL-NEXT:    vpsllw $2, %ymm0, %ymm2
634 ; AVX512VL-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm2, %ymm2
635 ; AVX512VL-NEXT:    vpblendvb %ymm3, %ymm2, %ymm0, %ymm0
636 ; AVX512VL-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
637 ; AVX512VL-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
638 ; AVX512VL-NEXT:    vpblendvb %ymm3, %ymm2, %ymm0, %ymm0
639 ; AVX512VL-NEXT:    vpor %ymm1, %ymm0, %ymm0
640 ; AVX512VL-NEXT:    retq
642 ; AVX512BW-LABEL: var_funnnel_v32i8:
643 ; AVX512BW:       # %bb.0:
644 ; 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
645 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,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
646 ; AVX512BW-NEXT:    vpsllw $8, %zmm0, %zmm0
647 ; AVX512BW-NEXT:    vporq %zmm1, %zmm0, %zmm0
648 ; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm1
649 ; 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
650 ; AVX512BW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0
651 ; AVX512BW-NEXT:    vpsrlw $8, %zmm0, %zmm0
652 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
653 ; AVX512BW-NEXT:    retq
655 ; AVX512VBMI2-LABEL: var_funnnel_v32i8:
656 ; AVX512VBMI2:       # %bb.0:
657 ; AVX512VBMI2-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
658 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
659 ; AVX512VBMI2-NEXT:    vmovdqa64 {{.*#+}} zmm3 = [0,64,1,65,2,66,3,67,4,68,5,69,6,70,7,71,8,72,9,73,10,74,11,75,12,76,13,77,14,78,15,79,16,80,17,81,18,82,19,83,20,84,21,85,22,86,23,87,24,88,25,89,26,90,27,91,28,92,29,93,30,94,31,95]
660 ; AVX512VBMI2-NEXT:    vpermi2b %zmm0, %zmm1, %zmm3
661 ; AVX512VBMI2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm0
662 ; AVX512VBMI2-NEXT:    vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,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
663 ; AVX512VBMI2-NEXT:    vpsllvw %zmm0, %zmm3, %zmm0
664 ; AVX512VBMI2-NEXT:    vpsrlw $8, %zmm0, %zmm0
665 ; AVX512VBMI2-NEXT:    vpmovwb %zmm0, %ymm0
666 ; AVX512VBMI2-NEXT:    retq
668 ; AVX512VLBW-LABEL: var_funnnel_v32i8:
669 ; AVX512VLBW:       # %bb.0:
670 ; 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
671 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,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
672 ; AVX512VLBW-NEXT:    vpsllw $8, %zmm0, %zmm0
673 ; AVX512VLBW-NEXT:    vporq %zmm1, %zmm0, %zmm0
674 ; AVX512VLBW-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm2, %ymm1
675 ; 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
676 ; AVX512VLBW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm0
677 ; AVX512VLBW-NEXT:    vpsrlw $8, %zmm0, %zmm0
678 ; AVX512VLBW-NEXT:    vpmovwb %zmm0, %ymm0
679 ; AVX512VLBW-NEXT:    retq
681 ; AVX512VLVBMI2-LABEL: var_funnnel_v32i8:
682 ; AVX512VLVBMI2:       # %bb.0:
683 ; AVX512VLVBMI2-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
684 ; AVX512VLVBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
685 ; AVX512VLVBMI2-NEXT:    vmovdqa64 {{.*#+}} zmm3 = [0,64,1,65,2,66,3,67,4,68,5,69,6,70,7,71,8,72,9,73,10,74,11,75,12,76,13,77,14,78,15,79,16,80,17,81,18,82,19,83,20,84,21,85,22,86,23,87,24,88,25,89,26,90,27,91,28,92,29,93,30,94,31,95]
686 ; AVX512VLVBMI2-NEXT:    vpermi2b %zmm0, %zmm1, %zmm3
687 ; AVX512VLVBMI2-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm2, %ymm0
688 ; AVX512VLVBMI2-NEXT:    vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,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
689 ; AVX512VLVBMI2-NEXT:    vpsllvw %zmm0, %zmm3, %zmm0
690 ; AVX512VLVBMI2-NEXT:    vpsrlw $8, %zmm0, %zmm0
691 ; AVX512VLVBMI2-NEXT:    vpmovwb %zmm0, %ymm0
692 ; AVX512VLVBMI2-NEXT:    retq
694 ; XOPAVX1-LABEL: var_funnnel_v32i8:
695 ; XOPAVX1:       # %bb.0:
696 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
697 ; XOPAVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
698 ; XOPAVX1-NEXT:    vpshlb %xmm4, %xmm3, %xmm3
699 ; XOPAVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
700 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
701 ; XOPAVX1-NEXT:    vbroadcastss {{.*#+}} xmm6 = [249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249]
702 ; XOPAVX1-NEXT:    vpaddb %xmm6, %xmm5, %xmm7
703 ; XOPAVX1-NEXT:    vpshlb %xmm7, %xmm3, %xmm3
704 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
705 ; XOPAVX1-NEXT:    vpshlb %xmm5, %xmm7, %xmm5
706 ; XOPAVX1-NEXT:    vpor %xmm3, %xmm5, %xmm3
707 ; XOPAVX1-NEXT:    vpshlb %xmm4, %xmm1, %xmm1
708 ; XOPAVX1-NEXT:    vpaddb %xmm6, %xmm2, %xmm4
709 ; XOPAVX1-NEXT:    vpshlb %xmm4, %xmm1, %xmm1
710 ; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm0, %xmm0
711 ; XOPAVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
712 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
713 ; XOPAVX1-NEXT:    retq
715 ; XOPAVX2-LABEL: var_funnnel_v32i8:
716 ; XOPAVX2:       # %bb.0:
717 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm3
718 ; XOPAVX2-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
719 ; XOPAVX2-NEXT:    vpshlb %xmm4, %xmm3, %xmm3
720 ; XOPAVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
721 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm2, %xmm5
722 ; XOPAVX2-NEXT:    vpbroadcastb {{.*#+}} xmm6 = [249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249]
723 ; XOPAVX2-NEXT:    vpaddb %xmm6, %xmm5, %xmm7
724 ; XOPAVX2-NEXT:    vpshlb %xmm7, %xmm3, %xmm3
725 ; XOPAVX2-NEXT:    vpshlb %xmm4, %xmm1, %xmm1
726 ; XOPAVX2-NEXT:    vpaddb %xmm6, %xmm2, %xmm4
727 ; XOPAVX2-NEXT:    vpshlb %xmm4, %xmm1, %xmm1
728 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm3, %ymm1, %ymm1
729 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
730 ; XOPAVX2-NEXT:    vpshlb %xmm5, %xmm3, %xmm3
731 ; XOPAVX2-NEXT:    vpshlb %xmm2, %xmm0, %xmm0
732 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm3, %ymm0, %ymm0
733 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
734 ; XOPAVX2-NEXT:    retq
735   %res = call <32 x i8> @llvm.fshl.v32i8(<32 x i8> %x, <32 x i8> %y, <32 x i8> %amt)
736   ret <32 x i8> %res
740 ; Uniform Variable Shifts
743 define <4 x i64> @splatvar_funnnel_v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> %amt) nounwind {
744 ; AVX1-LABEL: splatvar_funnnel_v4i64:
745 ; AVX1:       # %bb.0:
746 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm3 = [63,63]
747 ; AVX1-NEXT:    # xmm3 = mem[0,0]
748 ; AVX1-NEXT:    vpandn %xmm3, %xmm2, %xmm4
749 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
750 ; AVX1-NEXT:    vpsrlq $1, %xmm5, %xmm5
751 ; AVX1-NEXT:    vpsrlq %xmm4, %xmm5, %xmm5
752 ; AVX1-NEXT:    vpsrlq $1, %xmm1, %xmm1
753 ; AVX1-NEXT:    vpsrlq %xmm4, %xmm1, %xmm1
754 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm1, %ymm1
755 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
756 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
757 ; AVX1-NEXT:    vpsllq %xmm2, %xmm3, %xmm3
758 ; AVX1-NEXT:    vpsllq %xmm2, %xmm0, %xmm0
759 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
760 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
761 ; AVX1-NEXT:    retq
763 ; AVX2-LABEL: splatvar_funnnel_v4i64:
764 ; AVX2:       # %bb.0:
765 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm3 = [63,63]
766 ; AVX2-NEXT:    vpandn %xmm3, %xmm2, %xmm4
767 ; AVX2-NEXT:    vpsrlq $1, %ymm1, %ymm1
768 ; AVX2-NEXT:    vpsrlq %xmm4, %ymm1, %ymm1
769 ; AVX2-NEXT:    vpand %xmm3, %xmm2, %xmm2
770 ; AVX2-NEXT:    vpsllq %xmm2, %ymm0, %ymm0
771 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
772 ; AVX2-NEXT:    retq
774 ; AVX512F-LABEL: splatvar_funnnel_v4i64:
775 ; AVX512F:       # %bb.0:
776 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} xmm3 = [63,63]
777 ; AVX512F-NEXT:    vpandn %xmm3, %xmm2, %xmm4
778 ; AVX512F-NEXT:    vpsrlq $1, %ymm1, %ymm1
779 ; AVX512F-NEXT:    vpsrlq %xmm4, %ymm1, %ymm1
780 ; AVX512F-NEXT:    vpand %xmm3, %xmm2, %xmm2
781 ; AVX512F-NEXT:    vpsllq %xmm2, %ymm0, %ymm0
782 ; AVX512F-NEXT:    vpor %ymm1, %ymm0, %ymm0
783 ; AVX512F-NEXT:    retq
785 ; AVX512VL-LABEL: splatvar_funnnel_v4i64:
786 ; AVX512VL:       # %bb.0:
787 ; AVX512VL-NEXT:    vpbroadcastq {{.*#+}} xmm3 = [63,63]
788 ; AVX512VL-NEXT:    vpandn %xmm3, %xmm2, %xmm4
789 ; AVX512VL-NEXT:    vpsrlq $1, %ymm1, %ymm1
790 ; AVX512VL-NEXT:    vpsrlq %xmm4, %ymm1, %ymm1
791 ; AVX512VL-NEXT:    vpand %xmm3, %xmm2, %xmm2
792 ; AVX512VL-NEXT:    vpsllq %xmm2, %ymm0, %ymm0
793 ; AVX512VL-NEXT:    vpor %ymm1, %ymm0, %ymm0
794 ; AVX512VL-NEXT:    retq
796 ; AVX512BW-LABEL: splatvar_funnnel_v4i64:
797 ; AVX512BW:       # %bb.0:
798 ; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} xmm3 = [63,63]
799 ; AVX512BW-NEXT:    vpandn %xmm3, %xmm2, %xmm4
800 ; AVX512BW-NEXT:    vpsrlq $1, %ymm1, %ymm1
801 ; AVX512BW-NEXT:    vpsrlq %xmm4, %ymm1, %ymm1
802 ; AVX512BW-NEXT:    vpand %xmm3, %xmm2, %xmm2
803 ; AVX512BW-NEXT:    vpsllq %xmm2, %ymm0, %ymm0
804 ; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm0
805 ; AVX512BW-NEXT:    retq
807 ; AVX512VBMI2-LABEL: splatvar_funnnel_v4i64:
808 ; AVX512VBMI2:       # %bb.0:
809 ; AVX512VBMI2-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
810 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
811 ; AVX512VBMI2-NEXT:    vpbroadcastq %xmm2, %ymm2
812 ; AVX512VBMI2-NEXT:    vpshldvq %zmm2, %zmm1, %zmm0
813 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
814 ; AVX512VBMI2-NEXT:    retq
816 ; AVX512VLBW-LABEL: splatvar_funnnel_v4i64:
817 ; AVX512VLBW:       # %bb.0:
818 ; AVX512VLBW-NEXT:    vpbroadcastq {{.*#+}} xmm3 = [63,63]
819 ; AVX512VLBW-NEXT:    vpandn %xmm3, %xmm2, %xmm4
820 ; AVX512VLBW-NEXT:    vpsrlq $1, %ymm1, %ymm1
821 ; AVX512VLBW-NEXT:    vpsrlq %xmm4, %ymm1, %ymm1
822 ; AVX512VLBW-NEXT:    vpand %xmm3, %xmm2, %xmm2
823 ; AVX512VLBW-NEXT:    vpsllq %xmm2, %ymm0, %ymm0
824 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm0
825 ; AVX512VLBW-NEXT:    retq
827 ; AVX512VLVBMI2-LABEL: splatvar_funnnel_v4i64:
828 ; AVX512VLVBMI2:       # %bb.0:
829 ; AVX512VLVBMI2-NEXT:    vpbroadcastq %xmm2, %ymm2
830 ; AVX512VLVBMI2-NEXT:    vpshldvq %ymm2, %ymm1, %ymm0
831 ; AVX512VLVBMI2-NEXT:    retq
833 ; XOPAVX1-LABEL: splatvar_funnnel_v4i64:
834 ; XOPAVX1:       # %bb.0:
835 ; XOPAVX1-NEXT:    vmovddup {{.*#+}} xmm3 = [63,63]
836 ; XOPAVX1-NEXT:    # xmm3 = mem[0,0]
837 ; XOPAVX1-NEXT:    vpandn %xmm3, %xmm2, %xmm4
838 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
839 ; XOPAVX1-NEXT:    vpsrlq $1, %xmm5, %xmm5
840 ; XOPAVX1-NEXT:    vpsrlq %xmm4, %xmm5, %xmm5
841 ; XOPAVX1-NEXT:    vpsrlq $1, %xmm1, %xmm1
842 ; XOPAVX1-NEXT:    vpsrlq %xmm4, %xmm1, %xmm1
843 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm1, %ymm1
844 ; XOPAVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
845 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
846 ; XOPAVX1-NEXT:    vpsllq %xmm2, %xmm3, %xmm3
847 ; XOPAVX1-NEXT:    vpsllq %xmm2, %xmm0, %xmm0
848 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
849 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
850 ; XOPAVX1-NEXT:    retq
852 ; XOPAVX2-LABEL: splatvar_funnnel_v4i64:
853 ; XOPAVX2:       # %bb.0:
854 ; XOPAVX2-NEXT:    vpbroadcastq {{.*#+}} xmm3 = [63,63]
855 ; XOPAVX2-NEXT:    vpandn %xmm3, %xmm2, %xmm4
856 ; XOPAVX2-NEXT:    vpsrlq $1, %ymm1, %ymm1
857 ; XOPAVX2-NEXT:    vpsrlq %xmm4, %ymm1, %ymm1
858 ; XOPAVX2-NEXT:    vpand %xmm3, %xmm2, %xmm2
859 ; XOPAVX2-NEXT:    vpsllq %xmm2, %ymm0, %ymm0
860 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
861 ; XOPAVX2-NEXT:    retq
862   %splat = shufflevector <4 x i64> %amt, <4 x i64> undef, <4 x i32> zeroinitializer
863   %res = call <4 x i64> @llvm.fshl.v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> %splat)
864   ret <4 x i64> %res
867 define <8 x i32> @splatvar_funnnel_v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i32> %amt) nounwind {
868 ; AVX1-LABEL: splatvar_funnnel_v8i32:
869 ; AVX1:       # %bb.0:
870 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
871 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
872 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm5 = xmm4[2],xmm3[2],xmm4[3],xmm3[3]
873 ; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
874 ; AVX1-NEXT:    vpsllq %xmm2, %xmm5, %xmm5
875 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm6 = xmm1[2],xmm0[2],xmm1[3],xmm0[3]
876 ; AVX1-NEXT:    vpsllq %xmm2, %xmm6, %xmm6
877 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm6, %ymm5
878 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm3 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
879 ; AVX1-NEXT:    vpsllq %xmm2, %xmm3, %xmm3
880 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
881 ; AVX1-NEXT:    vpsllq %xmm2, %xmm0, %xmm0
882 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
883 ; AVX1-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm5[1,3],ymm0[5,7],ymm5[5,7]
884 ; AVX1-NEXT:    retq
886 ; AVX2-LABEL: splatvar_funnnel_v8i32:
887 ; AVX2:       # %bb.0:
888 ; AVX2-NEXT:    vpunpckhdq {{.*#+}} ymm3 = ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[6],ymm0[6],ymm1[7],ymm0[7]
889 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
890 ; AVX2-NEXT:    vpsllq %xmm2, %ymm3, %ymm3
891 ; AVX2-NEXT:    vpunpckldq {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[4],ymm0[4],ymm1[5],ymm0[5]
892 ; AVX2-NEXT:    vpsllq %xmm2, %ymm0, %ymm0
893 ; AVX2-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm3[1,3],ymm0[5,7],ymm3[5,7]
894 ; AVX2-NEXT:    retq
896 ; AVX512F-LABEL: splatvar_funnnel_v8i32:
897 ; AVX512F:       # %bb.0:
898 ; AVX512F-NEXT:    vpunpckhdq {{.*#+}} ymm3 = ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[6],ymm0[6],ymm1[7],ymm0[7]
899 ; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
900 ; AVX512F-NEXT:    vpsllq %xmm2, %ymm3, %ymm3
901 ; AVX512F-NEXT:    vpunpckldq {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[4],ymm0[4],ymm1[5],ymm0[5]
902 ; AVX512F-NEXT:    vpsllq %xmm2, %ymm0, %ymm0
903 ; AVX512F-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm3[1,3],ymm0[5,7],ymm3[5,7]
904 ; AVX512F-NEXT:    retq
906 ; AVX512VL-LABEL: splatvar_funnnel_v8i32:
907 ; AVX512VL:       # %bb.0:
908 ; AVX512VL-NEXT:    vpunpckhdq {{.*#+}} ymm3 = ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[6],ymm0[6],ymm1[7],ymm0[7]
909 ; AVX512VL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
910 ; AVX512VL-NEXT:    vpsllq %xmm2, %ymm3, %ymm3
911 ; AVX512VL-NEXT:    vpunpckldq {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[4],ymm0[4],ymm1[5],ymm0[5]
912 ; AVX512VL-NEXT:    vpsllq %xmm2, %ymm0, %ymm0
913 ; AVX512VL-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm3[1,3],ymm0[5,7],ymm3[5,7]
914 ; AVX512VL-NEXT:    retq
916 ; AVX512BW-LABEL: splatvar_funnnel_v8i32:
917 ; AVX512BW:       # %bb.0:
918 ; AVX512BW-NEXT:    vpunpckhdq {{.*#+}} ymm3 = ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[6],ymm0[6],ymm1[7],ymm0[7]
919 ; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
920 ; AVX512BW-NEXT:    vpsllq %xmm2, %ymm3, %ymm3
921 ; AVX512BW-NEXT:    vpunpckldq {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[4],ymm0[4],ymm1[5],ymm0[5]
922 ; AVX512BW-NEXT:    vpsllq %xmm2, %ymm0, %ymm0
923 ; AVX512BW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm3[1,3],ymm0[5,7],ymm3[5,7]
924 ; AVX512BW-NEXT:    retq
926 ; AVX512VBMI2-LABEL: splatvar_funnnel_v8i32:
927 ; AVX512VBMI2:       # %bb.0:
928 ; AVX512VBMI2-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
929 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
930 ; AVX512VBMI2-NEXT:    vpbroadcastd %xmm2, %ymm2
931 ; AVX512VBMI2-NEXT:    vpshldvd %zmm2, %zmm1, %zmm0
932 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
933 ; AVX512VBMI2-NEXT:    retq
935 ; AVX512VLBW-LABEL: splatvar_funnnel_v8i32:
936 ; AVX512VLBW:       # %bb.0:
937 ; AVX512VLBW-NEXT:    vpunpckhdq {{.*#+}} ymm3 = ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[6],ymm0[6],ymm1[7],ymm0[7]
938 ; AVX512VLBW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
939 ; AVX512VLBW-NEXT:    vpsllq %xmm2, %ymm3, %ymm3
940 ; AVX512VLBW-NEXT:    vpunpckldq {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[4],ymm0[4],ymm1[5],ymm0[5]
941 ; AVX512VLBW-NEXT:    vpsllq %xmm2, %ymm0, %ymm0
942 ; AVX512VLBW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm3[1,3],ymm0[5,7],ymm3[5,7]
943 ; AVX512VLBW-NEXT:    retq
945 ; AVX512VLVBMI2-LABEL: splatvar_funnnel_v8i32:
946 ; AVX512VLVBMI2:       # %bb.0:
947 ; AVX512VLVBMI2-NEXT:    vpbroadcastd %xmm2, %ymm2
948 ; AVX512VLVBMI2-NEXT:    vpshldvd %ymm2, %ymm1, %ymm0
949 ; AVX512VLVBMI2-NEXT:    retq
951 ; XOPAVX1-LABEL: splatvar_funnnel_v8i32:
952 ; XOPAVX1:       # %bb.0:
953 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
954 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
955 ; XOPAVX1-NEXT:    vpunpckhdq {{.*#+}} xmm5 = xmm4[2],xmm3[2],xmm4[3],xmm3[3]
956 ; XOPAVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
957 ; XOPAVX1-NEXT:    vpsllq %xmm2, %xmm5, %xmm5
958 ; XOPAVX1-NEXT:    vpunpckhdq {{.*#+}} xmm6 = xmm1[2],xmm0[2],xmm1[3],xmm0[3]
959 ; XOPAVX1-NEXT:    vpsllq %xmm2, %xmm6, %xmm6
960 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm6, %ymm5
961 ; XOPAVX1-NEXT:    vpunpckldq {{.*#+}} xmm3 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
962 ; XOPAVX1-NEXT:    vpsllq %xmm2, %xmm3, %xmm3
963 ; XOPAVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
964 ; XOPAVX1-NEXT:    vpsllq %xmm2, %xmm0, %xmm0
965 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
966 ; XOPAVX1-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm5[1,3],ymm0[5,7],ymm5[5,7]
967 ; XOPAVX1-NEXT:    retq
969 ; XOPAVX2-LABEL: splatvar_funnnel_v8i32:
970 ; XOPAVX2:       # %bb.0:
971 ; XOPAVX2-NEXT:    vpunpckhdq {{.*#+}} ymm3 = ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[6],ymm0[6],ymm1[7],ymm0[7]
972 ; XOPAVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
973 ; XOPAVX2-NEXT:    vpsllq %xmm2, %ymm3, %ymm3
974 ; XOPAVX2-NEXT:    vpunpckldq {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[4],ymm0[4],ymm1[5],ymm0[5]
975 ; XOPAVX2-NEXT:    vpsllq %xmm2, %ymm0, %ymm0
976 ; XOPAVX2-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm3[1,3],ymm0[5,7],ymm3[5,7]
977 ; XOPAVX2-NEXT:    retq
978   %splat = shufflevector <8 x i32> %amt, <8 x i32> undef, <8 x i32> zeroinitializer
979   %res = call <8 x i32> @llvm.fshl.v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i32> %splat)
980   ret <8 x i32> %res
983 define <16 x i16> @splatvar_funnnel_v16i16(<16 x i16> %x, <16 x i16> %y, <16 x i16> %amt) nounwind {
984 ; AVX1-LABEL: splatvar_funnnel_v16i16:
985 ; AVX1:       # %bb.0:
986 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,0,0,0]
987 ; AVX1-NEXT:    vpandn %xmm3, %xmm2, %xmm4
988 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
989 ; AVX1-NEXT:    vpsrlw $1, %xmm5, %xmm5
990 ; AVX1-NEXT:    vpsrlw %xmm4, %xmm5, %xmm5
991 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
992 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
993 ; AVX1-NEXT:    vpsllw %xmm2, %xmm3, %xmm3
994 ; AVX1-NEXT:    vpor %xmm5, %xmm3, %xmm3
995 ; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm1
996 ; AVX1-NEXT:    vpsrlw %xmm4, %xmm1, %xmm1
997 ; AVX1-NEXT:    vpsllw %xmm2, %xmm0, %xmm0
998 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
999 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
1000 ; AVX1-NEXT:    retq
1002 ; AVX2-LABEL: splatvar_funnnel_v16i16:
1003 ; AVX2:       # %bb.0:
1004 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm3 = [15,0,0,0,15,0,0,0]
1005 ; AVX2-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1006 ; AVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
1007 ; AVX2-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1008 ; AVX2-NEXT:    vpand %xmm3, %xmm2, %xmm2
1009 ; AVX2-NEXT:    vpsllw %xmm2, %ymm0, %ymm0
1010 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1011 ; AVX2-NEXT:    retq
1013 ; AVX512F-LABEL: splatvar_funnnel_v16i16:
1014 ; AVX512F:       # %bb.0:
1015 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} xmm3 = [15,0,0,0,15,0,0,0]
1016 ; AVX512F-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1017 ; AVX512F-NEXT:    vpsrlw $1, %ymm1, %ymm1
1018 ; AVX512F-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1019 ; AVX512F-NEXT:    vpand %xmm3, %xmm2, %xmm2
1020 ; AVX512F-NEXT:    vpsllw %xmm2, %ymm0, %ymm0
1021 ; AVX512F-NEXT:    vpor %ymm1, %ymm0, %ymm0
1022 ; AVX512F-NEXT:    retq
1024 ; AVX512VL-LABEL: splatvar_funnnel_v16i16:
1025 ; AVX512VL:       # %bb.0:
1026 ; AVX512VL-NEXT:    vpbroadcastq {{.*#+}} xmm3 = [15,0,0,0,15,0,0,0]
1027 ; AVX512VL-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1028 ; AVX512VL-NEXT:    vpsrlw $1, %ymm1, %ymm1
1029 ; AVX512VL-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1030 ; AVX512VL-NEXT:    vpand %xmm3, %xmm2, %xmm2
1031 ; AVX512VL-NEXT:    vpsllw %xmm2, %ymm0, %ymm0
1032 ; AVX512VL-NEXT:    vpor %ymm1, %ymm0, %ymm0
1033 ; AVX512VL-NEXT:    retq
1035 ; AVX512BW-LABEL: splatvar_funnnel_v16i16:
1036 ; AVX512BW:       # %bb.0:
1037 ; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} xmm3 = [15,0,0,0,15,0,0,0]
1038 ; AVX512BW-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1039 ; AVX512BW-NEXT:    vpsrlw $1, %ymm1, %ymm1
1040 ; AVX512BW-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1041 ; AVX512BW-NEXT:    vpand %xmm3, %xmm2, %xmm2
1042 ; AVX512BW-NEXT:    vpsllw %xmm2, %ymm0, %ymm0
1043 ; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm0
1044 ; AVX512BW-NEXT:    retq
1046 ; AVX512VBMI2-LABEL: splatvar_funnnel_v16i16:
1047 ; AVX512VBMI2:       # %bb.0:
1048 ; AVX512VBMI2-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1049 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1050 ; AVX512VBMI2-NEXT:    vpbroadcastw %xmm2, %ymm2
1051 ; AVX512VBMI2-NEXT:    vpshldvw %zmm2, %zmm1, %zmm0
1052 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1053 ; AVX512VBMI2-NEXT:    retq
1055 ; AVX512VLBW-LABEL: splatvar_funnnel_v16i16:
1056 ; AVX512VLBW:       # %bb.0:
1057 ; AVX512VLBW-NEXT:    vpbroadcastq {{.*#+}} xmm3 = [15,0,0,0,15,0,0,0]
1058 ; AVX512VLBW-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1059 ; AVX512VLBW-NEXT:    vpsrlw $1, %ymm1, %ymm1
1060 ; AVX512VLBW-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1061 ; AVX512VLBW-NEXT:    vpand %xmm3, %xmm2, %xmm2
1062 ; AVX512VLBW-NEXT:    vpsllw %xmm2, %ymm0, %ymm0
1063 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm0
1064 ; AVX512VLBW-NEXT:    retq
1066 ; AVX512VLVBMI2-LABEL: splatvar_funnnel_v16i16:
1067 ; AVX512VLVBMI2:       # %bb.0:
1068 ; AVX512VLVBMI2-NEXT:    vpbroadcastw %xmm2, %ymm2
1069 ; AVX512VLVBMI2-NEXT:    vpshldvw %ymm2, %ymm1, %ymm0
1070 ; AVX512VLVBMI2-NEXT:    retq
1072 ; XOPAVX1-LABEL: splatvar_funnnel_v16i16:
1073 ; XOPAVX1:       # %bb.0:
1074 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,0,0,0]
1075 ; XOPAVX1-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1076 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
1077 ; XOPAVX1-NEXT:    vpsrlw $1, %xmm5, %xmm5
1078 ; XOPAVX1-NEXT:    vpsrlw %xmm4, %xmm5, %xmm5
1079 ; XOPAVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
1080 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1081 ; XOPAVX1-NEXT:    vpsllw %xmm2, %xmm3, %xmm3
1082 ; XOPAVX1-NEXT:    vpor %xmm5, %xmm3, %xmm3
1083 ; XOPAVX1-NEXT:    vpsrlw $1, %xmm1, %xmm1
1084 ; XOPAVX1-NEXT:    vpsrlw %xmm4, %xmm1, %xmm1
1085 ; XOPAVX1-NEXT:    vpsllw %xmm2, %xmm0, %xmm0
1086 ; XOPAVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
1087 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
1088 ; XOPAVX1-NEXT:    retq
1090 ; XOPAVX2-LABEL: splatvar_funnnel_v16i16:
1091 ; XOPAVX2:       # %bb.0:
1092 ; XOPAVX2-NEXT:    vpbroadcastq {{.*#+}} xmm3 = [15,0,0,0,15,0,0,0]
1093 ; XOPAVX2-NEXT:    vpandn %xmm3, %xmm2, %xmm4
1094 ; XOPAVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
1095 ; XOPAVX2-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1096 ; XOPAVX2-NEXT:    vpand %xmm3, %xmm2, %xmm2
1097 ; XOPAVX2-NEXT:    vpsllw %xmm2, %ymm0, %ymm0
1098 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1099 ; XOPAVX2-NEXT:    retq
1100   %splat = shufflevector <16 x i16> %amt, <16 x i16> undef, <16 x i32> zeroinitializer
1101   %res = call <16 x i16> @llvm.fshl.v16i16(<16 x i16> %x, <16 x i16> %y, <16 x i16> %splat)
1102   ret <16 x i16> %res
1105 define <32 x i8> @splatvar_funnnel_v32i8(<32 x i8> %x, <32 x i8> %y, <32 x i8> %amt) nounwind {
1106 ; AVX1-LABEL: splatvar_funnnel_v32i8:
1107 ; AVX1:       # %bb.0:
1108 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1109 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
1110 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm4[8],xmm3[8],xmm4[9],xmm3[9],xmm4[10],xmm3[10],xmm4[11],xmm3[11],xmm4[12],xmm3[12],xmm4[13],xmm3[13],xmm4[14],xmm3[14],xmm4[15],xmm3[15]
1111 ; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1112 ; AVX1-NEXT:    vpsllw %xmm2, %xmm5, %xmm5
1113 ; AVX1-NEXT:    vpsrlw $8, %xmm5, %xmm5
1114 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm3 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]
1115 ; AVX1-NEXT:    vpsllw %xmm2, %xmm3, %xmm3
1116 ; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
1117 ; AVX1-NEXT:    vpackuswb %xmm5, %xmm3, %xmm3
1118 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
1119 ; AVX1-NEXT:    vpsllw %xmm2, %xmm4, %xmm4
1120 ; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm4
1121 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1122 ; AVX1-NEXT:    vpsllw %xmm2, %xmm0, %xmm0
1123 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
1124 ; AVX1-NEXT:    vpackuswb %xmm4, %xmm0, %xmm0
1125 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
1126 ; AVX1-NEXT:    retq
1128 ; AVX2-LABEL: splatvar_funnnel_v32i8:
1129 ; AVX2:       # %bb.0:
1130 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
1131 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1132 ; AVX2-NEXT:    vpsllw %xmm2, %ymm3, %ymm3
1133 ; AVX2-NEXT:    vpsrlw $8, %ymm3, %ymm3
1134 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
1135 ; AVX2-NEXT:    vpsllw %xmm2, %ymm0, %ymm0
1136 ; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
1137 ; AVX2-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
1138 ; AVX2-NEXT:    retq
1140 ; AVX512F-LABEL: splatvar_funnnel_v32i8:
1141 ; AVX512F:       # %bb.0:
1142 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
1143 ; AVX512F-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1144 ; AVX512F-NEXT:    vpsllw %xmm2, %ymm3, %ymm3
1145 ; AVX512F-NEXT:    vpsrlw $8, %ymm3, %ymm3
1146 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
1147 ; AVX512F-NEXT:    vpsllw %xmm2, %ymm0, %ymm0
1148 ; AVX512F-NEXT:    vpsrlw $8, %ymm0, %ymm0
1149 ; AVX512F-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
1150 ; AVX512F-NEXT:    retq
1152 ; AVX512VL-LABEL: splatvar_funnnel_v32i8:
1153 ; AVX512VL:       # %bb.0:
1154 ; AVX512VL-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
1155 ; AVX512VL-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1156 ; AVX512VL-NEXT:    vpsllw %xmm2, %ymm3, %ymm3
1157 ; AVX512VL-NEXT:    vpsrlw $8, %ymm3, %ymm3
1158 ; AVX512VL-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
1159 ; AVX512VL-NEXT:    vpsllw %xmm2, %ymm0, %ymm0
1160 ; AVX512VL-NEXT:    vpsrlw $8, %ymm0, %ymm0
1161 ; AVX512VL-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
1162 ; AVX512VL-NEXT:    retq
1164 ; AVX512BW-LABEL: splatvar_funnnel_v32i8:
1165 ; AVX512BW:       # %bb.0:
1166 ; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
1167 ; AVX512BW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1168 ; AVX512BW-NEXT:    vpsllw %xmm2, %ymm3, %ymm3
1169 ; AVX512BW-NEXT:    vpsrlw $8, %ymm3, %ymm3
1170 ; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
1171 ; AVX512BW-NEXT:    vpsllw %xmm2, %ymm0, %ymm0
1172 ; AVX512BW-NEXT:    vpsrlw $8, %ymm0, %ymm0
1173 ; AVX512BW-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
1174 ; AVX512BW-NEXT:    retq
1176 ; AVX512VBMI2-LABEL: splatvar_funnnel_v32i8:
1177 ; AVX512VBMI2:       # %bb.0:
1178 ; AVX512VBMI2-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
1179 ; AVX512VBMI2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1180 ; AVX512VBMI2-NEXT:    vpsllw %xmm2, %ymm3, %ymm3
1181 ; AVX512VBMI2-NEXT:    vpsrlw $8, %ymm3, %ymm3
1182 ; AVX512VBMI2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
1183 ; AVX512VBMI2-NEXT:    vpsllw %xmm2, %ymm0, %ymm0
1184 ; AVX512VBMI2-NEXT:    vpsrlw $8, %ymm0, %ymm0
1185 ; AVX512VBMI2-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
1186 ; AVX512VBMI2-NEXT:    retq
1188 ; AVX512VLBW-LABEL: splatvar_funnnel_v32i8:
1189 ; AVX512VLBW:       # %bb.0:
1190 ; AVX512VLBW-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
1191 ; AVX512VLBW-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1192 ; AVX512VLBW-NEXT:    vpsllw %xmm2, %ymm3, %ymm3
1193 ; AVX512VLBW-NEXT:    vpsrlw $8, %ymm3, %ymm3
1194 ; AVX512VLBW-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
1195 ; AVX512VLBW-NEXT:    vpsllw %xmm2, %ymm0, %ymm0
1196 ; AVX512VLBW-NEXT:    vpsrlw $8, %ymm0, %ymm0
1197 ; AVX512VLBW-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
1198 ; AVX512VLBW-NEXT:    retq
1200 ; AVX512VLVBMI2-LABEL: splatvar_funnnel_v32i8:
1201 ; AVX512VLVBMI2:       # %bb.0:
1202 ; AVX512VLVBMI2-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
1203 ; AVX512VLVBMI2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1204 ; AVX512VLVBMI2-NEXT:    vpsllw %xmm2, %ymm3, %ymm3
1205 ; AVX512VLVBMI2-NEXT:    vpsrlw $8, %ymm3, %ymm3
1206 ; AVX512VLVBMI2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
1207 ; AVX512VLVBMI2-NEXT:    vpsllw %xmm2, %ymm0, %ymm0
1208 ; AVX512VLVBMI2-NEXT:    vpsrlw $8, %ymm0, %ymm0
1209 ; AVX512VLVBMI2-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
1210 ; AVX512VLVBMI2-NEXT:    retq
1212 ; XOPAVX1-LABEL: splatvar_funnnel_v32i8:
1213 ; XOPAVX1:       # %bb.0:
1214 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1215 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
1216 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm4[8],xmm3[8],xmm4[9],xmm3[9],xmm4[10],xmm3[10],xmm4[11],xmm3[11],xmm4[12],xmm3[12],xmm4[13],xmm3[13],xmm4[14],xmm3[14],xmm4[15],xmm3[15]
1217 ; XOPAVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1218 ; XOPAVX1-NEXT:    vpsllw %xmm2, %xmm5, %xmm5
1219 ; XOPAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm3 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]
1220 ; XOPAVX1-NEXT:    vpsllw %xmm2, %xmm3, %xmm3
1221 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31]
1222 ; XOPAVX1-NEXT:    vpperm %xmm4, %xmm5, %xmm3, %xmm3
1223 ; XOPAVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
1224 ; XOPAVX1-NEXT:    vpsllw %xmm2, %xmm5, %xmm5
1225 ; XOPAVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1226 ; XOPAVX1-NEXT:    vpsllw %xmm2, %xmm0, %xmm0
1227 ; XOPAVX1-NEXT:    vpperm %xmm4, %xmm5, %xmm0, %xmm0
1228 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
1229 ; XOPAVX1-NEXT:    retq
1231 ; XOPAVX2-LABEL: splatvar_funnnel_v32i8:
1232 ; XOPAVX2:       # %bb.0:
1233 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
1234 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm4
1235 ; XOPAVX2-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm4[8],xmm3[8],xmm4[9],xmm3[9],xmm4[10],xmm3[10],xmm4[11],xmm3[11],xmm4[12],xmm3[12],xmm4[13],xmm3[13],xmm4[14],xmm3[14],xmm4[15],xmm3[15]
1236 ; XOPAVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1237 ; XOPAVX2-NEXT:    vpsllw %xmm2, %xmm5, %xmm5
1238 ; XOPAVX2-NEXT:    vpunpcklbw {{.*#+}} xmm3 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]
1239 ; XOPAVX2-NEXT:    vpsllw %xmm2, %xmm3, %xmm3
1240 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm4 = [1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31]
1241 ; XOPAVX2-NEXT:    vpperm %xmm4, %xmm5, %xmm3, %xmm3
1242 ; XOPAVX2-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
1243 ; XOPAVX2-NEXT:    vpsllw %xmm2, %xmm5, %xmm5
1244 ; XOPAVX2-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1245 ; XOPAVX2-NEXT:    vpsllw %xmm2, %xmm0, %xmm0
1246 ; XOPAVX2-NEXT:    vpperm %xmm4, %xmm5, %xmm0, %xmm0
1247 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm3, %ymm0, %ymm0
1248 ; XOPAVX2-NEXT:    retq
1249   %splat = shufflevector <32 x i8> %amt, <32 x i8> undef, <32 x i32> zeroinitializer
1250   %res = call <32 x i8> @llvm.fshl.v32i8(<32 x i8> %x, <32 x i8> %y, <32 x i8> %splat)
1251   ret <32 x i8> %res
1254 ; Harder PR37426 - https://bugs.llvm.org/show_bug.cgi?id=37426
1255 ; CGP should sink splatted select operands through the funnel shift.
1257 define void @fancierRotate2(ptr %arr, ptr %control, i32 %rot0, i32 %rot1) {
1258 ; AVX1-LABEL: fancierRotate2:
1259 ; AVX1:       # %bb.0: # %entry
1260 ; AVX1-NEXT:    vmovd %edx, %xmm1
1261 ; AVX1-NEXT:    vmovd %ecx, %xmm2
1262 ; AVX1-NEXT:    movq $-1024, %rax # imm = 0xFC00
1263 ; AVX1-NEXT:    vpxor %xmm0, %xmm0, %xmm0
1264 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [31,0,0,0]
1265 ; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
1266 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
1267 ; AVX1-NEXT:    .p2align 4, 0x90
1268 ; AVX1-NEXT:  .LBB8_1: # %loop
1269 ; AVX1-NEXT:    # =>This Inner Loop Header: Depth=1
1270 ; AVX1-NEXT:    vmovq {{.*#+}} xmm3 = mem[0],zero
1271 ; AVX1-NEXT:    vpcmpeqb %xmm0, %xmm3, %xmm3
1272 ; AVX1-NEXT:    vpmovsxbd %xmm3, %xmm4
1273 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,1,1]
1274 ; AVX1-NEXT:    vpmovsxbd %xmm3, %xmm3
1275 ; AVX1-NEXT:    vmovdqu 4096(%rdi,%rax,4), %xmm5
1276 ; AVX1-NEXT:    vmovdqu 4112(%rdi,%rax,4), %xmm6
1277 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm7 = xmm5[2,2,3,3]
1278 ; AVX1-NEXT:    vpsllq %xmm1, %xmm7, %xmm8
1279 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm5[0,0,1,1]
1280 ; AVX1-NEXT:    vpsllq %xmm1, %xmm5, %xmm9
1281 ; AVX1-NEXT:    vshufps {{.*#+}} xmm8 = xmm9[1,3],xmm8[1,3]
1282 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm9 = xmm6[2,2,3,3]
1283 ; AVX1-NEXT:    vpsllq %xmm1, %xmm9, %xmm10
1284 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm6[0,0,1,1]
1285 ; AVX1-NEXT:    vpsllq %xmm1, %xmm6, %xmm11
1286 ; AVX1-NEXT:    vshufps {{.*#+}} xmm10 = xmm11[1,3],xmm10[1,3]
1287 ; AVX1-NEXT:    vpsllq %xmm2, %xmm7, %xmm7
1288 ; AVX1-NEXT:    vpsllq %xmm2, %xmm5, %xmm5
1289 ; AVX1-NEXT:    vshufps {{.*#+}} xmm5 = xmm5[1,3],xmm7[1,3]
1290 ; AVX1-NEXT:    vblendvps %xmm4, %xmm8, %xmm5, %xmm4
1291 ; AVX1-NEXT:    vpsllq %xmm2, %xmm9, %xmm5
1292 ; AVX1-NEXT:    vpsllq %xmm2, %xmm6, %xmm6
1293 ; AVX1-NEXT:    vshufps {{.*#+}} xmm5 = xmm6[1,3],xmm5[1,3]
1294 ; AVX1-NEXT:    vblendvps %xmm3, %xmm10, %xmm5, %xmm3
1295 ; AVX1-NEXT:    vmovups %xmm4, 4096(%rdi,%rax,4)
1296 ; AVX1-NEXT:    vmovups %xmm3, 4112(%rdi,%rax,4)
1297 ; AVX1-NEXT:    addq $8, %rax
1298 ; AVX1-NEXT:    jne .LBB8_1
1299 ; AVX1-NEXT:  # %bb.2: # %exit
1300 ; AVX1-NEXT:    vzeroupper
1301 ; AVX1-NEXT:    retq
1303 ; AVX2-LABEL: fancierRotate2:
1304 ; AVX2:       # %bb.0: # %entry
1305 ; AVX2-NEXT:    vmovd %edx, %xmm0
1306 ; AVX2-NEXT:    vpbroadcastd %xmm0, %ymm0
1307 ; AVX2-NEXT:    vmovd %ecx, %xmm1
1308 ; AVX2-NEXT:    vpbroadcastd %xmm1, %ymm1
1309 ; AVX2-NEXT:    movq $-1024, %rax # imm = 0xFC00
1310 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1311 ; AVX2-NEXT:    vbroadcastss {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
1312 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm4 = [32,32,32,32,32,32,32,32]
1313 ; AVX2-NEXT:    .p2align 4, 0x90
1314 ; AVX2-NEXT:  .LBB8_1: # %loop
1315 ; AVX2-NEXT:    # =>This Inner Loop Header: Depth=1
1316 ; AVX2-NEXT:    vpmovzxbd {{.*#+}} ymm5 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero
1317 ; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm5, %ymm5
1318 ; AVX2-NEXT:    vblendvps %ymm5, %ymm0, %ymm1, %ymm5
1319 ; AVX2-NEXT:    vandps %ymm3, %ymm5, %ymm5
1320 ; AVX2-NEXT:    vmovdqu 4096(%rdi,%rax,4), %ymm6
1321 ; AVX2-NEXT:    vpsllvd %ymm5, %ymm6, %ymm7
1322 ; AVX2-NEXT:    vpsubd %ymm5, %ymm4, %ymm5
1323 ; AVX2-NEXT:    vpsrlvd %ymm5, %ymm6, %ymm5
1324 ; AVX2-NEXT:    vpor %ymm5, %ymm7, %ymm5
1325 ; AVX2-NEXT:    vmovdqu %ymm5, 4096(%rdi,%rax,4)
1326 ; AVX2-NEXT:    addq $8, %rax
1327 ; AVX2-NEXT:    jne .LBB8_1
1328 ; AVX2-NEXT:  # %bb.2: # %exit
1329 ; AVX2-NEXT:    vzeroupper
1330 ; AVX2-NEXT:    retq
1332 ; AVX512F-LABEL: fancierRotate2:
1333 ; AVX512F:       # %bb.0: # %entry
1334 ; AVX512F-NEXT:    vmovd %edx, %xmm0
1335 ; AVX512F-NEXT:    vpbroadcastd %xmm0, %ymm0
1336 ; AVX512F-NEXT:    vmovd %ecx, %xmm1
1337 ; AVX512F-NEXT:    vpbroadcastd %xmm1, %ymm1
1338 ; AVX512F-NEXT:    movq $-1024, %rax # imm = 0xFC00
1339 ; AVX512F-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1340 ; AVX512F-NEXT:    .p2align 4, 0x90
1341 ; AVX512F-NEXT:  .LBB8_1: # %loop
1342 ; AVX512F-NEXT:    # =>This Inner Loop Header: Depth=1
1343 ; AVX512F-NEXT:    vpmovzxbd {{.*#+}} ymm3 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero
1344 ; AVX512F-NEXT:    vpcmpeqd %ymm2, %ymm3, %ymm3
1345 ; AVX512F-NEXT:    vblendvps %ymm3, %ymm0, %ymm1, %ymm3
1346 ; AVX512F-NEXT:    vmovdqu 4096(%rdi,%rax,4), %ymm4
1347 ; AVX512F-NEXT:    vprolvd %zmm3, %zmm4, %zmm3
1348 ; AVX512F-NEXT:    vmovdqu %ymm3, 4096(%rdi,%rax,4)
1349 ; AVX512F-NEXT:    addq $8, %rax
1350 ; AVX512F-NEXT:    jne .LBB8_1
1351 ; AVX512F-NEXT:  # %bb.2: # %exit
1352 ; AVX512F-NEXT:    vzeroupper
1353 ; AVX512F-NEXT:    retq
1355 ; AVX512VL-LABEL: fancierRotate2:
1356 ; AVX512VL:       # %bb.0: # %entry
1357 ; AVX512VL-NEXT:    vpbroadcastd %edx, %ymm0
1358 ; AVX512VL-NEXT:    vpbroadcastd %ecx, %ymm1
1359 ; AVX512VL-NEXT:    movq $-1024, %rax # imm = 0xFC00
1360 ; AVX512VL-NEXT:    .p2align 4, 0x90
1361 ; AVX512VL-NEXT:  .LBB8_1: # %loop
1362 ; AVX512VL-NEXT:    # =>This Inner Loop Header: Depth=1
1363 ; AVX512VL-NEXT:    vpmovzxbd {{.*#+}} ymm2 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero
1364 ; AVX512VL-NEXT:    vptestnmd %ymm2, %ymm2, %k1
1365 ; AVX512VL-NEXT:    vpblendmd %ymm0, %ymm1, %ymm2 {%k1}
1366 ; AVX512VL-NEXT:    vmovdqu 4096(%rdi,%rax,4), %ymm3
1367 ; AVX512VL-NEXT:    vprolvd %ymm2, %ymm3, %ymm2
1368 ; AVX512VL-NEXT:    vmovdqu %ymm2, 4096(%rdi,%rax,4)
1369 ; AVX512VL-NEXT:    addq $8, %rax
1370 ; AVX512VL-NEXT:    jne .LBB8_1
1371 ; AVX512VL-NEXT:  # %bb.2: # %exit
1372 ; AVX512VL-NEXT:    vzeroupper
1373 ; AVX512VL-NEXT:    retq
1375 ; AVX512BW-LABEL: fancierRotate2:
1376 ; AVX512BW:       # %bb.0: # %entry
1377 ; AVX512BW-NEXT:    vmovd %edx, %xmm0
1378 ; AVX512BW-NEXT:    vpbroadcastd %xmm0, %ymm0
1379 ; AVX512BW-NEXT:    vmovd %ecx, %xmm1
1380 ; AVX512BW-NEXT:    vpbroadcastd %xmm1, %ymm1
1381 ; AVX512BW-NEXT:    movq $-1024, %rax # imm = 0xFC00
1382 ; AVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1383 ; AVX512BW-NEXT:    .p2align 4, 0x90
1384 ; AVX512BW-NEXT:  .LBB8_1: # %loop
1385 ; AVX512BW-NEXT:    # =>This Inner Loop Header: Depth=1
1386 ; AVX512BW-NEXT:    vpmovzxbd {{.*#+}} ymm3 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero
1387 ; AVX512BW-NEXT:    vpcmpeqd %ymm2, %ymm3, %ymm3
1388 ; AVX512BW-NEXT:    vblendvps %ymm3, %ymm0, %ymm1, %ymm3
1389 ; AVX512BW-NEXT:    vmovdqu 4096(%rdi,%rax,4), %ymm4
1390 ; AVX512BW-NEXT:    vprolvd %zmm3, %zmm4, %zmm3
1391 ; AVX512BW-NEXT:    vmovdqu %ymm3, 4096(%rdi,%rax,4)
1392 ; AVX512BW-NEXT:    addq $8, %rax
1393 ; AVX512BW-NEXT:    jne .LBB8_1
1394 ; AVX512BW-NEXT:  # %bb.2: # %exit
1395 ; AVX512BW-NEXT:    vzeroupper
1396 ; AVX512BW-NEXT:    retq
1398 ; AVX512VBMI2-LABEL: fancierRotate2:
1399 ; AVX512VBMI2:       # %bb.0: # %entry
1400 ; AVX512VBMI2-NEXT:    vmovd %edx, %xmm0
1401 ; AVX512VBMI2-NEXT:    vpbroadcastd %xmm0, %ymm0
1402 ; AVX512VBMI2-NEXT:    vmovd %ecx, %xmm1
1403 ; AVX512VBMI2-NEXT:    vpbroadcastd %xmm1, %ymm1
1404 ; AVX512VBMI2-NEXT:    movq $-1024, %rax # imm = 0xFC00
1405 ; AVX512VBMI2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1406 ; AVX512VBMI2-NEXT:    .p2align 4, 0x90
1407 ; AVX512VBMI2-NEXT:  .LBB8_1: # %loop
1408 ; AVX512VBMI2-NEXT:    # =>This Inner Loop Header: Depth=1
1409 ; AVX512VBMI2-NEXT:    vpmovzxbd {{.*#+}} ymm3 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero
1410 ; AVX512VBMI2-NEXT:    vpcmpeqd %ymm2, %ymm3, %ymm3
1411 ; AVX512VBMI2-NEXT:    vblendvps %ymm3, %ymm0, %ymm1, %ymm3
1412 ; AVX512VBMI2-NEXT:    vmovdqu 4096(%rdi,%rax,4), %ymm4
1413 ; AVX512VBMI2-NEXT:    vprolvd %zmm3, %zmm4, %zmm3
1414 ; AVX512VBMI2-NEXT:    vmovdqu %ymm3, 4096(%rdi,%rax,4)
1415 ; AVX512VBMI2-NEXT:    addq $8, %rax
1416 ; AVX512VBMI2-NEXT:    jne .LBB8_1
1417 ; AVX512VBMI2-NEXT:  # %bb.2: # %exit
1418 ; AVX512VBMI2-NEXT:    vzeroupper
1419 ; AVX512VBMI2-NEXT:    retq
1421 ; AVX512VLBW-LABEL: fancierRotate2:
1422 ; AVX512VLBW:       # %bb.0: # %entry
1423 ; AVX512VLBW-NEXT:    vpbroadcastd %edx, %ymm0
1424 ; AVX512VLBW-NEXT:    vpbroadcastd %ecx, %ymm1
1425 ; AVX512VLBW-NEXT:    movq $-1024, %rax # imm = 0xFC00
1426 ; AVX512VLBW-NEXT:    .p2align 4, 0x90
1427 ; AVX512VLBW-NEXT:  .LBB8_1: # %loop
1428 ; AVX512VLBW-NEXT:    # =>This Inner Loop Header: Depth=1
1429 ; AVX512VLBW-NEXT:    vmovq {{.*#+}} xmm2 = mem[0],zero
1430 ; AVX512VLBW-NEXT:    vptestnmb %xmm2, %xmm2, %k1
1431 ; AVX512VLBW-NEXT:    vpblendmd %ymm0, %ymm1, %ymm2 {%k1}
1432 ; AVX512VLBW-NEXT:    vmovdqu 4096(%rdi,%rax,4), %ymm3
1433 ; AVX512VLBW-NEXT:    vprolvd %ymm2, %ymm3, %ymm2
1434 ; AVX512VLBW-NEXT:    vmovdqu %ymm2, 4096(%rdi,%rax,4)
1435 ; AVX512VLBW-NEXT:    addq $8, %rax
1436 ; AVX512VLBW-NEXT:    jne .LBB8_1
1437 ; AVX512VLBW-NEXT:  # %bb.2: # %exit
1438 ; AVX512VLBW-NEXT:    vzeroupper
1439 ; AVX512VLBW-NEXT:    retq
1441 ; AVX512VLVBMI2-LABEL: fancierRotate2:
1442 ; AVX512VLVBMI2:       # %bb.0: # %entry
1443 ; AVX512VLVBMI2-NEXT:    vpbroadcastd %edx, %ymm0
1444 ; AVX512VLVBMI2-NEXT:    vpbroadcastd %ecx, %ymm1
1445 ; AVX512VLVBMI2-NEXT:    movq $-1024, %rax # imm = 0xFC00
1446 ; AVX512VLVBMI2-NEXT:    .p2align 4, 0x90
1447 ; AVX512VLVBMI2-NEXT:  .LBB8_1: # %loop
1448 ; AVX512VLVBMI2-NEXT:    # =>This Inner Loop Header: Depth=1
1449 ; AVX512VLVBMI2-NEXT:    vmovq {{.*#+}} xmm2 = mem[0],zero
1450 ; AVX512VLVBMI2-NEXT:    vptestnmb %xmm2, %xmm2, %k1
1451 ; AVX512VLVBMI2-NEXT:    vpblendmd %ymm0, %ymm1, %ymm2 {%k1}
1452 ; AVX512VLVBMI2-NEXT:    vmovdqu 4096(%rdi,%rax,4), %ymm3
1453 ; AVX512VLVBMI2-NEXT:    vprolvd %ymm2, %ymm3, %ymm2
1454 ; AVX512VLVBMI2-NEXT:    vmovdqu %ymm2, 4096(%rdi,%rax,4)
1455 ; AVX512VLVBMI2-NEXT:    addq $8, %rax
1456 ; AVX512VLVBMI2-NEXT:    jne .LBB8_1
1457 ; AVX512VLVBMI2-NEXT:  # %bb.2: # %exit
1458 ; AVX512VLVBMI2-NEXT:    vzeroupper
1459 ; AVX512VLVBMI2-NEXT:    retq
1461 ; XOPAVX1-LABEL: fancierRotate2:
1462 ; XOPAVX1:       # %bb.0: # %entry
1463 ; XOPAVX1-NEXT:    vmovd %edx, %xmm0
1464 ; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
1465 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
1466 ; XOPAVX1-NEXT:    vmovd %ecx, %xmm1
1467 ; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
1468 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm1, %ymm1
1469 ; XOPAVX1-NEXT:    movq $-1024, %rax # imm = 0xFC00
1470 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1471 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1472 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
1473 ; XOPAVX1-NEXT:    .p2align 4, 0x90
1474 ; XOPAVX1-NEXT:  .LBB8_1: # %loop
1475 ; XOPAVX1-NEXT:    # =>This Inner Loop Header: Depth=1
1476 ; XOPAVX1-NEXT:    vmovq {{.*#+}} xmm5 = mem[0],zero
1477 ; XOPAVX1-NEXT:    vpcomeqb %xmm2, %xmm5, %xmm5
1478 ; XOPAVX1-NEXT:    vpmovsxbd %xmm5, %xmm6
1479 ; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm5[1,1,1,1]
1480 ; XOPAVX1-NEXT:    vpmovsxbd %xmm5, %xmm5
1481 ; XOPAVX1-NEXT:    vblendvps %xmm5, %xmm3, %xmm4, %xmm5
1482 ; XOPAVX1-NEXT:    vprotd %xmm5, 4112(%rdi,%rax,4), %xmm5
1483 ; XOPAVX1-NEXT:    vblendvps %xmm6, %xmm0, %xmm1, %xmm6
1484 ; XOPAVX1-NEXT:    vprotd %xmm6, 4096(%rdi,%rax,4), %xmm6
1485 ; XOPAVX1-NEXT:    vmovdqu %xmm6, 4096(%rdi,%rax,4)
1486 ; XOPAVX1-NEXT:    vmovdqu %xmm5, 4112(%rdi,%rax,4)
1487 ; XOPAVX1-NEXT:    addq $8, %rax
1488 ; XOPAVX1-NEXT:    jne .LBB8_1
1489 ; XOPAVX1-NEXT:  # %bb.2: # %exit
1490 ; XOPAVX1-NEXT:    vzeroupper
1491 ; XOPAVX1-NEXT:    retq
1493 ; XOPAVX2-LABEL: fancierRotate2:
1494 ; XOPAVX2:       # %bb.0: # %entry
1495 ; XOPAVX2-NEXT:    vmovd %edx, %xmm0
1496 ; XOPAVX2-NEXT:    vpbroadcastd %xmm0, %ymm0
1497 ; XOPAVX2-NEXT:    vmovd %ecx, %xmm1
1498 ; XOPAVX2-NEXT:    vpbroadcastd %xmm1, %ymm1
1499 ; XOPAVX2-NEXT:    movq $-1024, %rax # imm = 0xFC00
1500 ; XOPAVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1501 ; XOPAVX2-NEXT:    .p2align 4, 0x90
1502 ; XOPAVX2-NEXT:  .LBB8_1: # %loop
1503 ; XOPAVX2-NEXT:    # =>This Inner Loop Header: Depth=1
1504 ; XOPAVX2-NEXT:    vpmovzxbd {{.*#+}} ymm3 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero
1505 ; XOPAVX2-NEXT:    vpcmpeqd %ymm2, %ymm3, %ymm3
1506 ; XOPAVX2-NEXT:    vblendvps %ymm3, %ymm0, %ymm1, %ymm3
1507 ; XOPAVX2-NEXT:    vextractf128 $1, %ymm3, %xmm4
1508 ; XOPAVX2-NEXT:    vprotd %xmm4, 4112(%rdi,%rax,4), %xmm4
1509 ; XOPAVX2-NEXT:    vprotd %xmm3, 4096(%rdi,%rax,4), %xmm3
1510 ; XOPAVX2-NEXT:    vmovdqu %xmm3, 4096(%rdi,%rax,4)
1511 ; XOPAVX2-NEXT:    vmovdqu %xmm4, 4112(%rdi,%rax,4)
1512 ; XOPAVX2-NEXT:    addq $8, %rax
1513 ; XOPAVX2-NEXT:    jne .LBB8_1
1514 ; XOPAVX2-NEXT:  # %bb.2: # %exit
1515 ; XOPAVX2-NEXT:    vzeroupper
1516 ; XOPAVX2-NEXT:    retq
1517 entry:
1518   %i0 = insertelement <8 x i32> undef, i32 %rot0, i32 0
1519   %s0 = shufflevector <8 x i32> %i0, <8 x i32> undef, <8 x i32> zeroinitializer
1520   %i1 = insertelement <8 x i32> undef, i32 %rot1, i32 0
1521   %s1 = shufflevector <8 x i32> %i1, <8 x i32> undef, <8 x i32> zeroinitializer
1522   br label %loop
1524 loop:
1525   %index = phi i64 [ 0, %entry ], [ %index.next, %loop ]
1526   %t0 = getelementptr inbounds i8, ptr %control, i64 %index
1527   %wide.load = load <8 x i8>, ptr %t0, align 1
1528   %t2 = icmp eq <8 x i8> %wide.load, zeroinitializer
1529   %shamt = select <8 x i1> %t2, <8 x i32> %s0, <8 x i32> %s1
1530   %t4 = getelementptr inbounds i32, ptr %arr, i64 %index
1531   %wide.load21 = load <8 x i32>, ptr %t4, align 4
1532   %rot = call <8 x i32> @llvm.fshl.v8i32(<8 x i32> %wide.load21, <8 x i32> %wide.load21, <8 x i32> %shamt)
1533   store <8 x i32> %rot, ptr %t4, align 4
1534   %index.next = add i64 %index, 8
1535   %t7 = icmp eq i64 %index.next, 1024
1536   br i1 %t7, label %exit, label %loop
1538 exit:
1539   ret void
1543 ; Constant Shifts
1546 define <4 x i64> @constant_funnnel_v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
1547 ; AVX1-LABEL: constant_funnnel_v4i64:
1548 ; AVX1:       # %bb.0:
1549 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1550 ; AVX1-NEXT:    vpsrlq $4, %xmm2, %xmm3
1551 ; AVX1-NEXT:    vpsrlq $14, %xmm2, %xmm2
1552 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm3[4,5,6,7]
1553 ; AVX1-NEXT:    vpsrlq $50, %xmm1, %xmm3
1554 ; AVX1-NEXT:    vpsrlq $60, %xmm1, %xmm1
1555 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm3[4,5,6,7]
1556 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1557 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1558 ; AVX1-NEXT:    vpsllq $60, %xmm2, %xmm3
1559 ; AVX1-NEXT:    vpsllq $50, %xmm2, %xmm2
1560 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm3[4,5,6,7]
1561 ; AVX1-NEXT:    vpsllq $14, %xmm0, %xmm3
1562 ; AVX1-NEXT:    vpsllq $4, %xmm0, %xmm0
1563 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]
1564 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1565 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1566 ; AVX1-NEXT:    retq
1568 ; AVX2-LABEL: constant_funnnel_v4i64:
1569 ; AVX2:       # %bb.0:
1570 ; AVX2-NEXT:    vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1571 ; AVX2-NEXT:    vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1572 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1573 ; AVX2-NEXT:    retq
1575 ; AVX512F-LABEL: constant_funnnel_v4i64:
1576 ; AVX512F:       # %bb.0:
1577 ; AVX512F-NEXT:    vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1578 ; AVX512F-NEXT:    vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1579 ; AVX512F-NEXT:    vpor %ymm1, %ymm0, %ymm0
1580 ; AVX512F-NEXT:    retq
1582 ; AVX512VL-LABEL: constant_funnnel_v4i64:
1583 ; AVX512VL:       # %bb.0:
1584 ; AVX512VL-NEXT:    vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1585 ; AVX512VL-NEXT:    vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1586 ; AVX512VL-NEXT:    vpor %ymm1, %ymm0, %ymm0
1587 ; AVX512VL-NEXT:    retq
1589 ; AVX512BW-LABEL: constant_funnnel_v4i64:
1590 ; AVX512BW:       # %bb.0:
1591 ; AVX512BW-NEXT:    vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1592 ; AVX512BW-NEXT:    vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1593 ; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm0
1594 ; AVX512BW-NEXT:    retq
1596 ; AVX512VBMI2-LABEL: constant_funnnel_v4i64:
1597 ; AVX512VBMI2:       # %bb.0:
1598 ; AVX512VBMI2-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1599 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1600 ; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} ymm2 = [4,14,50,60]
1601 ; AVX512VBMI2-NEXT:    vpshldvq %zmm2, %zmm1, %zmm0
1602 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1603 ; AVX512VBMI2-NEXT:    retq
1605 ; AVX512VLBW-LABEL: constant_funnnel_v4i64:
1606 ; AVX512VLBW:       # %bb.0:
1607 ; AVX512VLBW-NEXT:    vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1608 ; AVX512VLBW-NEXT:    vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1609 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm0
1610 ; AVX512VLBW-NEXT:    retq
1612 ; AVX512VLVBMI2-LABEL: constant_funnnel_v4i64:
1613 ; AVX512VLVBMI2:       # %bb.0:
1614 ; AVX512VLVBMI2-NEXT:    vpshldvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm0
1615 ; AVX512VLVBMI2-NEXT:    retq
1617 ; XOPAVX1-LABEL: constant_funnnel_v4i64:
1618 ; XOPAVX1:       # %bb.0:
1619 ; XOPAVX1-NEXT:    vpshlq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm2
1620 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1621 ; XOPAVX1-NEXT:    vpshlq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1622 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
1623 ; XOPAVX1-NEXT:    vpshlq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
1624 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1625 ; XOPAVX1-NEXT:    vpshlq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1626 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
1627 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1628 ; XOPAVX1-NEXT:    retq
1630 ; XOPAVX2-LABEL: constant_funnnel_v4i64:
1631 ; XOPAVX2:       # %bb.0:
1632 ; XOPAVX2-NEXT:    vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1633 ; XOPAVX2-NEXT:    vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1634 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1635 ; XOPAVX2-NEXT:    retq
1636   %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>)
1637   ret <4 x i64> %res
1640 define <8 x i32> @constant_funnnel_v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
1641 ; AVX1-LABEL: constant_funnnel_v8i32:
1642 ; AVX1:       # %bb.0:
1643 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1644 ; AVX1-NEXT:    vpsrld $21, %xmm2, %xmm3
1645 ; AVX1-NEXT:    vpsrld $23, %xmm2, %xmm4
1646 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
1647 ; AVX1-NEXT:    vpsrld $22, %xmm2, %xmm4
1648 ; AVX1-NEXT:    vpsrld $24, %xmm2, %xmm2
1649 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm4[4,5,6,7]
1650 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
1651 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1652 ; AVX1-NEXT:    vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3
1653 ; AVX1-NEXT:    vpor %xmm2, %xmm3, %xmm2
1654 ; AVX1-NEXT:    vpsrld $25, %xmm1, %xmm3
1655 ; AVX1-NEXT:    vpsrld $27, %xmm1, %xmm4
1656 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
1657 ; AVX1-NEXT:    vpsrld $26, %xmm1, %xmm4
1658 ; AVX1-NEXT:    vpsrld $28, %xmm1, %xmm1
1659 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm4[4,5,6,7]
1660 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]
1661 ; AVX1-NEXT:    vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1662 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
1663 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1664 ; AVX1-NEXT:    retq
1666 ; AVX2-LABEL: constant_funnnel_v8i32:
1667 ; AVX2:       # %bb.0:
1668 ; AVX2-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1669 ; AVX2-NEXT:    vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1670 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1671 ; AVX2-NEXT:    retq
1673 ; AVX512F-LABEL: constant_funnnel_v8i32:
1674 ; AVX512F:       # %bb.0:
1675 ; AVX512F-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1676 ; AVX512F-NEXT:    vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1677 ; AVX512F-NEXT:    vpor %ymm1, %ymm0, %ymm0
1678 ; AVX512F-NEXT:    retq
1680 ; AVX512VL-LABEL: constant_funnnel_v8i32:
1681 ; AVX512VL:       # %bb.0:
1682 ; AVX512VL-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1683 ; AVX512VL-NEXT:    vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1684 ; AVX512VL-NEXT:    vpor %ymm1, %ymm0, %ymm0
1685 ; AVX512VL-NEXT:    retq
1687 ; AVX512BW-LABEL: constant_funnnel_v8i32:
1688 ; AVX512BW:       # %bb.0:
1689 ; AVX512BW-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1690 ; AVX512BW-NEXT:    vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1691 ; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm0
1692 ; AVX512BW-NEXT:    retq
1694 ; AVX512VBMI2-LABEL: constant_funnnel_v8i32:
1695 ; AVX512VBMI2:       # %bb.0:
1696 ; AVX512VBMI2-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1697 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1698 ; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} ymm2 = [4,5,6,7,8,9,10,11]
1699 ; AVX512VBMI2-NEXT:    vpshldvd %zmm2, %zmm1, %zmm0
1700 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1701 ; AVX512VBMI2-NEXT:    retq
1703 ; AVX512VLBW-LABEL: constant_funnnel_v8i32:
1704 ; AVX512VLBW:       # %bb.0:
1705 ; AVX512VLBW-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1706 ; AVX512VLBW-NEXT:    vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1707 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm0
1708 ; AVX512VLBW-NEXT:    retq
1710 ; AVX512VLVBMI2-LABEL: constant_funnnel_v8i32:
1711 ; AVX512VLVBMI2:       # %bb.0:
1712 ; AVX512VLVBMI2-NEXT:    vpshldvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm0
1713 ; AVX512VLVBMI2-NEXT:    retq
1715 ; XOPAVX1-LABEL: constant_funnnel_v8i32:
1716 ; XOPAVX1:       # %bb.0:
1717 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1718 ; XOPAVX1-NEXT:    vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1719 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1720 ; XOPAVX1-NEXT:    vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3
1721 ; XOPAVX1-NEXT:    vpor %xmm2, %xmm3, %xmm2
1722 ; XOPAVX1-NEXT:    vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1723 ; XOPAVX1-NEXT:    vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1724 ; XOPAVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
1725 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1726 ; XOPAVX1-NEXT:    retq
1728 ; XOPAVX2-LABEL: constant_funnnel_v8i32:
1729 ; XOPAVX2:       # %bb.0:
1730 ; XOPAVX2-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1731 ; XOPAVX2-NEXT:    vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1732 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1733 ; XOPAVX2-NEXT:    retq
1734   %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>)
1735   ret <8 x i32> %res
1738 define <16 x i16> @constant_funnnel_v16i16(<16 x i16> %x, <16 x i16> %y) nounwind {
1739 ; AVX1-LABEL: constant_funnnel_v16i16:
1740 ; AVX1:       # %bb.0:
1741 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1742 ; AVX1-NEXT:    vpsrlw $1, %xmm2, %xmm2
1743 ; AVX1-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm3
1744 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3,4,5,6],xmm2[7]
1745 ; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm1
1746 ; AVX1-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1747 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1748 ; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
1749 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1750 ; AVX1-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1751 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
1752 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1753 ; AVX1-NEXT:    retq
1755 ; AVX2-LABEL: constant_funnnel_v16i16:
1756 ; AVX2:       # %bb.0:
1757 ; AVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
1758 ; AVX2-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm2
1759 ; AVX2-NEXT:    vpblendw {{.*#+}} ymm1 = ymm2[0,1,2,3,4,5,6],ymm1[7],ymm2[8,9,10,11,12,13,14],ymm1[15]
1760 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7]
1761 ; AVX2-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1762 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1763 ; AVX2-NEXT:    retq
1765 ; AVX512F-LABEL: constant_funnnel_v16i16:
1766 ; AVX512F:       # %bb.0:
1767 ; AVX512F-NEXT:    vpsrlw $1, %ymm1, %ymm1
1768 ; AVX512F-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm2
1769 ; AVX512F-NEXT:    vpblendw {{.*#+}} ymm1 = ymm2[0,1,2,3,4,5,6],ymm1[7],ymm2[8,9,10,11,12,13,14],ymm1[15]
1770 ; AVX512F-NEXT:    vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7]
1771 ; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1772 ; AVX512F-NEXT:    vpor %ymm1, %ymm0, %ymm0
1773 ; AVX512F-NEXT:    retq
1775 ; AVX512VL-LABEL: constant_funnnel_v16i16:
1776 ; AVX512VL:       # %bb.0:
1777 ; AVX512VL-NEXT:    vpsrlw $1, %ymm1, %ymm1
1778 ; AVX512VL-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm2
1779 ; AVX512VL-NEXT:    vpblendw {{.*#+}} ymm1 = ymm2[0,1,2,3,4,5,6],ymm1[7],ymm2[8,9,10,11,12,13,14],ymm1[15]
1780 ; AVX512VL-NEXT:    vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7]
1781 ; AVX512VL-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1782 ; AVX512VL-NEXT:    vpor %ymm1, %ymm0, %ymm0
1783 ; AVX512VL-NEXT:    retq
1785 ; AVX512BW-LABEL: constant_funnnel_v16i16:
1786 ; AVX512BW:       # %bb.0:
1787 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1788 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
1789 ; AVX512BW-NEXT:    vpsllvw %zmm2, %zmm0, %zmm0
1790 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm2 = [15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]
1791 ; AVX512BW-NEXT:    vpsrlw $1, %ymm1, %ymm1
1792 ; AVX512BW-NEXT:    vpsrlvw %zmm2, %zmm1, %zmm1
1793 ; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm0
1794 ; AVX512BW-NEXT:    retq
1796 ; AVX512VBMI2-LABEL: constant_funnnel_v16i16:
1797 ; AVX512VBMI2:       # %bb.0:
1798 ; AVX512VBMI2-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1799 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1800 ; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
1801 ; AVX512VBMI2-NEXT:    vpshldvw %zmm2, %zmm1, %zmm0
1802 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1803 ; AVX512VBMI2-NEXT:    retq
1805 ; AVX512VLBW-LABEL: constant_funnnel_v16i16:
1806 ; AVX512VLBW:       # %bb.0:
1807 ; AVX512VLBW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1808 ; AVX512VLBW-NEXT:    vpsrlw $1, %ymm1, %ymm1
1809 ; AVX512VLBW-NEXT:    vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1810 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm0
1811 ; AVX512VLBW-NEXT:    retq
1813 ; AVX512VLVBMI2-LABEL: constant_funnnel_v16i16:
1814 ; AVX512VLVBMI2:       # %bb.0:
1815 ; AVX512VLVBMI2-NEXT:    vpshldvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm0
1816 ; AVX512VLVBMI2-NEXT:    retq
1818 ; XOPAVX1-LABEL: constant_funnnel_v16i16:
1819 ; XOPAVX1:       # %bb.0:
1820 ; XOPAVX1-NEXT:    vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
1821 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1822 ; XOPAVX1-NEXT:    vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1823 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
1824 ; XOPAVX1-NEXT:    vpsrlw $1, %xmm1, %xmm2
1825 ; XOPAVX1-NEXT:    vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1826 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1827 ; XOPAVX1-NEXT:    vpsrlw $1, %xmm1, %xmm1
1828 ; XOPAVX1-NEXT:    vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1829 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
1830 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1831 ; XOPAVX1-NEXT:    retq
1833 ; XOPAVX2-LABEL: constant_funnnel_v16i16:
1834 ; XOPAVX2:       # %bb.0:
1835 ; XOPAVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
1836 ; XOPAVX2-NEXT:    vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm2
1837 ; XOPAVX2-NEXT:    vpblendw {{.*#+}} ymm1 = ymm2[0,1,2,3,4,5,6],ymm1[7],ymm2[8,9,10,11,12,13,14],ymm1[15]
1838 ; XOPAVX2-NEXT:    vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7]
1839 ; XOPAVX2-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1840 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1841 ; XOPAVX2-NEXT:    retq
1842   %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>)
1843   ret <16 x i16> %res
1846 define <32 x i8> @constant_funnnel_v32i8(<32 x i8> %x, <32 x i8> %y) nounwind {
1847 ; AVX1-LABEL: constant_funnnel_v32i8:
1848 ; AVX1:       # %bb.0:
1849 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1850 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1851 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15]
1852 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [1,128,64,32,16,8,4,2]
1853 ; AVX1-NEXT:    vpmullw %xmm5, %xmm4, %xmm4
1854 ; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm4
1855 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
1856 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,2,4,8,16,32,64,128]
1857 ; AVX1-NEXT:    vpmullw %xmm3, %xmm2, %xmm2
1858 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
1859 ; AVX1-NEXT:    vpackuswb %xmm4, %xmm2, %xmm2
1860 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
1861 ; AVX1-NEXT:    vpmullw %xmm5, %xmm4, %xmm4
1862 ; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm4
1863 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1864 ; AVX1-NEXT:    vpmullw %xmm3, %xmm0, %xmm0
1865 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
1866 ; AVX1-NEXT:    vpackuswb %xmm4, %xmm0, %xmm0
1867 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1868 ; AVX1-NEXT:    retq
1870 ; AVX2-LABEL: constant_funnnel_v32i8:
1871 ; AVX2:       # %bb.0:
1872 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
1873 ; AVX2-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
1874 ; AVX2-NEXT:    vpsrlw $8, %ymm2, %ymm2
1875 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
1876 ; AVX2-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1877 ; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
1878 ; AVX2-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
1879 ; AVX2-NEXT:    retq
1881 ; AVX512F-LABEL: constant_funnnel_v32i8:
1882 ; AVX512F:       # %bb.0:
1883 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
1884 ; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
1885 ; AVX512F-NEXT:    vpsrlw $8, %ymm2, %ymm2
1886 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
1887 ; AVX512F-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1888 ; AVX512F-NEXT:    vpsrlw $8, %ymm0, %ymm0
1889 ; AVX512F-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
1890 ; AVX512F-NEXT:    retq
1892 ; AVX512VL-LABEL: constant_funnnel_v32i8:
1893 ; AVX512VL:       # %bb.0:
1894 ; AVX512VL-NEXT:    vpunpckhbw {{.*#+}} ymm2 = ymm1[8],ymm0[8],ymm1[9],ymm0[9],ymm1[10],ymm0[10],ymm1[11],ymm0[11],ymm1[12],ymm0[12],ymm1[13],ymm0[13],ymm1[14],ymm0[14],ymm1[15],ymm0[15],ymm1[24],ymm0[24],ymm1[25],ymm0[25],ymm1[26],ymm0[26],ymm1[27],ymm0[27],ymm1[28],ymm0[28],ymm1[29],ymm0[29],ymm1[30],ymm0[30],ymm1[31],ymm0[31]
1895 ; AVX512VL-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
1896 ; AVX512VL-NEXT:    vpsrlw $8, %ymm2, %ymm2
1897 ; AVX512VL-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[4],ymm0[4],ymm1[5],ymm0[5],ymm1[6],ymm0[6],ymm1[7],ymm0[7],ymm1[16],ymm0[16],ymm1[17],ymm0[17],ymm1[18],ymm0[18],ymm1[19],ymm0[19],ymm1[20],ymm0[20],ymm1[21],ymm0[21],ymm1[22],ymm0[22],ymm1[23],ymm0[23]
1898 ; AVX512VL-NEXT:    vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1899 ; AVX512VL-NEXT:    vpsrlw $8, %ymm0, %ymm0
1900 ; AVX512VL-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
1901 ; AVX512VL-NEXT:    retq
1903 ; AVX512BW-LABEL: constant_funnnel_v32i8:
1904 ; AVX512BW:       # %bb.0:
1905 ; 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
1906 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,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
1907 ; AVX512BW-NEXT:    vpsllw $8, %zmm0, %zmm0
1908 ; AVX512BW-NEXT:    vporq %zmm1, %zmm0, %zmm0
1909 ; AVX512BW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
1910 ; AVX512BW-NEXT:    vpsrlw $8, %zmm0, %zmm0
1911 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
1912 ; AVX512BW-NEXT:    retq
1914 ; AVX512VBMI2-LABEL: constant_funnnel_v32i8:
1915 ; AVX512VBMI2:       # %bb.0:
1916 ; AVX512VBMI2-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1917 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1918 ; AVX512VBMI2-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,64,1,65,2,66,3,67,4,68,5,69,6,70,7,71,8,72,9,73,10,74,11,75,12,76,13,77,14,78,15,79,16,80,17,81,18,82,19,83,20,84,21,85,22,86,23,87,24,88,25,89,26,90,27,91,28,92,29,93,30,94,31,95]
1919 ; AVX512VBMI2-NEXT:    vpermi2b %zmm0, %zmm1, %zmm2
1920 ; AVX512VBMI2-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2, %zmm0
1921 ; AVX512VBMI2-NEXT:    vpsrlw $8, %zmm0, %zmm0
1922 ; AVX512VBMI2-NEXT:    vpmovwb %zmm0, %ymm0
1923 ; AVX512VBMI2-NEXT:    retq
1925 ; AVX512VLBW-LABEL: constant_funnnel_v32i8:
1926 ; AVX512VLBW:       # %bb.0:
1927 ; 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
1928 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,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
1929 ; AVX512VLBW-NEXT:    vpsllw $8, %zmm0, %zmm0
1930 ; AVX512VLBW-NEXT:    vporq %zmm1, %zmm0, %zmm0
1931 ; AVX512VLBW-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
1932 ; AVX512VLBW-NEXT:    vpsrlw $8, %zmm0, %zmm0
1933 ; AVX512VLBW-NEXT:    vpmovwb %zmm0, %ymm0
1934 ; AVX512VLBW-NEXT:    retq
1936 ; AVX512VLVBMI2-LABEL: constant_funnnel_v32i8:
1937 ; AVX512VLVBMI2:       # %bb.0:
1938 ; AVX512VLVBMI2-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1939 ; AVX512VLVBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1940 ; AVX512VLVBMI2-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [0,64,1,65,2,66,3,67,4,68,5,69,6,70,7,71,8,72,9,73,10,74,11,75,12,76,13,77,14,78,15,79,16,80,17,81,18,82,19,83,20,84,21,85,22,86,23,87,24,88,25,89,26,90,27,91,28,92,29,93,30,94,31,95]
1941 ; AVX512VLVBMI2-NEXT:    vpermi2b %zmm0, %zmm1, %zmm2
1942 ; AVX512VLVBMI2-NEXT:    vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2, %zmm0
1943 ; AVX512VLVBMI2-NEXT:    vpsrlw $8, %zmm0, %zmm0
1944 ; AVX512VLVBMI2-NEXT:    vpmovwb %zmm0, %ymm0
1945 ; AVX512VLVBMI2-NEXT:    retq
1947 ; XOPAVX1-LABEL: constant_funnnel_v32i8:
1948 ; XOPAVX1:       # %bb.0:
1949 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1950 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,2,3,4,5,6,7,0,7,6,5,4,3,2,1]
1951 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm2, %xmm2
1952 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
1953 ; XOPAVX1-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
1954 ; XOPAVX1-NEXT:    vpshlb %xmm5, %xmm4, %xmm4
1955 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [249,250,251,252,253,254,255,0,249,0,255,254,253,252,251,250]
1956 ; XOPAVX1-NEXT:    vpshlb %xmm6, %xmm4, %xmm4
1957 ; XOPAVX1-NEXT:    vpor %xmm4, %xmm2, %xmm2
1958 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm0, %xmm0
1959 ; XOPAVX1-NEXT:    vpshlb %xmm5, %xmm1, %xmm1
1960 ; XOPAVX1-NEXT:    vpshlb %xmm6, %xmm1, %xmm1
1961 ; XOPAVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
1962 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1963 ; XOPAVX1-NEXT:    retq
1965 ; XOPAVX2-LABEL: constant_funnnel_v32i8:
1966 ; XOPAVX2:       # %bb.0:
1967 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
1968 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,2,3,4,5,6,7,0,7,6,5,4,3,2,1]
1969 ; XOPAVX2-NEXT:    vpshlb %xmm3, %xmm2, %xmm2
1970 ; XOPAVX2-NEXT:    vpshlb %xmm3, %xmm0, %xmm0
1971 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
1972 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
1973 ; XOPAVX2-NEXT:    vpcmpeqd %xmm3, %xmm3, %xmm3
1974 ; XOPAVX2-NEXT:    vpshlb %xmm3, %xmm2, %xmm2
1975 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm4 = [249,250,251,252,253,254,255,0,249,0,255,254,253,252,251,250]
1976 ; XOPAVX2-NEXT:    vpshlb %xmm4, %xmm2, %xmm2
1977 ; XOPAVX2-NEXT:    vpshlb %xmm3, %xmm1, %xmm1
1978 ; XOPAVX2-NEXT:    vpshlb %xmm4, %xmm1, %xmm1
1979 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
1980 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1981 ; XOPAVX2-NEXT:    retq
1982   %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>)
1983   ret <32 x i8> %res
1987 ; Uniform Constant Shifts
1990 define <4 x i64> @splatconstant_funnnel_v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
1991 ; AVX1-LABEL: splatconstant_funnnel_v4i64:
1992 ; AVX1:       # %bb.0:
1993 ; AVX1-NEXT:    vpsrlq $50, %xmm1, %xmm2
1994 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1995 ; AVX1-NEXT:    vpsrlq $50, %xmm1, %xmm1
1996 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
1997 ; AVX1-NEXT:    vpsllq $14, %xmm0, %xmm2
1998 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1999 ; AVX1-NEXT:    vpsllq $14, %xmm0, %xmm0
2000 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
2001 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2002 ; AVX1-NEXT:    retq
2004 ; AVX2-LABEL: splatconstant_funnnel_v4i64:
2005 ; AVX2:       # %bb.0:
2006 ; AVX2-NEXT:    vpsrlq $50, %ymm1, %ymm1
2007 ; AVX2-NEXT:    vpsllq $14, %ymm0, %ymm0
2008 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2009 ; AVX2-NEXT:    retq
2011 ; AVX512F-LABEL: splatconstant_funnnel_v4i64:
2012 ; AVX512F:       # %bb.0:
2013 ; AVX512F-NEXT:    vpsrlq $50, %ymm1, %ymm1
2014 ; AVX512F-NEXT:    vpsllq $14, %ymm0, %ymm0
2015 ; AVX512F-NEXT:    vpor %ymm1, %ymm0, %ymm0
2016 ; AVX512F-NEXT:    retq
2018 ; AVX512VL-LABEL: splatconstant_funnnel_v4i64:
2019 ; AVX512VL:       # %bb.0:
2020 ; AVX512VL-NEXT:    vpsrlq $50, %ymm1, %ymm1
2021 ; AVX512VL-NEXT:    vpsllq $14, %ymm0, %ymm0
2022 ; AVX512VL-NEXT:    vpor %ymm1, %ymm0, %ymm0
2023 ; AVX512VL-NEXT:    retq
2025 ; AVX512BW-LABEL: splatconstant_funnnel_v4i64:
2026 ; AVX512BW:       # %bb.0:
2027 ; AVX512BW-NEXT:    vpsrlq $50, %ymm1, %ymm1
2028 ; AVX512BW-NEXT:    vpsllq $14, %ymm0, %ymm0
2029 ; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm0
2030 ; AVX512BW-NEXT:    retq
2032 ; AVX512VBMI2-LABEL: splatconstant_funnnel_v4i64:
2033 ; AVX512VBMI2:       # %bb.0:
2034 ; AVX512VBMI2-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2035 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2036 ; AVX512VBMI2-NEXT:    vpshldq $14, %zmm1, %zmm0, %zmm0
2037 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2038 ; AVX512VBMI2-NEXT:    retq
2040 ; AVX512VLBW-LABEL: splatconstant_funnnel_v4i64:
2041 ; AVX512VLBW:       # %bb.0:
2042 ; AVX512VLBW-NEXT:    vpsrlq $50, %ymm1, %ymm1
2043 ; AVX512VLBW-NEXT:    vpsllq $14, %ymm0, %ymm0
2044 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm0
2045 ; AVX512VLBW-NEXT:    retq
2047 ; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v4i64:
2048 ; AVX512VLVBMI2:       # %bb.0:
2049 ; AVX512VLVBMI2-NEXT:    vpshldq $14, %ymm1, %ymm0, %ymm0
2050 ; AVX512VLVBMI2-NEXT:    retq
2052 ; XOPAVX1-LABEL: splatconstant_funnnel_v4i64:
2053 ; XOPAVX1:       # %bb.0:
2054 ; XOPAVX1-NEXT:    vpsrlq $50, %xmm1, %xmm2
2055 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2056 ; XOPAVX1-NEXT:    vpsrlq $50, %xmm1, %xmm1
2057 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
2058 ; XOPAVX1-NEXT:    vpsllq $14, %xmm0, %xmm2
2059 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2060 ; XOPAVX1-NEXT:    vpsllq $14, %xmm0, %xmm0
2061 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
2062 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2063 ; XOPAVX1-NEXT:    retq
2065 ; XOPAVX2-LABEL: splatconstant_funnnel_v4i64:
2066 ; XOPAVX2:       # %bb.0:
2067 ; XOPAVX2-NEXT:    vpsrlq $50, %ymm1, %ymm1
2068 ; XOPAVX2-NEXT:    vpsllq $14, %ymm0, %ymm0
2069 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2070 ; XOPAVX2-NEXT:    retq
2071   %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>)
2072   ret <4 x i64> %res
2075 define <8 x i32> @splatconstant_funnnel_v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
2076 ; AVX1-LABEL: splatconstant_funnnel_v8i32:
2077 ; AVX1:       # %bb.0:
2078 ; AVX1-NEXT:    vpsrld $28, %xmm1, %xmm2
2079 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2080 ; AVX1-NEXT:    vpsrld $28, %xmm1, %xmm1
2081 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
2082 ; AVX1-NEXT:    vpslld $4, %xmm0, %xmm2
2083 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2084 ; AVX1-NEXT:    vpslld $4, %xmm0, %xmm0
2085 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
2086 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2087 ; AVX1-NEXT:    retq
2089 ; AVX2-LABEL: splatconstant_funnnel_v8i32:
2090 ; AVX2:       # %bb.0:
2091 ; AVX2-NEXT:    vpsrld $28, %ymm1, %ymm1
2092 ; AVX2-NEXT:    vpslld $4, %ymm0, %ymm0
2093 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2094 ; AVX2-NEXT:    retq
2096 ; AVX512F-LABEL: splatconstant_funnnel_v8i32:
2097 ; AVX512F:       # %bb.0:
2098 ; AVX512F-NEXT:    vpsrld $28, %ymm1, %ymm1
2099 ; AVX512F-NEXT:    vpslld $4, %ymm0, %ymm0
2100 ; AVX512F-NEXT:    vpor %ymm1, %ymm0, %ymm0
2101 ; AVX512F-NEXT:    retq
2103 ; AVX512VL-LABEL: splatconstant_funnnel_v8i32:
2104 ; AVX512VL:       # %bb.0:
2105 ; AVX512VL-NEXT:    vpsrld $28, %ymm1, %ymm1
2106 ; AVX512VL-NEXT:    vpslld $4, %ymm0, %ymm0
2107 ; AVX512VL-NEXT:    vpor %ymm1, %ymm0, %ymm0
2108 ; AVX512VL-NEXT:    retq
2110 ; AVX512BW-LABEL: splatconstant_funnnel_v8i32:
2111 ; AVX512BW:       # %bb.0:
2112 ; AVX512BW-NEXT:    vpsrld $28, %ymm1, %ymm1
2113 ; AVX512BW-NEXT:    vpslld $4, %ymm0, %ymm0
2114 ; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm0
2115 ; AVX512BW-NEXT:    retq
2117 ; AVX512VBMI2-LABEL: splatconstant_funnnel_v8i32:
2118 ; AVX512VBMI2:       # %bb.0:
2119 ; AVX512VBMI2-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2120 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2121 ; AVX512VBMI2-NEXT:    vpshldd $4, %zmm1, %zmm0, %zmm0
2122 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2123 ; AVX512VBMI2-NEXT:    retq
2125 ; AVX512VLBW-LABEL: splatconstant_funnnel_v8i32:
2126 ; AVX512VLBW:       # %bb.0:
2127 ; AVX512VLBW-NEXT:    vpsrld $28, %ymm1, %ymm1
2128 ; AVX512VLBW-NEXT:    vpslld $4, %ymm0, %ymm0
2129 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm0
2130 ; AVX512VLBW-NEXT:    retq
2132 ; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v8i32:
2133 ; AVX512VLVBMI2:       # %bb.0:
2134 ; AVX512VLVBMI2-NEXT:    vpshldd $4, %ymm1, %ymm0, %ymm0
2135 ; AVX512VLVBMI2-NEXT:    retq
2137 ; XOPAVX1-LABEL: splatconstant_funnnel_v8i32:
2138 ; XOPAVX1:       # %bb.0:
2139 ; XOPAVX1-NEXT:    vpsrld $28, %xmm1, %xmm2
2140 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2141 ; XOPAVX1-NEXT:    vpsrld $28, %xmm1, %xmm1
2142 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
2143 ; XOPAVX1-NEXT:    vpslld $4, %xmm0, %xmm2
2144 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2145 ; XOPAVX1-NEXT:    vpslld $4, %xmm0, %xmm0
2146 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
2147 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2148 ; XOPAVX1-NEXT:    retq
2150 ; XOPAVX2-LABEL: splatconstant_funnnel_v8i32:
2151 ; XOPAVX2:       # %bb.0:
2152 ; XOPAVX2-NEXT:    vpsrld $28, %ymm1, %ymm1
2153 ; XOPAVX2-NEXT:    vpslld $4, %ymm0, %ymm0
2154 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2155 ; XOPAVX2-NEXT:    retq
2156   %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>)
2157   ret <8 x i32> %res
2160 define <16 x i16> @splatconstant_funnnel_v16i16(<16 x i16> %x, <16 x i16> %y) nounwind {
2161 ; AVX1-LABEL: splatconstant_funnnel_v16i16:
2162 ; AVX1:       # %bb.0:
2163 ; AVX1-NEXT:    vpsrlw $9, %xmm1, %xmm2
2164 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2165 ; AVX1-NEXT:    vpsrlw $9, %xmm1, %xmm1
2166 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
2167 ; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm2
2168 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2169 ; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
2170 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
2171 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2172 ; AVX1-NEXT:    retq
2174 ; AVX2-LABEL: splatconstant_funnnel_v16i16:
2175 ; AVX2:       # %bb.0:
2176 ; AVX2-NEXT:    vpsrlw $9, %ymm1, %ymm1
2177 ; AVX2-NEXT:    vpsllw $7, %ymm0, %ymm0
2178 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2179 ; AVX2-NEXT:    retq
2181 ; AVX512F-LABEL: splatconstant_funnnel_v16i16:
2182 ; AVX512F:       # %bb.0:
2183 ; AVX512F-NEXT:    vpsrlw $9, %ymm1, %ymm1
2184 ; AVX512F-NEXT:    vpsllw $7, %ymm0, %ymm0
2185 ; AVX512F-NEXT:    vpor %ymm1, %ymm0, %ymm0
2186 ; AVX512F-NEXT:    retq
2188 ; AVX512VL-LABEL: splatconstant_funnnel_v16i16:
2189 ; AVX512VL:       # %bb.0:
2190 ; AVX512VL-NEXT:    vpsrlw $9, %ymm1, %ymm1
2191 ; AVX512VL-NEXT:    vpsllw $7, %ymm0, %ymm0
2192 ; AVX512VL-NEXT:    vpor %ymm1, %ymm0, %ymm0
2193 ; AVX512VL-NEXT:    retq
2195 ; AVX512BW-LABEL: splatconstant_funnnel_v16i16:
2196 ; AVX512BW:       # %bb.0:
2197 ; AVX512BW-NEXT:    vpsrlw $9, %ymm1, %ymm1
2198 ; AVX512BW-NEXT:    vpsllw $7, %ymm0, %ymm0
2199 ; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm0
2200 ; AVX512BW-NEXT:    retq
2202 ; AVX512VBMI2-LABEL: splatconstant_funnnel_v16i16:
2203 ; AVX512VBMI2:       # %bb.0:
2204 ; AVX512VBMI2-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2205 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2206 ; AVX512VBMI2-NEXT:    vpshldw $7, %zmm1, %zmm0, %zmm0
2207 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2208 ; AVX512VBMI2-NEXT:    retq
2210 ; AVX512VLBW-LABEL: splatconstant_funnnel_v16i16:
2211 ; AVX512VLBW:       # %bb.0:
2212 ; AVX512VLBW-NEXT:    vpsrlw $9, %ymm1, %ymm1
2213 ; AVX512VLBW-NEXT:    vpsllw $7, %ymm0, %ymm0
2214 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm0
2215 ; AVX512VLBW-NEXT:    retq
2217 ; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v16i16:
2218 ; AVX512VLVBMI2:       # %bb.0:
2219 ; AVX512VLVBMI2-NEXT:    vpshldw $7, %ymm1, %ymm0, %ymm0
2220 ; AVX512VLVBMI2-NEXT:    retq
2222 ; XOPAVX1-LABEL: splatconstant_funnnel_v16i16:
2223 ; XOPAVX1:       # %bb.0:
2224 ; XOPAVX1-NEXT:    vpsrlw $9, %xmm1, %xmm2
2225 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2226 ; XOPAVX1-NEXT:    vpsrlw $9, %xmm1, %xmm1
2227 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
2228 ; XOPAVX1-NEXT:    vpsllw $7, %xmm0, %xmm2
2229 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2230 ; XOPAVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
2231 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
2232 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2233 ; XOPAVX1-NEXT:    retq
2235 ; XOPAVX2-LABEL: splatconstant_funnnel_v16i16:
2236 ; XOPAVX2:       # %bb.0:
2237 ; XOPAVX2-NEXT:    vpsrlw $9, %ymm1, %ymm1
2238 ; XOPAVX2-NEXT:    vpsllw $7, %ymm0, %ymm0
2239 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2240 ; XOPAVX2-NEXT:    retq
2241   %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>)
2242   ret <16 x i16> %res
2245 define <32 x i8> @splatconstant_funnnel_v32i8(<32 x i8> %x, <32 x i8> %y) nounwind {
2246 ; AVX1-LABEL: splatconstant_funnnel_v32i8:
2247 ; AVX1:       # %bb.0:
2248 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2249 ; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm2
2250 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
2251 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
2252 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
2253 ; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
2254 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2255 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2256 ; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm2
2257 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
2258 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
2259 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm0
2260 ; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
2261 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2262 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2263 ; AVX1-NEXT:    retq
2265 ; AVX2-LABEL: splatconstant_funnnel_v32i8:
2266 ; AVX2:       # %bb.0:
2267 ; AVX2-NEXT:    vpsrlw $4, %ymm1, %ymm1
2268 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2269 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm0
2270 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2271 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2272 ; AVX2-NEXT:    retq
2274 ; AVX512F-LABEL: splatconstant_funnnel_v32i8:
2275 ; AVX512F:       # %bb.0:
2276 ; AVX512F-NEXT:    vpsllw $4, %ymm0, %ymm2
2277 ; AVX512F-NEXT:    vpsrlw $4, %ymm1, %ymm0
2278 ; AVX512F-NEXT:    vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm2, %zmm0
2279 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2280 ; AVX512F-NEXT:    retq
2282 ; AVX512VL-LABEL: splatconstant_funnnel_v32i8:
2283 ; AVX512VL:       # %bb.0:
2284 ; AVX512VL-NEXT:    vpsllw $4, %ymm0, %ymm2
2285 ; AVX512VL-NEXT:    vpsrlw $4, %ymm1, %ymm0
2286 ; AVX512VL-NEXT:    vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm2, %ymm0
2287 ; AVX512VL-NEXT:    retq
2289 ; AVX512BW-LABEL: splatconstant_funnnel_v32i8:
2290 ; AVX512BW:       # %bb.0:
2291 ; AVX512BW-NEXT:    vpsllw $4, %ymm0, %ymm2
2292 ; AVX512BW-NEXT:    vpsrlw $4, %ymm1, %ymm0
2293 ; AVX512BW-NEXT:    vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm2, %zmm0
2294 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2295 ; AVX512BW-NEXT:    retq
2297 ; AVX512VBMI2-LABEL: splatconstant_funnnel_v32i8:
2298 ; AVX512VBMI2:       # %bb.0:
2299 ; AVX512VBMI2-NEXT:    vpsllw $4, %ymm0, %ymm2
2300 ; AVX512VBMI2-NEXT:    vpsrlw $4, %ymm1, %ymm0
2301 ; AVX512VBMI2-NEXT:    vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm2, %zmm0
2302 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
2303 ; AVX512VBMI2-NEXT:    retq
2305 ; AVX512VLBW-LABEL: splatconstant_funnnel_v32i8:
2306 ; AVX512VLBW:       # %bb.0:
2307 ; AVX512VLBW-NEXT:    vpsllw $4, %ymm0, %ymm2
2308 ; AVX512VLBW-NEXT:    vpsrlw $4, %ymm1, %ymm0
2309 ; AVX512VLBW-NEXT:    vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm2, %ymm0
2310 ; AVX512VLBW-NEXT:    retq
2312 ; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v32i8:
2313 ; AVX512VLVBMI2:       # %bb.0:
2314 ; AVX512VLVBMI2-NEXT:    vpsllw $4, %ymm0, %ymm2
2315 ; AVX512VLVBMI2-NEXT:    vpsrlw $4, %ymm1, %ymm0
2316 ; AVX512VLVBMI2-NEXT:    vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm2, %ymm0
2317 ; AVX512VLVBMI2-NEXT:    retq
2319 ; XOPAVX1-LABEL: splatconstant_funnnel_v32i8:
2320 ; XOPAVX1:       # %bb.0:
2321 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2322 ; XOPAVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
2323 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm2, %xmm2
2324 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm1, %xmm1
2325 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2326 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2327 ; XOPAVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4]
2328 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm2, %xmm2
2329 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm0, %xmm0
2330 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2331 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2332 ; XOPAVX1-NEXT:    retq
2334 ; XOPAVX2-LABEL: splatconstant_funnnel_v32i8:
2335 ; XOPAVX2:       # %bb.0:
2336 ; XOPAVX2-NEXT:    vpsrlw $4, %ymm1, %ymm1
2337 ; XOPAVX2-NEXT:    vpsllw $4, %ymm0, %ymm0
2338 ; XOPAVX2-NEXT:    vpcmov {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm0, %ymm0
2339 ; XOPAVX2-NEXT:    retq
2340   %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>)
2341   ret <32 x i8> %res