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.fshr.v4i64(<4 x i64>, <4 x i64>, <4 x i64>)
14 declare <8 x i32> @llvm.fshr.v8i32(<8 x i32>, <8 x i32>, <8 x i32>)
15 declare <16 x i16> @llvm.fshr.v16i16(<16 x i16>, <16 x i16>, <16 x i16>)
16 declare <32 x i8> @llvm.fshr.v32i8(<32 x i8>, <32 x i8>, <32 x i8>)
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:
25 ; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm3 = [63,63,63,63]
26 ; AVX1-NEXT: vandps %ymm3, %ymm2, %ymm4
27 ; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5
28 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6
29 ; AVX1-NEXT: vpsrlq %xmm5, %xmm6, %xmm7
30 ; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm5[2,3,2,3]
31 ; AVX1-NEXT: vpsrlq %xmm5, %xmm6, %xmm5
32 ; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm7[0,1,2,3],xmm5[4,5,6,7]
33 ; AVX1-NEXT: vpsrlq %xmm4, %xmm1, %xmm6
34 ; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[2,3,2,3]
35 ; AVX1-NEXT: vpsrlq %xmm4, %xmm1, %xmm1
36 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm6[0,1,2,3],xmm1[4,5,6,7]
37 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm1, %ymm1
38 ; AVX1-NEXT: vandnps %ymm3, %ymm2, %ymm2
39 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
40 ; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm3[2,3,2,3]
41 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
42 ; AVX1-NEXT: vpaddq %xmm5, %xmm5, %xmm5
43 ; AVX1-NEXT: vpsllq %xmm4, %xmm5, %xmm4
44 ; AVX1-NEXT: vpsllq %xmm3, %xmm5, %xmm3
45 ; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1,2,3],xmm4[4,5,6,7]
46 ; AVX1-NEXT: vshufps {{.*#+}} xmm4 = xmm2[2,3,2,3]
47 ; AVX1-NEXT: vpaddq %xmm0, %xmm0, %xmm0
48 ; AVX1-NEXT: vpsllq %xmm4, %xmm0, %xmm4
49 ; AVX1-NEXT: vpsllq %xmm2, %xmm0, %xmm0
50 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7]
51 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
52 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
55 ; AVX2-LABEL: var_funnnel_v4i64:
57 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
58 ; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm4
59 ; AVX2-NEXT: vpsrlvq %ymm4, %ymm1, %ymm1
60 ; AVX2-NEXT: vpandn %ymm3, %ymm2, %ymm2
61 ; AVX2-NEXT: vpaddq %ymm0, %ymm0, %ymm0
62 ; AVX2-NEXT: vpsllvq %ymm2, %ymm0, %ymm0
63 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
66 ; AVX512F-LABEL: var_funnnel_v4i64:
68 ; AVX512F-NEXT: vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
69 ; AVX512F-NEXT: vpand %ymm3, %ymm2, %ymm4
70 ; AVX512F-NEXT: vpsrlvq %ymm4, %ymm1, %ymm1
71 ; AVX512F-NEXT: vpandn %ymm3, %ymm2, %ymm2
72 ; AVX512F-NEXT: vpaddq %ymm0, %ymm0, %ymm0
73 ; AVX512F-NEXT: vpsllvq %ymm2, %ymm0, %ymm0
74 ; AVX512F-NEXT: vpor %ymm1, %ymm0, %ymm0
77 ; AVX512VL-LABEL: var_funnnel_v4i64:
79 ; AVX512VL-NEXT: vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
80 ; AVX512VL-NEXT: vpand %ymm3, %ymm2, %ymm4
81 ; AVX512VL-NEXT: vpsrlvq %ymm4, %ymm1, %ymm1
82 ; AVX512VL-NEXT: vpandn %ymm3, %ymm2, %ymm2
83 ; AVX512VL-NEXT: vpaddq %ymm0, %ymm0, %ymm0
84 ; AVX512VL-NEXT: vpsllvq %ymm2, %ymm0, %ymm0
85 ; AVX512VL-NEXT: vpor %ymm1, %ymm0, %ymm0
88 ; AVX512BW-LABEL: var_funnnel_v4i64:
90 ; AVX512BW-NEXT: vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
91 ; AVX512BW-NEXT: vpand %ymm3, %ymm2, %ymm4
92 ; AVX512BW-NEXT: vpsrlvq %ymm4, %ymm1, %ymm1
93 ; AVX512BW-NEXT: vpandn %ymm3, %ymm2, %ymm2
94 ; AVX512BW-NEXT: vpaddq %ymm0, %ymm0, %ymm0
95 ; AVX512BW-NEXT: vpsllvq %ymm2, %ymm0, %ymm0
96 ; AVX512BW-NEXT: vpor %ymm1, %ymm0, %ymm0
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: vpshrdvq %zmm2, %zmm0, %zmm1
105 ; AVX512VBMI2-NEXT: vmovdqa %ymm1, %ymm0
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: vpand %ymm3, %ymm2, %ymm4
112 ; AVX512VLBW-NEXT: vpsrlvq %ymm4, %ymm1, %ymm1
113 ; AVX512VLBW-NEXT: vpandn %ymm3, %ymm2, %ymm2
114 ; AVX512VLBW-NEXT: vpaddq %ymm0, %ymm0, %ymm0
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: vpshrdvq %ymm2, %ymm0, %ymm1
122 ; AVX512VLVBMI2-NEXT: vmovdqa %ymm1, %ymm0
123 ; AVX512VLVBMI2-NEXT: retq
125 ; XOPAVX1-LABEL: var_funnnel_v4i64:
127 ; XOPAVX1-NEXT: vbroadcastsd {{.*#+}} ymm3 = [63,63,63,63]
128 ; XOPAVX1-NEXT: vandps %ymm3, %ymm2, %ymm4
129 ; XOPAVX1-NEXT: vextractf128 $1, %ymm4, %xmm5
130 ; XOPAVX1-NEXT: vpxor %xmm6, %xmm6, %xmm6
131 ; XOPAVX1-NEXT: vpsubq %xmm5, %xmm6, %xmm5
132 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm7
133 ; XOPAVX1-NEXT: vpshlq %xmm5, %xmm7, %xmm5
134 ; XOPAVX1-NEXT: vpsubq %xmm4, %xmm6, %xmm4
135 ; XOPAVX1-NEXT: vpshlq %xmm4, %xmm1, %xmm1
136 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm5, %ymm1, %ymm1
137 ; XOPAVX1-NEXT: vandnps %ymm3, %ymm2, %ymm2
138 ; XOPAVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
139 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
140 ; XOPAVX1-NEXT: vpaddq %xmm4, %xmm4, %xmm4
141 ; XOPAVX1-NEXT: vpshlq %xmm3, %xmm4, %xmm3
142 ; XOPAVX1-NEXT: vpaddq %xmm0, %xmm0, %xmm0
143 ; XOPAVX1-NEXT: vpshlq %xmm2, %xmm0, %xmm0
144 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
145 ; XOPAVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
148 ; XOPAVX2-LABEL: var_funnnel_v4i64:
150 ; XOPAVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
151 ; XOPAVX2-NEXT: vpand %ymm3, %ymm2, %ymm4
152 ; XOPAVX2-NEXT: vpsrlvq %ymm4, %ymm1, %ymm1
153 ; XOPAVX2-NEXT: vpandn %ymm3, %ymm2, %ymm2
154 ; XOPAVX2-NEXT: vpaddq %ymm0, %ymm0, %ymm0
155 ; XOPAVX2-NEXT: vpsllvq %ymm2, %ymm0, %ymm0
156 ; XOPAVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
158 %res = call <4 x i64> @llvm.fshr.v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> %amt)
162 define <8 x i32> @var_funnnel_v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i32> %amt) nounwind {
163 ; AVX1-LABEL: var_funnnel_v8i32:
165 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
166 ; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
167 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
168 ; AVX1-NEXT: vpsrldq {{.*#+}} xmm5 = xmm4[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
169 ; AVX1-NEXT: vpsrld %xmm5, %xmm3, %xmm5
170 ; AVX1-NEXT: vpsrlq $32, %xmm4, %xmm6
171 ; AVX1-NEXT: vpsrld %xmm6, %xmm3, %xmm6
172 ; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm6[0,1,2,3],xmm5[4,5,6,7]
173 ; AVX1-NEXT: vpxor %xmm6, %xmm6, %xmm6
174 ; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm7 = xmm4[2],xmm6[2],xmm4[3],xmm6[3]
175 ; AVX1-NEXT: vpsrld %xmm7, %xmm3, %xmm7
176 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm8 = xmm4[0],zero,xmm4[1],zero
177 ; AVX1-NEXT: vpsrld %xmm8, %xmm3, %xmm3
178 ; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1,2,3],xmm7[4,5,6,7]
179 ; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm5[2,3],xmm3[4,5],xmm5[6,7]
180 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm5 = [31,31,31,31]
181 ; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4
182 ; AVX1-NEXT: vpslld $23, %xmm4, %xmm4
183 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm7 = [1065353216,1065353216,1065353216,1065353216]
184 ; AVX1-NEXT: vpaddd %xmm7, %xmm4, %xmm4
185 ; AVX1-NEXT: vcvttps2dq %xmm4, %xmm4
186 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm8
187 ; AVX1-NEXT: vpaddd %xmm8, %xmm8, %xmm8
188 ; AVX1-NEXT: vpmulld %xmm4, %xmm8, %xmm4
189 ; AVX1-NEXT: vpor %xmm3, %xmm4, %xmm3
190 ; AVX1-NEXT: vpsrldq {{.*#+}} xmm4 = xmm2[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
191 ; AVX1-NEXT: vpsrld %xmm4, %xmm1, %xmm4
192 ; AVX1-NEXT: vpsrlq $32, %xmm2, %xmm8
193 ; AVX1-NEXT: vpsrld %xmm8, %xmm1, %xmm8
194 ; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm8[0,1,2,3],xmm4[4,5,6,7]
195 ; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm6 = xmm2[2],xmm6[2],xmm2[3],xmm6[3]
196 ; AVX1-NEXT: vpsrld %xmm6, %xmm1, %xmm6
197 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm8 = xmm2[0],zero,xmm2[1],zero
198 ; AVX1-NEXT: vpsrld %xmm8, %xmm1, %xmm1
199 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm6[4,5,6,7]
200 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm4[2,3],xmm1[4,5],xmm4[6,7]
201 ; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2
202 ; AVX1-NEXT: vpslld $23, %xmm2, %xmm2
203 ; AVX1-NEXT: vpaddd %xmm7, %xmm2, %xmm2
204 ; AVX1-NEXT: vcvttps2dq %xmm2, %xmm2
205 ; AVX1-NEXT: vpaddd %xmm0, %xmm0, %xmm0
206 ; AVX1-NEXT: vpmulld %xmm2, %xmm0, %xmm0
207 ; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
208 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
211 ; AVX2-LABEL: var_funnnel_v8i32:
213 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
214 ; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm4
215 ; AVX2-NEXT: vpsrlvd %ymm4, %ymm1, %ymm1
216 ; AVX2-NEXT: vpandn %ymm3, %ymm2, %ymm2
217 ; AVX2-NEXT: vpaddd %ymm0, %ymm0, %ymm0
218 ; AVX2-NEXT: vpsllvd %ymm2, %ymm0, %ymm0
219 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
222 ; AVX512F-LABEL: var_funnnel_v8i32:
224 ; AVX512F-NEXT: vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
225 ; AVX512F-NEXT: vpand %ymm3, %ymm2, %ymm4
226 ; AVX512F-NEXT: vpsrlvd %ymm4, %ymm1, %ymm1
227 ; AVX512F-NEXT: vpandn %ymm3, %ymm2, %ymm2
228 ; AVX512F-NEXT: vpaddd %ymm0, %ymm0, %ymm0
229 ; AVX512F-NEXT: vpsllvd %ymm2, %ymm0, %ymm0
230 ; AVX512F-NEXT: vpor %ymm1, %ymm0, %ymm0
233 ; AVX512VL-LABEL: var_funnnel_v8i32:
235 ; AVX512VL-NEXT: vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
236 ; AVX512VL-NEXT: vpand %ymm3, %ymm2, %ymm4
237 ; AVX512VL-NEXT: vpsrlvd %ymm4, %ymm1, %ymm1
238 ; AVX512VL-NEXT: vpandn %ymm3, %ymm2, %ymm2
239 ; AVX512VL-NEXT: vpaddd %ymm0, %ymm0, %ymm0
240 ; AVX512VL-NEXT: vpsllvd %ymm2, %ymm0, %ymm0
241 ; AVX512VL-NEXT: vpor %ymm1, %ymm0, %ymm0
242 ; AVX512VL-NEXT: retq
244 ; AVX512BW-LABEL: var_funnnel_v8i32:
246 ; AVX512BW-NEXT: vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
247 ; AVX512BW-NEXT: vpand %ymm3, %ymm2, %ymm4
248 ; AVX512BW-NEXT: vpsrlvd %ymm4, %ymm1, %ymm1
249 ; AVX512BW-NEXT: vpandn %ymm3, %ymm2, %ymm2
250 ; AVX512BW-NEXT: vpaddd %ymm0, %ymm0, %ymm0
251 ; AVX512BW-NEXT: vpsllvd %ymm2, %ymm0, %ymm0
252 ; AVX512BW-NEXT: vpor %ymm1, %ymm0, %ymm0
253 ; AVX512BW-NEXT: retq
255 ; AVX512VBMI2-LABEL: var_funnnel_v8i32:
256 ; AVX512VBMI2: # %bb.0:
257 ; AVX512VBMI2-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2
258 ; AVX512VBMI2-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
259 ; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
260 ; AVX512VBMI2-NEXT: vpshrdvd %zmm2, %zmm0, %zmm1
261 ; AVX512VBMI2-NEXT: vmovdqa %ymm1, %ymm0
262 ; AVX512VBMI2-NEXT: retq
264 ; AVX512VLBW-LABEL: var_funnnel_v8i32:
265 ; AVX512VLBW: # %bb.0:
266 ; AVX512VLBW-NEXT: vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
267 ; AVX512VLBW-NEXT: vpand %ymm3, %ymm2, %ymm4
268 ; AVX512VLBW-NEXT: vpsrlvd %ymm4, %ymm1, %ymm1
269 ; AVX512VLBW-NEXT: vpandn %ymm3, %ymm2, %ymm2
270 ; AVX512VLBW-NEXT: vpaddd %ymm0, %ymm0, %ymm0
271 ; AVX512VLBW-NEXT: vpsllvd %ymm2, %ymm0, %ymm0
272 ; AVX512VLBW-NEXT: vpor %ymm1, %ymm0, %ymm0
273 ; AVX512VLBW-NEXT: retq
275 ; AVX512VLVBMI2-LABEL: var_funnnel_v8i32:
276 ; AVX512VLVBMI2: # %bb.0:
277 ; AVX512VLVBMI2-NEXT: vpshrdvd %ymm2, %ymm0, %ymm1
278 ; AVX512VLVBMI2-NEXT: vmovdqa %ymm1, %ymm0
279 ; AVX512VLVBMI2-NEXT: retq
281 ; XOPAVX1-LABEL: var_funnnel_v8i32:
283 ; XOPAVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
284 ; XOPAVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
285 ; XOPAVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4
286 ; XOPAVX1-NEXT: vpsubd %xmm3, %xmm4, %xmm5
287 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm6
288 ; XOPAVX1-NEXT: vpshld %xmm5, %xmm6, %xmm5
289 ; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [31,31,31,31]
290 ; XOPAVX1-NEXT: vpxor %xmm6, %xmm3, %xmm3
291 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm7
292 ; XOPAVX1-NEXT: vpaddd %xmm7, %xmm7, %xmm7
293 ; XOPAVX1-NEXT: vpshld %xmm3, %xmm7, %xmm3
294 ; XOPAVX1-NEXT: vpor %xmm5, %xmm3, %xmm3
295 ; XOPAVX1-NEXT: vpsubd %xmm2, %xmm4, %xmm4
296 ; XOPAVX1-NEXT: vpshld %xmm4, %xmm1, %xmm1
297 ; XOPAVX1-NEXT: vpxor %xmm6, %xmm2, %xmm2
298 ; XOPAVX1-NEXT: vpaddd %xmm0, %xmm0, %xmm0
299 ; XOPAVX1-NEXT: vpshld %xmm2, %xmm0, %xmm0
300 ; XOPAVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
301 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
304 ; XOPAVX2-LABEL: var_funnnel_v8i32:
306 ; XOPAVX2-NEXT: vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
307 ; XOPAVX2-NEXT: vpand %ymm3, %ymm2, %ymm4
308 ; XOPAVX2-NEXT: vpsrlvd %ymm4, %ymm1, %ymm1
309 ; XOPAVX2-NEXT: vpandn %ymm3, %ymm2, %ymm2
310 ; XOPAVX2-NEXT: vpaddd %ymm0, %ymm0, %ymm0
311 ; XOPAVX2-NEXT: vpsllvd %ymm2, %ymm0, %ymm0
312 ; XOPAVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
314 %res = call <8 x i32> @llvm.fshr.v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i32> %amt)
318 define <16 x i16> @var_funnnel_v16i16(<16 x i16> %x, <16 x i16> %y, <16 x i16> %amt) nounwind {
319 ; AVX1-LABEL: var_funnnel_v16i16:
321 ; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
322 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
323 ; AVX1-NEXT: vpsllw $12, %xmm3, %xmm4
324 ; AVX1-NEXT: vpsllw $4, %xmm3, %xmm5
325 ; AVX1-NEXT: vpor %xmm4, %xmm5, %xmm4
326 ; AVX1-NEXT: vpaddw %xmm4, %xmm4, %xmm5
327 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6
328 ; AVX1-NEXT: vpsrlw $8, %xmm6, %xmm7
329 ; AVX1-NEXT: vpblendvb %xmm4, %xmm7, %xmm6, %xmm4
330 ; AVX1-NEXT: vpsrlw $4, %xmm4, %xmm6
331 ; AVX1-NEXT: vpblendvb %xmm5, %xmm6, %xmm4, %xmm4
332 ; AVX1-NEXT: vpsrlw $2, %xmm4, %xmm6
333 ; AVX1-NEXT: vpaddw %xmm5, %xmm5, %xmm5
334 ; AVX1-NEXT: vpblendvb %xmm5, %xmm6, %xmm4, %xmm4
335 ; AVX1-NEXT: vpsrlw $1, %xmm4, %xmm6
336 ; AVX1-NEXT: vpaddw %xmm5, %xmm5, %xmm5
337 ; AVX1-NEXT: vpblendvb %xmm5, %xmm6, %xmm4, %xmm4
338 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm5 = [15,15,15,15,15,15,15,15]
339 ; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm6
340 ; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm3 = xmm6[4,4,5,5,6,6,7,7]
341 ; AVX1-NEXT: vpslld $23, %xmm3, %xmm7
342 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [1065353216,1065353216,1065353216,1065353216]
343 ; AVX1-NEXT: vpaddd %xmm3, %xmm7, %xmm7
344 ; AVX1-NEXT: vcvttps2dq %xmm7, %xmm7
345 ; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm6 = xmm6[0],zero,xmm6[1],zero,xmm6[2],zero,xmm6[3],zero
346 ; AVX1-NEXT: vpslld $23, %xmm6, %xmm6
347 ; AVX1-NEXT: vpaddd %xmm3, %xmm6, %xmm6
348 ; AVX1-NEXT: vcvttps2dq %xmm6, %xmm6
349 ; AVX1-NEXT: vpackusdw %xmm7, %xmm6, %xmm6
350 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7
351 ; AVX1-NEXT: vpaddw %xmm7, %xmm7, %xmm7
352 ; AVX1-NEXT: vpmullw %xmm6, %xmm7, %xmm6
353 ; AVX1-NEXT: vpor %xmm4, %xmm6, %xmm4
354 ; AVX1-NEXT: vpsllw $12, %xmm2, %xmm6
355 ; AVX1-NEXT: vpsllw $4, %xmm2, %xmm7
356 ; AVX1-NEXT: vpor %xmm6, %xmm7, %xmm6
357 ; AVX1-NEXT: vpaddw %xmm6, %xmm6, %xmm7
358 ; AVX1-NEXT: vpsrlw $8, %xmm1, %xmm8
359 ; AVX1-NEXT: vpblendvb %xmm6, %xmm8, %xmm1, %xmm1
360 ; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm6
361 ; AVX1-NEXT: vpblendvb %xmm7, %xmm6, %xmm1, %xmm1
362 ; AVX1-NEXT: vpsrlw $2, %xmm1, %xmm6
363 ; AVX1-NEXT: vpaddw %xmm7, %xmm7, %xmm7
364 ; AVX1-NEXT: vpblendvb %xmm7, %xmm6, %xmm1, %xmm1
365 ; AVX1-NEXT: vpsrlw $1, %xmm1, %xmm6
366 ; AVX1-NEXT: vpaddw %xmm7, %xmm7, %xmm7
367 ; AVX1-NEXT: vpblendvb %xmm7, %xmm6, %xmm1, %xmm1
368 ; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2
369 ; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm5 = xmm2[4,4,5,5,6,6,7,7]
370 ; AVX1-NEXT: vpslld $23, %xmm5, %xmm5
371 ; AVX1-NEXT: vpaddd %xmm3, %xmm5, %xmm5
372 ; AVX1-NEXT: vcvttps2dq %xmm5, %xmm5
373 ; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero
374 ; AVX1-NEXT: vpslld $23, %xmm2, %xmm2
375 ; AVX1-NEXT: vpaddd %xmm3, %xmm2, %xmm2
376 ; AVX1-NEXT: vcvttps2dq %xmm2, %xmm2
377 ; AVX1-NEXT: vpackusdw %xmm5, %xmm2, %xmm2
378 ; AVX1-NEXT: vpaddw %xmm0, %xmm0, %xmm0
379 ; AVX1-NEXT: vpmullw %xmm2, %xmm0, %xmm0
380 ; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
381 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0
384 ; AVX2-LABEL: var_funnnel_v16i16:
386 ; 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]
387 ; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
388 ; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4
389 ; 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]
390 ; AVX2-NEXT: vpsrlvd %ymm5, %ymm3, %ymm3
391 ; AVX2-NEXT: vpblendw {{.*#+}} ymm3 = ymm3[0],ymm4[1],ymm3[2],ymm4[3],ymm3[4],ymm4[5],ymm3[6],ymm4[7],ymm3[8],ymm4[9],ymm3[10],ymm4[11],ymm3[12],ymm4[13],ymm3[14],ymm4[15]
392 ; 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]
393 ; 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]
394 ; AVX2-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0
395 ; AVX2-NEXT: vpblendw {{.*#+}} ymm0 = ymm0[0],ymm4[1],ymm0[2],ymm4[3],ymm0[4],ymm4[5],ymm0[6],ymm4[7],ymm0[8],ymm4[9],ymm0[10],ymm4[11],ymm0[12],ymm4[13],ymm0[14],ymm4[15]
396 ; AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0
399 ; AVX512F-LABEL: var_funnnel_v16i16:
401 ; 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
402 ; 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
403 ; AVX512F-NEXT: vpslld $16, %zmm0, %zmm0
404 ; AVX512F-NEXT: vpord %zmm1, %zmm0, %zmm0
405 ; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm1
406 ; 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
407 ; AVX512F-NEXT: vpsrlvd %zmm1, %zmm0, %zmm0
408 ; AVX512F-NEXT: vpmovdw %zmm0, %ymm0
411 ; AVX512VL-LABEL: var_funnnel_v16i16:
413 ; 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
414 ; 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
415 ; AVX512VL-NEXT: vpslld $16, %zmm0, %zmm0
416 ; AVX512VL-NEXT: vpord %zmm1, %zmm0, %zmm0
417 ; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm2, %ymm1
418 ; 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
419 ; AVX512VL-NEXT: vpsrlvd %zmm1, %zmm0, %zmm0
420 ; AVX512VL-NEXT: vpmovdw %zmm0, %ymm0
421 ; AVX512VL-NEXT: retq
423 ; AVX512BW-LABEL: var_funnnel_v16i16:
425 ; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
426 ; AVX512BW-NEXT: vpbroadcastw {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
427 ; AVX512BW-NEXT: vpand %ymm3, %ymm2, %ymm4
428 ; AVX512BW-NEXT: vpsrlvw %zmm4, %zmm1, %zmm1
429 ; AVX512BW-NEXT: vpandn %ymm3, %ymm2, %ymm2
430 ; AVX512BW-NEXT: vpaddw %ymm0, %ymm0, %ymm0
431 ; AVX512BW-NEXT: vpsllvw %zmm2, %zmm0, %zmm0
432 ; AVX512BW-NEXT: vpor %ymm1, %ymm0, %ymm0
433 ; AVX512BW-NEXT: retq
435 ; AVX512VBMI2-LABEL: var_funnnel_v16i16:
436 ; AVX512VBMI2: # %bb.0:
437 ; AVX512VBMI2-NEXT: # kill: def $ymm2 killed $ymm2 def $zmm2
438 ; AVX512VBMI2-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
439 ; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
440 ; AVX512VBMI2-NEXT: vpshrdvw %zmm2, %zmm0, %zmm1
441 ; AVX512VBMI2-NEXT: vmovdqa %ymm1, %ymm0
442 ; AVX512VBMI2-NEXT: retq
444 ; AVX512VLBW-LABEL: var_funnnel_v16i16:
445 ; AVX512VLBW: # %bb.0:
446 ; AVX512VLBW-NEXT: vpbroadcastw {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
447 ; AVX512VLBW-NEXT: vpand %ymm3, %ymm2, %ymm4
448 ; AVX512VLBW-NEXT: vpsrlvw %ymm4, %ymm1, %ymm1
449 ; AVX512VLBW-NEXT: vpandn %ymm3, %ymm2, %ymm2
450 ; AVX512VLBW-NEXT: vpaddw %ymm0, %ymm0, %ymm0
451 ; AVX512VLBW-NEXT: vpsllvw %ymm2, %ymm0, %ymm0
452 ; AVX512VLBW-NEXT: vpor %ymm1, %ymm0, %ymm0
453 ; AVX512VLBW-NEXT: retq
455 ; AVX512VLVBMI2-LABEL: var_funnnel_v16i16:
456 ; AVX512VLVBMI2: # %bb.0:
457 ; AVX512VLVBMI2-NEXT: vpshrdvw %ymm2, %ymm0, %ymm1
458 ; AVX512VLVBMI2-NEXT: vmovdqa %ymm1, %ymm0
459 ; AVX512VLVBMI2-NEXT: retq
461 ; XOPAVX1-LABEL: var_funnnel_v16i16:
463 ; XOPAVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
464 ; XOPAVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
465 ; XOPAVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4
466 ; XOPAVX1-NEXT: vpsubw %xmm3, %xmm4, %xmm5
467 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm6
468 ; XOPAVX1-NEXT: vpshlw %xmm5, %xmm6, %xmm5
469 ; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [15,15,15,15,15,15,15,15]
470 ; XOPAVX1-NEXT: vpxor %xmm6, %xmm3, %xmm3
471 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm7
472 ; XOPAVX1-NEXT: vpaddw %xmm7, %xmm7, %xmm7
473 ; XOPAVX1-NEXT: vpshlw %xmm3, %xmm7, %xmm3
474 ; XOPAVX1-NEXT: vpor %xmm5, %xmm3, %xmm3
475 ; XOPAVX1-NEXT: vpsubw %xmm2, %xmm4, %xmm4
476 ; XOPAVX1-NEXT: vpshlw %xmm4, %xmm1, %xmm1
477 ; XOPAVX1-NEXT: vpxor %xmm6, %xmm2, %xmm2
478 ; XOPAVX1-NEXT: vpaddw %xmm0, %xmm0, %xmm0
479 ; XOPAVX1-NEXT: vpshlw %xmm2, %xmm0, %xmm0
480 ; XOPAVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
481 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
484 ; XOPAVX2-LABEL: var_funnnel_v16i16:
486 ; XOPAVX2-NEXT: vpbroadcastw {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
487 ; XOPAVX2-NEXT: vpand %ymm3, %ymm2, %ymm4
488 ; XOPAVX2-NEXT: vextracti128 $1, %ymm4, %xmm5
489 ; XOPAVX2-NEXT: vpxor %xmm6, %xmm6, %xmm6
490 ; XOPAVX2-NEXT: vpsubw %xmm5, %xmm6, %xmm5
491 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm7
492 ; XOPAVX2-NEXT: vpshlw %xmm5, %xmm7, %xmm5
493 ; XOPAVX2-NEXT: vpsubw %xmm4, %xmm6, %xmm4
494 ; XOPAVX2-NEXT: vpshlw %xmm4, %xmm1, %xmm1
495 ; XOPAVX2-NEXT: vinserti128 $1, %xmm5, %ymm1, %ymm1
496 ; XOPAVX2-NEXT: vpandn %ymm3, %ymm2, %ymm2
497 ; XOPAVX2-NEXT: vextracti128 $1, %ymm2, %xmm3
498 ; XOPAVX2-NEXT: vpaddw %ymm0, %ymm0, %ymm0
499 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm4
500 ; XOPAVX2-NEXT: vpshlw %xmm3, %xmm4, %xmm3
501 ; XOPAVX2-NEXT: vpshlw %xmm2, %xmm0, %xmm0
502 ; XOPAVX2-NEXT: vinserti128 $1, %xmm3, %ymm0, %ymm0
503 ; XOPAVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
505 %res = call <16 x i16> @llvm.fshr.v16i16(<16 x i16> %x, <16 x i16> %y, <16 x i16> %amt)
509 define <32 x i8> @var_funnnel_v32i8(<32 x i8> %x, <32 x i8> %y, <32 x i8> %amt) nounwind {
510 ; AVX1-LABEL: var_funnnel_v32i8:
512 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
513 ; AVX1-NEXT: vpaddb %xmm3, %xmm3, %xmm5
514 ; AVX1-NEXT: vpsllw $4, %xmm5, %xmm4
515 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
516 ; AVX1-NEXT: vpand %xmm3, %xmm4, %xmm6
517 ; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
518 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm7
519 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
520 ; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm8
521 ; AVX1-NEXT: vpsllw $5, %xmm8, %xmm8
522 ; AVX1-NEXT: vpblendvb %xmm8, %xmm6, %xmm5, %xmm6
523 ; AVX1-NEXT: vpsllw $2, %xmm6, %xmm9
524 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm5 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
525 ; AVX1-NEXT: vpand %xmm5, %xmm9, %xmm9
526 ; AVX1-NEXT: vpaddb %xmm8, %xmm8, %xmm8
527 ; AVX1-NEXT: vpblendvb %xmm8, %xmm9, %xmm6, %xmm6
528 ; AVX1-NEXT: vpaddb %xmm6, %xmm6, %xmm9
529 ; AVX1-NEXT: vpaddb %xmm8, %xmm8, %xmm8
530 ; AVX1-NEXT: vpblendvb %xmm8, %xmm9, %xmm6, %xmm6
531 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm8
532 ; AVX1-NEXT: vpsrlw $4, %xmm8, %xmm9
533 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm10 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
534 ; AVX1-NEXT: vpand %xmm10, %xmm9, %xmm9
535 ; AVX1-NEXT: vpsllw $5, %xmm7, %xmm7
536 ; AVX1-NEXT: vpblendvb %xmm7, %xmm9, %xmm8, %xmm8
537 ; AVX1-NEXT: vpsrlw $2, %xmm8, %xmm9
538 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm11 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
539 ; AVX1-NEXT: vpand %xmm11, %xmm9, %xmm9
540 ; AVX1-NEXT: vpaddb %xmm7, %xmm7, %xmm7
541 ; AVX1-NEXT: vpblendvb %xmm7, %xmm9, %xmm8, %xmm8
542 ; AVX1-NEXT: vpsrlw $1, %xmm8, %xmm9
543 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm12 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
544 ; AVX1-NEXT: vpand %xmm12, %xmm9, %xmm9
545 ; AVX1-NEXT: vpaddb %xmm7, %xmm7, %xmm7
546 ; AVX1-NEXT: vpblendvb %xmm7, %xmm9, %xmm8, %xmm7
547 ; AVX1-NEXT: vpor %xmm7, %xmm6, %xmm6
548 ; AVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm0
549 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm7
550 ; AVX1-NEXT: vpand %xmm3, %xmm7, %xmm3
551 ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm4
552 ; AVX1-NEXT: vpsllw $5, %xmm4, %xmm4
553 ; AVX1-NEXT: vpblendvb %xmm4, %xmm3, %xmm0, %xmm0
554 ; AVX1-NEXT: vpsllw $2, %xmm0, %xmm3
555 ; AVX1-NEXT: vpand %xmm5, %xmm3, %xmm3
556 ; AVX1-NEXT: vpaddb %xmm4, %xmm4, %xmm4
557 ; AVX1-NEXT: vpblendvb %xmm4, %xmm3, %xmm0, %xmm0
558 ; AVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm3
559 ; AVX1-NEXT: vpaddb %xmm4, %xmm4, %xmm4
560 ; AVX1-NEXT: vpblendvb %xmm4, %xmm3, %xmm0, %xmm0
561 ; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm3
562 ; AVX1-NEXT: vpand %xmm3, %xmm10, %xmm3
563 ; AVX1-NEXT: vpsllw $5, %xmm2, %xmm2
564 ; AVX1-NEXT: vpblendvb %xmm2, %xmm3, %xmm1, %xmm1
565 ; AVX1-NEXT: vpsrlw $2, %xmm1, %xmm3
566 ; AVX1-NEXT: vpand %xmm3, %xmm11, %xmm3
567 ; AVX1-NEXT: vpaddb %xmm2, %xmm2, %xmm2
568 ; AVX1-NEXT: vpblendvb %xmm2, %xmm3, %xmm1, %xmm1
569 ; AVX1-NEXT: vpsrlw $1, %xmm1, %xmm3
570 ; AVX1-NEXT: vpand %xmm3, %xmm12, %xmm3
571 ; AVX1-NEXT: vpaddb %xmm2, %xmm2, %xmm2
572 ; AVX1-NEXT: vpblendvb %xmm2, %xmm3, %xmm1, %xmm1
573 ; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
574 ; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm0, %ymm0
577 ; AVX2-LABEL: var_funnnel_v32i8:
579 ; AVX2-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]
580 ; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm4
581 ; AVX2-NEXT: vpsllw $5, %ymm4, %ymm4
582 ; AVX2-NEXT: vpaddb %ymm4, %ymm4, %ymm5
583 ; AVX2-NEXT: vpsrlw $4, %ymm1, %ymm6
584 ; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm6, %ymm6
585 ; AVX2-NEXT: vpblendvb %ymm4, %ymm6, %ymm1, %ymm1
586 ; AVX2-NEXT: vpsrlw $2, %ymm1, %ymm4
587 ; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4
588 ; AVX2-NEXT: vpblendvb %ymm5, %ymm4, %ymm1, %ymm1
589 ; AVX2-NEXT: vpsrlw $1, %ymm1, %ymm4
590 ; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4
591 ; AVX2-NEXT: vpaddb %ymm5, %ymm5, %ymm5
592 ; AVX2-NEXT: vpblendvb %ymm5, %ymm4, %ymm1, %ymm1
593 ; AVX2-NEXT: vpandn %ymm3, %ymm2, %ymm2
594 ; AVX2-NEXT: vpsllw $5, %ymm2, %ymm2
595 ; AVX2-NEXT: vpaddb %ymm2, %ymm2, %ymm3
596 ; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm0
597 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm4
598 ; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4
599 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm0, %ymm0
600 ; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2
601 ; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
602 ; AVX2-NEXT: vpblendvb %ymm3, %ymm2, %ymm0, %ymm0
603 ; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2
604 ; AVX2-NEXT: vpaddb %ymm3, %ymm3, %ymm3
605 ; AVX2-NEXT: vpblendvb %ymm3, %ymm2, %ymm0, %ymm0
606 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
609 ; AVX512F-LABEL: var_funnnel_v32i8:
611 ; 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]
612 ; AVX512F-NEXT: vpand %ymm3, %ymm2, %ymm4
613 ; AVX512F-NEXT: vpsllw $5, %ymm4, %ymm4
614 ; AVX512F-NEXT: vpaddb %ymm4, %ymm4, %ymm5
615 ; AVX512F-NEXT: vpsrlw $4, %ymm1, %ymm6
616 ; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm6, %ymm6
617 ; AVX512F-NEXT: vpblendvb %ymm4, %ymm6, %ymm1, %ymm1
618 ; AVX512F-NEXT: vpsrlw $2, %ymm1, %ymm4
619 ; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4
620 ; AVX512F-NEXT: vpblendvb %ymm5, %ymm4, %ymm1, %ymm1
621 ; AVX512F-NEXT: vpsrlw $1, %ymm1, %ymm4
622 ; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4
623 ; AVX512F-NEXT: vpaddb %ymm5, %ymm5, %ymm5
624 ; AVX512F-NEXT: vpblendvb %ymm5, %ymm4, %ymm1, %ymm1
625 ; AVX512F-NEXT: vpandn %ymm3, %ymm2, %ymm2
626 ; AVX512F-NEXT: vpsllw $5, %ymm2, %ymm2
627 ; AVX512F-NEXT: vpaddb %ymm2, %ymm2, %ymm3
628 ; AVX512F-NEXT: vpaddb %ymm0, %ymm0, %ymm0
629 ; AVX512F-NEXT: vpsllw $4, %ymm0, %ymm4
630 ; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4
631 ; AVX512F-NEXT: vpblendvb %ymm2, %ymm4, %ymm0, %ymm0
632 ; AVX512F-NEXT: vpsllw $2, %ymm0, %ymm2
633 ; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
634 ; AVX512F-NEXT: vpblendvb %ymm3, %ymm2, %ymm0, %ymm0
635 ; AVX512F-NEXT: vpaddb %ymm0, %ymm0, %ymm2
636 ; AVX512F-NEXT: vpaddb %ymm3, %ymm3, %ymm3
637 ; AVX512F-NEXT: vpblendvb %ymm3, %ymm2, %ymm0, %ymm0
638 ; AVX512F-NEXT: vpor %ymm1, %ymm0, %ymm0
641 ; AVX512VL-LABEL: var_funnnel_v32i8:
643 ; 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]
644 ; AVX512VL-NEXT: vpand %ymm3, %ymm2, %ymm4
645 ; AVX512VL-NEXT: vpsllw $5, %ymm4, %ymm4
646 ; AVX512VL-NEXT: vpaddb %ymm4, %ymm4, %ymm5
647 ; AVX512VL-NEXT: vpsrlw $4, %ymm1, %ymm6
648 ; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm6, %ymm6
649 ; AVX512VL-NEXT: vpblendvb %ymm4, %ymm6, %ymm1, %ymm1
650 ; AVX512VL-NEXT: vpsrlw $2, %ymm1, %ymm4
651 ; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm4, %ymm4
652 ; AVX512VL-NEXT: vpblendvb %ymm5, %ymm4, %ymm1, %ymm1
653 ; AVX512VL-NEXT: vpsrlw $1, %ymm1, %ymm4
654 ; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm4, %ymm4
655 ; AVX512VL-NEXT: vpaddb %ymm5, %ymm5, %ymm5
656 ; AVX512VL-NEXT: vpblendvb %ymm5, %ymm4, %ymm1, %ymm1
657 ; AVX512VL-NEXT: vpandn %ymm3, %ymm2, %ymm2
658 ; AVX512VL-NEXT: vpsllw $5, %ymm2, %ymm2
659 ; AVX512VL-NEXT: vpaddb %ymm2, %ymm2, %ymm3
660 ; AVX512VL-NEXT: vpaddb %ymm0, %ymm0, %ymm0
661 ; AVX512VL-NEXT: vpsllw $4, %ymm0, %ymm4
662 ; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm4, %ymm4
663 ; AVX512VL-NEXT: vpblendvb %ymm2, %ymm4, %ymm0, %ymm0
664 ; AVX512VL-NEXT: vpsllw $2, %ymm0, %ymm2
665 ; AVX512VL-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm2, %ymm2
666 ; AVX512VL-NEXT: vpblendvb %ymm3, %ymm2, %ymm0, %ymm0
667 ; AVX512VL-NEXT: vpaddb %ymm0, %ymm0, %ymm2
668 ; AVX512VL-NEXT: vpaddb %ymm3, %ymm3, %ymm3
669 ; AVX512VL-NEXT: vpblendvb %ymm3, %ymm2, %ymm0, %ymm0
670 ; AVX512VL-NEXT: vpor %ymm1, %ymm0, %ymm0
671 ; AVX512VL-NEXT: retq
673 ; AVX512BW-LABEL: var_funnnel_v32i8:
675 ; 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
676 ; 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
677 ; AVX512BW-NEXT: vpsllw $8, %zmm0, %zmm0
678 ; AVX512BW-NEXT: vporq %zmm1, %zmm0, %zmm0
679 ; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm1
680 ; 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
681 ; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm0
682 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0
683 ; AVX512BW-NEXT: retq
685 ; AVX512VBMI2-LABEL: var_funnnel_v32i8:
686 ; AVX512VBMI2: # %bb.0:
687 ; AVX512VBMI2-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
688 ; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
689 ; 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]
690 ; AVX512VBMI2-NEXT: vpermi2b %zmm0, %zmm1, %zmm3
691 ; AVX512VBMI2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm0
692 ; 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
693 ; AVX512VBMI2-NEXT: vpsrlvw %zmm0, %zmm3, %zmm0
694 ; AVX512VBMI2-NEXT: vpmovwb %zmm0, %ymm0
695 ; AVX512VBMI2-NEXT: retq
697 ; AVX512VLBW-LABEL: var_funnnel_v32i8:
698 ; AVX512VLBW: # %bb.0:
699 ; 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
700 ; 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
701 ; AVX512VLBW-NEXT: vpsllw $8, %zmm0, %zmm0
702 ; AVX512VLBW-NEXT: vporq %zmm1, %zmm0, %zmm0
703 ; AVX512VLBW-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm2, %ymm1
704 ; 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
705 ; AVX512VLBW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm0
706 ; AVX512VLBW-NEXT: vpmovwb %zmm0, %ymm0
707 ; AVX512VLBW-NEXT: retq
709 ; AVX512VLVBMI2-LABEL: var_funnnel_v32i8:
710 ; AVX512VLVBMI2: # %bb.0:
711 ; AVX512VLVBMI2-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
712 ; AVX512VLVBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
713 ; 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]
714 ; AVX512VLVBMI2-NEXT: vpermi2b %zmm0, %zmm1, %zmm3
715 ; AVX512VLVBMI2-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm2, %ymm0
716 ; 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
717 ; AVX512VLVBMI2-NEXT: vpsrlvw %zmm0, %zmm3, %zmm0
718 ; AVX512VLVBMI2-NEXT: vpmovwb %zmm0, %ymm0
719 ; AVX512VLVBMI2-NEXT: retq
721 ; XOPAVX1-LABEL: var_funnnel_v32i8:
723 ; XOPAVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
724 ; XOPAVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
725 ; XOPAVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4
726 ; XOPAVX1-NEXT: vpsubb %xmm3, %xmm4, %xmm5
727 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm6
728 ; XOPAVX1-NEXT: vpshlb %xmm5, %xmm6, %xmm5
729 ; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
730 ; XOPAVX1-NEXT: vpxor %xmm6, %xmm3, %xmm3
731 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm7
732 ; XOPAVX1-NEXT: vpaddb %xmm7, %xmm7, %xmm7
733 ; XOPAVX1-NEXT: vpshlb %xmm3, %xmm7, %xmm3
734 ; XOPAVX1-NEXT: vpor %xmm5, %xmm3, %xmm3
735 ; XOPAVX1-NEXT: vpsubb %xmm2, %xmm4, %xmm4
736 ; XOPAVX1-NEXT: vpshlb %xmm4, %xmm1, %xmm1
737 ; XOPAVX1-NEXT: vpxor %xmm6, %xmm2, %xmm2
738 ; XOPAVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm0
739 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm0, %xmm0
740 ; XOPAVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
741 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
744 ; XOPAVX2-LABEL: var_funnnel_v32i8:
746 ; XOPAVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
747 ; XOPAVX2-NEXT: vextracti128 $1, %ymm2, %xmm3
748 ; XOPAVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4
749 ; XOPAVX2-NEXT: vpsubb %xmm3, %xmm4, %xmm5
750 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm6
751 ; XOPAVX2-NEXT: vpshlb %xmm5, %xmm6, %xmm5
752 ; XOPAVX2-NEXT: vpsubb %xmm2, %xmm4, %xmm4
753 ; XOPAVX2-NEXT: vpshlb %xmm4, %xmm1, %xmm1
754 ; XOPAVX2-NEXT: vinserti128 $1, %xmm5, %ymm1, %ymm1
755 ; XOPAVX2-NEXT: vpbroadcastb {{.*#+}} xmm4 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
756 ; XOPAVX2-NEXT: vpxor %xmm4, %xmm3, %xmm3
757 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm5
758 ; XOPAVX2-NEXT: vpaddb %xmm5, %xmm5, %xmm5
759 ; XOPAVX2-NEXT: vpshlb %xmm3, %xmm5, %xmm3
760 ; XOPAVX2-NEXT: vpxor %xmm4, %xmm2, %xmm2
761 ; XOPAVX2-NEXT: vpaddb %xmm0, %xmm0, %xmm0
762 ; XOPAVX2-NEXT: vpshlb %xmm2, %xmm0, %xmm0
763 ; XOPAVX2-NEXT: vinserti128 $1, %xmm3, %ymm0, %ymm0
764 ; XOPAVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
766 %res = call <32 x i8> @llvm.fshr.v32i8(<32 x i8> %x, <32 x i8> %y, <32 x i8> %amt)
771 ; Uniform Variable Shifts
774 define <4 x i64> @splatvar_funnnel_v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> %amt) nounwind {
775 ; AVX1-LABEL: splatvar_funnnel_v4i64:
777 ; AVX1-NEXT: vmovddup {{.*#+}} xmm3 = [63,63]
778 ; AVX1-NEXT: # xmm3 = mem[0,0]
779 ; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm4
780 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
781 ; AVX1-NEXT: vpsrlq %xmm4, %xmm5, %xmm5
782 ; AVX1-NEXT: vpsrlq %xmm4, %xmm1, %xmm1
783 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm1, %ymm1
784 ; AVX1-NEXT: vpandn %xmm3, %xmm2, %xmm2
785 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
786 ; AVX1-NEXT: vpaddq %xmm3, %xmm3, %xmm3
787 ; AVX1-NEXT: vpsllq %xmm2, %xmm3, %xmm3
788 ; AVX1-NEXT: vpaddq %xmm0, %xmm0, %xmm0
789 ; AVX1-NEXT: vpsllq %xmm2, %xmm0, %xmm0
790 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
791 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
794 ; AVX2-LABEL: splatvar_funnnel_v4i64:
796 ; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm3 = [63,63]
797 ; AVX2-NEXT: vpand %xmm3, %xmm2, %xmm4
798 ; AVX2-NEXT: vpsrlq %xmm4, %ymm1, %ymm1
799 ; AVX2-NEXT: vpandn %xmm3, %xmm2, %xmm2
800 ; AVX2-NEXT: vpaddq %ymm0, %ymm0, %ymm0
801 ; AVX2-NEXT: vpsllq %xmm2, %ymm0, %ymm0
802 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
805 ; AVX512F-LABEL: splatvar_funnnel_v4i64:
807 ; AVX512F-NEXT: vpbroadcastq {{.*#+}} xmm3 = [63,63]
808 ; AVX512F-NEXT: vpand %xmm3, %xmm2, %xmm4
809 ; AVX512F-NEXT: vpsrlq %xmm4, %ymm1, %ymm1
810 ; AVX512F-NEXT: vpandn %xmm3, %xmm2, %xmm2
811 ; AVX512F-NEXT: vpaddq %ymm0, %ymm0, %ymm0
812 ; AVX512F-NEXT: vpsllq %xmm2, %ymm0, %ymm0
813 ; AVX512F-NEXT: vpor %ymm1, %ymm0, %ymm0
816 ; AVX512VL-LABEL: splatvar_funnnel_v4i64:
818 ; AVX512VL-NEXT: vpbroadcastq {{.*#+}} xmm3 = [63,63]
819 ; AVX512VL-NEXT: vpand %xmm3, %xmm2, %xmm4
820 ; AVX512VL-NEXT: vpsrlq %xmm4, %ymm1, %ymm1
821 ; AVX512VL-NEXT: vpandn %xmm3, %xmm2, %xmm2
822 ; AVX512VL-NEXT: vpaddq %ymm0, %ymm0, %ymm0
823 ; AVX512VL-NEXT: vpsllq %xmm2, %ymm0, %ymm0
824 ; AVX512VL-NEXT: vpor %ymm1, %ymm0, %ymm0
825 ; AVX512VL-NEXT: retq
827 ; AVX512BW-LABEL: splatvar_funnnel_v4i64:
829 ; AVX512BW-NEXT: vpbroadcastq {{.*#+}} xmm3 = [63,63]
830 ; AVX512BW-NEXT: vpand %xmm3, %xmm2, %xmm4
831 ; AVX512BW-NEXT: vpsrlq %xmm4, %ymm1, %ymm1
832 ; AVX512BW-NEXT: vpandn %xmm3, %xmm2, %xmm2
833 ; AVX512BW-NEXT: vpaddq %ymm0, %ymm0, %ymm0
834 ; AVX512BW-NEXT: vpsllq %xmm2, %ymm0, %ymm0
835 ; AVX512BW-NEXT: vpor %ymm1, %ymm0, %ymm0
836 ; AVX512BW-NEXT: retq
838 ; AVX512VBMI2-LABEL: splatvar_funnnel_v4i64:
839 ; AVX512VBMI2: # %bb.0:
840 ; AVX512VBMI2-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
841 ; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
842 ; AVX512VBMI2-NEXT: vpbroadcastq %xmm2, %ymm2
843 ; AVX512VBMI2-NEXT: vpshrdvq %zmm2, %zmm0, %zmm1
844 ; AVX512VBMI2-NEXT: vmovdqa %ymm1, %ymm0
845 ; AVX512VBMI2-NEXT: retq
847 ; AVX512VLBW-LABEL: splatvar_funnnel_v4i64:
848 ; AVX512VLBW: # %bb.0:
849 ; AVX512VLBW-NEXT: vpbroadcastq {{.*#+}} xmm3 = [63,63]
850 ; AVX512VLBW-NEXT: vpand %xmm3, %xmm2, %xmm4
851 ; AVX512VLBW-NEXT: vpsrlq %xmm4, %ymm1, %ymm1
852 ; AVX512VLBW-NEXT: vpandn %xmm3, %xmm2, %xmm2
853 ; AVX512VLBW-NEXT: vpaddq %ymm0, %ymm0, %ymm0
854 ; AVX512VLBW-NEXT: vpsllq %xmm2, %ymm0, %ymm0
855 ; AVX512VLBW-NEXT: vpor %ymm1, %ymm0, %ymm0
856 ; AVX512VLBW-NEXT: retq
858 ; AVX512VLVBMI2-LABEL: splatvar_funnnel_v4i64:
859 ; AVX512VLVBMI2: # %bb.0:
860 ; AVX512VLVBMI2-NEXT: vpbroadcastq %xmm2, %ymm2
861 ; AVX512VLVBMI2-NEXT: vpshrdvq %ymm2, %ymm0, %ymm1
862 ; AVX512VLVBMI2-NEXT: vmovdqa %ymm1, %ymm0
863 ; AVX512VLVBMI2-NEXT: retq
865 ; XOPAVX1-LABEL: splatvar_funnnel_v4i64:
867 ; XOPAVX1-NEXT: vmovddup {{.*#+}} xmm3 = [63,63]
868 ; XOPAVX1-NEXT: # xmm3 = mem[0,0]
869 ; XOPAVX1-NEXT: vpand %xmm3, %xmm2, %xmm4
870 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
871 ; XOPAVX1-NEXT: vpsrlq %xmm4, %xmm5, %xmm5
872 ; XOPAVX1-NEXT: vpsrlq %xmm4, %xmm1, %xmm1
873 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm5, %ymm1, %ymm1
874 ; XOPAVX1-NEXT: vpandn %xmm3, %xmm2, %xmm2
875 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
876 ; XOPAVX1-NEXT: vpaddq %xmm3, %xmm3, %xmm3
877 ; XOPAVX1-NEXT: vpsllq %xmm2, %xmm3, %xmm3
878 ; XOPAVX1-NEXT: vpaddq %xmm0, %xmm0, %xmm0
879 ; XOPAVX1-NEXT: vpsllq %xmm2, %xmm0, %xmm0
880 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
881 ; XOPAVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
884 ; XOPAVX2-LABEL: splatvar_funnnel_v4i64:
886 ; XOPAVX2-NEXT: vpbroadcastq {{.*#+}} xmm3 = [63,63]
887 ; XOPAVX2-NEXT: vpand %xmm3, %xmm2, %xmm4
888 ; XOPAVX2-NEXT: vpsrlq %xmm4, %ymm1, %ymm1
889 ; XOPAVX2-NEXT: vpandn %xmm3, %xmm2, %xmm2
890 ; XOPAVX2-NEXT: vpaddq %ymm0, %ymm0, %ymm0
891 ; XOPAVX2-NEXT: vpsllq %xmm2, %ymm0, %ymm0
892 ; XOPAVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
894 %splat = shufflevector <4 x i64> %amt, <4 x i64> undef, <4 x i32> zeroinitializer
895 %res = call <4 x i64> @llvm.fshr.v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> %splat)
899 define <8 x i32> @splatvar_funnnel_v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i32> %amt) nounwind {
900 ; AVX1-LABEL: splatvar_funnnel_v8i32:
902 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
903 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
904 ; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm5 = xmm4[2],xmm3[2],xmm4[3],xmm3[3]
905 ; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
906 ; AVX1-NEXT: vpsrlq %xmm2, %xmm5, %xmm5
907 ; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm6 = xmm1[2],xmm0[2],xmm1[3],xmm0[3]
908 ; AVX1-NEXT: vpsrlq %xmm2, %xmm6, %xmm6
909 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm6, %ymm5
910 ; AVX1-NEXT: vpunpckldq {{.*#+}} xmm3 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
911 ; AVX1-NEXT: vpsrlq %xmm2, %xmm3, %xmm3
912 ; AVX1-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
913 ; AVX1-NEXT: vpsrlq %xmm2, %xmm0, %xmm0
914 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
915 ; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm5[0,2],ymm0[4,6],ymm5[4,6]
918 ; AVX2-LABEL: splatvar_funnnel_v8i32:
920 ; AVX2-NEXT: vpunpckhdq {{.*#+}} ymm3 = ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[6],ymm0[6],ymm1[7],ymm0[7]
921 ; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
922 ; AVX2-NEXT: vpsrlq %xmm2, %ymm3, %ymm3
923 ; AVX2-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[4],ymm0[4],ymm1[5],ymm0[5]
924 ; AVX2-NEXT: vpsrlq %xmm2, %ymm0, %ymm0
925 ; AVX2-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm3[0,2],ymm0[4,6],ymm3[4,6]
928 ; AVX512F-LABEL: splatvar_funnnel_v8i32:
930 ; AVX512F-NEXT: vpunpckhdq {{.*#+}} ymm3 = ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[6],ymm0[6],ymm1[7],ymm0[7]
931 ; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
932 ; AVX512F-NEXT: vpsrlq %xmm2, %ymm3, %ymm3
933 ; AVX512F-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[4],ymm0[4],ymm1[5],ymm0[5]
934 ; AVX512F-NEXT: vpsrlq %xmm2, %ymm0, %ymm0
935 ; AVX512F-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm3[0,2],ymm0[4,6],ymm3[4,6]
938 ; AVX512VL-LABEL: splatvar_funnnel_v8i32:
940 ; AVX512VL-NEXT: vpunpckhdq {{.*#+}} ymm3 = ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[6],ymm0[6],ymm1[7],ymm0[7]
941 ; AVX512VL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
942 ; AVX512VL-NEXT: vpsrlq %xmm2, %ymm3, %ymm3
943 ; AVX512VL-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[4],ymm0[4],ymm1[5],ymm0[5]
944 ; AVX512VL-NEXT: vpsrlq %xmm2, %ymm0, %ymm0
945 ; AVX512VL-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm3[0,2],ymm0[4,6],ymm3[4,6]
946 ; AVX512VL-NEXT: retq
948 ; AVX512BW-LABEL: splatvar_funnnel_v8i32:
950 ; AVX512BW-NEXT: vpunpckhdq {{.*#+}} ymm3 = ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[6],ymm0[6],ymm1[7],ymm0[7]
951 ; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
952 ; AVX512BW-NEXT: vpsrlq %xmm2, %ymm3, %ymm3
953 ; AVX512BW-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[4],ymm0[4],ymm1[5],ymm0[5]
954 ; AVX512BW-NEXT: vpsrlq %xmm2, %ymm0, %ymm0
955 ; AVX512BW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm3[0,2],ymm0[4,6],ymm3[4,6]
956 ; AVX512BW-NEXT: retq
958 ; AVX512VBMI2-LABEL: splatvar_funnnel_v8i32:
959 ; AVX512VBMI2: # %bb.0:
960 ; AVX512VBMI2-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
961 ; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
962 ; AVX512VBMI2-NEXT: vpbroadcastd %xmm2, %ymm2
963 ; AVX512VBMI2-NEXT: vpshrdvd %zmm2, %zmm0, %zmm1
964 ; AVX512VBMI2-NEXT: vmovdqa %ymm1, %ymm0
965 ; AVX512VBMI2-NEXT: retq
967 ; AVX512VLBW-LABEL: splatvar_funnnel_v8i32:
968 ; AVX512VLBW: # %bb.0:
969 ; AVX512VLBW-NEXT: vpunpckhdq {{.*#+}} ymm3 = ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[6],ymm0[6],ymm1[7],ymm0[7]
970 ; AVX512VLBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
971 ; AVX512VLBW-NEXT: vpsrlq %xmm2, %ymm3, %ymm3
972 ; AVX512VLBW-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[4],ymm0[4],ymm1[5],ymm0[5]
973 ; AVX512VLBW-NEXT: vpsrlq %xmm2, %ymm0, %ymm0
974 ; AVX512VLBW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm3[0,2],ymm0[4,6],ymm3[4,6]
975 ; AVX512VLBW-NEXT: retq
977 ; AVX512VLVBMI2-LABEL: splatvar_funnnel_v8i32:
978 ; AVX512VLVBMI2: # %bb.0:
979 ; AVX512VLVBMI2-NEXT: vpbroadcastd %xmm2, %ymm2
980 ; AVX512VLVBMI2-NEXT: vpshrdvd %ymm2, %ymm0, %ymm1
981 ; AVX512VLVBMI2-NEXT: vmovdqa %ymm1, %ymm0
982 ; AVX512VLVBMI2-NEXT: retq
984 ; XOPAVX1-LABEL: splatvar_funnnel_v8i32:
986 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
987 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
988 ; XOPAVX1-NEXT: vpunpckhdq {{.*#+}} xmm5 = xmm4[2],xmm3[2],xmm4[3],xmm3[3]
989 ; XOPAVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
990 ; XOPAVX1-NEXT: vpsrlq %xmm2, %xmm5, %xmm5
991 ; XOPAVX1-NEXT: vpunpckhdq {{.*#+}} xmm6 = xmm1[2],xmm0[2],xmm1[3],xmm0[3]
992 ; XOPAVX1-NEXT: vpsrlq %xmm2, %xmm6, %xmm6
993 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm5, %ymm6, %ymm5
994 ; XOPAVX1-NEXT: vpunpckldq {{.*#+}} xmm3 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
995 ; XOPAVX1-NEXT: vpsrlq %xmm2, %xmm3, %xmm3
996 ; XOPAVX1-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
997 ; XOPAVX1-NEXT: vpsrlq %xmm2, %xmm0, %xmm0
998 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
999 ; XOPAVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm5[0,2],ymm0[4,6],ymm5[4,6]
1000 ; XOPAVX1-NEXT: retq
1002 ; XOPAVX2-LABEL: splatvar_funnnel_v8i32:
1004 ; XOPAVX2-NEXT: vpunpckhdq {{.*#+}} ymm3 = ymm1[2],ymm0[2],ymm1[3],ymm0[3],ymm1[6],ymm0[6],ymm1[7],ymm0[7]
1005 ; XOPAVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1006 ; XOPAVX2-NEXT: vpsrlq %xmm2, %ymm3, %ymm3
1007 ; XOPAVX2-NEXT: vpunpckldq {{.*#+}} ymm0 = ymm1[0],ymm0[0],ymm1[1],ymm0[1],ymm1[4],ymm0[4],ymm1[5],ymm0[5]
1008 ; XOPAVX2-NEXT: vpsrlq %xmm2, %ymm0, %ymm0
1009 ; XOPAVX2-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm3[0,2],ymm0[4,6],ymm3[4,6]
1010 ; XOPAVX2-NEXT: retq
1011 %splat = shufflevector <8 x i32> %amt, <8 x i32> undef, <8 x i32> zeroinitializer
1012 %res = call <8 x i32> @llvm.fshr.v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i32> %splat)
1016 define <16 x i16> @splatvar_funnnel_v16i16(<16 x i16> %x, <16 x i16> %y, <16 x i16> %amt) nounwind {
1017 ; AVX1-LABEL: splatvar_funnnel_v16i16:
1019 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [15,0,0,0]
1020 ; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm4
1021 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
1022 ; AVX1-NEXT: vpsrlw %xmm4, %xmm5, %xmm5
1023 ; AVX1-NEXT: vpandn %xmm3, %xmm2, %xmm2
1024 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1025 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
1026 ; AVX1-NEXT: vpsllw %xmm2, %xmm3, %xmm3
1027 ; AVX1-NEXT: vpor %xmm5, %xmm3, %xmm3
1028 ; AVX1-NEXT: vpsrlw %xmm4, %xmm1, %xmm1
1029 ; AVX1-NEXT: vpaddw %xmm0, %xmm0, %xmm0
1030 ; AVX1-NEXT: vpsllw %xmm2, %xmm0, %xmm0
1031 ; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
1032 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
1035 ; AVX2-LABEL: splatvar_funnnel_v16i16:
1037 ; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm3 = [15,0,0,0,15,0,0,0]
1038 ; AVX2-NEXT: vpand %xmm3, %xmm2, %xmm4
1039 ; AVX2-NEXT: vpsrlw %xmm4, %ymm1, %ymm1
1040 ; AVX2-NEXT: vpandn %xmm3, %xmm2, %xmm2
1041 ; AVX2-NEXT: vpaddw %ymm0, %ymm0, %ymm0
1042 ; AVX2-NEXT: vpsllw %xmm2, %ymm0, %ymm0
1043 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1046 ; AVX512F-LABEL: splatvar_funnnel_v16i16:
1048 ; AVX512F-NEXT: vpbroadcastq {{.*#+}} xmm3 = [15,0,0,0,15,0,0,0]
1049 ; AVX512F-NEXT: vpand %xmm3, %xmm2, %xmm4
1050 ; AVX512F-NEXT: vpsrlw %xmm4, %ymm1, %ymm1
1051 ; AVX512F-NEXT: vpandn %xmm3, %xmm2, %xmm2
1052 ; AVX512F-NEXT: vpaddw %ymm0, %ymm0, %ymm0
1053 ; AVX512F-NEXT: vpsllw %xmm2, %ymm0, %ymm0
1054 ; AVX512F-NEXT: vpor %ymm1, %ymm0, %ymm0
1055 ; AVX512F-NEXT: retq
1057 ; AVX512VL-LABEL: splatvar_funnnel_v16i16:
1058 ; AVX512VL: # %bb.0:
1059 ; AVX512VL-NEXT: vpbroadcastq {{.*#+}} xmm3 = [15,0,0,0,15,0,0,0]
1060 ; AVX512VL-NEXT: vpand %xmm3, %xmm2, %xmm4
1061 ; AVX512VL-NEXT: vpsrlw %xmm4, %ymm1, %ymm1
1062 ; AVX512VL-NEXT: vpandn %xmm3, %xmm2, %xmm2
1063 ; AVX512VL-NEXT: vpaddw %ymm0, %ymm0, %ymm0
1064 ; AVX512VL-NEXT: vpsllw %xmm2, %ymm0, %ymm0
1065 ; AVX512VL-NEXT: vpor %ymm1, %ymm0, %ymm0
1066 ; AVX512VL-NEXT: retq
1068 ; AVX512BW-LABEL: splatvar_funnnel_v16i16:
1069 ; AVX512BW: # %bb.0:
1070 ; AVX512BW-NEXT: vpbroadcastq {{.*#+}} xmm3 = [15,0,0,0,15,0,0,0]
1071 ; AVX512BW-NEXT: vpand %xmm3, %xmm2, %xmm4
1072 ; AVX512BW-NEXT: vpsrlw %xmm4, %ymm1, %ymm1
1073 ; AVX512BW-NEXT: vpandn %xmm3, %xmm2, %xmm2
1074 ; AVX512BW-NEXT: vpaddw %ymm0, %ymm0, %ymm0
1075 ; AVX512BW-NEXT: vpsllw %xmm2, %ymm0, %ymm0
1076 ; AVX512BW-NEXT: vpor %ymm1, %ymm0, %ymm0
1077 ; AVX512BW-NEXT: retq
1079 ; AVX512VBMI2-LABEL: splatvar_funnnel_v16i16:
1080 ; AVX512VBMI2: # %bb.0:
1081 ; AVX512VBMI2-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
1082 ; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1083 ; AVX512VBMI2-NEXT: vpbroadcastw %xmm2, %ymm2
1084 ; AVX512VBMI2-NEXT: vpshrdvw %zmm2, %zmm0, %zmm1
1085 ; AVX512VBMI2-NEXT: vmovdqa %ymm1, %ymm0
1086 ; AVX512VBMI2-NEXT: retq
1088 ; AVX512VLBW-LABEL: splatvar_funnnel_v16i16:
1089 ; AVX512VLBW: # %bb.0:
1090 ; AVX512VLBW-NEXT: vpbroadcastq {{.*#+}} xmm3 = [15,0,0,0,15,0,0,0]
1091 ; AVX512VLBW-NEXT: vpand %xmm3, %xmm2, %xmm4
1092 ; AVX512VLBW-NEXT: vpsrlw %xmm4, %ymm1, %ymm1
1093 ; AVX512VLBW-NEXT: vpandn %xmm3, %xmm2, %xmm2
1094 ; AVX512VLBW-NEXT: vpaddw %ymm0, %ymm0, %ymm0
1095 ; AVX512VLBW-NEXT: vpsllw %xmm2, %ymm0, %ymm0
1096 ; AVX512VLBW-NEXT: vpor %ymm1, %ymm0, %ymm0
1097 ; AVX512VLBW-NEXT: retq
1099 ; AVX512VLVBMI2-LABEL: splatvar_funnnel_v16i16:
1100 ; AVX512VLVBMI2: # %bb.0:
1101 ; AVX512VLVBMI2-NEXT: vpbroadcastw %xmm2, %ymm2
1102 ; AVX512VLVBMI2-NEXT: vpshrdvw %ymm2, %ymm0, %ymm1
1103 ; AVX512VLVBMI2-NEXT: vmovdqa %ymm1, %ymm0
1104 ; AVX512VLVBMI2-NEXT: retq
1106 ; XOPAVX1-LABEL: splatvar_funnnel_v16i16:
1108 ; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [15,0,0,0]
1109 ; XOPAVX1-NEXT: vpand %xmm3, %xmm2, %xmm4
1110 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
1111 ; XOPAVX1-NEXT: vpsrlw %xmm4, %xmm5, %xmm5
1112 ; XOPAVX1-NEXT: vpandn %xmm3, %xmm2, %xmm2
1113 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1114 ; XOPAVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
1115 ; XOPAVX1-NEXT: vpsllw %xmm2, %xmm3, %xmm3
1116 ; XOPAVX1-NEXT: vpor %xmm5, %xmm3, %xmm3
1117 ; XOPAVX1-NEXT: vpsrlw %xmm4, %xmm1, %xmm1
1118 ; XOPAVX1-NEXT: vpaddw %xmm0, %xmm0, %xmm0
1119 ; XOPAVX1-NEXT: vpsllw %xmm2, %xmm0, %xmm0
1120 ; XOPAVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
1121 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
1122 ; XOPAVX1-NEXT: retq
1124 ; XOPAVX2-LABEL: splatvar_funnnel_v16i16:
1126 ; XOPAVX2-NEXT: vpbroadcastq {{.*#+}} xmm3 = [15,0,0,0,15,0,0,0]
1127 ; XOPAVX2-NEXT: vpand %xmm3, %xmm2, %xmm4
1128 ; XOPAVX2-NEXT: vpsrlw %xmm4, %ymm1, %ymm1
1129 ; XOPAVX2-NEXT: vpandn %xmm3, %xmm2, %xmm2
1130 ; XOPAVX2-NEXT: vpaddw %ymm0, %ymm0, %ymm0
1131 ; XOPAVX2-NEXT: vpsllw %xmm2, %ymm0, %ymm0
1132 ; XOPAVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1133 ; XOPAVX2-NEXT: retq
1134 %splat = shufflevector <16 x i16> %amt, <16 x i16> undef, <16 x i32> zeroinitializer
1135 %res = call <16 x i16> @llvm.fshr.v16i16(<16 x i16> %x, <16 x i16> %y, <16 x i16> %splat)
1139 define <32 x i8> @splatvar_funnnel_v32i8(<32 x i8> %x, <32 x i8> %y, <32 x i8> %amt) nounwind {
1140 ; AVX1-LABEL: splatvar_funnnel_v32i8:
1142 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1143 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
1144 ; 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]
1145 ; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1146 ; AVX1-NEXT: vpsrlw %xmm2, %xmm5, %xmm5
1147 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [255,255,255,255,255,255,255,255]
1148 ; AVX1-NEXT: vpand %xmm6, %xmm5, %xmm5
1149 ; 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]
1150 ; AVX1-NEXT: vpsrlw %xmm2, %xmm3, %xmm3
1151 ; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
1152 ; AVX1-NEXT: vpackuswb %xmm5, %xmm3, %xmm3
1153 ; 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]
1154 ; AVX1-NEXT: vpsrlw %xmm2, %xmm4, %xmm4
1155 ; AVX1-NEXT: vpand %xmm6, %xmm4, %xmm4
1156 ; 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]
1157 ; AVX1-NEXT: vpsrlw %xmm2, %xmm0, %xmm0
1158 ; AVX1-NEXT: vpand %xmm6, %xmm0, %xmm0
1159 ; AVX1-NEXT: vpackuswb %xmm4, %xmm0, %xmm0
1160 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
1163 ; AVX2-LABEL: splatvar_funnnel_v32i8:
1165 ; 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]
1166 ; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1167 ; AVX2-NEXT: vpsrlw %xmm2, %ymm3, %ymm3
1168 ; AVX2-NEXT: vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1169 ; AVX2-NEXT: vpand %ymm4, %ymm3, %ymm3
1170 ; 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]
1171 ; AVX2-NEXT: vpsrlw %xmm2, %ymm0, %ymm0
1172 ; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0
1173 ; AVX2-NEXT: vpackuswb %ymm3, %ymm0, %ymm0
1176 ; AVX512F-LABEL: splatvar_funnnel_v32i8:
1178 ; 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]
1179 ; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1180 ; AVX512F-NEXT: vpsrlw %xmm2, %ymm3, %ymm3
1181 ; AVX512F-NEXT: vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1182 ; AVX512F-NEXT: vpand %ymm4, %ymm3, %ymm3
1183 ; 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]
1184 ; AVX512F-NEXT: vpsrlw %xmm2, %ymm0, %ymm0
1185 ; AVX512F-NEXT: vpand %ymm4, %ymm0, %ymm0
1186 ; AVX512F-NEXT: vpackuswb %ymm3, %ymm0, %ymm0
1187 ; AVX512F-NEXT: retq
1189 ; AVX512VL-LABEL: splatvar_funnnel_v32i8:
1190 ; AVX512VL: # %bb.0:
1191 ; 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]
1192 ; AVX512VL-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1193 ; AVX512VL-NEXT: vpsrlw %xmm2, %ymm3, %ymm3
1194 ; AVX512VL-NEXT: vpbroadcastd {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1195 ; AVX512VL-NEXT: vpand %ymm4, %ymm3, %ymm3
1196 ; 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]
1197 ; AVX512VL-NEXT: vpsrlw %xmm2, %ymm0, %ymm0
1198 ; AVX512VL-NEXT: vpand %ymm4, %ymm0, %ymm0
1199 ; AVX512VL-NEXT: vpackuswb %ymm3, %ymm0, %ymm0
1200 ; AVX512VL-NEXT: retq
1202 ; AVX512BW-LABEL: splatvar_funnnel_v32i8:
1203 ; AVX512BW: # %bb.0:
1204 ; 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]
1205 ; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1206 ; AVX512BW-NEXT: vpsrlw %xmm2, %ymm3, %ymm3
1207 ; AVX512BW-NEXT: vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1208 ; AVX512BW-NEXT: vpand %ymm4, %ymm3, %ymm3
1209 ; 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]
1210 ; AVX512BW-NEXT: vpsrlw %xmm2, %ymm0, %ymm0
1211 ; AVX512BW-NEXT: vpand %ymm4, %ymm0, %ymm0
1212 ; AVX512BW-NEXT: vpackuswb %ymm3, %ymm0, %ymm0
1213 ; AVX512BW-NEXT: retq
1215 ; AVX512VBMI2-LABEL: splatvar_funnnel_v32i8:
1216 ; AVX512VBMI2: # %bb.0:
1217 ; AVX512VBMI2-NEXT: vmovdqa {{.*#+}} ymm3 = [0,2,4,6,8,10,12,14,64,66,68,70,72,74,76,78,16,18,20,22,24,26,28,30,80,82,84,86,88,90,92,94]
1218 ; AVX512VBMI2-NEXT: vpunpckhbw {{.*#+}} ymm4 = 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]
1219 ; AVX512VBMI2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1220 ; AVX512VBMI2-NEXT: vpsrlw %xmm2, %ymm4, %ymm4
1221 ; 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]
1222 ; AVX512VBMI2-NEXT: vpsrlw %xmm2, %ymm0, %ymm0
1223 ; AVX512VBMI2-NEXT: vpermt2b %zmm4, %zmm3, %zmm0
1224 ; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
1225 ; AVX512VBMI2-NEXT: retq
1227 ; AVX512VLBW-LABEL: splatvar_funnnel_v32i8:
1228 ; AVX512VLBW: # %bb.0:
1229 ; 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]
1230 ; AVX512VLBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1231 ; AVX512VLBW-NEXT: vpsrlw %xmm2, %ymm3, %ymm3
1232 ; AVX512VLBW-NEXT: vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1233 ; AVX512VLBW-NEXT: vpand %ymm4, %ymm3, %ymm3
1234 ; 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]
1235 ; AVX512VLBW-NEXT: vpsrlw %xmm2, %ymm0, %ymm0
1236 ; AVX512VLBW-NEXT: vpand %ymm4, %ymm0, %ymm0
1237 ; AVX512VLBW-NEXT: vpackuswb %ymm3, %ymm0, %ymm0
1238 ; AVX512VLBW-NEXT: retq
1240 ; AVX512VLVBMI2-LABEL: splatvar_funnnel_v32i8:
1241 ; AVX512VLVBMI2: # %bb.0:
1242 ; 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]
1243 ; AVX512VLVBMI2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1244 ; AVX512VLVBMI2-NEXT: vpsrlw %xmm2, %ymm3, %ymm3
1245 ; 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]
1246 ; AVX512VLVBMI2-NEXT: vpsrlw %xmm2, %ymm0, %ymm1
1247 ; AVX512VLVBMI2-NEXT: vmovdqa {{.*#+}} ymm0 = [0,2,4,6,8,10,12,14,32,34,36,38,40,42,44,46,16,18,20,22,24,26,28,30,48,50,52,54,56,58,60,62]
1248 ; AVX512VLVBMI2-NEXT: vpermi2b %ymm3, %ymm1, %ymm0
1249 ; AVX512VLVBMI2-NEXT: retq
1251 ; XOPAVX1-LABEL: splatvar_funnnel_v32i8:
1253 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1254 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
1255 ; 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]
1256 ; XOPAVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1257 ; XOPAVX1-NEXT: vpsrlw %xmm2, %xmm5, %xmm5
1258 ; 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]
1259 ; XOPAVX1-NEXT: vpsrlw %xmm2, %xmm3, %xmm3
1260 ; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30]
1261 ; XOPAVX1-NEXT: vpperm %xmm4, %xmm5, %xmm3, %xmm3
1262 ; 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]
1263 ; XOPAVX1-NEXT: vpsrlw %xmm2, %xmm5, %xmm5
1264 ; 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]
1265 ; XOPAVX1-NEXT: vpsrlw %xmm2, %xmm0, %xmm0
1266 ; XOPAVX1-NEXT: vpperm %xmm4, %xmm5, %xmm0, %xmm0
1267 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
1268 ; XOPAVX1-NEXT: retq
1270 ; XOPAVX2-LABEL: splatvar_funnnel_v32i8:
1272 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
1273 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm4
1274 ; 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]
1275 ; XOPAVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1276 ; XOPAVX2-NEXT: vpsrlw %xmm2, %xmm5, %xmm5
1277 ; 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]
1278 ; XOPAVX2-NEXT: vpsrlw %xmm2, %xmm3, %xmm3
1279 ; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm4 = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30]
1280 ; XOPAVX2-NEXT: vpperm %xmm4, %xmm5, %xmm3, %xmm3
1281 ; 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]
1282 ; XOPAVX2-NEXT: vpsrlw %xmm2, %xmm5, %xmm5
1283 ; 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]
1284 ; XOPAVX2-NEXT: vpsrlw %xmm2, %xmm0, %xmm0
1285 ; XOPAVX2-NEXT: vpperm %xmm4, %xmm5, %xmm0, %xmm0
1286 ; XOPAVX2-NEXT: vinserti128 $1, %xmm3, %ymm0, %ymm0
1287 ; XOPAVX2-NEXT: retq
1288 %splat = shufflevector <32 x i8> %amt, <32 x i8> undef, <32 x i32> zeroinitializer
1289 %res = call <32 x i8> @llvm.fshr.v32i8(<32 x i8> %x, <32 x i8> %y, <32 x i8> %splat)
1297 define <4 x i64> @constant_funnnel_v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
1298 ; AVX1-LABEL: constant_funnnel_v4i64:
1300 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1301 ; AVX1-NEXT: vpsrlq $60, %xmm2, %xmm3
1302 ; AVX1-NEXT: vpsrlq $50, %xmm2, %xmm2
1303 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm3[4,5,6,7]
1304 ; AVX1-NEXT: vpsrlq $14, %xmm1, %xmm3
1305 ; AVX1-NEXT: vpsrlq $4, %xmm1, %xmm1
1306 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm3[4,5,6,7]
1307 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
1308 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
1309 ; AVX1-NEXT: vpsllq $4, %xmm2, %xmm3
1310 ; AVX1-NEXT: vpsllq $14, %xmm2, %xmm2
1311 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm3[4,5,6,7]
1312 ; AVX1-NEXT: vpsllq $50, %xmm0, %xmm3
1313 ; AVX1-NEXT: vpsllq $60, %xmm0, %xmm0
1314 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]
1315 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1316 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
1319 ; AVX2-LABEL: constant_funnnel_v4i64:
1321 ; AVX2-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1322 ; AVX2-NEXT: vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1323 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1326 ; AVX512F-LABEL: constant_funnnel_v4i64:
1328 ; AVX512F-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1329 ; AVX512F-NEXT: vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1330 ; AVX512F-NEXT: vpor %ymm1, %ymm0, %ymm0
1331 ; AVX512F-NEXT: retq
1333 ; AVX512VL-LABEL: constant_funnnel_v4i64:
1334 ; AVX512VL: # %bb.0:
1335 ; AVX512VL-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1336 ; AVX512VL-NEXT: vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1337 ; AVX512VL-NEXT: vpor %ymm1, %ymm0, %ymm0
1338 ; AVX512VL-NEXT: retq
1340 ; AVX512BW-LABEL: constant_funnnel_v4i64:
1341 ; AVX512BW: # %bb.0:
1342 ; AVX512BW-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1343 ; AVX512BW-NEXT: vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1344 ; AVX512BW-NEXT: vpor %ymm1, %ymm0, %ymm0
1345 ; AVX512BW-NEXT: retq
1347 ; AVX512VBMI2-LABEL: constant_funnnel_v4i64:
1348 ; AVX512VBMI2: # %bb.0:
1349 ; AVX512VBMI2-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
1350 ; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1351 ; AVX512VBMI2-NEXT: vmovdqa {{.*#+}} ymm2 = [4,14,50,60]
1352 ; AVX512VBMI2-NEXT: vpshrdvq %zmm2, %zmm0, %zmm1
1353 ; AVX512VBMI2-NEXT: vmovdqa %ymm1, %ymm0
1354 ; AVX512VBMI2-NEXT: retq
1356 ; AVX512VLBW-LABEL: constant_funnnel_v4i64:
1357 ; AVX512VLBW: # %bb.0:
1358 ; AVX512VLBW-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1359 ; AVX512VLBW-NEXT: vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1360 ; AVX512VLBW-NEXT: vpor %ymm1, %ymm0, %ymm0
1361 ; AVX512VLBW-NEXT: retq
1363 ; AVX512VLVBMI2-LABEL: constant_funnnel_v4i64:
1364 ; AVX512VLVBMI2: # %bb.0:
1365 ; AVX512VLVBMI2-NEXT: vpshrdvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1
1366 ; AVX512VLVBMI2-NEXT: vmovdqa %ymm1, %ymm0
1367 ; AVX512VLVBMI2-NEXT: retq
1369 ; XOPAVX1-LABEL: constant_funnnel_v4i64:
1371 ; XOPAVX1-NEXT: vpshlq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm2
1372 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
1373 ; XOPAVX1-NEXT: vpshlq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1374 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
1375 ; XOPAVX1-NEXT: vpshlq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
1376 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1377 ; XOPAVX1-NEXT: vpshlq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1378 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
1379 ; XOPAVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
1380 ; XOPAVX1-NEXT: retq
1382 ; XOPAVX2-LABEL: constant_funnnel_v4i64:
1384 ; XOPAVX2-NEXT: vpsrlvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1385 ; XOPAVX2-NEXT: vpsllvq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1386 ; XOPAVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1387 ; XOPAVX2-NEXT: retq
1388 %res = call <4 x i64> @llvm.fshr.v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> <i64 4, i64 14, i64 50, i64 60>)
1392 define <8 x i32> @constant_funnnel_v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
1393 ; AVX1-LABEL: constant_funnnel_v8i32:
1395 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1396 ; AVX1-NEXT: vpsrld $11, %xmm2, %xmm3
1397 ; AVX1-NEXT: vpsrld $9, %xmm2, %xmm4
1398 ; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
1399 ; AVX1-NEXT: vpsrld $10, %xmm2, %xmm4
1400 ; AVX1-NEXT: vpsrld $8, %xmm2, %xmm2
1401 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm4[4,5,6,7]
1402 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
1403 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1404 ; AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3
1405 ; AVX1-NEXT: vpor %xmm2, %xmm3, %xmm2
1406 ; AVX1-NEXT: vpsrld $7, %xmm1, %xmm3
1407 ; AVX1-NEXT: vpsrld $5, %xmm1, %xmm4
1408 ; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
1409 ; AVX1-NEXT: vpsrld $6, %xmm1, %xmm4
1410 ; AVX1-NEXT: vpsrld $4, %xmm1, %xmm1
1411 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm4[4,5,6,7]
1412 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]
1413 ; AVX1-NEXT: vpmulld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1414 ; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
1415 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1418 ; AVX2-LABEL: constant_funnnel_v8i32:
1420 ; AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1421 ; AVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1422 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1425 ; AVX512F-LABEL: constant_funnnel_v8i32:
1427 ; AVX512F-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1428 ; AVX512F-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1429 ; AVX512F-NEXT: vpor %ymm1, %ymm0, %ymm0
1430 ; AVX512F-NEXT: retq
1432 ; AVX512VL-LABEL: constant_funnnel_v8i32:
1433 ; AVX512VL: # %bb.0:
1434 ; AVX512VL-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1435 ; AVX512VL-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1436 ; AVX512VL-NEXT: vpor %ymm1, %ymm0, %ymm0
1437 ; AVX512VL-NEXT: retq
1439 ; AVX512BW-LABEL: constant_funnnel_v8i32:
1440 ; AVX512BW: # %bb.0:
1441 ; AVX512BW-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1442 ; AVX512BW-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1443 ; AVX512BW-NEXT: vpor %ymm1, %ymm0, %ymm0
1444 ; AVX512BW-NEXT: retq
1446 ; AVX512VBMI2-LABEL: constant_funnnel_v8i32:
1447 ; AVX512VBMI2: # %bb.0:
1448 ; AVX512VBMI2-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
1449 ; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1450 ; AVX512VBMI2-NEXT: vmovdqa {{.*#+}} ymm2 = [4,5,6,7,8,9,10,11]
1451 ; AVX512VBMI2-NEXT: vpshrdvd %zmm2, %zmm0, %zmm1
1452 ; AVX512VBMI2-NEXT: vmovdqa %ymm1, %ymm0
1453 ; AVX512VBMI2-NEXT: retq
1455 ; AVX512VLBW-LABEL: constant_funnnel_v8i32:
1456 ; AVX512VLBW: # %bb.0:
1457 ; AVX512VLBW-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1458 ; AVX512VLBW-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1459 ; AVX512VLBW-NEXT: vpor %ymm1, %ymm0, %ymm0
1460 ; AVX512VLBW-NEXT: retq
1462 ; AVX512VLVBMI2-LABEL: constant_funnnel_v8i32:
1463 ; AVX512VLVBMI2: # %bb.0:
1464 ; AVX512VLVBMI2-NEXT: vpshrdvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1
1465 ; AVX512VLVBMI2-NEXT: vmovdqa %ymm1, %ymm0
1466 ; AVX512VLVBMI2-NEXT: retq
1468 ; XOPAVX1-LABEL: constant_funnnel_v8i32:
1470 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1471 ; XOPAVX1-NEXT: vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1472 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1473 ; XOPAVX1-NEXT: vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3
1474 ; XOPAVX1-NEXT: vpor %xmm2, %xmm3, %xmm2
1475 ; XOPAVX1-NEXT: vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1476 ; XOPAVX1-NEXT: vpshld {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1477 ; XOPAVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
1478 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1479 ; XOPAVX1-NEXT: retq
1481 ; XOPAVX2-LABEL: constant_funnnel_v8i32:
1483 ; XOPAVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1484 ; XOPAVX2-NEXT: vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1485 ; XOPAVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1486 ; XOPAVX2-NEXT: retq
1487 %res = call <8 x i32> @llvm.fshr.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>)
1491 define <16 x i16> @constant_funnnel_v16i16(<16 x i16> %x, <16 x i16> %y) nounwind {
1492 ; AVX1-LABEL: constant_funnnel_v16i16:
1494 ; AVX1-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm2
1495 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3,4,5,6,7]
1496 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
1497 ; AVX1-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1498 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
1499 ; AVX1-NEXT: vpaddw %xmm0, %xmm0, %xmm2
1500 ; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1501 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1502 ; AVX1-NEXT: vpaddw %xmm0, %xmm0, %xmm0
1503 ; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1504 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
1505 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
1508 ; AVX2-LABEL: constant_funnnel_v16i16:
1510 ; AVX2-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm2
1511 ; AVX2-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7]
1512 ; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm1[0,1,2,3],ymm2[4,5,6,7]
1513 ; AVX2-NEXT: vpaddw %ymm0, %ymm0, %ymm0
1514 ; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1515 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1518 ; AVX512F-LABEL: constant_funnnel_v16i16:
1520 ; AVX512F-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm2
1521 ; AVX512F-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7]
1522 ; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm1[0,1,2,3],ymm2[4,5,6,7]
1523 ; AVX512F-NEXT: vpaddw %ymm0, %ymm0, %ymm0
1524 ; AVX512F-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1525 ; AVX512F-NEXT: vpor %ymm1, %ymm0, %ymm0
1526 ; AVX512F-NEXT: retq
1528 ; AVX512VL-LABEL: constant_funnnel_v16i16:
1529 ; AVX512VL: # %bb.0:
1530 ; AVX512VL-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm2
1531 ; AVX512VL-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7]
1532 ; AVX512VL-NEXT: vpblendd {{.*#+}} ymm1 = ymm1[0,1,2,3],ymm2[4,5,6,7]
1533 ; AVX512VL-NEXT: vpaddw %ymm0, %ymm0, %ymm0
1534 ; AVX512VL-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1535 ; AVX512VL-NEXT: vpor %ymm1, %ymm0, %ymm0
1536 ; AVX512VL-NEXT: retq
1538 ; AVX512BW-LABEL: constant_funnnel_v16i16:
1539 ; AVX512BW: # %bb.0:
1540 ; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
1541 ; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
1542 ; AVX512BW-NEXT: vpsrlvw %zmm2, %zmm1, %zmm1
1543 ; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm2 = [15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]
1544 ; AVX512BW-NEXT: vpaddw %ymm0, %ymm0, %ymm0
1545 ; AVX512BW-NEXT: vpsllvw %zmm2, %zmm0, %zmm0
1546 ; AVX512BW-NEXT: vpor %ymm1, %ymm0, %ymm0
1547 ; AVX512BW-NEXT: retq
1549 ; AVX512VBMI2-LABEL: constant_funnnel_v16i16:
1550 ; AVX512VBMI2: # %bb.0:
1551 ; AVX512VBMI2-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
1552 ; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1553 ; AVX512VBMI2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
1554 ; AVX512VBMI2-NEXT: vpshrdvw %zmm2, %zmm0, %zmm1
1555 ; AVX512VBMI2-NEXT: vmovdqa %ymm1, %ymm0
1556 ; AVX512VBMI2-NEXT: retq
1558 ; AVX512VLBW-LABEL: constant_funnnel_v16i16:
1559 ; AVX512VLBW: # %bb.0:
1560 ; AVX512VLBW-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1561 ; AVX512VLBW-NEXT: vpaddw %ymm0, %ymm0, %ymm0
1562 ; AVX512VLBW-NEXT: vpsllvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1563 ; AVX512VLBW-NEXT: vpor %ymm1, %ymm0, %ymm0
1564 ; AVX512VLBW-NEXT: retq
1566 ; AVX512VLVBMI2-LABEL: constant_funnnel_v16i16:
1567 ; AVX512VLVBMI2: # %bb.0:
1568 ; AVX512VLVBMI2-NEXT: vpshrdvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1
1569 ; AVX512VLVBMI2-NEXT: vmovdqa %ymm1, %ymm0
1570 ; AVX512VLVBMI2-NEXT: retq
1572 ; XOPAVX1-LABEL: constant_funnnel_v16i16:
1574 ; XOPAVX1-NEXT: vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm2
1575 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
1576 ; XOPAVX1-NEXT: vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1577 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
1578 ; XOPAVX1-NEXT: vpaddw %xmm0, %xmm0, %xmm2
1579 ; XOPAVX1-NEXT: vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
1580 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1581 ; XOPAVX1-NEXT: vpaddw %xmm0, %xmm0, %xmm0
1582 ; XOPAVX1-NEXT: vpshlw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1583 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
1584 ; XOPAVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
1585 ; XOPAVX1-NEXT: retq
1587 ; XOPAVX2-LABEL: constant_funnnel_v16i16:
1589 ; XOPAVX2-NEXT: vpmulhuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm2
1590 ; XOPAVX2-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7]
1591 ; XOPAVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm1[0,1,2,3],ymm2[4,5,6,7]
1592 ; XOPAVX2-NEXT: vpaddw %ymm0, %ymm0, %ymm0
1593 ; XOPAVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1594 ; XOPAVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1595 ; XOPAVX2-NEXT: retq
1596 %res = call <16 x i16> @llvm.fshr.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>)
1600 define <32 x i8> @constant_funnnel_v32i8(<32 x i8> %x, <32 x i8> %y) nounwind {
1601 ; AVX1-LABEL: constant_funnnel_v32i8:
1603 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1604 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
1605 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm2[8],xmm3[8],xmm2[9],xmm3[9],xmm2[10],xmm3[10],xmm2[11],xmm3[11],xmm2[12],xmm3[12],xmm2[13],xmm3[13],xmm2[14],xmm3[14],xmm2[15],xmm3[15]
1606 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [256,2,4,8,16,32,64,128]
1607 ; AVX1-NEXT: vpmullw %xmm5, %xmm4, %xmm4
1608 ; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4
1609 ; 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
1610 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [256,128,64,32,16,8,4,2]
1611 ; AVX1-NEXT: vpmullw %xmm6, %xmm2, %xmm2
1612 ; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2
1613 ; AVX1-NEXT: vpackuswb %xmm4, %xmm2, %xmm2
1614 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
1615 ; AVX1-NEXT: vpaddb %xmm4, %xmm4, %xmm4
1616 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm7 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1617 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm8 = [128,1,2,4,8,16,32,64]
1618 ; AVX1-NEXT: vpmullw %xmm7, %xmm8, %xmm7
1619 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm9 = [255,255,255,255,255,255,255,255]
1620 ; AVX1-NEXT: vpand %xmm7, %xmm9, %xmm7
1621 ; 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
1622 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm10 = [128,64,32,16,8,4,2,1]
1623 ; AVX1-NEXT: vpmullw %xmm4, %xmm10, %xmm4
1624 ; AVX1-NEXT: vpand %xmm4, %xmm9, %xmm4
1625 ; AVX1-NEXT: vpackuswb %xmm7, %xmm4, %xmm4
1626 ; AVX1-NEXT: vpor %xmm2, %xmm4, %xmm2
1627 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm1[8],xmm3[8],xmm1[9],xmm3[9],xmm1[10],xmm3[10],xmm1[11],xmm3[11],xmm1[12],xmm3[12],xmm1[13],xmm3[13],xmm1[14],xmm3[14],xmm1[15],xmm3[15]
1628 ; AVX1-NEXT: vpmullw %xmm5, %xmm3, %xmm3
1629 ; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3
1630 ; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
1631 ; AVX1-NEXT: vpmullw %xmm6, %xmm1, %xmm1
1632 ; AVX1-NEXT: vpsrlw $8, %xmm1, %xmm1
1633 ; AVX1-NEXT: vpackuswb %xmm3, %xmm1, %xmm1
1634 ; AVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm0
1635 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1636 ; AVX1-NEXT: vpmullw %xmm3, %xmm8, %xmm3
1637 ; AVX1-NEXT: vpand %xmm3, %xmm9, %xmm3
1638 ; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1639 ; AVX1-NEXT: vpmullw %xmm0, %xmm10, %xmm0
1640 ; AVX1-NEXT: vpand %xmm0, %xmm9, %xmm0
1641 ; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm0
1642 ; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
1643 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1646 ; AVX2-LABEL: constant_funnnel_v32i8:
1648 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
1649 ; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15],ymm1[24],ymm2[24],ymm1[25],ymm2[25],ymm1[26],ymm2[26],ymm1[27],ymm2[27],ymm1[28],ymm2[28],ymm1[29],ymm2[29],ymm1[30],ymm2[30],ymm1[31],ymm2[31]
1650 ; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
1651 ; AVX2-NEXT: vpsrlw $8, %ymm3, %ymm3
1652 ; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[16],ymm2[16],ymm1[17],ymm2[17],ymm1[18],ymm2[18],ymm1[19],ymm2[19],ymm1[20],ymm2[20],ymm1[21],ymm2[21],ymm1[22],ymm2[22],ymm1[23],ymm2[23]
1653 ; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1654 ; AVX2-NEXT: vpsrlw $8, %ymm1, %ymm1
1655 ; AVX2-NEXT: vpackuswb %ymm3, %ymm1, %ymm1
1656 ; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm0
1657 ; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
1658 ; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
1659 ; AVX2-NEXT: vpbroadcastw {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1660 ; AVX2-NEXT: vpand %ymm3, %ymm2, %ymm2
1661 ; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
1662 ; AVX2-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1663 ; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm0
1664 ; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
1665 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1668 ; AVX512F-LABEL: constant_funnnel_v32i8:
1670 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2
1671 ; AVX512F-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15],ymm1[24],ymm2[24],ymm1[25],ymm2[25],ymm1[26],ymm2[26],ymm1[27],ymm2[27],ymm1[28],ymm2[28],ymm1[29],ymm2[29],ymm1[30],ymm2[30],ymm1[31],ymm2[31]
1672 ; AVX512F-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
1673 ; AVX512F-NEXT: vpsrlw $8, %ymm3, %ymm3
1674 ; AVX512F-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[16],ymm2[16],ymm1[17],ymm2[17],ymm1[18],ymm2[18],ymm1[19],ymm2[19],ymm1[20],ymm2[20],ymm1[21],ymm2[21],ymm1[22],ymm2[22],ymm1[23],ymm2[23]
1675 ; AVX512F-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1676 ; AVX512F-NEXT: vpsrlw $8, %ymm1, %ymm1
1677 ; AVX512F-NEXT: vpackuswb %ymm3, %ymm1, %ymm1
1678 ; AVX512F-NEXT: vpaddb %ymm0, %ymm0, %ymm0
1679 ; AVX512F-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
1680 ; AVX512F-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
1681 ; AVX512F-NEXT: vpbroadcastw {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1682 ; AVX512F-NEXT: vpand %ymm3, %ymm2, %ymm2
1683 ; AVX512F-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
1684 ; AVX512F-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1685 ; AVX512F-NEXT: vpand %ymm3, %ymm0, %ymm0
1686 ; AVX512F-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
1687 ; AVX512F-NEXT: vpor %ymm1, %ymm0, %ymm0
1688 ; AVX512F-NEXT: retq
1690 ; AVX512VL-LABEL: constant_funnnel_v32i8:
1691 ; AVX512VL: # %bb.0:
1692 ; AVX512VL-NEXT: vpxor %xmm2, %xmm2, %xmm2
1693 ; AVX512VL-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15],ymm1[24],ymm2[24],ymm1[25],ymm2[25],ymm1[26],ymm2[26],ymm1[27],ymm2[27],ymm1[28],ymm2[28],ymm1[29],ymm2[29],ymm1[30],ymm2[30],ymm1[31],ymm2[31]
1694 ; AVX512VL-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
1695 ; AVX512VL-NEXT: vpsrlw $8, %ymm3, %ymm3
1696 ; AVX512VL-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[16],ymm2[16],ymm1[17],ymm2[17],ymm1[18],ymm2[18],ymm1[19],ymm2[19],ymm1[20],ymm2[20],ymm1[21],ymm2[21],ymm1[22],ymm2[22],ymm1[23],ymm2[23]
1697 ; AVX512VL-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1698 ; AVX512VL-NEXT: vpsrlw $8, %ymm1, %ymm1
1699 ; AVX512VL-NEXT: vpackuswb %ymm3, %ymm1, %ymm1
1700 ; AVX512VL-NEXT: vpaddb %ymm0, %ymm0, %ymm0
1701 ; AVX512VL-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
1702 ; AVX512VL-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
1703 ; AVX512VL-NEXT: vpbroadcastd {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1704 ; AVX512VL-NEXT: vpand %ymm3, %ymm2, %ymm2
1705 ; AVX512VL-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
1706 ; AVX512VL-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
1707 ; AVX512VL-NEXT: vpand %ymm3, %ymm0, %ymm0
1708 ; AVX512VL-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
1709 ; AVX512VL-NEXT: vpor %ymm1, %ymm0, %ymm0
1710 ; AVX512VL-NEXT: retq
1712 ; AVX512BW-LABEL: constant_funnnel_v32i8:
1713 ; AVX512BW: # %bb.0:
1714 ; 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
1715 ; 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
1716 ; AVX512BW-NEXT: vpsllw $8, %zmm0, %zmm0
1717 ; AVX512BW-NEXT: vporq %zmm1, %zmm0, %zmm0
1718 ; AVX512BW-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
1719 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0
1720 ; AVX512BW-NEXT: retq
1722 ; AVX512VBMI2-LABEL: constant_funnnel_v32i8:
1723 ; AVX512VBMI2: # %bb.0:
1724 ; AVX512VBMI2-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
1725 ; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1726 ; 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]
1727 ; AVX512VBMI2-NEXT: vpermi2b %zmm0, %zmm1, %zmm2
1728 ; AVX512VBMI2-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2, %zmm0
1729 ; AVX512VBMI2-NEXT: vpmovwb %zmm0, %ymm0
1730 ; AVX512VBMI2-NEXT: retq
1732 ; AVX512VLBW-LABEL: constant_funnnel_v32i8:
1733 ; AVX512VLBW: # %bb.0:
1734 ; 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
1735 ; 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
1736 ; AVX512VLBW-NEXT: vpsllw $8, %zmm0, %zmm0
1737 ; AVX512VLBW-NEXT: vporq %zmm1, %zmm0, %zmm0
1738 ; AVX512VLBW-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
1739 ; AVX512VLBW-NEXT: vpmovwb %zmm0, %ymm0
1740 ; AVX512VLBW-NEXT: retq
1742 ; AVX512VLVBMI2-LABEL: constant_funnnel_v32i8:
1743 ; AVX512VLVBMI2: # %bb.0:
1744 ; AVX512VLVBMI2-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
1745 ; AVX512VLVBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1746 ; 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]
1747 ; AVX512VLVBMI2-NEXT: vpermi2b %zmm0, %zmm1, %zmm2
1748 ; AVX512VLVBMI2-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2, %zmm0
1749 ; AVX512VLVBMI2-NEXT: vpmovwb %zmm0, %ymm0
1750 ; AVX512VLVBMI2-NEXT: retq
1752 ; XOPAVX1-LABEL: constant_funnnel_v32i8:
1754 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1755 ; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,255,254,253,252,251,250,249,0,249,250,251,252,253,254,255]
1756 ; XOPAVX1-NEXT: vpshlb %xmm3, %xmm2, %xmm2
1757 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
1758 ; XOPAVX1-NEXT: vpaddb %xmm4, %xmm4, %xmm4
1759 ; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [7,6,5,4,3,2,1,0,7,0,1,2,3,4,5,6]
1760 ; XOPAVX1-NEXT: vpshlb %xmm5, %xmm4, %xmm4
1761 ; XOPAVX1-NEXT: vpor %xmm2, %xmm4, %xmm2
1762 ; XOPAVX1-NEXT: vpshlb %xmm3, %xmm1, %xmm1
1763 ; XOPAVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm0
1764 ; XOPAVX1-NEXT: vpshlb %xmm5, %xmm0, %xmm0
1765 ; XOPAVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
1766 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1767 ; XOPAVX1-NEXT: retq
1769 ; XOPAVX2-LABEL: constant_funnnel_v32i8:
1771 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
1772 ; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [0,255,254,253,252,251,250,249,0,249,250,251,252,253,254,255]
1773 ; XOPAVX2-NEXT: vpshlb %xmm3, %xmm2, %xmm2
1774 ; XOPAVX2-NEXT: vpshlb %xmm3, %xmm1, %xmm1
1775 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1
1776 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm2
1777 ; XOPAVX2-NEXT: vpaddb %xmm2, %xmm2, %xmm2
1778 ; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [7,6,5,4,3,2,1,0,7,0,1,2,3,4,5,6]
1779 ; XOPAVX2-NEXT: vpshlb %xmm3, %xmm2, %xmm2
1780 ; XOPAVX2-NEXT: vpaddb %xmm0, %xmm0, %xmm0
1781 ; XOPAVX2-NEXT: vpshlb %xmm3, %xmm0, %xmm0
1782 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
1783 ; XOPAVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1784 ; XOPAVX2-NEXT: retq
1785 %res = call <32 x i8> @llvm.fshr.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>)
1790 ; Uniform Constant Shifts
1793 define <4 x i64> @splatconstant_funnnel_v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
1794 ; AVX1-LABEL: splatconstant_funnnel_v4i64:
1796 ; AVX1-NEXT: vpsrlq $14, %xmm1, %xmm2
1797 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
1798 ; AVX1-NEXT: vpsrlq $14, %xmm1, %xmm1
1799 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
1800 ; AVX1-NEXT: vpsllq $50, %xmm0, %xmm2
1801 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1802 ; AVX1-NEXT: vpsllq $50, %xmm0, %xmm0
1803 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
1804 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
1807 ; AVX2-LABEL: splatconstant_funnnel_v4i64:
1809 ; AVX2-NEXT: vpsrlq $14, %ymm1, %ymm1
1810 ; AVX2-NEXT: vpsllq $50, %ymm0, %ymm0
1811 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1814 ; AVX512F-LABEL: splatconstant_funnnel_v4i64:
1816 ; AVX512F-NEXT: vpsrlq $14, %ymm1, %ymm1
1817 ; AVX512F-NEXT: vpsllq $50, %ymm0, %ymm0
1818 ; AVX512F-NEXT: vpor %ymm1, %ymm0, %ymm0
1819 ; AVX512F-NEXT: retq
1821 ; AVX512VL-LABEL: splatconstant_funnnel_v4i64:
1822 ; AVX512VL: # %bb.0:
1823 ; AVX512VL-NEXT: vpsrlq $14, %ymm1, %ymm1
1824 ; AVX512VL-NEXT: vpsllq $50, %ymm0, %ymm0
1825 ; AVX512VL-NEXT: vpor %ymm1, %ymm0, %ymm0
1826 ; AVX512VL-NEXT: retq
1828 ; AVX512BW-LABEL: splatconstant_funnnel_v4i64:
1829 ; AVX512BW: # %bb.0:
1830 ; AVX512BW-NEXT: vpsrlq $14, %ymm1, %ymm1
1831 ; AVX512BW-NEXT: vpsllq $50, %ymm0, %ymm0
1832 ; AVX512BW-NEXT: vpor %ymm1, %ymm0, %ymm0
1833 ; AVX512BW-NEXT: retq
1835 ; AVX512VBMI2-LABEL: splatconstant_funnnel_v4i64:
1836 ; AVX512VBMI2: # %bb.0:
1837 ; AVX512VBMI2-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
1838 ; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1839 ; AVX512VBMI2-NEXT: vpshrdq $14, %zmm0, %zmm1, %zmm0
1840 ; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
1841 ; AVX512VBMI2-NEXT: retq
1843 ; AVX512VLBW-LABEL: splatconstant_funnnel_v4i64:
1844 ; AVX512VLBW: # %bb.0:
1845 ; AVX512VLBW-NEXT: vpsrlq $14, %ymm1, %ymm1
1846 ; AVX512VLBW-NEXT: vpsllq $50, %ymm0, %ymm0
1847 ; AVX512VLBW-NEXT: vpor %ymm1, %ymm0, %ymm0
1848 ; AVX512VLBW-NEXT: retq
1850 ; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v4i64:
1851 ; AVX512VLVBMI2: # %bb.0:
1852 ; AVX512VLVBMI2-NEXT: vpshrdq $14, %ymm0, %ymm1, %ymm0
1853 ; AVX512VLVBMI2-NEXT: retq
1855 ; XOPAVX1-LABEL: splatconstant_funnnel_v4i64:
1857 ; XOPAVX1-NEXT: vpsrlq $14, %xmm1, %xmm2
1858 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
1859 ; XOPAVX1-NEXT: vpsrlq $14, %xmm1, %xmm1
1860 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
1861 ; XOPAVX1-NEXT: vpsllq $50, %xmm0, %xmm2
1862 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1863 ; XOPAVX1-NEXT: vpsllq $50, %xmm0, %xmm0
1864 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
1865 ; XOPAVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
1866 ; XOPAVX1-NEXT: retq
1868 ; XOPAVX2-LABEL: splatconstant_funnnel_v4i64:
1870 ; XOPAVX2-NEXT: vpsrlq $14, %ymm1, %ymm1
1871 ; XOPAVX2-NEXT: vpsllq $50, %ymm0, %ymm0
1872 ; XOPAVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1873 ; XOPAVX2-NEXT: retq
1874 %res = call <4 x i64> @llvm.fshr.v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> <i64 14, i64 14, i64 14, i64 14>)
1878 define <8 x i32> @splatconstant_funnnel_v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
1879 ; AVX1-LABEL: splatconstant_funnnel_v8i32:
1881 ; AVX1-NEXT: vpsrld $4, %xmm1, %xmm2
1882 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
1883 ; AVX1-NEXT: vpsrld $4, %xmm1, %xmm1
1884 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
1885 ; AVX1-NEXT: vpslld $28, %xmm0, %xmm2
1886 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1887 ; AVX1-NEXT: vpslld $28, %xmm0, %xmm0
1888 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
1889 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
1892 ; AVX2-LABEL: splatconstant_funnnel_v8i32:
1894 ; AVX2-NEXT: vpsrld $4, %ymm1, %ymm1
1895 ; AVX2-NEXT: vpslld $28, %ymm0, %ymm0
1896 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1899 ; AVX512F-LABEL: splatconstant_funnnel_v8i32:
1901 ; AVX512F-NEXT: vpsrld $4, %ymm1, %ymm1
1902 ; AVX512F-NEXT: vpslld $28, %ymm0, %ymm0
1903 ; AVX512F-NEXT: vpor %ymm1, %ymm0, %ymm0
1904 ; AVX512F-NEXT: retq
1906 ; AVX512VL-LABEL: splatconstant_funnnel_v8i32:
1907 ; AVX512VL: # %bb.0:
1908 ; AVX512VL-NEXT: vpsrld $4, %ymm1, %ymm1
1909 ; AVX512VL-NEXT: vpslld $28, %ymm0, %ymm0
1910 ; AVX512VL-NEXT: vpor %ymm1, %ymm0, %ymm0
1911 ; AVX512VL-NEXT: retq
1913 ; AVX512BW-LABEL: splatconstant_funnnel_v8i32:
1914 ; AVX512BW: # %bb.0:
1915 ; AVX512BW-NEXT: vpsrld $4, %ymm1, %ymm1
1916 ; AVX512BW-NEXT: vpslld $28, %ymm0, %ymm0
1917 ; AVX512BW-NEXT: vpor %ymm1, %ymm0, %ymm0
1918 ; AVX512BW-NEXT: retq
1920 ; AVX512VBMI2-LABEL: splatconstant_funnnel_v8i32:
1921 ; AVX512VBMI2: # %bb.0:
1922 ; AVX512VBMI2-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
1923 ; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1924 ; AVX512VBMI2-NEXT: vpshrdd $4, %zmm0, %zmm1, %zmm0
1925 ; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
1926 ; AVX512VBMI2-NEXT: retq
1928 ; AVX512VLBW-LABEL: splatconstant_funnnel_v8i32:
1929 ; AVX512VLBW: # %bb.0:
1930 ; AVX512VLBW-NEXT: vpsrld $4, %ymm1, %ymm1
1931 ; AVX512VLBW-NEXT: vpslld $28, %ymm0, %ymm0
1932 ; AVX512VLBW-NEXT: vpor %ymm1, %ymm0, %ymm0
1933 ; AVX512VLBW-NEXT: retq
1935 ; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v8i32:
1936 ; AVX512VLVBMI2: # %bb.0:
1937 ; AVX512VLVBMI2-NEXT: vpshrdd $4, %ymm0, %ymm1, %ymm0
1938 ; AVX512VLVBMI2-NEXT: retq
1940 ; XOPAVX1-LABEL: splatconstant_funnnel_v8i32:
1942 ; XOPAVX1-NEXT: vpsrld $4, %xmm1, %xmm2
1943 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
1944 ; XOPAVX1-NEXT: vpsrld $4, %xmm1, %xmm1
1945 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
1946 ; XOPAVX1-NEXT: vpslld $28, %xmm0, %xmm2
1947 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1948 ; XOPAVX1-NEXT: vpslld $28, %xmm0, %xmm0
1949 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
1950 ; XOPAVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
1951 ; XOPAVX1-NEXT: retq
1953 ; XOPAVX2-LABEL: splatconstant_funnnel_v8i32:
1955 ; XOPAVX2-NEXT: vpsrld $4, %ymm1, %ymm1
1956 ; XOPAVX2-NEXT: vpslld $28, %ymm0, %ymm0
1957 ; XOPAVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1958 ; XOPAVX2-NEXT: retq
1959 %res = call <8 x i32> @llvm.fshr.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>)
1963 define <16 x i16> @splatconstant_funnnel_v16i16(<16 x i16> %x, <16 x i16> %y) nounwind {
1964 ; AVX1-LABEL: splatconstant_funnnel_v16i16:
1966 ; AVX1-NEXT: vpsrlw $7, %xmm1, %xmm2
1967 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
1968 ; AVX1-NEXT: vpsrlw $7, %xmm1, %xmm1
1969 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
1970 ; AVX1-NEXT: vpsllw $9, %xmm0, %xmm2
1971 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1972 ; AVX1-NEXT: vpsllw $9, %xmm0, %xmm0
1973 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
1974 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
1977 ; AVX2-LABEL: splatconstant_funnnel_v16i16:
1979 ; AVX2-NEXT: vpsrlw $7, %ymm1, %ymm1
1980 ; AVX2-NEXT: vpsllw $9, %ymm0, %ymm0
1981 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1984 ; AVX512F-LABEL: splatconstant_funnnel_v16i16:
1986 ; AVX512F-NEXT: vpsrlw $7, %ymm1, %ymm1
1987 ; AVX512F-NEXT: vpsllw $9, %ymm0, %ymm0
1988 ; AVX512F-NEXT: vpor %ymm1, %ymm0, %ymm0
1989 ; AVX512F-NEXT: retq
1991 ; AVX512VL-LABEL: splatconstant_funnnel_v16i16:
1992 ; AVX512VL: # %bb.0:
1993 ; AVX512VL-NEXT: vpsrlw $7, %ymm1, %ymm1
1994 ; AVX512VL-NEXT: vpsllw $9, %ymm0, %ymm0
1995 ; AVX512VL-NEXT: vpor %ymm1, %ymm0, %ymm0
1996 ; AVX512VL-NEXT: retq
1998 ; AVX512BW-LABEL: splatconstant_funnnel_v16i16:
1999 ; AVX512BW: # %bb.0:
2000 ; AVX512BW-NEXT: vpsrlw $7, %ymm1, %ymm1
2001 ; AVX512BW-NEXT: vpsllw $9, %ymm0, %ymm0
2002 ; AVX512BW-NEXT: vpor %ymm1, %ymm0, %ymm0
2003 ; AVX512BW-NEXT: retq
2005 ; AVX512VBMI2-LABEL: splatconstant_funnnel_v16i16:
2006 ; AVX512VBMI2: # %bb.0:
2007 ; AVX512VBMI2-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
2008 ; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
2009 ; AVX512VBMI2-NEXT: vpshrdw $7, %zmm0, %zmm1, %zmm0
2010 ; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
2011 ; AVX512VBMI2-NEXT: retq
2013 ; AVX512VLBW-LABEL: splatconstant_funnnel_v16i16:
2014 ; AVX512VLBW: # %bb.0:
2015 ; AVX512VLBW-NEXT: vpsrlw $7, %ymm1, %ymm1
2016 ; AVX512VLBW-NEXT: vpsllw $9, %ymm0, %ymm0
2017 ; AVX512VLBW-NEXT: vpor %ymm1, %ymm0, %ymm0
2018 ; AVX512VLBW-NEXT: retq
2020 ; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v16i16:
2021 ; AVX512VLVBMI2: # %bb.0:
2022 ; AVX512VLVBMI2-NEXT: vpshrdw $7, %ymm0, %ymm1, %ymm0
2023 ; AVX512VLVBMI2-NEXT: retq
2025 ; XOPAVX1-LABEL: splatconstant_funnnel_v16i16:
2027 ; XOPAVX1-NEXT: vpsrlw $7, %xmm1, %xmm2
2028 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
2029 ; XOPAVX1-NEXT: vpsrlw $7, %xmm1, %xmm1
2030 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
2031 ; XOPAVX1-NEXT: vpsllw $9, %xmm0, %xmm2
2032 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
2033 ; XOPAVX1-NEXT: vpsllw $9, %xmm0, %xmm0
2034 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
2035 ; XOPAVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
2036 ; XOPAVX1-NEXT: retq
2038 ; XOPAVX2-LABEL: splatconstant_funnnel_v16i16:
2040 ; XOPAVX2-NEXT: vpsrlw $7, %ymm1, %ymm1
2041 ; XOPAVX2-NEXT: vpsllw $9, %ymm0, %ymm0
2042 ; XOPAVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
2043 ; XOPAVX2-NEXT: retq
2044 %res = call <16 x i16> @llvm.fshr.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>)
2048 define <32 x i8> @splatconstant_funnnel_v32i8(<32 x i8> %x, <32 x i8> %y) nounwind {
2049 ; AVX1-LABEL: splatconstant_funnnel_v32i8:
2051 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
2052 ; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm2
2053 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
2054 ; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
2055 ; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm1
2056 ; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1
2057 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
2058 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
2059 ; AVX1-NEXT: vpsllw $4, %xmm2, %xmm2
2060 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
2061 ; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
2062 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm0
2063 ; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0
2064 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
2065 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
2068 ; AVX2-LABEL: splatconstant_funnnel_v32i8:
2070 ; AVX2-NEXT: vpsrlw $4, %ymm1, %ymm1
2071 ; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
2072 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm0
2073 ; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
2074 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
2077 ; AVX512F-LABEL: splatconstant_funnnel_v32i8:
2079 ; AVX512F-NEXT: vpsllw $4, %ymm0, %ymm2
2080 ; AVX512F-NEXT: vpsrlw $4, %ymm1, %ymm0
2081 ; AVX512F-NEXT: vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm2, %zmm0
2082 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
2083 ; AVX512F-NEXT: retq
2085 ; AVX512VL-LABEL: splatconstant_funnnel_v32i8:
2086 ; AVX512VL: # %bb.0:
2087 ; AVX512VL-NEXT: vpsllw $4, %ymm0, %ymm2
2088 ; AVX512VL-NEXT: vpsrlw $4, %ymm1, %ymm0
2089 ; AVX512VL-NEXT: vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm2, %ymm0
2090 ; AVX512VL-NEXT: retq
2092 ; AVX512BW-LABEL: splatconstant_funnnel_v32i8:
2093 ; AVX512BW: # %bb.0:
2094 ; AVX512BW-NEXT: vpsllw $4, %ymm0, %ymm2
2095 ; AVX512BW-NEXT: vpsrlw $4, %ymm1, %ymm0
2096 ; AVX512BW-NEXT: vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm2, %zmm0
2097 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
2098 ; AVX512BW-NEXT: retq
2100 ; AVX512VBMI2-LABEL: splatconstant_funnnel_v32i8:
2101 ; AVX512VBMI2: # %bb.0:
2102 ; AVX512VBMI2-NEXT: vpsllw $4, %ymm0, %ymm2
2103 ; AVX512VBMI2-NEXT: vpsrlw $4, %ymm1, %ymm0
2104 ; AVX512VBMI2-NEXT: vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm2, %zmm0
2105 ; AVX512VBMI2-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
2106 ; AVX512VBMI2-NEXT: retq
2108 ; AVX512VLBW-LABEL: splatconstant_funnnel_v32i8:
2109 ; AVX512VLBW: # %bb.0:
2110 ; AVX512VLBW-NEXT: vpsllw $4, %ymm0, %ymm2
2111 ; AVX512VLBW-NEXT: vpsrlw $4, %ymm1, %ymm0
2112 ; AVX512VLBW-NEXT: vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm2, %ymm0
2113 ; AVX512VLBW-NEXT: retq
2115 ; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v32i8:
2116 ; AVX512VLVBMI2: # %bb.0:
2117 ; AVX512VLVBMI2-NEXT: vpsllw $4, %ymm0, %ymm2
2118 ; AVX512VLVBMI2-NEXT: vpsrlw $4, %ymm1, %ymm0
2119 ; AVX512VLVBMI2-NEXT: vpternlogq $216, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm2, %ymm0
2120 ; AVX512VLVBMI2-NEXT: retq
2122 ; XOPAVX1-LABEL: splatconstant_funnnel_v32i8:
2124 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
2125 ; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
2126 ; XOPAVX1-NEXT: vpshlb %xmm3, %xmm2, %xmm2
2127 ; XOPAVX1-NEXT: vpshlb %xmm3, %xmm1, %xmm1
2128 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
2129 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
2130 ; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4]
2131 ; XOPAVX1-NEXT: vpshlb %xmm3, %xmm2, %xmm2
2132 ; XOPAVX1-NEXT: vpshlb %xmm3, %xmm0, %xmm0
2133 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
2134 ; XOPAVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
2135 ; XOPAVX1-NEXT: retq
2137 ; XOPAVX2-LABEL: splatconstant_funnnel_v32i8:
2139 ; XOPAVX2-NEXT: vpsrlw $4, %ymm1, %ymm1
2140 ; XOPAVX2-NEXT: vpsllw $4, %ymm0, %ymm0
2141 ; XOPAVX2-NEXT: vpcmov {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm0, %ymm0
2142 ; XOPAVX2-NEXT: retq
2143 %res = call <32 x i8> @llvm.fshr.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>)