1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX512,AVX512F
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VL
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512BW
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VLBW
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefixes=XOP,XOPAVX1
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefixes=XOP,XOPAVX2
11 declare <4 x i64> @llvm.fshr.v4i64(<4 x i64>, <4 x i64>, <4 x i64>)
12 declare <8 x i32> @llvm.fshr.v8i32(<8 x i32>, <8 x i32>, <8 x i32>)
13 declare <16 x i16> @llvm.fshr.v16i16(<16 x i16>, <16 x i16>, <16 x i16>)
14 declare <32 x i8> @llvm.fshr.v32i8(<32 x i8>, <32 x i8>, <32 x i8>)
20 define <4 x i64> @var_funnnel_v4i64(<4 x i64> %x, <4 x i64> %amt) nounwind {
21 ; AVX1-LABEL: var_funnnel_v4i64:
23 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
24 ; AVX1-NEXT: vandps {{.*}}(%rip), %ymm1, %ymm3
25 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
26 ; AVX1-NEXT: vpsrlq %xmm4, %xmm2, %xmm5
27 ; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[2,3,0,1]
28 ; AVX1-NEXT: vpsrlq %xmm4, %xmm2, %xmm4
29 ; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7]
30 ; AVX1-NEXT: vpsrlq %xmm3, %xmm0, %xmm5
31 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[2,3,0,1]
32 ; AVX1-NEXT: vpsrlq %xmm3, %xmm0, %xmm3
33 ; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm5[0,1,2,3],xmm3[4,5,6,7]
34 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3
35 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
36 ; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5
37 ; AVX1-NEXT: vpsubq %xmm4, %xmm5, %xmm4
38 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [63,63]
39 ; AVX1-NEXT: vpand %xmm6, %xmm4, %xmm4
40 ; AVX1-NEXT: vpsllq %xmm4, %xmm2, %xmm7
41 ; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[2,3,0,1]
42 ; AVX1-NEXT: vpsllq %xmm4, %xmm2, %xmm2
43 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm7[0,1,2,3],xmm2[4,5,6,7]
44 ; AVX1-NEXT: vpsubq %xmm1, %xmm5, %xmm1
45 ; AVX1-NEXT: vpand %xmm6, %xmm1, %xmm1
46 ; AVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm4
47 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
48 ; AVX1-NEXT: vpsllq %xmm1, %xmm0, %xmm0
49 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm4[0,1,2,3],xmm0[4,5,6,7]
50 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
51 ; AVX1-NEXT: vorps %ymm3, %ymm0, %ymm0
54 ; AVX2-LABEL: var_funnnel_v4i64:
56 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [63,63,63,63]
57 ; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm3
58 ; AVX2-NEXT: vpsrlvq %ymm3, %ymm0, %ymm3
59 ; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4
60 ; AVX2-NEXT: vpsubq %ymm1, %ymm4, %ymm1
61 ; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1
62 ; AVX2-NEXT: vpsllvq %ymm1, %ymm0, %ymm0
63 ; AVX2-NEXT: vpor %ymm3, %ymm0, %ymm0
66 ; AVX512F-LABEL: var_funnnel_v4i64:
68 ; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
69 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
70 ; AVX512F-NEXT: vprorvq %zmm1, %zmm0, %zmm0
71 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
74 ; AVX512VL-LABEL: var_funnnel_v4i64:
76 ; AVX512VL-NEXT: vprorvq %ymm1, %ymm0, %ymm0
79 ; AVX512BW-LABEL: var_funnnel_v4i64:
81 ; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
82 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
83 ; AVX512BW-NEXT: vprorvq %zmm1, %zmm0, %zmm0
84 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
87 ; AVX512VLBW-LABEL: var_funnnel_v4i64:
88 ; AVX512VLBW: # %bb.0:
89 ; AVX512VLBW-NEXT: vprorvq %ymm1, %ymm0, %ymm0
90 ; AVX512VLBW-NEXT: retq
92 ; XOPAVX1-LABEL: var_funnnel_v4i64:
94 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
95 ; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
96 ; XOPAVX1-NEXT: vpsubq %xmm2, %xmm3, %xmm2
97 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
98 ; XOPAVX1-NEXT: vprotq %xmm2, %xmm4, %xmm2
99 ; XOPAVX1-NEXT: vpsubq %xmm1, %xmm3, %xmm1
100 ; XOPAVX1-NEXT: vprotq %xmm1, %xmm0, %xmm0
101 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
104 ; XOPAVX2-LABEL: var_funnnel_v4i64:
106 ; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
107 ; XOPAVX2-NEXT: vpsubq %ymm1, %ymm2, %ymm1
108 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
109 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
110 ; XOPAVX2-NEXT: vprotq %xmm2, %xmm3, %xmm2
111 ; XOPAVX2-NEXT: vprotq %xmm1, %xmm0, %xmm0
112 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
114 %res = call <4 x i64> @llvm.fshr.v4i64(<4 x i64> %x, <4 x i64> %x, <4 x i64> %amt)
118 define <8 x i32> @var_funnnel_v8i32(<8 x i32> %x, <8 x i32> %amt) nounwind {
119 ; AVX1-LABEL: var_funnnel_v8i32:
121 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
122 ; AVX1-NEXT: vpxor %xmm8, %xmm8, %xmm8
123 ; AVX1-NEXT: vpsubd %xmm2, %xmm8, %xmm2
124 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [31,31,31,31]
125 ; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2
126 ; AVX1-NEXT: vpslld $23, %xmm2, %xmm2
127 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [1065353216,1065353216,1065353216,1065353216]
128 ; AVX1-NEXT: vpaddd %xmm5, %xmm2, %xmm2
129 ; AVX1-NEXT: vcvttps2dq %xmm2, %xmm2
130 ; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm2[1,1,3,3]
131 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7
132 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm7[1,1,3,3]
133 ; AVX1-NEXT: vpmuludq %xmm6, %xmm3, %xmm3
134 ; AVX1-NEXT: vpmuludq %xmm2, %xmm7, %xmm2
135 ; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm2[1,1,3,3]
136 ; AVX1-NEXT: vpblendw {{.*#+}} xmm6 = xmm6[0,1],xmm3[2,3],xmm6[4,5],xmm3[6,7]
137 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[0,0,2,2]
138 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
139 ; AVX1-NEXT: vpor %xmm6, %xmm2, %xmm2
140 ; AVX1-NEXT: vpsubd %xmm1, %xmm8, %xmm1
141 ; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm1
142 ; AVX1-NEXT: vpslld $23, %xmm1, %xmm1
143 ; AVX1-NEXT: vpaddd %xmm5, %xmm1, %xmm1
144 ; AVX1-NEXT: vcvttps2dq %xmm1, %xmm1
145 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
146 ; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
147 ; AVX1-NEXT: vpmuludq %xmm3, %xmm4, %xmm3
148 ; AVX1-NEXT: vpmuludq %xmm1, %xmm0, %xmm0
149 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
150 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]
151 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[0,0,2,2]
152 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7]
153 ; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
154 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
157 ; AVX2-LABEL: var_funnnel_v8i32:
159 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
160 ; AVX2-NEXT: vpsubd %ymm1, %ymm2, %ymm1
161 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [31,31,31,31,31,31,31,31]
162 ; AVX2-NEXT: vpand %ymm2, %ymm1, %ymm1
163 ; AVX2-NEXT: vpsllvd %ymm1, %ymm0, %ymm2
164 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm3 = [32,32,32,32,32,32,32,32]
165 ; AVX2-NEXT: vpsubd %ymm1, %ymm3, %ymm1
166 ; AVX2-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0
167 ; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0
170 ; AVX512F-LABEL: var_funnnel_v8i32:
172 ; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
173 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
174 ; AVX512F-NEXT: vprorvd %zmm1, %zmm0, %zmm0
175 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
178 ; AVX512VL-LABEL: var_funnnel_v8i32:
180 ; AVX512VL-NEXT: vprorvd %ymm1, %ymm0, %ymm0
181 ; AVX512VL-NEXT: retq
183 ; AVX512BW-LABEL: var_funnnel_v8i32:
185 ; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
186 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
187 ; AVX512BW-NEXT: vprorvd %zmm1, %zmm0, %zmm0
188 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
189 ; AVX512BW-NEXT: retq
191 ; AVX512VLBW-LABEL: var_funnnel_v8i32:
192 ; AVX512VLBW: # %bb.0:
193 ; AVX512VLBW-NEXT: vprorvd %ymm1, %ymm0, %ymm0
194 ; AVX512VLBW-NEXT: retq
196 ; XOPAVX1-LABEL: var_funnnel_v8i32:
198 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
199 ; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
200 ; XOPAVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm2
201 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
202 ; XOPAVX1-NEXT: vprotd %xmm2, %xmm4, %xmm2
203 ; XOPAVX1-NEXT: vpsubd %xmm1, %xmm3, %xmm1
204 ; XOPAVX1-NEXT: vprotd %xmm1, %xmm0, %xmm0
205 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
208 ; XOPAVX2-LABEL: var_funnnel_v8i32:
210 ; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
211 ; XOPAVX2-NEXT: vpsubd %ymm1, %ymm2, %ymm1
212 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
213 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
214 ; XOPAVX2-NEXT: vprotd %xmm2, %xmm3, %xmm2
215 ; XOPAVX2-NEXT: vprotd %xmm1, %xmm0, %xmm0
216 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
218 %res = call <8 x i32> @llvm.fshr.v8i32(<8 x i32> %x, <8 x i32> %x, <8 x i32> %amt)
222 define <16 x i16> @var_funnnel_v16i16(<16 x i16> %x, <16 x i16> %amt) nounwind {
223 ; AVX1-LABEL: var_funnnel_v16i16:
225 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
226 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
227 ; AVX1-NEXT: vpsubw %xmm2, %xmm3, %xmm2
228 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [15,15,15,15,15,15,15,15]
229 ; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2
230 ; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm5 = xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]
231 ; AVX1-NEXT: vpslld $23, %xmm5, %xmm5
232 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [1065353216,1065353216,1065353216,1065353216]
233 ; AVX1-NEXT: vpaddd %xmm6, %xmm5, %xmm5
234 ; AVX1-NEXT: vcvttps2dq %xmm5, %xmm5
235 ; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero
236 ; AVX1-NEXT: vpslld $23, %xmm2, %xmm2
237 ; AVX1-NEXT: vpaddd %xmm6, %xmm2, %xmm2
238 ; AVX1-NEXT: vcvttps2dq %xmm2, %xmm2
239 ; AVX1-NEXT: vpackusdw %xmm5, %xmm2, %xmm2
240 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
241 ; AVX1-NEXT: vpmulhuw %xmm2, %xmm5, %xmm7
242 ; AVX1-NEXT: vpmullw %xmm2, %xmm5, %xmm2
243 ; AVX1-NEXT: vpor %xmm7, %xmm2, %xmm2
244 ; AVX1-NEXT: vpsubw %xmm1, %xmm3, %xmm1
245 ; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm1
246 ; AVX1-NEXT: vpunpckhwd {{.*#+}} xmm3 = xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
247 ; AVX1-NEXT: vpslld $23, %xmm3, %xmm3
248 ; AVX1-NEXT: vpaddd %xmm6, %xmm3, %xmm3
249 ; AVX1-NEXT: vcvttps2dq %xmm3, %xmm3
250 ; AVX1-NEXT: vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
251 ; AVX1-NEXT: vpslld $23, %xmm1, %xmm1
252 ; AVX1-NEXT: vpaddd %xmm6, %xmm1, %xmm1
253 ; AVX1-NEXT: vcvttps2dq %xmm1, %xmm1
254 ; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1
255 ; AVX1-NEXT: vpmulhuw %xmm1, %xmm0, %xmm3
256 ; AVX1-NEXT: vpmullw %xmm1, %xmm0, %xmm0
257 ; AVX1-NEXT: vpor %xmm3, %xmm0, %xmm0
258 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
261 ; AVX2-LABEL: var_funnnel_v16i16:
263 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
264 ; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm3 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15]
265 ; AVX2-NEXT: vpsubw %ymm1, %ymm2, %ymm1
266 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
267 ; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15]
268 ; AVX2-NEXT: vpsllvd %ymm4, %ymm3, %ymm4
269 ; AVX2-NEXT: vpsrld $16, %ymm4, %ymm4
270 ; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11]
271 ; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm5 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11]
272 ; AVX2-NEXT: vpsllvd %ymm5, %ymm0, %ymm5
273 ; AVX2-NEXT: vpsrld $16, %ymm5, %ymm5
274 ; AVX2-NEXT: vpackusdw %ymm4, %ymm5, %ymm4
275 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
276 ; AVX2-NEXT: vpsubw %ymm1, %ymm5, %ymm1
277 ; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm5 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15]
278 ; AVX2-NEXT: vpsrlvd %ymm5, %ymm3, %ymm3
279 ; AVX2-NEXT: vpsrld $16, %ymm3, %ymm3
280 ; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11]
281 ; AVX2-NEXT: vpsrlvd %ymm1, %ymm0, %ymm0
282 ; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0
283 ; AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0
284 ; AVX2-NEXT: vpor %ymm0, %ymm4, %ymm0
287 ; AVX512F-LABEL: var_funnnel_v16i16:
289 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2
290 ; AVX512F-NEXT: vpsubw %ymm1, %ymm2, %ymm1
291 ; AVX512F-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
292 ; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm2 = 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
293 ; 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
294 ; AVX512F-NEXT: vpsllvd %zmm2, %zmm0, %zmm2
295 ; AVX512F-NEXT: vmovdqa {{.*#+}} ymm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
296 ; AVX512F-NEXT: vpsubw %ymm1, %ymm3, %ymm1
297 ; 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
298 ; AVX512F-NEXT: vpsrlvd %zmm1, %zmm0, %zmm0
299 ; AVX512F-NEXT: vpord %zmm0, %zmm2, %zmm0
300 ; AVX512F-NEXT: vpmovdw %zmm0, %ymm0
303 ; AVX512VL-LABEL: var_funnnel_v16i16:
305 ; AVX512VL-NEXT: vpxor %xmm2, %xmm2, %xmm2
306 ; AVX512VL-NEXT: vpsubw %ymm1, %ymm2, %ymm1
307 ; AVX512VL-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
308 ; AVX512VL-NEXT: vpmovzxwd {{.*#+}} zmm2 = 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
309 ; 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
310 ; AVX512VL-NEXT: vpsllvd %zmm2, %zmm0, %zmm2
311 ; AVX512VL-NEXT: vmovdqa {{.*#+}} ymm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
312 ; AVX512VL-NEXT: vpsubw %ymm1, %ymm3, %ymm1
313 ; 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
314 ; AVX512VL-NEXT: vpsrlvd %zmm1, %zmm0, %zmm0
315 ; AVX512VL-NEXT: vpord %zmm0, %zmm2, %zmm0
316 ; AVX512VL-NEXT: vpmovdw %zmm0, %ymm0
317 ; AVX512VL-NEXT: retq
319 ; AVX512BW-LABEL: var_funnnel_v16i16:
321 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
322 ; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2
323 ; AVX512BW-NEXT: vpsubw %ymm1, %ymm2, %ymm1
324 ; AVX512BW-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
325 ; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm2
326 ; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
327 ; AVX512BW-NEXT: vpsubw %ymm1, %ymm3, %ymm1
328 ; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm0
329 ; AVX512BW-NEXT: vpor %ymm0, %ymm2, %ymm0
330 ; AVX512BW-NEXT: retq
332 ; AVX512VLBW-LABEL: var_funnnel_v16i16:
333 ; AVX512VLBW: # %bb.0:
334 ; AVX512VLBW-NEXT: vpxor %xmm2, %xmm2, %xmm2
335 ; AVX512VLBW-NEXT: vpsubw %ymm1, %ymm2, %ymm1
336 ; AVX512VLBW-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
337 ; AVX512VLBW-NEXT: vpsllvw %ymm1, %ymm0, %ymm2
338 ; AVX512VLBW-NEXT: vmovdqa {{.*#+}} ymm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
339 ; AVX512VLBW-NEXT: vpsubw %ymm1, %ymm3, %ymm1
340 ; AVX512VLBW-NEXT: vpsrlvw %ymm1, %ymm0, %ymm0
341 ; AVX512VLBW-NEXT: vpor %ymm0, %ymm2, %ymm0
342 ; AVX512VLBW-NEXT: retq
344 ; XOPAVX1-LABEL: var_funnnel_v16i16:
346 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
347 ; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
348 ; XOPAVX1-NEXT: vpsubw %xmm2, %xmm3, %xmm2
349 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
350 ; XOPAVX1-NEXT: vprotw %xmm2, %xmm4, %xmm2
351 ; XOPAVX1-NEXT: vpsubw %xmm1, %xmm3, %xmm1
352 ; XOPAVX1-NEXT: vprotw %xmm1, %xmm0, %xmm0
353 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
356 ; XOPAVX2-LABEL: var_funnnel_v16i16:
358 ; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
359 ; XOPAVX2-NEXT: vpsubw %ymm1, %ymm2, %ymm1
360 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
361 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
362 ; XOPAVX2-NEXT: vprotw %xmm2, %xmm3, %xmm2
363 ; XOPAVX2-NEXT: vprotw %xmm1, %xmm0, %xmm0
364 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
366 %res = call <16 x i16> @llvm.fshr.v16i16(<16 x i16> %x, <16 x i16> %x, <16 x i16> %amt)
370 define <32 x i8> @var_funnnel_v32i8(<32 x i8> %x, <32 x i8> %amt) nounwind {
371 ; AVX1-LABEL: var_funnnel_v32i8:
373 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
374 ; AVX1-NEXT: vpsrlw $4, %xmm2, %xmm3
375 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
376 ; AVX1-NEXT: vpandn %xmm3, %xmm4, %xmm3
377 ; AVX1-NEXT: vpsllw $4, %xmm2, %xmm5
378 ; AVX1-NEXT: vpand %xmm4, %xmm5, %xmm5
379 ; AVX1-NEXT: vpor %xmm3, %xmm5, %xmm3
380 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
381 ; AVX1-NEXT: vpxor %xmm8, %xmm8, %xmm8
382 ; AVX1-NEXT: vpsubb %xmm5, %xmm8, %xmm5
383 ; AVX1-NEXT: vpsllw $5, %xmm5, %xmm5
384 ; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
385 ; AVX1-NEXT: vpsrlw $6, %xmm2, %xmm3
386 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
387 ; AVX1-NEXT: vpandn %xmm3, %xmm7, %xmm3
388 ; AVX1-NEXT: vpsllw $2, %xmm2, %xmm6
389 ; AVX1-NEXT: vpand %xmm7, %xmm6, %xmm6
390 ; AVX1-NEXT: vpor %xmm3, %xmm6, %xmm3
391 ; AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5
392 ; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
393 ; AVX1-NEXT: vpsrlw $7, %xmm2, %xmm3
394 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm9 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
395 ; AVX1-NEXT: vpand %xmm9, %xmm3, %xmm3
396 ; AVX1-NEXT: vpaddb %xmm2, %xmm2, %xmm6
397 ; AVX1-NEXT: vpor %xmm3, %xmm6, %xmm3
398 ; AVX1-NEXT: vpaddb %xmm5, %xmm5, %xmm5
399 ; AVX1-NEXT: vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
400 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm3
401 ; AVX1-NEXT: vpandn %xmm3, %xmm4, %xmm3
402 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm5
403 ; AVX1-NEXT: vpand %xmm4, %xmm5, %xmm4
404 ; AVX1-NEXT: vpor %xmm3, %xmm4, %xmm3
405 ; AVX1-NEXT: vpsubb %xmm1, %xmm8, %xmm1
406 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1
407 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
408 ; AVX1-NEXT: vpsrlw $6, %xmm0, %xmm3
409 ; AVX1-NEXT: vpandn %xmm3, %xmm7, %xmm3
410 ; AVX1-NEXT: vpsllw $2, %xmm0, %xmm4
411 ; AVX1-NEXT: vpand %xmm7, %xmm4, %xmm4
412 ; AVX1-NEXT: vpor %xmm3, %xmm4, %xmm3
413 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1
414 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
415 ; AVX1-NEXT: vpsrlw $7, %xmm0, %xmm3
416 ; AVX1-NEXT: vpand %xmm9, %xmm3, %xmm3
417 ; AVX1-NEXT: vpaddb %xmm0, %xmm0, %xmm4
418 ; AVX1-NEXT: vpor %xmm3, %xmm4, %xmm3
419 ; AVX1-NEXT: vpaddb %xmm1, %xmm1, %xmm1
420 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
421 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
424 ; AVX2-LABEL: var_funnnel_v32i8:
426 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm2
427 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
428 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm3
429 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm3, %ymm3
430 ; AVX2-NEXT: vpor %ymm2, %ymm3, %ymm2
431 ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
432 ; AVX2-NEXT: vpsubb %ymm1, %ymm3, %ymm1
433 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1
434 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
435 ; AVX2-NEXT: vpsrlw $6, %ymm0, %ymm2
436 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
437 ; AVX2-NEXT: vpsllw $2, %ymm0, %ymm3
438 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm3, %ymm3
439 ; AVX2-NEXT: vpor %ymm2, %ymm3, %ymm2
440 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
441 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
442 ; AVX2-NEXT: vpaddb %ymm0, %ymm0, %ymm2
443 ; AVX2-NEXT: vpsrlw $7, %ymm0, %ymm3
444 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm3, %ymm3
445 ; AVX2-NEXT: vpor %ymm3, %ymm2, %ymm2
446 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm1
447 ; AVX2-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
450 ; AVX512F-LABEL: var_funnnel_v32i8:
452 ; AVX512F-NEXT: vpsrlw $4, %ymm0, %ymm2
453 ; AVX512F-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
454 ; AVX512F-NEXT: vpsllw $4, %ymm0, %ymm3
455 ; AVX512F-NEXT: vpand {{.*}}(%rip), %ymm3, %ymm3
456 ; AVX512F-NEXT: vpor %ymm2, %ymm3, %ymm2
457 ; AVX512F-NEXT: vpxor %xmm3, %xmm3, %xmm3
458 ; AVX512F-NEXT: vpsubb %ymm1, %ymm3, %ymm1
459 ; AVX512F-NEXT: vpsllw $5, %ymm1, %ymm1
460 ; AVX512F-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
461 ; AVX512F-NEXT: vpsrlw $6, %ymm0, %ymm2
462 ; AVX512F-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
463 ; AVX512F-NEXT: vpsllw $2, %ymm0, %ymm3
464 ; AVX512F-NEXT: vpand {{.*}}(%rip), %ymm3, %ymm3
465 ; AVX512F-NEXT: vpor %ymm2, %ymm3, %ymm2
466 ; AVX512F-NEXT: vpaddb %ymm1, %ymm1, %ymm1
467 ; AVX512F-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
468 ; AVX512F-NEXT: vpaddb %ymm0, %ymm0, %ymm2
469 ; AVX512F-NEXT: vpsrlw $7, %ymm0, %ymm3
470 ; AVX512F-NEXT: vpand {{.*}}(%rip), %ymm3, %ymm3
471 ; AVX512F-NEXT: vpor %ymm3, %ymm2, %ymm2
472 ; AVX512F-NEXT: vpaddb %ymm1, %ymm1, %ymm1
473 ; AVX512F-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
476 ; AVX512VL-LABEL: var_funnnel_v32i8:
478 ; AVX512VL-NEXT: vpsrlw $4, %ymm0, %ymm2
479 ; AVX512VL-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
480 ; AVX512VL-NEXT: vpsllw $4, %ymm0, %ymm3
481 ; AVX512VL-NEXT: vpand {{.*}}(%rip), %ymm3, %ymm3
482 ; AVX512VL-NEXT: vpor %ymm2, %ymm3, %ymm2
483 ; AVX512VL-NEXT: vpxor %xmm3, %xmm3, %xmm3
484 ; AVX512VL-NEXT: vpsubb %ymm1, %ymm3, %ymm1
485 ; AVX512VL-NEXT: vpsllw $5, %ymm1, %ymm1
486 ; AVX512VL-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
487 ; AVX512VL-NEXT: vpsrlw $6, %ymm0, %ymm2
488 ; AVX512VL-NEXT: vpand {{.*}}(%rip), %ymm2, %ymm2
489 ; AVX512VL-NEXT: vpsllw $2, %ymm0, %ymm3
490 ; AVX512VL-NEXT: vpand {{.*}}(%rip), %ymm3, %ymm3
491 ; AVX512VL-NEXT: vpor %ymm2, %ymm3, %ymm2
492 ; AVX512VL-NEXT: vpaddb %ymm1, %ymm1, %ymm1
493 ; AVX512VL-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
494 ; AVX512VL-NEXT: vpaddb %ymm0, %ymm0, %ymm2
495 ; AVX512VL-NEXT: vpsrlw $7, %ymm0, %ymm3
496 ; AVX512VL-NEXT: vpand {{.*}}(%rip), %ymm3, %ymm3
497 ; AVX512VL-NEXT: vpor %ymm3, %ymm2, %ymm2
498 ; AVX512VL-NEXT: vpaddb %ymm1, %ymm1, %ymm1
499 ; AVX512VL-NEXT: vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
500 ; AVX512VL-NEXT: retq
502 ; AVX512BW-LABEL: var_funnnel_v32i8:
504 ; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm2 = [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]
505 ; AVX512BW-NEXT: vpand %ymm2, %ymm1, %ymm3
506 ; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm3 = ymm3[0],zero,ymm3[1],zero,ymm3[2],zero,ymm3[3],zero,ymm3[4],zero,ymm3[5],zero,ymm3[6],zero,ymm3[7],zero,ymm3[8],zero,ymm3[9],zero,ymm3[10],zero,ymm3[11],zero,ymm3[12],zero,ymm3[13],zero,ymm3[14],zero,ymm3[15],zero,ymm3[16],zero,ymm3[17],zero,ymm3[18],zero,ymm3[19],zero,ymm3[20],zero,ymm3[21],zero,ymm3[22],zero,ymm3[23],zero,ymm3[24],zero,ymm3[25],zero,ymm3[26],zero,ymm3[27],zero,ymm3[28],zero,ymm3[29],zero,ymm3[30],zero,ymm3[31],zero
507 ; 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
508 ; AVX512BW-NEXT: vpsrlvw %zmm3, %zmm0, %zmm3
509 ; AVX512BW-NEXT: vpxor %xmm4, %xmm4, %xmm4
510 ; AVX512BW-NEXT: vpsubb %ymm1, %ymm4, %ymm1
511 ; AVX512BW-NEXT: vpand %ymm2, %ymm1, %ymm1
512 ; 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
513 ; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm0
514 ; AVX512BW-NEXT: vporq %zmm3, %zmm0, %zmm0
515 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0
516 ; AVX512BW-NEXT: retq
518 ; AVX512VLBW-LABEL: var_funnnel_v32i8:
519 ; AVX512VLBW: # %bb.0:
520 ; AVX512VLBW-NEXT: vmovdqa {{.*#+}} ymm2 = [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]
521 ; AVX512VLBW-NEXT: vpand %ymm2, %ymm1, %ymm3
522 ; AVX512VLBW-NEXT: vpmovzxbw {{.*#+}} zmm3 = ymm3[0],zero,ymm3[1],zero,ymm3[2],zero,ymm3[3],zero,ymm3[4],zero,ymm3[5],zero,ymm3[6],zero,ymm3[7],zero,ymm3[8],zero,ymm3[9],zero,ymm3[10],zero,ymm3[11],zero,ymm3[12],zero,ymm3[13],zero,ymm3[14],zero,ymm3[15],zero,ymm3[16],zero,ymm3[17],zero,ymm3[18],zero,ymm3[19],zero,ymm3[20],zero,ymm3[21],zero,ymm3[22],zero,ymm3[23],zero,ymm3[24],zero,ymm3[25],zero,ymm3[26],zero,ymm3[27],zero,ymm3[28],zero,ymm3[29],zero,ymm3[30],zero,ymm3[31],zero
523 ; 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
524 ; AVX512VLBW-NEXT: vpsrlvw %zmm3, %zmm0, %zmm3
525 ; AVX512VLBW-NEXT: vpxor %xmm4, %xmm4, %xmm4
526 ; AVX512VLBW-NEXT: vpsubb %ymm1, %ymm4, %ymm1
527 ; AVX512VLBW-NEXT: vpand %ymm2, %ymm1, %ymm1
528 ; 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
529 ; AVX512VLBW-NEXT: vpsllvw %zmm1, %zmm0, %zmm0
530 ; AVX512VLBW-NEXT: vporq %zmm3, %zmm0, %zmm0
531 ; AVX512VLBW-NEXT: vpmovwb %zmm0, %ymm0
532 ; AVX512VLBW-NEXT: retq
534 ; XOPAVX1-LABEL: var_funnnel_v32i8:
536 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
537 ; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
538 ; XOPAVX1-NEXT: vpsubb %xmm2, %xmm3, %xmm2
539 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
540 ; XOPAVX1-NEXT: vprotb %xmm2, %xmm4, %xmm2
541 ; XOPAVX1-NEXT: vpsubb %xmm1, %xmm3, %xmm1
542 ; XOPAVX1-NEXT: vprotb %xmm1, %xmm0, %xmm0
543 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
546 ; XOPAVX2-LABEL: var_funnnel_v32i8:
548 ; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
549 ; XOPAVX2-NEXT: vpsubb %ymm1, %ymm2, %ymm1
550 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
551 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
552 ; XOPAVX2-NEXT: vprotb %xmm2, %xmm3, %xmm2
553 ; XOPAVX2-NEXT: vprotb %xmm1, %xmm0, %xmm0
554 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
556 %res = call <32 x i8> @llvm.fshr.v32i8(<32 x i8> %x, <32 x i8> %x, <32 x i8> %amt)
561 ; Uniform Variable Shifts
564 define <4 x i64> @splatvar_funnnel_v4i64(<4 x i64> %x, <4 x i64> %amt) nounwind {
565 ; AVX1-LABEL: splatvar_funnnel_v4i64:
567 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
568 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
569 ; AVX1-NEXT: vpsubq %xmm1, %xmm2, %xmm2
570 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [63,63]
571 ; AVX1-NEXT: vpand %xmm3, %xmm2, %xmm2
572 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
573 ; AVX1-NEXT: vpsllq %xmm2, %xmm4, %xmm5
574 ; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm2[2,3,0,1]
575 ; AVX1-NEXT: vpsllq %xmm6, %xmm4, %xmm7
576 ; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm5[0,1,2,3],xmm7[4,5,6,7]
577 ; AVX1-NEXT: vpsllq %xmm2, %xmm0, %xmm2
578 ; AVX1-NEXT: vpsllq %xmm6, %xmm0, %xmm6
579 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm6[4,5,6,7]
580 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm2, %ymm2
581 ; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1
582 ; AVX1-NEXT: vpsrlq %xmm1, %xmm4, %xmm3
583 ; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm0
584 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
585 ; AVX1-NEXT: vorps %ymm0, %ymm2, %ymm0
588 ; AVX2-LABEL: splatvar_funnnel_v4i64:
590 ; AVX2-NEXT: vpbroadcastq %xmm1, %xmm1
591 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [63,63]
592 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm3
593 ; AVX2-NEXT: vpsrlq %xmm3, %ymm0, %ymm3
594 ; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4
595 ; AVX2-NEXT: vpsubq %xmm1, %xmm4, %xmm1
596 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1
597 ; AVX2-NEXT: vpsllq %xmm1, %ymm0, %ymm0
598 ; AVX2-NEXT: vpor %ymm3, %ymm0, %ymm0
601 ; AVX512F-LABEL: splatvar_funnnel_v4i64:
603 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
604 ; AVX512F-NEXT: vpbroadcastq %xmm1, %ymm1
605 ; AVX512F-NEXT: vprorvq %zmm1, %zmm0, %zmm0
606 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
609 ; AVX512VL-LABEL: splatvar_funnnel_v4i64:
611 ; AVX512VL-NEXT: vpbroadcastq %xmm1, %ymm1
612 ; AVX512VL-NEXT: vprorvq %ymm1, %ymm0, %ymm0
613 ; AVX512VL-NEXT: retq
615 ; AVX512BW-LABEL: splatvar_funnnel_v4i64:
617 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
618 ; AVX512BW-NEXT: vpbroadcastq %xmm1, %ymm1
619 ; AVX512BW-NEXT: vprorvq %zmm1, %zmm0, %zmm0
620 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
621 ; AVX512BW-NEXT: retq
623 ; AVX512VLBW-LABEL: splatvar_funnnel_v4i64:
624 ; AVX512VLBW: # %bb.0:
625 ; AVX512VLBW-NEXT: vpbroadcastq %xmm1, %ymm1
626 ; AVX512VLBW-NEXT: vprorvq %ymm1, %ymm0, %ymm0
627 ; AVX512VLBW-NEXT: retq
629 ; XOPAVX1-LABEL: splatvar_funnnel_v4i64:
631 ; XOPAVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
632 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
633 ; XOPAVX1-NEXT: vpsubq %xmm1, %xmm2, %xmm1
634 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
635 ; XOPAVX1-NEXT: vprotq %xmm1, %xmm2, %xmm2
636 ; XOPAVX1-NEXT: vprotq %xmm1, %xmm0, %xmm0
637 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
640 ; XOPAVX2-LABEL: splatvar_funnnel_v4i64:
642 ; XOPAVX2-NEXT: vpbroadcastq %xmm1, %ymm1
643 ; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
644 ; XOPAVX2-NEXT: vpsubq %ymm1, %ymm2, %ymm1
645 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
646 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
647 ; XOPAVX2-NEXT: vprotq %xmm2, %xmm3, %xmm2
648 ; XOPAVX2-NEXT: vprotq %xmm1, %xmm0, %xmm0
649 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
651 %splat = shufflevector <4 x i64> %amt, <4 x i64> undef, <4 x i32> zeroinitializer
652 %res = call <4 x i64> @llvm.fshr.v4i64(<4 x i64> %x, <4 x i64> %x, <4 x i64> %splat)
656 define <8 x i32> @splatvar_funnnel_v8i32(<8 x i32> %x, <8 x i32> %amt) nounwind {
657 ; AVX1-LABEL: splatvar_funnnel_v8i32:
659 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
660 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
661 ; AVX1-NEXT: vpsubd %xmm1, %xmm2, %xmm1
662 ; AVX1-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1
663 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero
664 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
665 ; AVX1-NEXT: vpslld %xmm2, %xmm3, %xmm4
666 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [32,32,32,32]
667 ; AVX1-NEXT: vpsubd %xmm1, %xmm5, %xmm1
668 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
669 ; AVX1-NEXT: vpsrld %xmm1, %xmm3, %xmm3
670 ; AVX1-NEXT: vpor %xmm3, %xmm4, %xmm3
671 ; AVX1-NEXT: vpslld %xmm2, %xmm0, %xmm2
672 ; AVX1-NEXT: vpsrld %xmm1, %xmm0, %xmm0
673 ; AVX1-NEXT: vpor %xmm0, %xmm2, %xmm0
674 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
677 ; AVX2-LABEL: splatvar_funnnel_v8i32:
679 ; AVX2-NEXT: vpbroadcastd %xmm1, %xmm1
680 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
681 ; AVX2-NEXT: vpsubd %xmm1, %xmm2, %xmm1
682 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [31,31,31,31]
683 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1
684 ; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero
685 ; AVX2-NEXT: vpslld %xmm2, %ymm0, %ymm2
686 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [32,32,32,32]
687 ; AVX2-NEXT: vpsubd %xmm1, %xmm3, %xmm1
688 ; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
689 ; AVX2-NEXT: vpsrld %xmm1, %ymm0, %ymm0
690 ; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0
693 ; AVX512F-LABEL: splatvar_funnnel_v8i32:
695 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
696 ; AVX512F-NEXT: vpbroadcastd %xmm1, %ymm1
697 ; AVX512F-NEXT: vprorvd %zmm1, %zmm0, %zmm0
698 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
701 ; AVX512VL-LABEL: splatvar_funnnel_v8i32:
703 ; AVX512VL-NEXT: vpbroadcastd %xmm1, %ymm1
704 ; AVX512VL-NEXT: vprorvd %ymm1, %ymm0, %ymm0
705 ; AVX512VL-NEXT: retq
707 ; AVX512BW-LABEL: splatvar_funnnel_v8i32:
709 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
710 ; AVX512BW-NEXT: vpbroadcastd %xmm1, %ymm1
711 ; AVX512BW-NEXT: vprorvd %zmm1, %zmm0, %zmm0
712 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
713 ; AVX512BW-NEXT: retq
715 ; AVX512VLBW-LABEL: splatvar_funnnel_v8i32:
716 ; AVX512VLBW: # %bb.0:
717 ; AVX512VLBW-NEXT: vpbroadcastd %xmm1, %ymm1
718 ; AVX512VLBW-NEXT: vprorvd %ymm1, %ymm0, %ymm0
719 ; AVX512VLBW-NEXT: retq
721 ; XOPAVX1-LABEL: splatvar_funnnel_v8i32:
723 ; XOPAVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
724 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
725 ; XOPAVX1-NEXT: vpsubd %xmm1, %xmm2, %xmm1
726 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
727 ; XOPAVX1-NEXT: vprotd %xmm1, %xmm2, %xmm2
728 ; XOPAVX1-NEXT: vprotd %xmm1, %xmm0, %xmm0
729 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
732 ; XOPAVX2-LABEL: splatvar_funnnel_v8i32:
734 ; XOPAVX2-NEXT: vpbroadcastd %xmm1, %ymm1
735 ; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
736 ; XOPAVX2-NEXT: vpsubd %ymm1, %ymm2, %ymm1
737 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
738 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
739 ; XOPAVX2-NEXT: vprotd %xmm2, %xmm3, %xmm2
740 ; XOPAVX2-NEXT: vprotd %xmm1, %xmm0, %xmm0
741 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
743 %splat = shufflevector <8 x i32> %amt, <8 x i32> undef, <8 x i32> zeroinitializer
744 %res = call <8 x i32> @llvm.fshr.v8i32(<8 x i32> %x, <8 x i32> %x, <8 x i32> %splat)
748 define <16 x i16> @splatvar_funnnel_v16i16(<16 x i16> %x, <16 x i16> %amt) nounwind {
749 ; AVX1-LABEL: splatvar_funnnel_v16i16:
751 ; AVX1-NEXT: vpshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7]
752 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
753 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
754 ; AVX1-NEXT: vpsubw %xmm1, %xmm2, %xmm1
755 ; AVX1-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1
756 ; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
757 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
758 ; AVX1-NEXT: vpsllw %xmm2, %xmm3, %xmm4
759 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [16,16,16,16,16,16,16,16]
760 ; AVX1-NEXT: vpsubw %xmm1, %xmm5, %xmm1
761 ; AVX1-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
762 ; AVX1-NEXT: vpsrlw %xmm1, %xmm3, %xmm3
763 ; AVX1-NEXT: vpor %xmm3, %xmm4, %xmm3
764 ; AVX1-NEXT: vpsllw %xmm2, %xmm0, %xmm2
765 ; AVX1-NEXT: vpsrlw %xmm1, %xmm0, %xmm0
766 ; AVX1-NEXT: vpor %xmm0, %xmm2, %xmm0
767 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
770 ; AVX2-LABEL: splatvar_funnnel_v16i16:
772 ; AVX2-NEXT: vpbroadcastw %xmm1, %xmm1
773 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
774 ; AVX2-NEXT: vpsubw %xmm1, %xmm2, %xmm1
775 ; AVX2-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1
776 ; AVX2-NEXT: vpmovzxwq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
777 ; AVX2-NEXT: vpsllw %xmm2, %ymm0, %ymm2
778 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]
779 ; AVX2-NEXT: vpsubw %xmm1, %xmm3, %xmm1
780 ; AVX2-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
781 ; AVX2-NEXT: vpsrlw %xmm1, %ymm0, %ymm0
782 ; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0
785 ; AVX512-LABEL: splatvar_funnnel_v16i16:
787 ; AVX512-NEXT: vpbroadcastw %xmm1, %xmm1
788 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
789 ; AVX512-NEXT: vpsubw %xmm1, %xmm2, %xmm1
790 ; AVX512-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1
791 ; AVX512-NEXT: vpmovzxwq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
792 ; AVX512-NEXT: vpsllw %xmm2, %ymm0, %ymm2
793 ; AVX512-NEXT: vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]
794 ; AVX512-NEXT: vpsubw %xmm1, %xmm3, %xmm1
795 ; AVX512-NEXT: vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
796 ; AVX512-NEXT: vpsrlw %xmm1, %ymm0, %ymm0
797 ; AVX512-NEXT: vpor %ymm0, %ymm2, %ymm0
800 ; XOPAVX1-LABEL: splatvar_funnnel_v16i16:
802 ; XOPAVX1-NEXT: vpshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7]
803 ; XOPAVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
804 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
805 ; XOPAVX1-NEXT: vpsubw %xmm1, %xmm2, %xmm1
806 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
807 ; XOPAVX1-NEXT: vprotw %xmm1, %xmm2, %xmm2
808 ; XOPAVX1-NEXT: vprotw %xmm1, %xmm0, %xmm0
809 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
812 ; XOPAVX2-LABEL: splatvar_funnnel_v16i16:
814 ; XOPAVX2-NEXT: vpbroadcastw %xmm1, %ymm1
815 ; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
816 ; XOPAVX2-NEXT: vpsubw %ymm1, %ymm2, %ymm1
817 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
818 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
819 ; XOPAVX2-NEXT: vprotw %xmm2, %xmm3, %xmm2
820 ; XOPAVX2-NEXT: vprotw %xmm1, %xmm0, %xmm0
821 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
823 %splat = shufflevector <16 x i16> %amt, <16 x i16> undef, <16 x i32> zeroinitializer
824 %res = call <16 x i16> @llvm.fshr.v16i16(<16 x i16> %x, <16 x i16> %x, <16 x i16> %splat)
828 define <32 x i8> @splatvar_funnnel_v32i8(<32 x i8> %x, <32 x i8> %amt) nounwind {
829 ; AVX1-LABEL: splatvar_funnnel_v32i8:
831 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
832 ; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1
833 ; AVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm1
834 ; AVX1-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1
835 ; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm3 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
836 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
837 ; AVX1-NEXT: vpsllw %xmm3, %xmm4, %xmm5
838 ; AVX1-NEXT: vpcmpeqd %xmm6, %xmm6, %xmm6
839 ; AVX1-NEXT: vpsllw %xmm3, %xmm6, %xmm7
840 ; AVX1-NEXT: vpshufb %xmm2, %xmm7, %xmm2
841 ; AVX1-NEXT: vpand %xmm2, %xmm5, %xmm5
842 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
843 ; AVX1-NEXT: vpsubb %xmm1, %xmm7, %xmm1
844 ; AVX1-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
845 ; AVX1-NEXT: vpsrlw %xmm1, %xmm4, %xmm4
846 ; AVX1-NEXT: vpsrlw %xmm1, %xmm6, %xmm6
847 ; AVX1-NEXT: vpshufb {{.*#+}} xmm6 = xmm6[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
848 ; AVX1-NEXT: vpand %xmm6, %xmm4, %xmm4
849 ; AVX1-NEXT: vpor %xmm4, %xmm5, %xmm4
850 ; AVX1-NEXT: vpsllw %xmm3, %xmm0, %xmm3
851 ; AVX1-NEXT: vpand %xmm2, %xmm3, %xmm2
852 ; AVX1-NEXT: vpsrlw %xmm1, %xmm0, %xmm0
853 ; AVX1-NEXT: vpand %xmm6, %xmm0, %xmm0
854 ; AVX1-NEXT: vpor %xmm0, %xmm2, %xmm0
855 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0
858 ; AVX2-LABEL: splatvar_funnnel_v32i8:
860 ; AVX2-NEXT: vpbroadcastb %xmm1, %xmm1
861 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
862 ; AVX2-NEXT: vpsubb %xmm1, %xmm2, %xmm1
863 ; AVX2-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1
864 ; AVX2-NEXT: vpmovzxbq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
865 ; AVX2-NEXT: vpsllw %xmm2, %ymm0, %ymm3
866 ; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
867 ; AVX2-NEXT: vpsllw %xmm2, %xmm4, %xmm2
868 ; AVX2-NEXT: vpbroadcastb %xmm2, %ymm2
869 ; AVX2-NEXT: vpand %ymm2, %ymm3, %ymm2
870 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm3 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
871 ; AVX2-NEXT: vpsubb %xmm1, %xmm3, %xmm1
872 ; AVX2-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
873 ; AVX2-NEXT: vpsrlw %xmm1, %ymm0, %ymm0
874 ; AVX2-NEXT: vpsrlw %xmm1, %xmm4, %xmm1
875 ; AVX2-NEXT: vpsrlw $8, %xmm1, %xmm1
876 ; AVX2-NEXT: vpbroadcastb %xmm1, %ymm1
877 ; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
878 ; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0
881 ; AVX512F-LABEL: splatvar_funnnel_v32i8:
883 ; AVX512F-NEXT: vpbroadcastb %xmm1, %xmm1
884 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2
885 ; AVX512F-NEXT: vpsubb %xmm1, %xmm2, %xmm1
886 ; AVX512F-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1
887 ; AVX512F-NEXT: vpmovzxbq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
888 ; AVX512F-NEXT: vpsllw %xmm2, %ymm0, %ymm3
889 ; AVX512F-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
890 ; AVX512F-NEXT: vpsllw %xmm2, %xmm4, %xmm2
891 ; AVX512F-NEXT: vpbroadcastb %xmm2, %ymm2
892 ; AVX512F-NEXT: vpand %ymm2, %ymm3, %ymm2
893 ; AVX512F-NEXT: vmovdqa {{.*#+}} xmm3 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
894 ; AVX512F-NEXT: vpsubb %xmm1, %xmm3, %xmm1
895 ; AVX512F-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
896 ; AVX512F-NEXT: vpsrlw %xmm1, %ymm0, %ymm0
897 ; AVX512F-NEXT: vpsrlw %xmm1, %xmm4, %xmm1
898 ; AVX512F-NEXT: vpsrlw $8, %xmm1, %xmm1
899 ; AVX512F-NEXT: vpbroadcastb %xmm1, %ymm1
900 ; AVX512F-NEXT: vpand %ymm1, %ymm0, %ymm0
901 ; AVX512F-NEXT: vpor %ymm0, %ymm2, %ymm0
904 ; AVX512VL-LABEL: splatvar_funnnel_v32i8:
906 ; AVX512VL-NEXT: vpbroadcastb %xmm1, %xmm1
907 ; AVX512VL-NEXT: vpxor %xmm2, %xmm2, %xmm2
908 ; AVX512VL-NEXT: vpsubb %xmm1, %xmm2, %xmm1
909 ; AVX512VL-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1
910 ; AVX512VL-NEXT: vpmovzxbq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
911 ; AVX512VL-NEXT: vpsllw %xmm2, %ymm0, %ymm3
912 ; AVX512VL-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4
913 ; AVX512VL-NEXT: vpsllw %xmm2, %xmm4, %xmm2
914 ; AVX512VL-NEXT: vpbroadcastb %xmm2, %ymm2
915 ; AVX512VL-NEXT: vpand %ymm2, %ymm3, %ymm2
916 ; AVX512VL-NEXT: vmovdqa {{.*#+}} xmm3 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
917 ; AVX512VL-NEXT: vpsubb %xmm1, %xmm3, %xmm1
918 ; AVX512VL-NEXT: vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
919 ; AVX512VL-NEXT: vpsrlw %xmm1, %ymm0, %ymm0
920 ; AVX512VL-NEXT: vpsrlw %xmm1, %xmm4, %xmm1
921 ; AVX512VL-NEXT: vpsrlw $8, %xmm1, %xmm1
922 ; AVX512VL-NEXT: vpbroadcastb %xmm1, %ymm1
923 ; AVX512VL-NEXT: vpand %ymm1, %ymm0, %ymm0
924 ; AVX512VL-NEXT: vpor %ymm0, %ymm2, %ymm0
925 ; AVX512VL-NEXT: retq
927 ; AVX512BW-LABEL: splatvar_funnnel_v32i8:
929 ; AVX512BW-NEXT: vpbroadcastb %xmm1, %ymm1
930 ; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm2 = [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]
931 ; AVX512BW-NEXT: vpand %ymm2, %ymm1, %ymm3
932 ; AVX512BW-NEXT: vpmovzxbw {{.*#+}} zmm3 = ymm3[0],zero,ymm3[1],zero,ymm3[2],zero,ymm3[3],zero,ymm3[4],zero,ymm3[5],zero,ymm3[6],zero,ymm3[7],zero,ymm3[8],zero,ymm3[9],zero,ymm3[10],zero,ymm3[11],zero,ymm3[12],zero,ymm3[13],zero,ymm3[14],zero,ymm3[15],zero,ymm3[16],zero,ymm3[17],zero,ymm3[18],zero,ymm3[19],zero,ymm3[20],zero,ymm3[21],zero,ymm3[22],zero,ymm3[23],zero,ymm3[24],zero,ymm3[25],zero,ymm3[26],zero,ymm3[27],zero,ymm3[28],zero,ymm3[29],zero,ymm3[30],zero,ymm3[31],zero
933 ; 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
934 ; AVX512BW-NEXT: vpsrlvw %zmm3, %zmm0, %zmm3
935 ; AVX512BW-NEXT: vpxor %xmm4, %xmm4, %xmm4
936 ; AVX512BW-NEXT: vpsubb %ymm1, %ymm4, %ymm1
937 ; AVX512BW-NEXT: vpand %ymm2, %ymm1, %ymm1
938 ; 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
939 ; AVX512BW-NEXT: vpsllvw %zmm1, %zmm0, %zmm0
940 ; AVX512BW-NEXT: vporq %zmm3, %zmm0, %zmm0
941 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0
942 ; AVX512BW-NEXT: retq
944 ; AVX512VLBW-LABEL: splatvar_funnnel_v32i8:
945 ; AVX512VLBW: # %bb.0:
946 ; AVX512VLBW-NEXT: vpbroadcastb %xmm1, %ymm1
947 ; AVX512VLBW-NEXT: vmovdqa {{.*#+}} ymm2 = [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]
948 ; AVX512VLBW-NEXT: vpand %ymm2, %ymm1, %ymm3
949 ; AVX512VLBW-NEXT: vpmovzxbw {{.*#+}} zmm3 = ymm3[0],zero,ymm3[1],zero,ymm3[2],zero,ymm3[3],zero,ymm3[4],zero,ymm3[5],zero,ymm3[6],zero,ymm3[7],zero,ymm3[8],zero,ymm3[9],zero,ymm3[10],zero,ymm3[11],zero,ymm3[12],zero,ymm3[13],zero,ymm3[14],zero,ymm3[15],zero,ymm3[16],zero,ymm3[17],zero,ymm3[18],zero,ymm3[19],zero,ymm3[20],zero,ymm3[21],zero,ymm3[22],zero,ymm3[23],zero,ymm3[24],zero,ymm3[25],zero,ymm3[26],zero,ymm3[27],zero,ymm3[28],zero,ymm3[29],zero,ymm3[30],zero,ymm3[31],zero
950 ; 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
951 ; AVX512VLBW-NEXT: vpsrlvw %zmm3, %zmm0, %zmm3
952 ; AVX512VLBW-NEXT: vpxor %xmm4, %xmm4, %xmm4
953 ; AVX512VLBW-NEXT: vpsubb %ymm1, %ymm4, %ymm1
954 ; AVX512VLBW-NEXT: vpand %ymm2, %ymm1, %ymm1
955 ; 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
956 ; AVX512VLBW-NEXT: vpsllvw %zmm1, %zmm0, %zmm0
957 ; AVX512VLBW-NEXT: vporq %zmm3, %zmm0, %zmm0
958 ; AVX512VLBW-NEXT: vpmovwb %zmm0, %ymm0
959 ; AVX512VLBW-NEXT: retq
961 ; XOPAVX1-LABEL: splatvar_funnnel_v32i8:
963 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
964 ; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1
965 ; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm1
966 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
967 ; XOPAVX1-NEXT: vprotb %xmm1, %xmm2, %xmm2
968 ; XOPAVX1-NEXT: vprotb %xmm1, %xmm0, %xmm0
969 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
972 ; XOPAVX2-LABEL: splatvar_funnnel_v32i8:
974 ; XOPAVX2-NEXT: vpbroadcastb %xmm1, %ymm1
975 ; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
976 ; XOPAVX2-NEXT: vpsubb %ymm1, %ymm2, %ymm1
977 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
978 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
979 ; XOPAVX2-NEXT: vprotb %xmm2, %xmm3, %xmm2
980 ; XOPAVX2-NEXT: vprotb %xmm1, %xmm0, %xmm0
981 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
983 %splat = shufflevector <32 x i8> %amt, <32 x i8> undef, <32 x i32> zeroinitializer
984 %res = call <32 x i8> @llvm.fshr.v32i8(<32 x i8> %x, <32 x i8> %x, <32 x i8> %splat)
992 define <4 x i64> @constant_funnnel_v4i64(<4 x i64> %x) nounwind {
993 ; AVX1-LABEL: constant_funnnel_v4i64:
995 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
996 ; AVX1-NEXT: vpsrlq $60, %xmm1, %xmm2
997 ; AVX1-NEXT: vpsrlq $50, %xmm1, %xmm3
998 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
999 ; AVX1-NEXT: vpsrlq $14, %xmm0, %xmm3
1000 ; AVX1-NEXT: vpsrlq $4, %xmm0, %xmm4
1001 ; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
1002 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
1003 ; AVX1-NEXT: vpsllq $4, %xmm1, %xmm3
1004 ; AVX1-NEXT: vpsllq $14, %xmm1, %xmm1
1005 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm3[4,5,6,7]
1006 ; AVX1-NEXT: vpsllq $50, %xmm0, %xmm3
1007 ; AVX1-NEXT: vpsllq $60, %xmm0, %xmm0
1008 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]
1009 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1010 ; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
1013 ; AVX2-LABEL: constant_funnnel_v4i64:
1015 ; AVX2-NEXT: vpsrlvq {{.*}}(%rip), %ymm0, %ymm1
1016 ; AVX2-NEXT: vpsllvq {{.*}}(%rip), %ymm0, %ymm0
1017 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1020 ; AVX512F-LABEL: constant_funnnel_v4i64:
1022 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1023 ; AVX512F-NEXT: vmovdqa {{.*#+}} ymm1 = [4,14,50,60]
1024 ; AVX512F-NEXT: vprorvq %zmm1, %zmm0, %zmm0
1025 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
1026 ; AVX512F-NEXT: retq
1028 ; AVX512VL-LABEL: constant_funnnel_v4i64:
1029 ; AVX512VL: # %bb.0:
1030 ; AVX512VL-NEXT: vprorvq {{.*}}(%rip), %ymm0, %ymm0
1031 ; AVX512VL-NEXT: retq
1033 ; AVX512BW-LABEL: constant_funnnel_v4i64:
1034 ; AVX512BW: # %bb.0:
1035 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1036 ; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm1 = [4,14,50,60]
1037 ; AVX512BW-NEXT: vprorvq %zmm1, %zmm0, %zmm0
1038 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
1039 ; AVX512BW-NEXT: retq
1041 ; AVX512VLBW-LABEL: constant_funnnel_v4i64:
1042 ; AVX512VLBW: # %bb.0:
1043 ; AVX512VLBW-NEXT: vprorvq {{.*}}(%rip), %ymm0, %ymm0
1044 ; AVX512VLBW-NEXT: retq
1046 ; XOPAVX1-LABEL: constant_funnnel_v4i64:
1048 ; XOPAVX1-NEXT: vprotq {{.*}}(%rip), %xmm0, %xmm1
1049 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1050 ; XOPAVX1-NEXT: vprotq {{.*}}(%rip), %xmm0, %xmm0
1051 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1052 ; XOPAVX1-NEXT: retq
1054 ; XOPAVX2-LABEL: constant_funnnel_v4i64:
1056 ; XOPAVX2-NEXT: vprotq {{.*}}(%rip), %xmm0, %xmm1
1057 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
1058 ; XOPAVX2-NEXT: vprotq {{.*}}(%rip), %xmm0, %xmm0
1059 ; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
1060 ; XOPAVX2-NEXT: retq
1061 %res = call <4 x i64> @llvm.fshr.v4i64(<4 x i64> %x, <4 x i64> %x, <4 x i64> <i64 4, i64 14, i64 50, i64 60>)
1065 define <8 x i32> @constant_funnnel_v8i32(<8 x i32> %x) nounwind {
1066 ; AVX1-LABEL: constant_funnnel_v8i32:
1068 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [16777216,8388608,4194304,2097152]
1069 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
1070 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1071 ; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
1072 ; AVX1-NEXT: vpmuludq %xmm2, %xmm4, %xmm2
1073 ; AVX1-NEXT: vpmuludq %xmm1, %xmm3, %xmm1
1074 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
1075 ; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
1076 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[0,0,2,2]
1077 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
1078 ; AVX1-NEXT: vpor %xmm3, %xmm1, %xmm1
1079 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [268435456,134217728,67108864,33554432]
1080 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
1081 ; AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
1082 ; AVX1-NEXT: vpmuludq %xmm3, %xmm4, %xmm3
1083 ; AVX1-NEXT: vpmuludq %xmm2, %xmm0, %xmm0
1084 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
1085 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
1086 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm3[0,0,2,2]
1087 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7]
1088 ; AVX1-NEXT: vpor %xmm2, %xmm0, %xmm0
1089 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1092 ; AVX2-LABEL: constant_funnnel_v8i32:
1094 ; AVX2-NEXT: vpsrlvd {{.*}}(%rip), %ymm0, %ymm1
1095 ; AVX2-NEXT: vpsllvd {{.*}}(%rip), %ymm0, %ymm0
1096 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1099 ; AVX512F-LABEL: constant_funnnel_v8i32:
1101 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1102 ; AVX512F-NEXT: vmovdqa {{.*#+}} ymm1 = [4,5,6,7,8,9,10,11]
1103 ; AVX512F-NEXT: vprorvd %zmm1, %zmm0, %zmm0
1104 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
1105 ; AVX512F-NEXT: retq
1107 ; AVX512VL-LABEL: constant_funnnel_v8i32:
1108 ; AVX512VL: # %bb.0:
1109 ; AVX512VL-NEXT: vprorvd {{.*}}(%rip), %ymm0, %ymm0
1110 ; AVX512VL-NEXT: retq
1112 ; AVX512BW-LABEL: constant_funnnel_v8i32:
1113 ; AVX512BW: # %bb.0:
1114 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1115 ; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm1 = [4,5,6,7,8,9,10,11]
1116 ; AVX512BW-NEXT: vprorvd %zmm1, %zmm0, %zmm0
1117 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
1118 ; AVX512BW-NEXT: retq
1120 ; AVX512VLBW-LABEL: constant_funnnel_v8i32:
1121 ; AVX512VLBW: # %bb.0:
1122 ; AVX512VLBW-NEXT: vprorvd {{.*}}(%rip), %ymm0, %ymm0
1123 ; AVX512VLBW-NEXT: retq
1125 ; XOPAVX1-LABEL: constant_funnnel_v8i32:
1127 ; XOPAVX1-NEXT: vprotd {{.*}}(%rip), %xmm0, %xmm1
1128 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1129 ; XOPAVX1-NEXT: vprotd {{.*}}(%rip), %xmm0, %xmm0
1130 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1131 ; XOPAVX1-NEXT: retq
1133 ; XOPAVX2-LABEL: constant_funnnel_v8i32:
1135 ; XOPAVX2-NEXT: vprotd {{.*}}(%rip), %xmm0, %xmm1
1136 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
1137 ; XOPAVX2-NEXT: vprotd {{.*}}(%rip), %xmm0, %xmm0
1138 ; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
1139 ; XOPAVX2-NEXT: retq
1140 %res = call <8 x i32> @llvm.fshr.v8i32(<8 x i32> %x, <8 x i32> %x, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11>)
1144 define <16 x i16> @constant_funnnel_v16i16(<16 x i16> %x) nounwind {
1145 ; AVX1-LABEL: constant_funnnel_v16i16:
1147 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1148 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [256,128,64,32,16,8,4,2]
1149 ; AVX1-NEXT: vpmulhuw %xmm2, %xmm1, %xmm3
1150 ; AVX1-NEXT: vpmullw %xmm2, %xmm1, %xmm1
1151 ; AVX1-NEXT: vpor %xmm3, %xmm1, %xmm1
1152 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [1,32768,16384,8192,4096,2048,1024,512]
1153 ; AVX1-NEXT: vpmulhuw %xmm2, %xmm0, %xmm3
1154 ; AVX1-NEXT: vpmullw %xmm2, %xmm0, %xmm0
1155 ; AVX1-NEXT: vpor %xmm3, %xmm0, %xmm0
1156 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1159 ; AVX2-LABEL: constant_funnnel_v16i16:
1161 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [1,32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2]
1162 ; AVX2-NEXT: vpmulhuw %ymm1, %ymm0, %ymm2
1163 ; AVX2-NEXT: vpmullw %ymm1, %ymm0, %ymm0
1164 ; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
1167 ; AVX512F-LABEL: constant_funnnel_v16i16:
1169 ; AVX512F-NEXT: vmovdqa {{.*#+}} ymm1 = [1,32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2]
1170 ; AVX512F-NEXT: vpmulhuw %ymm1, %ymm0, %ymm2
1171 ; AVX512F-NEXT: vpmullw %ymm1, %ymm0, %ymm0
1172 ; AVX512F-NEXT: vpor %ymm2, %ymm0, %ymm0
1173 ; AVX512F-NEXT: retq
1175 ; AVX512VL-LABEL: constant_funnnel_v16i16:
1176 ; AVX512VL: # %bb.0:
1177 ; AVX512VL-NEXT: vmovdqa {{.*#+}} ymm1 = [1,32768,16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2]
1178 ; AVX512VL-NEXT: vpmulhuw %ymm1, %ymm0, %ymm2
1179 ; AVX512VL-NEXT: vpmullw %ymm1, %ymm0, %ymm0
1180 ; AVX512VL-NEXT: vpor %ymm2, %ymm0, %ymm0
1181 ; AVX512VL-NEXT: retq
1183 ; AVX512BW-LABEL: constant_funnnel_v16i16:
1184 ; AVX512BW: # %bb.0:
1185 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1186 ; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm1 = [16,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
1187 ; AVX512BW-NEXT: vpsrlvw %zmm1, %zmm0, %zmm1
1188 ; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm2 = [0,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1]
1189 ; AVX512BW-NEXT: vpsllvw %zmm2, %zmm0, %zmm0
1190 ; AVX512BW-NEXT: vpor %ymm1, %ymm0, %ymm0
1191 ; AVX512BW-NEXT: retq
1193 ; AVX512VLBW-LABEL: constant_funnnel_v16i16:
1194 ; AVX512VLBW: # %bb.0:
1195 ; AVX512VLBW-NEXT: vpsrlvw {{.*}}(%rip), %ymm0, %ymm1
1196 ; AVX512VLBW-NEXT: vpsllvw {{.*}}(%rip), %ymm0, %ymm0
1197 ; AVX512VLBW-NEXT: vpor %ymm1, %ymm0, %ymm0
1198 ; AVX512VLBW-NEXT: retq
1200 ; XOPAVX1-LABEL: constant_funnnel_v16i16:
1202 ; XOPAVX1-NEXT: vprotw {{.*}}(%rip), %xmm0, %xmm1
1203 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1204 ; XOPAVX1-NEXT: vprotw {{.*}}(%rip), %xmm0, %xmm0
1205 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1206 ; XOPAVX1-NEXT: retq
1208 ; XOPAVX2-LABEL: constant_funnnel_v16i16:
1210 ; XOPAVX2-NEXT: vprotw {{.*}}(%rip), %xmm0, %xmm1
1211 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
1212 ; XOPAVX2-NEXT: vprotw {{.*}}(%rip), %xmm0, %xmm0
1213 ; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
1214 ; XOPAVX2-NEXT: retq
1215 %res = call <16 x i16> @llvm.fshr.v16i16(<16 x i16> %x, <16 x i16> %x, <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>)
1219 define <32 x i8> @constant_funnnel_v32i8(<32 x i8> %x) nounwind {
1220 ; AVX1-LABEL: constant_funnnel_v32i8:
1222 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1223 ; AVX1-NEXT: vpxor %xmm8, %xmm8, %xmm8
1224 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm1[8],xmm8[8],xmm1[9],xmm8[9],xmm1[10],xmm8[10],xmm1[11],xmm8[11],xmm1[12],xmm8[12],xmm1[13],xmm8[13],xmm1[14],xmm8[14],xmm1[15],xmm8[15]
1225 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm9 = [256,2,4,8,16,32,64,128]
1226 ; AVX1-NEXT: vpmullw %xmm9, %xmm3, %xmm3
1227 ; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3
1228 ; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm5 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
1229 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [256,128,64,32,16,8,4,2]
1230 ; AVX1-NEXT: vpmullw %xmm6, %xmm5, %xmm7
1231 ; AVX1-NEXT: vpsrlw $8, %xmm7, %xmm7
1232 ; AVX1-NEXT: vpackuswb %xmm3, %xmm7, %xmm3
1233 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
1234 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [1,2,4,8,16,32,64,128]
1235 ; AVX1-NEXT: vpmullw %xmm7, %xmm1, %xmm1
1236 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
1237 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
1238 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [1,128,64,32,16,8,4,2]
1239 ; AVX1-NEXT: vpmullw %xmm4, %xmm5, %xmm5
1240 ; AVX1-NEXT: vpand %xmm2, %xmm5, %xmm5
1241 ; AVX1-NEXT: vpackuswb %xmm1, %xmm5, %xmm1
1242 ; AVX1-NEXT: vpor %xmm3, %xmm1, %xmm1
1243 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8],xmm8[8],xmm0[9],xmm8[9],xmm0[10],xmm8[10],xmm0[11],xmm8[11],xmm0[12],xmm8[12],xmm0[13],xmm8[13],xmm0[14],xmm8[14],xmm0[15],xmm8[15]
1244 ; AVX1-NEXT: vpmullw %xmm9, %xmm3, %xmm3
1245 ; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3
1246 ; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1247 ; AVX1-NEXT: vpmullw %xmm6, %xmm5, %xmm6
1248 ; AVX1-NEXT: vpsrlw $8, %xmm6, %xmm6
1249 ; AVX1-NEXT: vpackuswb %xmm3, %xmm6, %xmm3
1250 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1251 ; AVX1-NEXT: vpmullw %xmm7, %xmm0, %xmm0
1252 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
1253 ; AVX1-NEXT: vpmullw %xmm4, %xmm5, %xmm4
1254 ; AVX1-NEXT: vpand %xmm2, %xmm4, %xmm2
1255 ; AVX1-NEXT: vpackuswb %xmm0, %xmm2, %xmm0
1256 ; AVX1-NEXT: vpor %xmm3, %xmm0, %xmm0
1257 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1260 ; AVX2-LABEL: constant_funnnel_v32i8:
1262 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm1
1263 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
1264 ; AVX2-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [57344,41152,24704,8256,8192,24640,41088,57536,57344,41152,24704,8256,8192,24640,41088,57536]
1265 ; AVX2-NEXT: # ymm2 = mem[0,1,0,1]
1266 ; AVX2-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm1
1267 ; AVX2-NEXT: vpsllw $2, %ymm1, %ymm3
1268 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm3, %ymm3
1269 ; AVX2-NEXT: vpaddb %ymm2, %ymm2, %ymm2
1270 ; AVX2-NEXT: vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
1271 ; AVX2-NEXT: vpaddb %ymm1, %ymm1, %ymm3
1272 ; AVX2-NEXT: vpaddb %ymm2, %ymm2, %ymm2
1273 ; AVX2-NEXT: vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
1274 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
1275 ; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8],ymm2[8],ymm0[9],ymm2[9],ymm0[10],ymm2[10],ymm0[11],ymm2[11],ymm0[12],ymm2[12],ymm0[13],ymm2[13],ymm0[14],ymm2[14],ymm0[15],ymm2[15],ymm0[24],ymm2[24],ymm0[25],ymm2[25],ymm0[26],ymm2[26],ymm0[27],ymm2[27],ymm0[28],ymm2[28],ymm0[29],ymm2[29],ymm0[30],ymm2[30],ymm0[31],ymm2[31]
1276 ; AVX2-NEXT: vpmullw {{.*}}(%rip), %ymm3, %ymm3
1277 ; AVX2-NEXT: vpsrlw $8, %ymm3, %ymm3
1278 ; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0],ymm2[0],ymm0[1],ymm2[1],ymm0[2],ymm2[2],ymm0[3],ymm2[3],ymm0[4],ymm2[4],ymm0[5],ymm2[5],ymm0[6],ymm2[6],ymm0[7],ymm2[7],ymm0[16],ymm2[16],ymm0[17],ymm2[17],ymm0[18],ymm2[18],ymm0[19],ymm2[19],ymm0[20],ymm2[20],ymm0[21],ymm2[21],ymm0[22],ymm2[22],ymm0[23],ymm2[23]
1279 ; AVX2-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
1280 ; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0
1281 ; AVX2-NEXT: vpackuswb %ymm3, %ymm0, %ymm0
1282 ; AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0
1285 ; AVX512F-LABEL: constant_funnnel_v32i8:
1287 ; AVX512F-NEXT: vpsllw $4, %ymm0, %ymm1
1288 ; AVX512F-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
1289 ; AVX512F-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [57344,41152,24704,8256,8192,24640,41088,57536,57344,41152,24704,8256,8192,24640,41088,57536]
1290 ; AVX512F-NEXT: # ymm2 = mem[0,1,0,1]
1291 ; AVX512F-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm1
1292 ; AVX512F-NEXT: vpsllw $2, %ymm1, %ymm3
1293 ; AVX512F-NEXT: vpand {{.*}}(%rip), %ymm3, %ymm3
1294 ; AVX512F-NEXT: vpaddb %ymm2, %ymm2, %ymm2
1295 ; AVX512F-NEXT: vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
1296 ; AVX512F-NEXT: vpaddb %ymm1, %ymm1, %ymm3
1297 ; AVX512F-NEXT: vpaddb %ymm2, %ymm2, %ymm2
1298 ; AVX512F-NEXT: vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
1299 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2
1300 ; AVX512F-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8],ymm2[8],ymm0[9],ymm2[9],ymm0[10],ymm2[10],ymm0[11],ymm2[11],ymm0[12],ymm2[12],ymm0[13],ymm2[13],ymm0[14],ymm2[14],ymm0[15],ymm2[15],ymm0[24],ymm2[24],ymm0[25],ymm2[25],ymm0[26],ymm2[26],ymm0[27],ymm2[27],ymm0[28],ymm2[28],ymm0[29],ymm2[29],ymm0[30],ymm2[30],ymm0[31],ymm2[31]
1301 ; AVX512F-NEXT: vpmullw {{.*}}(%rip), %ymm3, %ymm3
1302 ; AVX512F-NEXT: vpsrlw $8, %ymm3, %ymm3
1303 ; AVX512F-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0],ymm2[0],ymm0[1],ymm2[1],ymm0[2],ymm2[2],ymm0[3],ymm2[3],ymm0[4],ymm2[4],ymm0[5],ymm2[5],ymm0[6],ymm2[6],ymm0[7],ymm2[7],ymm0[16],ymm2[16],ymm0[17],ymm2[17],ymm0[18],ymm2[18],ymm0[19],ymm2[19],ymm0[20],ymm2[20],ymm0[21],ymm2[21],ymm0[22],ymm2[22],ymm0[23],ymm2[23]
1304 ; AVX512F-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
1305 ; AVX512F-NEXT: vpsrlw $8, %ymm0, %ymm0
1306 ; AVX512F-NEXT: vpackuswb %ymm3, %ymm0, %ymm0
1307 ; AVX512F-NEXT: vpor %ymm0, %ymm1, %ymm0
1308 ; AVX512F-NEXT: retq
1310 ; AVX512VL-LABEL: constant_funnnel_v32i8:
1311 ; AVX512VL: # %bb.0:
1312 ; AVX512VL-NEXT: vpsllw $4, %ymm0, %ymm1
1313 ; AVX512VL-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
1314 ; AVX512VL-NEXT: vbroadcasti128 {{.*#+}} ymm2 = [57344,41152,24704,8256,8192,24640,41088,57536,57344,41152,24704,8256,8192,24640,41088,57536]
1315 ; AVX512VL-NEXT: # ymm2 = mem[0,1,0,1]
1316 ; AVX512VL-NEXT: vpblendvb %ymm2, %ymm1, %ymm0, %ymm1
1317 ; AVX512VL-NEXT: vpsllw $2, %ymm1, %ymm3
1318 ; AVX512VL-NEXT: vpand {{.*}}(%rip), %ymm3, %ymm3
1319 ; AVX512VL-NEXT: vpaddb %ymm2, %ymm2, %ymm2
1320 ; AVX512VL-NEXT: vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
1321 ; AVX512VL-NEXT: vpaddb %ymm1, %ymm1, %ymm3
1322 ; AVX512VL-NEXT: vpaddb %ymm2, %ymm2, %ymm2
1323 ; AVX512VL-NEXT: vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
1324 ; 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]
1325 ; AVX512VL-NEXT: vpsrlw $8, %ymm2, %ymm2
1326 ; AVX512VL-NEXT: vpmullw {{.*}}(%rip), %ymm2, %ymm2
1327 ; AVX512VL-NEXT: vpsrlw $8, %ymm2, %ymm2
1328 ; 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]
1329 ; AVX512VL-NEXT: vpsrlw $8, %ymm0, %ymm0
1330 ; AVX512VL-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
1331 ; AVX512VL-NEXT: vpsrlw $8, %ymm0, %ymm0
1332 ; AVX512VL-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
1333 ; AVX512VL-NEXT: vpor %ymm0, %ymm1, %ymm0
1334 ; AVX512VL-NEXT: retq
1336 ; AVX512BW-LABEL: constant_funnnel_v32i8:
1337 ; AVX512BW: # %bb.0:
1338 ; 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
1339 ; AVX512BW-NEXT: vpsrlvw {{.*}}(%rip), %zmm0, %zmm1
1340 ; AVX512BW-NEXT: vpsllvw {{.*}}(%rip), %zmm0, %zmm0
1341 ; AVX512BW-NEXT: vporq %zmm1, %zmm0, %zmm0
1342 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0
1343 ; AVX512BW-NEXT: retq
1345 ; AVX512VLBW-LABEL: constant_funnnel_v32i8:
1346 ; AVX512VLBW: # %bb.0:
1347 ; 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
1348 ; AVX512VLBW-NEXT: vpsrlvw {{.*}}(%rip), %zmm0, %zmm1
1349 ; AVX512VLBW-NEXT: vpsllvw {{.*}}(%rip), %zmm0, %zmm0
1350 ; AVX512VLBW-NEXT: vporq %zmm1, %zmm0, %zmm0
1351 ; AVX512VLBW-NEXT: vpmovwb %zmm0, %ymm0
1352 ; AVX512VLBW-NEXT: retq
1354 ; XOPAVX1-LABEL: constant_funnnel_v32i8:
1356 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1357 ; XOPAVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [0,255,254,253,252,251,250,249,248,249,250,251,252,253,254,255]
1358 ; XOPAVX1-NEXT: vprotb %xmm2, %xmm1, %xmm1
1359 ; XOPAVX1-NEXT: vprotb %xmm2, %xmm0, %xmm0
1360 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1361 ; XOPAVX1-NEXT: retq
1363 ; XOPAVX2-LABEL: constant_funnnel_v32i8:
1365 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1366 ; XOPAVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [0,255,254,253,252,251,250,249,248,249,250,251,252,253,254,255]
1367 ; XOPAVX2-NEXT: vprotb %xmm2, %xmm1, %xmm1
1368 ; XOPAVX2-NEXT: vprotb %xmm2, %xmm0, %xmm0
1369 ; XOPAVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
1370 ; XOPAVX2-NEXT: retq
1371 %res = call <32 x i8> @llvm.fshr.v32i8(<32 x i8> %x, <32 x i8> %x, <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>)
1376 ; Uniform Constant Shifts
1379 define <4 x i64> @splatconstant_funnnel_v4i64(<4 x i64> %x) nounwind {
1380 ; AVX1-LABEL: splatconstant_funnnel_v4i64:
1382 ; AVX1-NEXT: vpsrlq $14, %xmm0, %xmm1
1383 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
1384 ; AVX1-NEXT: vpsrlq $14, %xmm2, %xmm3
1385 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
1386 ; AVX1-NEXT: vpsllq $50, %xmm0, %xmm0
1387 ; AVX1-NEXT: vpsllq $50, %xmm2, %xmm2
1388 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1389 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
1392 ; AVX2-LABEL: splatconstant_funnnel_v4i64:
1394 ; AVX2-NEXT: vpsrlq $14, %ymm0, %ymm1
1395 ; AVX2-NEXT: vpsllq $50, %ymm0, %ymm0
1396 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1399 ; AVX512F-LABEL: splatconstant_funnnel_v4i64:
1401 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1402 ; AVX512F-NEXT: vprorq $14, %zmm0, %zmm0
1403 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
1404 ; AVX512F-NEXT: retq
1406 ; AVX512VL-LABEL: splatconstant_funnnel_v4i64:
1407 ; AVX512VL: # %bb.0:
1408 ; AVX512VL-NEXT: vprorq $14, %ymm0, %ymm0
1409 ; AVX512VL-NEXT: retq
1411 ; AVX512BW-LABEL: splatconstant_funnnel_v4i64:
1412 ; AVX512BW: # %bb.0:
1413 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1414 ; AVX512BW-NEXT: vprorq $14, %zmm0, %zmm0
1415 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
1416 ; AVX512BW-NEXT: retq
1418 ; AVX512VLBW-LABEL: splatconstant_funnnel_v4i64:
1419 ; AVX512VLBW: # %bb.0:
1420 ; AVX512VLBW-NEXT: vprorq $14, %ymm0, %ymm0
1421 ; AVX512VLBW-NEXT: retq
1423 ; XOPAVX1-LABEL: splatconstant_funnnel_v4i64:
1425 ; XOPAVX1-NEXT: vprotq $50, %xmm0, %xmm1
1426 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1427 ; XOPAVX1-NEXT: vprotq $50, %xmm0, %xmm0
1428 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1429 ; XOPAVX1-NEXT: retq
1431 ; XOPAVX2-LABEL: splatconstant_funnnel_v4i64:
1433 ; XOPAVX2-NEXT: vprotq $50, %xmm0, %xmm1
1434 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
1435 ; XOPAVX2-NEXT: vprotq $50, %xmm0, %xmm0
1436 ; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
1437 ; XOPAVX2-NEXT: retq
1438 %res = call <4 x i64> @llvm.fshr.v4i64(<4 x i64> %x, <4 x i64> %x, <4 x i64> <i64 14, i64 14, i64 14, i64 14>)
1442 define <8 x i32> @splatconstant_funnnel_v8i32(<8 x i32> %x) nounwind {
1443 ; AVX1-LABEL: splatconstant_funnnel_v8i32:
1445 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1446 ; AVX1-NEXT: vpsrld $4, %xmm1, %xmm2
1447 ; AVX1-NEXT: vpslld $28, %xmm1, %xmm1
1448 ; AVX1-NEXT: vpor %xmm2, %xmm1, %xmm1
1449 ; AVX1-NEXT: vpsrld $4, %xmm0, %xmm2
1450 ; AVX1-NEXT: vpslld $28, %xmm0, %xmm0
1451 ; AVX1-NEXT: vpor %xmm2, %xmm0, %xmm0
1452 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1455 ; AVX2-LABEL: splatconstant_funnnel_v8i32:
1457 ; AVX2-NEXT: vpsrld $4, %ymm0, %ymm1
1458 ; AVX2-NEXT: vpslld $28, %ymm0, %ymm0
1459 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1462 ; AVX512F-LABEL: splatconstant_funnnel_v8i32:
1464 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1465 ; AVX512F-NEXT: vprord $4, %zmm0, %zmm0
1466 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
1467 ; AVX512F-NEXT: retq
1469 ; AVX512VL-LABEL: splatconstant_funnnel_v8i32:
1470 ; AVX512VL: # %bb.0:
1471 ; AVX512VL-NEXT: vprord $4, %ymm0, %ymm0
1472 ; AVX512VL-NEXT: retq
1474 ; AVX512BW-LABEL: splatconstant_funnnel_v8i32:
1475 ; AVX512BW: # %bb.0:
1476 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1477 ; AVX512BW-NEXT: vprord $4, %zmm0, %zmm0
1478 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
1479 ; AVX512BW-NEXT: retq
1481 ; AVX512VLBW-LABEL: splatconstant_funnnel_v8i32:
1482 ; AVX512VLBW: # %bb.0:
1483 ; AVX512VLBW-NEXT: vprord $4, %ymm0, %ymm0
1484 ; AVX512VLBW-NEXT: retq
1486 ; XOPAVX1-LABEL: splatconstant_funnnel_v8i32:
1488 ; XOPAVX1-NEXT: vprotd $28, %xmm0, %xmm1
1489 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1490 ; XOPAVX1-NEXT: vprotd $28, %xmm0, %xmm0
1491 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1492 ; XOPAVX1-NEXT: retq
1494 ; XOPAVX2-LABEL: splatconstant_funnnel_v8i32:
1496 ; XOPAVX2-NEXT: vprotd $28, %xmm0, %xmm1
1497 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
1498 ; XOPAVX2-NEXT: vprotd $28, %xmm0, %xmm0
1499 ; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
1500 ; XOPAVX2-NEXT: retq
1501 %res = call <8 x i32> @llvm.fshr.v8i32(<8 x i32> %x, <8 x i32> %x, <8 x i32> <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>)
1505 define <16 x i16> @splatconstant_funnnel_v16i16(<16 x i16> %x) nounwind {
1506 ; AVX1-LABEL: splatconstant_funnnel_v16i16:
1508 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1509 ; AVX1-NEXT: vpsrlw $7, %xmm1, %xmm2
1510 ; AVX1-NEXT: vpsllw $9, %xmm1, %xmm1
1511 ; AVX1-NEXT: vpor %xmm2, %xmm1, %xmm1
1512 ; AVX1-NEXT: vpsrlw $7, %xmm0, %xmm2
1513 ; AVX1-NEXT: vpsllw $9, %xmm0, %xmm0
1514 ; AVX1-NEXT: vpor %xmm2, %xmm0, %xmm0
1515 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1518 ; AVX2-LABEL: splatconstant_funnnel_v16i16:
1520 ; AVX2-NEXT: vpsrlw $7, %ymm0, %ymm1
1521 ; AVX2-NEXT: vpsllw $9, %ymm0, %ymm0
1522 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1525 ; AVX512-LABEL: splatconstant_funnnel_v16i16:
1527 ; AVX512-NEXT: vpsrlw $7, %ymm0, %ymm1
1528 ; AVX512-NEXT: vpsllw $9, %ymm0, %ymm0
1529 ; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0
1532 ; XOPAVX1-LABEL: splatconstant_funnnel_v16i16:
1534 ; XOPAVX1-NEXT: vprotw $9, %xmm0, %xmm1
1535 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1536 ; XOPAVX1-NEXT: vprotw $9, %xmm0, %xmm0
1537 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1538 ; XOPAVX1-NEXT: retq
1540 ; XOPAVX2-LABEL: splatconstant_funnnel_v16i16:
1542 ; XOPAVX2-NEXT: vprotw $9, %xmm0, %xmm1
1543 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
1544 ; XOPAVX2-NEXT: vprotw $9, %xmm0, %xmm0
1545 ; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
1546 ; XOPAVX2-NEXT: retq
1547 %res = call <16 x i16> @llvm.fshr.v16i16(<16 x i16> %x, <16 x i16> %x, <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>)
1551 define <32 x i8> @splatconstant_funnnel_v32i8(<32 x i8> %x) nounwind {
1552 ; AVX1-LABEL: splatconstant_funnnel_v32i8:
1554 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1555 ; AVX1-NEXT: vpsrlw $4, %xmm1, %xmm2
1556 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
1557 ; AVX1-NEXT: vpandn %xmm2, %xmm3, %xmm2
1558 ; AVX1-NEXT: vpsllw $4, %xmm1, %xmm1
1559 ; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1
1560 ; AVX1-NEXT: vpor %xmm2, %xmm1, %xmm1
1561 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm2
1562 ; AVX1-NEXT: vpandn %xmm2, %xmm3, %xmm2
1563 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm0
1564 ; AVX1-NEXT: vpand %xmm3, %xmm0, %xmm0
1565 ; AVX1-NEXT: vpor %xmm2, %xmm0, %xmm0
1566 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1569 ; AVX2-LABEL: splatconstant_funnnel_v32i8:
1571 ; AVX2-NEXT: vpsrlw $4, %ymm0, %ymm1
1572 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
1573 ; AVX2-NEXT: vpsllw $4, %ymm0, %ymm0
1574 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1575 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1578 ; AVX512-LABEL: splatconstant_funnnel_v32i8:
1580 ; AVX512-NEXT: vpsrlw $4, %ymm0, %ymm1
1581 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
1582 ; AVX512-NEXT: vpsllw $4, %ymm0, %ymm0
1583 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1584 ; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0
1587 ; XOPAVX1-LABEL: splatconstant_funnnel_v32i8:
1589 ; XOPAVX1-NEXT: vprotb $4, %xmm0, %xmm1
1590 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1591 ; XOPAVX1-NEXT: vprotb $4, %xmm0, %xmm0
1592 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1593 ; XOPAVX1-NEXT: retq
1595 ; XOPAVX2-LABEL: splatconstant_funnnel_v32i8:
1597 ; XOPAVX2-NEXT: vprotb $4, %xmm0, %xmm1
1598 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
1599 ; XOPAVX2-NEXT: vprotb $4, %xmm0, %xmm0
1600 ; XOPAVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
1601 ; XOPAVX2-NEXT: retq
1602 %res = call <32 x i8> @llvm.fshr.v32i8(<32 x i8> %x, <32 x i8> %x, <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>)