Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / X86 / vector-fshl-rot-256.ll
blob64e5efa4b116506f8d1230b09b91f3ac4c453d40
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX512,AVX512F
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VL
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512BW
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VLBW
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefixes=XOP,XOPAVX1
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefixes=XOP,XOPAVX2
11 declare <4 x i64> @llvm.fshl.v4i64(<4 x i64>, <4 x i64>, <4 x i64>)
12 declare <8 x i32> @llvm.fshl.v8i32(<8 x i32>, <8 x i32>, <8 x i32>)
13 declare <16 x i16> @llvm.fshl.v16i16(<16 x i16>, <16 x i16>, <16 x i16>)
14 declare <32 x i8> @llvm.fshl.v32i8(<32 x i8>, <32 x i8>, <32 x i8>)
17 ; Variable Shifts
20 define <4 x i64> @var_funnnel_v4i64(<4 x i64> %x, <4 x i64> %amt) nounwind {
21 ; AVX1-LABEL: var_funnnel_v4i64:
22 ; AVX1:       # %bb.0:
23 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
24 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm1, %ymm3
25 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
26 ; AVX1-NEXT:    vpsllq %xmm4, %xmm2, %xmm5
27 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[2,3,0,1]
28 ; AVX1-NEXT:    vpsllq %xmm4, %xmm2, %xmm4
29 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7]
30 ; AVX1-NEXT:    vpsllq %xmm3, %xmm0, %xmm5
31 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[2,3,0,1]
32 ; AVX1-NEXT:    vpsllq %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:    vpsrlq %xmm4, %xmm2, %xmm7
41 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[2,3,0,1]
42 ; AVX1-NEXT:    vpsrlq %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:    vpsrlq %xmm1, %xmm0, %xmm4
47 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
48 ; AVX1-NEXT:    vpsrlq %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 %ymm0, %ymm3, %ymm0
52 ; AVX1-NEXT:    retq
54 ; AVX2-LABEL: var_funnnel_v4i64:
55 ; AVX2:       # %bb.0:
56 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [63,63,63,63]
57 ; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm3
58 ; AVX2-NEXT:    vpsllvq %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:    vpsrlvq %ymm1, %ymm0, %ymm0
63 ; AVX2-NEXT:    vpor %ymm0, %ymm3, %ymm0
64 ; AVX2-NEXT:    retq
66 ; AVX512F-LABEL: var_funnnel_v4i64:
67 ; AVX512F:       # %bb.0:
68 ; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
69 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
70 ; AVX512F-NEXT:    vprolvq %zmm1, %zmm0, %zmm0
71 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
72 ; AVX512F-NEXT:    retq
74 ; AVX512VL-LABEL: var_funnnel_v4i64:
75 ; AVX512VL:       # %bb.0:
76 ; AVX512VL-NEXT:    vprolvq %ymm1, %ymm0, %ymm0
77 ; AVX512VL-NEXT:    retq
79 ; AVX512BW-LABEL: var_funnnel_v4i64:
80 ; AVX512BW:       # %bb.0:
81 ; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
82 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
83 ; AVX512BW-NEXT:    vprolvq %zmm1, %zmm0, %zmm0
84 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
85 ; AVX512BW-NEXT:    retq
87 ; AVX512VLBW-LABEL: var_funnnel_v4i64:
88 ; AVX512VLBW:       # %bb.0:
89 ; AVX512VLBW-NEXT:    vprolvq %ymm1, %ymm0, %ymm0
90 ; AVX512VLBW-NEXT:    retq
92 ; XOPAVX1-LABEL: var_funnnel_v4i64:
93 ; XOPAVX1:       # %bb.0:
94 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
95 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
96 ; XOPAVX1-NEXT:    vprotq %xmm2, %xmm3, %xmm2
97 ; XOPAVX1-NEXT:    vprotq %xmm1, %xmm0, %xmm0
98 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
99 ; XOPAVX1-NEXT:    retq
101 ; XOPAVX2-LABEL: var_funnnel_v4i64:
102 ; XOPAVX2:       # %bb.0:
103 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
104 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
105 ; XOPAVX2-NEXT:    vprotq %xmm2, %xmm3, %xmm2
106 ; XOPAVX2-NEXT:    vprotq %xmm1, %xmm0, %xmm0
107 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
108 ; XOPAVX2-NEXT:    retq
109   %res = call <4 x i64> @llvm.fshl.v4i64(<4 x i64> %x, <4 x i64> %x, <4 x i64> %amt)
110   ret <4 x i64> %res
113 define <8 x i32> @var_funnnel_v8i32(<8 x i32> %x, <8 x i32> %amt) nounwind {
114 ; AVX1-LABEL: var_funnnel_v8i32:
115 ; AVX1:       # %bb.0:
116 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
117 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [31,31,31,31]
118 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
119 ; AVX1-NEXT:    vpslld $23, %xmm2, %xmm2
120 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [1065353216,1065353216,1065353216,1065353216]
121 ; AVX1-NEXT:    vpaddd %xmm4, %xmm2, %xmm2
122 ; AVX1-NEXT:    vcvttps2dq %xmm2, %xmm2
123 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm2[1,1,3,3]
124 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
125 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
126 ; AVX1-NEXT:    vpmuludq %xmm5, %xmm7, %xmm5
127 ; AVX1-NEXT:    vpmuludq %xmm2, %xmm6, %xmm2
128 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm2[1,1,3,3]
129 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm6 = xmm6[0,1],xmm5[2,3],xmm6[4,5],xmm5[6,7]
130 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm5[0,0,2,2]
131 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm5[2,3],xmm2[4,5],xmm5[6,7]
132 ; AVX1-NEXT:    vpor %xmm6, %xmm2, %xmm2
133 ; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
134 ; AVX1-NEXT:    vpslld $23, %xmm1, %xmm1
135 ; AVX1-NEXT:    vpaddd %xmm4, %xmm1, %xmm1
136 ; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1
137 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
138 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
139 ; AVX1-NEXT:    vpmuludq %xmm3, %xmm4, %xmm3
140 ; AVX1-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
141 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
142 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]
143 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[0,0,2,2]
144 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7]
145 ; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
146 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
147 ; AVX1-NEXT:    retq
149 ; AVX2-LABEL: var_funnnel_v8i32:
150 ; AVX2:       # %bb.0:
151 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [31,31,31,31,31,31,31,31]
152 ; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm1
153 ; AVX2-NEXT:    vpsllvd %ymm1, %ymm0, %ymm2
154 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [32,32,32,32,32,32,32,32]
155 ; AVX2-NEXT:    vpsubd %ymm1, %ymm3, %ymm1
156 ; AVX2-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
157 ; AVX2-NEXT:    vpor %ymm0, %ymm2, %ymm0
158 ; AVX2-NEXT:    retq
160 ; AVX512F-LABEL: var_funnnel_v8i32:
161 ; AVX512F:       # %bb.0:
162 ; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
163 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
164 ; AVX512F-NEXT:    vprolvd %zmm1, %zmm0, %zmm0
165 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
166 ; AVX512F-NEXT:    retq
168 ; AVX512VL-LABEL: var_funnnel_v8i32:
169 ; AVX512VL:       # %bb.0:
170 ; AVX512VL-NEXT:    vprolvd %ymm1, %ymm0, %ymm0
171 ; AVX512VL-NEXT:    retq
173 ; AVX512BW-LABEL: var_funnnel_v8i32:
174 ; AVX512BW:       # %bb.0:
175 ; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
176 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
177 ; AVX512BW-NEXT:    vprolvd %zmm1, %zmm0, %zmm0
178 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
179 ; AVX512BW-NEXT:    retq
181 ; AVX512VLBW-LABEL: var_funnnel_v8i32:
182 ; AVX512VLBW:       # %bb.0:
183 ; AVX512VLBW-NEXT:    vprolvd %ymm1, %ymm0, %ymm0
184 ; AVX512VLBW-NEXT:    retq
186 ; XOPAVX1-LABEL: var_funnnel_v8i32:
187 ; XOPAVX1:       # %bb.0:
188 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
189 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
190 ; XOPAVX1-NEXT:    vprotd %xmm2, %xmm3, %xmm2
191 ; XOPAVX1-NEXT:    vprotd %xmm1, %xmm0, %xmm0
192 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
193 ; XOPAVX1-NEXT:    retq
195 ; XOPAVX2-LABEL: var_funnnel_v8i32:
196 ; XOPAVX2:       # %bb.0:
197 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
198 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
199 ; XOPAVX2-NEXT:    vprotd %xmm2, %xmm3, %xmm2
200 ; XOPAVX2-NEXT:    vprotd %xmm1, %xmm0, %xmm0
201 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
202 ; XOPAVX2-NEXT:    retq
203   %res = call <8 x i32> @llvm.fshl.v8i32(<8 x i32> %x, <8 x i32> %x, <8 x i32> %amt)
204   ret <8 x i32> %res
207 define <16 x i16> @var_funnnel_v16i16(<16 x i16> %x, <16 x i16> %amt) nounwind {
208 ; AVX1-LABEL: var_funnnel_v16i16:
209 ; AVX1:       # %bb.0:
210 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
211 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15]
212 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
213 ; AVX1-NEXT:    vpxor %xmm4, %xmm4, %xmm4
214 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm5 = xmm2[4],xmm4[4],xmm2[5],xmm4[5],xmm2[6],xmm4[6],xmm2[7],xmm4[7]
215 ; AVX1-NEXT:    vpslld $23, %xmm5, %xmm5
216 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [1065353216,1065353216,1065353216,1065353216]
217 ; AVX1-NEXT:    vpaddd %xmm6, %xmm5, %xmm5
218 ; AVX1-NEXT:    vcvttps2dq %xmm5, %xmm5
219 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero
220 ; AVX1-NEXT:    vpslld $23, %xmm2, %xmm2
221 ; AVX1-NEXT:    vpaddd %xmm6, %xmm2, %xmm2
222 ; AVX1-NEXT:    vcvttps2dq %xmm2, %xmm2
223 ; AVX1-NEXT:    vpackusdw %xmm5, %xmm2, %xmm2
224 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
225 ; AVX1-NEXT:    vpmulhuw %xmm2, %xmm5, %xmm7
226 ; AVX1-NEXT:    vpmullw %xmm2, %xmm5, %xmm2
227 ; AVX1-NEXT:    vpor %xmm7, %xmm2, %xmm2
228 ; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
229 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm3 = xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7]
230 ; AVX1-NEXT:    vpslld $23, %xmm3, %xmm3
231 ; AVX1-NEXT:    vpaddd %xmm6, %xmm3, %xmm3
232 ; AVX1-NEXT:    vcvttps2dq %xmm3, %xmm3
233 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
234 ; AVX1-NEXT:    vpslld $23, %xmm1, %xmm1
235 ; AVX1-NEXT:    vpaddd %xmm6, %xmm1, %xmm1
236 ; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1
237 ; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
238 ; AVX1-NEXT:    vpmulhuw %xmm1, %xmm0, %xmm3
239 ; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
240 ; AVX1-NEXT:    vpor %xmm3, %xmm0, %xmm0
241 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
242 ; AVX1-NEXT:    retq
244 ; AVX2-LABEL: var_funnnel_v16i16:
245 ; AVX2:       # %bb.0:
246 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
247 ; 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]
248 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
249 ; 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]
250 ; AVX2-NEXT:    vpsllvd %ymm4, %ymm3, %ymm4
251 ; AVX2-NEXT:    vpsrld $16, %ymm4, %ymm4
252 ; 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]
253 ; 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]
254 ; AVX2-NEXT:    vpsllvd %ymm5, %ymm0, %ymm5
255 ; AVX2-NEXT:    vpsrld $16, %ymm5, %ymm5
256 ; AVX2-NEXT:    vpackusdw %ymm4, %ymm5, %ymm4
257 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm5 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
258 ; AVX2-NEXT:    vpsubw %ymm1, %ymm5, %ymm1
259 ; 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]
260 ; AVX2-NEXT:    vpsrlvd %ymm5, %ymm3, %ymm3
261 ; AVX2-NEXT:    vpsrld $16, %ymm3, %ymm3
262 ; 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]
263 ; AVX2-NEXT:    vpsrlvd %ymm1, %ymm0, %ymm0
264 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
265 ; AVX2-NEXT:    vpackusdw %ymm3, %ymm0, %ymm0
266 ; AVX2-NEXT:    vpor %ymm0, %ymm4, %ymm0
267 ; AVX2-NEXT:    retq
269 ; AVX512F-LABEL: var_funnnel_v16i16:
270 ; AVX512F:       # %bb.0:
271 ; 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
272 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
273 ; 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
274 ; AVX512F-NEXT:    vpsllvd %zmm2, %zmm0, %zmm2
275 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
276 ; AVX512F-NEXT:    vpsubw %ymm1, %ymm3, %ymm1
277 ; 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
278 ; AVX512F-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0
279 ; AVX512F-NEXT:    vpord %zmm0, %zmm2, %zmm0
280 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
281 ; AVX512F-NEXT:    retq
283 ; AVX512VL-LABEL: var_funnnel_v16i16:
284 ; AVX512VL:       # %bb.0:
285 ; 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
286 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
287 ; 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
288 ; AVX512VL-NEXT:    vpsllvd %zmm2, %zmm0, %zmm2
289 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
290 ; AVX512VL-NEXT:    vpsubw %ymm1, %ymm3, %ymm1
291 ; 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
292 ; AVX512VL-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0
293 ; AVX512VL-NEXT:    vpord %zmm0, %zmm2, %zmm0
294 ; AVX512VL-NEXT:    vpmovdw %zmm0, %ymm0
295 ; AVX512VL-NEXT:    retq
297 ; AVX512BW-LABEL: var_funnnel_v16i16:
298 ; AVX512BW:       # %bb.0:
299 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
300 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
301 ; AVX512BW-NEXT:    vpsllvw %zmm1, %zmm0, %zmm2
302 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
303 ; AVX512BW-NEXT:    vpsubw %ymm1, %ymm3, %ymm1
304 ; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
305 ; AVX512BW-NEXT:    vpor %ymm0, %ymm2, %ymm0
306 ; AVX512BW-NEXT:    retq
308 ; AVX512VLBW-LABEL: var_funnnel_v16i16:
309 ; AVX512VLBW:       # %bb.0:
310 ; AVX512VLBW-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
311 ; AVX512VLBW-NEXT:    vpsllvw %ymm1, %ymm0, %ymm2
312 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} ymm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
313 ; AVX512VLBW-NEXT:    vpsubw %ymm1, %ymm3, %ymm1
314 ; AVX512VLBW-NEXT:    vpsrlvw %ymm1, %ymm0, %ymm0
315 ; AVX512VLBW-NEXT:    vpor %ymm0, %ymm2, %ymm0
316 ; AVX512VLBW-NEXT:    retq
318 ; XOPAVX1-LABEL: var_funnnel_v16i16:
319 ; XOPAVX1:       # %bb.0:
320 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
321 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
322 ; XOPAVX1-NEXT:    vprotw %xmm2, %xmm3, %xmm2
323 ; XOPAVX1-NEXT:    vprotw %xmm1, %xmm0, %xmm0
324 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
325 ; XOPAVX1-NEXT:    retq
327 ; XOPAVX2-LABEL: var_funnnel_v16i16:
328 ; XOPAVX2:       # %bb.0:
329 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
330 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
331 ; XOPAVX2-NEXT:    vprotw %xmm2, %xmm3, %xmm2
332 ; XOPAVX2-NEXT:    vprotw %xmm1, %xmm0, %xmm0
333 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
334 ; XOPAVX2-NEXT:    retq
335   %res = call <16 x i16> @llvm.fshl.v16i16(<16 x i16> %x, <16 x i16> %x, <16 x i16> %amt)
336   ret <16 x i16> %res
339 define <32 x i8> @var_funnnel_v32i8(<32 x i8> %x, <32 x i8> %amt) nounwind {
340 ; AVX1-LABEL: var_funnnel_v32i8:
341 ; AVX1:       # %bb.0:
342 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
343 ; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm3
344 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
345 ; AVX1-NEXT:    vpandn %xmm3, %xmm4, %xmm3
346 ; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm5
347 ; AVX1-NEXT:    vpand %xmm4, %xmm5, %xmm5
348 ; AVX1-NEXT:    vpor %xmm3, %xmm5, %xmm3
349 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
350 ; AVX1-NEXT:    vpsllw $5, %xmm5, %xmm5
351 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
352 ; AVX1-NEXT:    vpsrlw $6, %xmm2, %xmm3
353 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
354 ; AVX1-NEXT:    vpandn %xmm3, %xmm6, %xmm3
355 ; AVX1-NEXT:    vpsllw $2, %xmm2, %xmm7
356 ; AVX1-NEXT:    vpand %xmm6, %xmm7, %xmm7
357 ; AVX1-NEXT:    vpor %xmm3, %xmm7, %xmm3
358 ; AVX1-NEXT:    vpaddb %xmm5, %xmm5, %xmm5
359 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
360 ; AVX1-NEXT:    vpsrlw $7, %xmm2, %xmm3
361 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm8 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
362 ; AVX1-NEXT:    vpand %xmm8, %xmm3, %xmm3
363 ; AVX1-NEXT:    vpaddb %xmm2, %xmm2, %xmm7
364 ; AVX1-NEXT:    vpor %xmm3, %xmm7, %xmm3
365 ; AVX1-NEXT:    vpaddb %xmm5, %xmm5, %xmm5
366 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm3, %xmm2, %xmm2
367 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm3
368 ; AVX1-NEXT:    vpandn %xmm3, %xmm4, %xmm3
369 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm5
370 ; AVX1-NEXT:    vpand %xmm4, %xmm5, %xmm4
371 ; AVX1-NEXT:    vpor %xmm3, %xmm4, %xmm3
372 ; AVX1-NEXT:    vpsllw $5, %xmm1, %xmm1
373 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
374 ; AVX1-NEXT:    vpsrlw $6, %xmm0, %xmm3
375 ; AVX1-NEXT:    vpandn %xmm3, %xmm6, %xmm3
376 ; AVX1-NEXT:    vpsllw $2, %xmm0, %xmm4
377 ; AVX1-NEXT:    vpand %xmm6, %xmm4, %xmm4
378 ; AVX1-NEXT:    vpor %xmm3, %xmm4, %xmm3
379 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
380 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
381 ; AVX1-NEXT:    vpsrlw $7, %xmm0, %xmm3
382 ; AVX1-NEXT:    vpand %xmm8, %xmm3, %xmm3
383 ; AVX1-NEXT:    vpaddb %xmm0, %xmm0, %xmm4
384 ; AVX1-NEXT:    vpor %xmm3, %xmm4, %xmm3
385 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm1
386 ; AVX1-NEXT:    vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
387 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
388 ; AVX1-NEXT:    retq
390 ; AVX2-LABEL: var_funnnel_v32i8:
391 ; AVX2:       # %bb.0:
392 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm2
393 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
394 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm3
395 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
396 ; AVX2-NEXT:    vpor %ymm2, %ymm3, %ymm2
397 ; AVX2-NEXT:    vpsllw $5, %ymm1, %ymm1
398 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
399 ; AVX2-NEXT:    vpsrlw $6, %ymm0, %ymm2
400 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
401 ; AVX2-NEXT:    vpsllw $2, %ymm0, %ymm3
402 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
403 ; AVX2-NEXT:    vpor %ymm2, %ymm3, %ymm2
404 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
405 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
406 ; AVX2-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
407 ; AVX2-NEXT:    vpsrlw $7, %ymm0, %ymm3
408 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
409 ; AVX2-NEXT:    vpor %ymm3, %ymm2, %ymm2
410 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
411 ; AVX2-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
412 ; AVX2-NEXT:    retq
414 ; AVX512F-LABEL: var_funnnel_v32i8:
415 ; AVX512F:       # %bb.0:
416 ; AVX512F-NEXT:    vpsrlw $4, %ymm0, %ymm2
417 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
418 ; AVX512F-NEXT:    vpsllw $4, %ymm0, %ymm3
419 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
420 ; AVX512F-NEXT:    vpor %ymm2, %ymm3, %ymm2
421 ; AVX512F-NEXT:    vpsllw $5, %ymm1, %ymm1
422 ; AVX512F-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
423 ; AVX512F-NEXT:    vpsrlw $6, %ymm0, %ymm2
424 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
425 ; AVX512F-NEXT:    vpsllw $2, %ymm0, %ymm3
426 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
427 ; AVX512F-NEXT:    vpor %ymm2, %ymm3, %ymm2
428 ; AVX512F-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
429 ; AVX512F-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
430 ; AVX512F-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
431 ; AVX512F-NEXT:    vpsrlw $7, %ymm0, %ymm3
432 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
433 ; AVX512F-NEXT:    vpor %ymm3, %ymm2, %ymm2
434 ; AVX512F-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
435 ; AVX512F-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
436 ; AVX512F-NEXT:    retq
438 ; AVX512VL-LABEL: var_funnnel_v32i8:
439 ; AVX512VL:       # %bb.0:
440 ; AVX512VL-NEXT:    vpsrlw $4, %ymm0, %ymm2
441 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
442 ; AVX512VL-NEXT:    vpsllw $4, %ymm0, %ymm3
443 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
444 ; AVX512VL-NEXT:    vpor %ymm2, %ymm3, %ymm2
445 ; AVX512VL-NEXT:    vpsllw $5, %ymm1, %ymm1
446 ; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
447 ; AVX512VL-NEXT:    vpsrlw $6, %ymm0, %ymm2
448 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
449 ; AVX512VL-NEXT:    vpsllw $2, %ymm0, %ymm3
450 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
451 ; AVX512VL-NEXT:    vpor %ymm2, %ymm3, %ymm2
452 ; AVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
453 ; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
454 ; AVX512VL-NEXT:    vpaddb %ymm0, %ymm0, %ymm2
455 ; AVX512VL-NEXT:    vpsrlw $7, %ymm0, %ymm3
456 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
457 ; AVX512VL-NEXT:    vpor %ymm3, %ymm2, %ymm2
458 ; AVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm1
459 ; AVX512VL-NEXT:    vpblendvb %ymm1, %ymm2, %ymm0, %ymm0
460 ; AVX512VL-NEXT:    retq
462 ; AVX512BW-LABEL: var_funnnel_v32i8:
463 ; AVX512BW:       # %bb.0:
464 ; 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]
465 ; AVX512BW-NEXT:    vpand %ymm2, %ymm1, %ymm3
466 ; 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
467 ; 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
468 ; AVX512BW-NEXT:    vpsllvw %zmm3, %zmm0, %zmm3
469 ; AVX512BW-NEXT:    vpxor %xmm4, %xmm4, %xmm4
470 ; AVX512BW-NEXT:    vpsubb %ymm1, %ymm4, %ymm1
471 ; AVX512BW-NEXT:    vpand %ymm2, %ymm1, %ymm1
472 ; 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
473 ; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
474 ; AVX512BW-NEXT:    vporq %zmm0, %zmm3, %zmm0
475 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
476 ; AVX512BW-NEXT:    retq
478 ; AVX512VLBW-LABEL: var_funnnel_v32i8:
479 ; AVX512VLBW:       # %bb.0:
480 ; 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]
481 ; AVX512VLBW-NEXT:    vpand %ymm2, %ymm1, %ymm3
482 ; 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
483 ; 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
484 ; AVX512VLBW-NEXT:    vpsllvw %zmm3, %zmm0, %zmm3
485 ; AVX512VLBW-NEXT:    vpxor %xmm4, %xmm4, %xmm4
486 ; AVX512VLBW-NEXT:    vpsubb %ymm1, %ymm4, %ymm1
487 ; AVX512VLBW-NEXT:    vpand %ymm2, %ymm1, %ymm1
488 ; 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
489 ; AVX512VLBW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
490 ; AVX512VLBW-NEXT:    vporq %zmm0, %zmm3, %zmm0
491 ; AVX512VLBW-NEXT:    vpmovwb %zmm0, %ymm0
492 ; AVX512VLBW-NEXT:    retq
494 ; XOPAVX1-LABEL: var_funnnel_v32i8:
495 ; XOPAVX1:       # %bb.0:
496 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
497 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
498 ; XOPAVX1-NEXT:    vprotb %xmm2, %xmm3, %xmm2
499 ; XOPAVX1-NEXT:    vprotb %xmm1, %xmm0, %xmm0
500 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
501 ; XOPAVX1-NEXT:    retq
503 ; XOPAVX2-LABEL: var_funnnel_v32i8:
504 ; XOPAVX2:       # %bb.0:
505 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
506 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
507 ; XOPAVX2-NEXT:    vprotb %xmm2, %xmm3, %xmm2
508 ; XOPAVX2-NEXT:    vprotb %xmm1, %xmm0, %xmm0
509 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
510 ; XOPAVX2-NEXT:    retq
511   %res = call <32 x i8> @llvm.fshl.v32i8(<32 x i8> %x, <32 x i8> %x, <32 x i8> %amt)
512   ret <32 x i8> %res
516 ; Uniform Variable Shifts
519 define <4 x i64> @splatvar_funnnel_v4i64(<4 x i64> %x, <4 x i64> %amt) nounwind {
520 ; AVX1-LABEL: splatvar_funnnel_v4i64:
521 ; AVX1:       # %bb.0:
522 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = xmm1[0,0]
523 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
524 ; AVX1-NEXT:    vpsubq %xmm1, %xmm2, %xmm2
525 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [63,63]
526 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
527 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
528 ; AVX1-NEXT:    vpsrlq %xmm2, %xmm4, %xmm5
529 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm2[2,3,0,1]
530 ; AVX1-NEXT:    vpsrlq %xmm6, %xmm4, %xmm7
531 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm5 = xmm5[0,1,2,3],xmm7[4,5,6,7]
532 ; AVX1-NEXT:    vpsrlq %xmm2, %xmm0, %xmm2
533 ; AVX1-NEXT:    vpsrlq %xmm6, %xmm0, %xmm6
534 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm6[4,5,6,7]
535 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm2, %ymm2
536 ; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
537 ; AVX1-NEXT:    vpsllq %xmm1, %xmm4, %xmm3
538 ; AVX1-NEXT:    vpsllq %xmm1, %xmm0, %xmm0
539 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
540 ; AVX1-NEXT:    vorps %ymm2, %ymm0, %ymm0
541 ; AVX1-NEXT:    retq
543 ; AVX2-LABEL: splatvar_funnnel_v4i64:
544 ; AVX2:       # %bb.0:
545 ; AVX2-NEXT:    vpbroadcastq %xmm1, %ymm1
546 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [63,63]
547 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm3
548 ; AVX2-NEXT:    vpsllq %xmm3, %ymm0, %ymm3
549 ; AVX2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
550 ; AVX2-NEXT:    vpsubq %xmm1, %xmm4, %xmm1
551 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
552 ; AVX2-NEXT:    vpsrlq %xmm1, %ymm0, %ymm0
553 ; AVX2-NEXT:    vpor %ymm0, %ymm3, %ymm0
554 ; AVX2-NEXT:    retq
556 ; AVX512F-LABEL: splatvar_funnnel_v4i64:
557 ; AVX512F:       # %bb.0:
558 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
559 ; AVX512F-NEXT:    vpbroadcastq %xmm1, %ymm1
560 ; AVX512F-NEXT:    vprolvq %zmm1, %zmm0, %zmm0
561 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
562 ; AVX512F-NEXT:    retq
564 ; AVX512VL-LABEL: splatvar_funnnel_v4i64:
565 ; AVX512VL:       # %bb.0:
566 ; AVX512VL-NEXT:    vpbroadcastq %xmm1, %ymm1
567 ; AVX512VL-NEXT:    vprolvq %ymm1, %ymm0, %ymm0
568 ; AVX512VL-NEXT:    retq
570 ; AVX512BW-LABEL: splatvar_funnnel_v4i64:
571 ; AVX512BW:       # %bb.0:
572 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
573 ; AVX512BW-NEXT:    vpbroadcastq %xmm1, %ymm1
574 ; AVX512BW-NEXT:    vprolvq %zmm1, %zmm0, %zmm0
575 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
576 ; AVX512BW-NEXT:    retq
578 ; AVX512VLBW-LABEL: splatvar_funnnel_v4i64:
579 ; AVX512VLBW:       # %bb.0:
580 ; AVX512VLBW-NEXT:    vpbroadcastq %xmm1, %ymm1
581 ; AVX512VLBW-NEXT:    vprolvq %ymm1, %ymm0, %ymm0
582 ; AVX512VLBW-NEXT:    retq
584 ; XOPAVX1-LABEL: splatvar_funnnel_v4i64:
585 ; XOPAVX1:       # %bb.0:
586 ; XOPAVX1-NEXT:    vmovddup {{.*#+}} xmm1 = xmm1[0,0]
587 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
588 ; XOPAVX1-NEXT:    vprotq %xmm1, %xmm2, %xmm2
589 ; XOPAVX1-NEXT:    vprotq %xmm1, %xmm0, %xmm0
590 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
591 ; XOPAVX1-NEXT:    retq
593 ; XOPAVX2-LABEL: splatvar_funnnel_v4i64:
594 ; XOPAVX2:       # %bb.0:
595 ; XOPAVX2-NEXT:    vpbroadcastq %xmm1, %ymm1
596 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
597 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm3
598 ; XOPAVX2-NEXT:    vprotq %xmm3, %xmm2, %xmm2
599 ; XOPAVX2-NEXT:    vprotq %xmm1, %xmm0, %xmm0
600 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
601 ; XOPAVX2-NEXT:    retq
602   %splat = shufflevector <4 x i64> %amt, <4 x i64> undef, <4 x i32> zeroinitializer
603   %res = call <4 x i64> @llvm.fshl.v4i64(<4 x i64> %x, <4 x i64> %x, <4 x i64> %splat)
604   ret <4 x i64> %res
607 define <8 x i32> @splatvar_funnnel_v8i32(<8 x i32> %x, <8 x i32> %amt) nounwind {
608 ; AVX1-LABEL: splatvar_funnnel_v8i32:
609 ; AVX1:       # %bb.0:
610 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
611 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
612 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
613 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm3 = xmm1[0],zero,xmm1[1],zero
614 ; AVX1-NEXT:    vpslld %xmm3, %xmm2, %xmm4
615 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [32,32,32,32]
616 ; AVX1-NEXT:    vpsubd %xmm1, %xmm5, %xmm1
617 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
618 ; AVX1-NEXT:    vpsrld %xmm1, %xmm2, %xmm2
619 ; AVX1-NEXT:    vpor %xmm2, %xmm4, %xmm2
620 ; AVX1-NEXT:    vpslld %xmm3, %xmm0, %xmm3
621 ; AVX1-NEXT:    vpsrld %xmm1, %xmm0, %xmm0
622 ; AVX1-NEXT:    vpor %xmm0, %xmm3, %xmm0
623 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
624 ; AVX1-NEXT:    retq
626 ; AVX2-LABEL: splatvar_funnnel_v8i32:
627 ; AVX2:       # %bb.0:
628 ; AVX2-NEXT:    vpbroadcastd %xmm1, %ymm1
629 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [31,31,31,31]
630 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
631 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero
632 ; AVX2-NEXT:    vpslld %xmm2, %ymm0, %ymm2
633 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [32,32,32,32]
634 ; AVX2-NEXT:    vpsubd %xmm1, %xmm3, %xmm1
635 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
636 ; AVX2-NEXT:    vpsrld %xmm1, %ymm0, %ymm0
637 ; AVX2-NEXT:    vpor %ymm0, %ymm2, %ymm0
638 ; AVX2-NEXT:    retq
640 ; AVX512F-LABEL: splatvar_funnnel_v8i32:
641 ; AVX512F:       # %bb.0:
642 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
643 ; AVX512F-NEXT:    vpbroadcastd %xmm1, %ymm1
644 ; AVX512F-NEXT:    vprolvd %zmm1, %zmm0, %zmm0
645 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
646 ; AVX512F-NEXT:    retq
648 ; AVX512VL-LABEL: splatvar_funnnel_v8i32:
649 ; AVX512VL:       # %bb.0:
650 ; AVX512VL-NEXT:    vpbroadcastd %xmm1, %ymm1
651 ; AVX512VL-NEXT:    vprolvd %ymm1, %ymm0, %ymm0
652 ; AVX512VL-NEXT:    retq
654 ; AVX512BW-LABEL: splatvar_funnnel_v8i32:
655 ; AVX512BW:       # %bb.0:
656 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
657 ; AVX512BW-NEXT:    vpbroadcastd %xmm1, %ymm1
658 ; AVX512BW-NEXT:    vprolvd %zmm1, %zmm0, %zmm0
659 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
660 ; AVX512BW-NEXT:    retq
662 ; AVX512VLBW-LABEL: splatvar_funnnel_v8i32:
663 ; AVX512VLBW:       # %bb.0:
664 ; AVX512VLBW-NEXT:    vpbroadcastd %xmm1, %ymm1
665 ; AVX512VLBW-NEXT:    vprolvd %ymm1, %ymm0, %ymm0
666 ; AVX512VLBW-NEXT:    retq
668 ; XOPAVX1-LABEL: splatvar_funnnel_v8i32:
669 ; XOPAVX1:       # %bb.0:
670 ; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
671 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
672 ; XOPAVX1-NEXT:    vprotd %xmm1, %xmm2, %xmm2
673 ; XOPAVX1-NEXT:    vprotd %xmm1, %xmm0, %xmm0
674 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
675 ; XOPAVX1-NEXT:    retq
677 ; XOPAVX2-LABEL: splatvar_funnnel_v8i32:
678 ; XOPAVX2:       # %bb.0:
679 ; XOPAVX2-NEXT:    vpbroadcastd %xmm1, %ymm1
680 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
681 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm3
682 ; XOPAVX2-NEXT:    vprotd %xmm3, %xmm2, %xmm2
683 ; XOPAVX2-NEXT:    vprotd %xmm1, %xmm0, %xmm0
684 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
685 ; XOPAVX2-NEXT:    retq
686   %splat = shufflevector <8 x i32> %amt, <8 x i32> undef, <8 x i32> zeroinitializer
687   %res = call <8 x i32> @llvm.fshl.v8i32(<8 x i32> %x, <8 x i32> %x, <8 x i32> %splat)
688   ret <8 x i32> %res
691 define <16 x i16> @splatvar_funnnel_v16i16(<16 x i16> %x, <16 x i16> %amt) nounwind {
692 ; AVX1-LABEL: splatvar_funnnel_v16i16:
693 ; AVX1:       # %bb.0:
694 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7]
695 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
696 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
697 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
698 ; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm3 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
699 ; AVX1-NEXT:    vpsllw %xmm3, %xmm2, %xmm4
700 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [16,16,16,16,16,16,16,16]
701 ; AVX1-NEXT:    vpsubw %xmm1, %xmm5, %xmm1
702 ; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
703 ; AVX1-NEXT:    vpsrlw %xmm1, %xmm2, %xmm2
704 ; AVX1-NEXT:    vpor %xmm2, %xmm4, %xmm2
705 ; AVX1-NEXT:    vpsllw %xmm3, %xmm0, %xmm3
706 ; AVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
707 ; AVX1-NEXT:    vpor %xmm0, %xmm3, %xmm0
708 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
709 ; AVX1-NEXT:    retq
711 ; AVX2-LABEL: splatvar_funnnel_v16i16:
712 ; AVX2:       # %bb.0:
713 ; AVX2-NEXT:    vpbroadcastw %xmm1, %ymm1
714 ; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
715 ; AVX2-NEXT:    vpmovzxwq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
716 ; AVX2-NEXT:    vpsllw %xmm2, %ymm0, %ymm2
717 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]
718 ; AVX2-NEXT:    vpsubw %xmm1, %xmm3, %xmm1
719 ; AVX2-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
720 ; AVX2-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
721 ; AVX2-NEXT:    vpor %ymm0, %ymm2, %ymm0
722 ; AVX2-NEXT:    retq
724 ; AVX512-LABEL: splatvar_funnnel_v16i16:
725 ; AVX512:       # %bb.0:
726 ; AVX512-NEXT:    vpbroadcastw %xmm1, %ymm1
727 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
728 ; AVX512-NEXT:    vpmovzxwq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
729 ; AVX512-NEXT:    vpsllw %xmm2, %ymm0, %ymm2
730 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16]
731 ; AVX512-NEXT:    vpsubw %xmm1, %xmm3, %xmm1
732 ; AVX512-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
733 ; AVX512-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
734 ; AVX512-NEXT:    vpor %ymm0, %ymm2, %ymm0
735 ; AVX512-NEXT:    retq
737 ; XOPAVX1-LABEL: splatvar_funnnel_v16i16:
738 ; XOPAVX1:       # %bb.0:
739 ; XOPAVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,0,2,3,4,5,6,7]
740 ; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
741 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
742 ; XOPAVX1-NEXT:    vprotw %xmm1, %xmm2, %xmm2
743 ; XOPAVX1-NEXT:    vprotw %xmm1, %xmm0, %xmm0
744 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
745 ; XOPAVX1-NEXT:    retq
747 ; XOPAVX2-LABEL: splatvar_funnnel_v16i16:
748 ; XOPAVX2:       # %bb.0:
749 ; XOPAVX2-NEXT:    vpbroadcastw %xmm1, %ymm1
750 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
751 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm3
752 ; XOPAVX2-NEXT:    vprotw %xmm3, %xmm2, %xmm2
753 ; XOPAVX2-NEXT:    vprotw %xmm1, %xmm0, %xmm0
754 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
755 ; XOPAVX2-NEXT:    retq
756   %splat = shufflevector <16 x i16> %amt, <16 x i16> undef, <16 x i32> zeroinitializer
757   %res = call <16 x i16> @llvm.fshl.v16i16(<16 x i16> %x, <16 x i16> %x, <16 x i16> %splat)
758   ret <16 x i16> %res
761 define <32 x i8> @splatvar_funnnel_v32i8(<32 x i8> %x, <32 x i8> %amt) nounwind {
762 ; AVX1-LABEL: splatvar_funnnel_v32i8:
763 ; AVX1:       # %bb.0:
764 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
765 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
766 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
767 ; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm3 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
768 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
769 ; AVX1-NEXT:    vpsllw %xmm3, %xmm4, %xmm5
770 ; AVX1-NEXT:    vpcmpeqd %xmm6, %xmm6, %xmm6
771 ; AVX1-NEXT:    vpsllw %xmm3, %xmm6, %xmm7
772 ; AVX1-NEXT:    vpshufb %xmm2, %xmm7, %xmm2
773 ; AVX1-NEXT:    vpand %xmm2, %xmm5, %xmm5
774 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
775 ; AVX1-NEXT:    vpsubb %xmm1, %xmm7, %xmm1
776 ; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
777 ; AVX1-NEXT:    vpsrlw %xmm1, %xmm4, %xmm4
778 ; AVX1-NEXT:    vpsrlw %xmm1, %xmm6, %xmm6
779 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm6 = xmm6[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
780 ; AVX1-NEXT:    vpand %xmm6, %xmm4, %xmm4
781 ; AVX1-NEXT:    vpor %xmm4, %xmm5, %xmm4
782 ; AVX1-NEXT:    vpsllw %xmm3, %xmm0, %xmm3
783 ; AVX1-NEXT:    vpand %xmm2, %xmm3, %xmm2
784 ; AVX1-NEXT:    vpsrlw %xmm1, %xmm0, %xmm0
785 ; AVX1-NEXT:    vpand %xmm6, %xmm0, %xmm0
786 ; AVX1-NEXT:    vpor %xmm0, %xmm2, %xmm0
787 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
788 ; AVX1-NEXT:    retq
790 ; AVX2-LABEL: splatvar_funnnel_v32i8:
791 ; AVX2:       # %bb.0:
792 ; AVX2-NEXT:    vpbroadcastb %xmm1, %ymm1
793 ; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
794 ; AVX2-NEXT:    vpmovzxbq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
795 ; AVX2-NEXT:    vpsllw %xmm2, %ymm0, %ymm3
796 ; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm4, %ymm4
797 ; AVX2-NEXT:    vpsllw %xmm2, %ymm4, %ymm2
798 ; AVX2-NEXT:    vpbroadcastb %xmm2, %ymm2
799 ; AVX2-NEXT:    vpand %ymm2, %ymm3, %ymm2
800 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
801 ; AVX2-NEXT:    vpsubb %xmm1, %xmm3, %xmm1
802 ; AVX2-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
803 ; AVX2-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
804 ; AVX2-NEXT:    vpsrlw %xmm1, %ymm4, %ymm1
805 ; AVX2-NEXT:    vpsrlw $8, %ymm1, %ymm1
806 ; AVX2-NEXT:    vpbroadcastb %xmm1, %ymm1
807 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
808 ; AVX2-NEXT:    vpor %ymm0, %ymm2, %ymm0
809 ; AVX2-NEXT:    retq
811 ; AVX512F-LABEL: splatvar_funnnel_v32i8:
812 ; AVX512F:       # %bb.0:
813 ; AVX512F-NEXT:    vpbroadcastb %xmm1, %ymm1
814 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
815 ; AVX512F-NEXT:    vpmovzxbq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
816 ; AVX512F-NEXT:    vpsllw %xmm2, %ymm0, %ymm3
817 ; AVX512F-NEXT:    vpcmpeqd %ymm4, %ymm4, %ymm4
818 ; AVX512F-NEXT:    vpsllw %xmm2, %ymm4, %ymm2
819 ; AVX512F-NEXT:    vpbroadcastb %xmm2, %ymm2
820 ; AVX512F-NEXT:    vpand %ymm2, %ymm3, %ymm2
821 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm3 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
822 ; AVX512F-NEXT:    vpsubb %xmm1, %xmm3, %xmm1
823 ; AVX512F-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
824 ; AVX512F-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
825 ; AVX512F-NEXT:    vpsrlw %xmm1, %ymm4, %ymm1
826 ; AVX512F-NEXT:    vpsrlw $8, %ymm1, %ymm1
827 ; AVX512F-NEXT:    vpbroadcastb %xmm1, %ymm1
828 ; AVX512F-NEXT:    vpand %ymm1, %ymm0, %ymm0
829 ; AVX512F-NEXT:    vpor %ymm0, %ymm2, %ymm0
830 ; AVX512F-NEXT:    retq
832 ; AVX512VL-LABEL: splatvar_funnnel_v32i8:
833 ; AVX512VL:       # %bb.0:
834 ; AVX512VL-NEXT:    vpbroadcastb %xmm1, %ymm1
835 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
836 ; AVX512VL-NEXT:    vpmovzxbq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
837 ; AVX512VL-NEXT:    vpsllw %xmm2, %ymm0, %ymm3
838 ; AVX512VL-NEXT:    vpcmpeqd %ymm4, %ymm4, %ymm4
839 ; AVX512VL-NEXT:    vpsllw %xmm2, %ymm4, %ymm2
840 ; AVX512VL-NEXT:    vpbroadcastb %xmm2, %ymm2
841 ; AVX512VL-NEXT:    vpand %ymm2, %ymm3, %ymm2
842 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm3 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
843 ; AVX512VL-NEXT:    vpsubb %xmm1, %xmm3, %xmm1
844 ; AVX512VL-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
845 ; AVX512VL-NEXT:    vpsrlw %xmm1, %ymm0, %ymm0
846 ; AVX512VL-NEXT:    vpsrlw %xmm1, %ymm4, %ymm1
847 ; AVX512VL-NEXT:    vpsrlw $8, %ymm1, %ymm1
848 ; AVX512VL-NEXT:    vpbroadcastb %xmm1, %ymm1
849 ; AVX512VL-NEXT:    vpand %ymm1, %ymm0, %ymm0
850 ; AVX512VL-NEXT:    vpor %ymm0, %ymm2, %ymm0
851 ; AVX512VL-NEXT:    retq
853 ; AVX512BW-LABEL: splatvar_funnnel_v32i8:
854 ; AVX512BW:       # %bb.0:
855 ; AVX512BW-NEXT:    vpbroadcastb %xmm1, %ymm1
856 ; 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]
857 ; AVX512BW-NEXT:    vpand %ymm2, %ymm1, %ymm3
858 ; 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
859 ; 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
860 ; AVX512BW-NEXT:    vpsllvw %zmm3, %zmm0, %zmm3
861 ; AVX512BW-NEXT:    vpxor %xmm4, %xmm4, %xmm4
862 ; AVX512BW-NEXT:    vpsubb %ymm1, %ymm4, %ymm1
863 ; AVX512BW-NEXT:    vpand %ymm2, %ymm1, %ymm1
864 ; 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
865 ; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
866 ; AVX512BW-NEXT:    vporq %zmm0, %zmm3, %zmm0
867 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
868 ; AVX512BW-NEXT:    retq
870 ; AVX512VLBW-LABEL: splatvar_funnnel_v32i8:
871 ; AVX512VLBW:       # %bb.0:
872 ; AVX512VLBW-NEXT:    vpbroadcastb %xmm1, %ymm1
873 ; 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]
874 ; AVX512VLBW-NEXT:    vpand %ymm2, %ymm1, %ymm3
875 ; 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
876 ; 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
877 ; AVX512VLBW-NEXT:    vpsllvw %zmm3, %zmm0, %zmm3
878 ; AVX512VLBW-NEXT:    vpxor %xmm4, %xmm4, %xmm4
879 ; AVX512VLBW-NEXT:    vpsubb %ymm1, %ymm4, %ymm1
880 ; AVX512VLBW-NEXT:    vpand %ymm2, %ymm1, %ymm1
881 ; 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
882 ; AVX512VLBW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
883 ; AVX512VLBW-NEXT:    vporq %zmm0, %zmm3, %zmm0
884 ; AVX512VLBW-NEXT:    vpmovwb %zmm0, %ymm0
885 ; AVX512VLBW-NEXT:    retq
887 ; XOPAVX1-LABEL: splatvar_funnnel_v32i8:
888 ; XOPAVX1:       # %bb.0:
889 ; XOPAVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
890 ; XOPAVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
891 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
892 ; XOPAVX1-NEXT:    vprotb %xmm1, %xmm2, %xmm2
893 ; XOPAVX1-NEXT:    vprotb %xmm1, %xmm0, %xmm0
894 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
895 ; XOPAVX1-NEXT:    retq
897 ; XOPAVX2-LABEL: splatvar_funnnel_v32i8:
898 ; XOPAVX2:       # %bb.0:
899 ; XOPAVX2-NEXT:    vpbroadcastb %xmm1, %ymm1
900 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
901 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm3
902 ; XOPAVX2-NEXT:    vprotb %xmm3, %xmm2, %xmm2
903 ; XOPAVX2-NEXT:    vprotb %xmm1, %xmm0, %xmm0
904 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
905 ; XOPAVX2-NEXT:    retq
906   %splat = shufflevector <32 x i8> %amt, <32 x i8> undef, <32 x i32> zeroinitializer
907   %res = call <32 x i8> @llvm.fshl.v32i8(<32 x i8> %x, <32 x i8> %x, <32 x i8> %splat)
908   ret <32 x i8> %res
912 ; Constant Shifts
915 define <4 x i64> @constant_funnnel_v4i64(<4 x i64> %x) nounwind {
916 ; AVX1-LABEL: constant_funnnel_v4i64:
917 ; AVX1:       # %bb.0:
918 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
919 ; AVX1-NEXT:    vpsrlq $4, %xmm1, %xmm2
920 ; AVX1-NEXT:    vpsrlq $14, %xmm1, %xmm3
921 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
922 ; AVX1-NEXT:    vpsrlq $50, %xmm0, %xmm3
923 ; AVX1-NEXT:    vpsrlq $60, %xmm0, %xmm4
924 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
925 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
926 ; AVX1-NEXT:    vpsllq $60, %xmm1, %xmm3
927 ; AVX1-NEXT:    vpsllq $50, %xmm1, %xmm1
928 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm3[4,5,6,7]
929 ; AVX1-NEXT:    vpsllq $14, %xmm0, %xmm3
930 ; AVX1-NEXT:    vpsllq $4, %xmm0, %xmm0
931 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]
932 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
933 ; AVX1-NEXT:    vorps %ymm2, %ymm0, %ymm0
934 ; AVX1-NEXT:    retq
936 ; AVX2-LABEL: constant_funnnel_v4i64:
937 ; AVX2:       # %bb.0:
938 ; AVX2-NEXT:    vpsrlvq {{.*}}(%rip), %ymm0, %ymm1
939 ; AVX2-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
940 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
941 ; AVX2-NEXT:    retq
943 ; AVX512F-LABEL: constant_funnnel_v4i64:
944 ; AVX512F:       # %bb.0:
945 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
946 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm1 = [4,14,50,60]
947 ; AVX512F-NEXT:    vprolvq %zmm1, %zmm0, %zmm0
948 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
949 ; AVX512F-NEXT:    retq
951 ; AVX512VL-LABEL: constant_funnnel_v4i64:
952 ; AVX512VL:       # %bb.0:
953 ; AVX512VL-NEXT:    vprolvq {{.*}}(%rip), %ymm0, %ymm0
954 ; AVX512VL-NEXT:    retq
956 ; AVX512BW-LABEL: constant_funnnel_v4i64:
957 ; AVX512BW:       # %bb.0:
958 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
959 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm1 = [4,14,50,60]
960 ; AVX512BW-NEXT:    vprolvq %zmm1, %zmm0, %zmm0
961 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
962 ; AVX512BW-NEXT:    retq
964 ; AVX512VLBW-LABEL: constant_funnnel_v4i64:
965 ; AVX512VLBW:       # %bb.0:
966 ; AVX512VLBW-NEXT:    vprolvq {{.*}}(%rip), %ymm0, %ymm0
967 ; AVX512VLBW-NEXT:    retq
969 ; XOPAVX1-LABEL: constant_funnnel_v4i64:
970 ; XOPAVX1:       # %bb.0:
971 ; XOPAVX1-NEXT:    vprotq {{.*}}(%rip), %xmm0, %xmm1
972 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
973 ; XOPAVX1-NEXT:    vprotq {{.*}}(%rip), %xmm0, %xmm0
974 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
975 ; XOPAVX1-NEXT:    retq
977 ; XOPAVX2-LABEL: constant_funnnel_v4i64:
978 ; XOPAVX2:       # %bb.0:
979 ; XOPAVX2-NEXT:    vprotq {{.*}}(%rip), %xmm0, %xmm1
980 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
981 ; XOPAVX2-NEXT:    vprotq {{.*}}(%rip), %xmm0, %xmm0
982 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
983 ; XOPAVX2-NEXT:    retq
984   %res = call <4 x i64> @llvm.fshl.v4i64(<4 x i64> %x, <4 x i64> %x, <4 x i64> <i64 4, i64 14, i64 50, i64 60>)
985   ret <4 x i64> %res
988 define <8 x i32> @constant_funnnel_v8i32(<8 x i32> %x) nounwind {
989 ; AVX1-LABEL: constant_funnnel_v8i32:
990 ; AVX1:       # %bb.0:
991 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [256,512,1024,2048]
992 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
993 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
994 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
995 ; AVX1-NEXT:    vpmuludq %xmm2, %xmm4, %xmm2
996 ; AVX1-NEXT:    vpmuludq %xmm1, %xmm3, %xmm1
997 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
998 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
999 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[0,0,2,2]
1000 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
1001 ; AVX1-NEXT:    vpor %xmm3, %xmm1, %xmm1
1002 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [16,32,64,128]
1003 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
1004 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
1005 ; AVX1-NEXT:    vpmuludq %xmm3, %xmm4, %xmm3
1006 ; AVX1-NEXT:    vpmuludq %xmm2, %xmm0, %xmm0
1007 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
1008 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
1009 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[0,0,2,2]
1010 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7]
1011 ; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
1012 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1013 ; AVX1-NEXT:    retq
1015 ; AVX2-LABEL: constant_funnnel_v8i32:
1016 ; AVX2:       # %bb.0:
1017 ; AVX2-NEXT:    vpsrlvd {{.*}}(%rip), %ymm0, %ymm1
1018 ; AVX2-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
1019 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1020 ; AVX2-NEXT:    retq
1022 ; AVX512F-LABEL: constant_funnnel_v8i32:
1023 ; AVX512F:       # %bb.0:
1024 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1025 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm1 = [4,5,6,7,8,9,10,11]
1026 ; AVX512F-NEXT:    vprolvd %zmm1, %zmm0, %zmm0
1027 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1028 ; AVX512F-NEXT:    retq
1030 ; AVX512VL-LABEL: constant_funnnel_v8i32:
1031 ; AVX512VL:       # %bb.0:
1032 ; AVX512VL-NEXT:    vprolvd {{.*}}(%rip), %ymm0, %ymm0
1033 ; AVX512VL-NEXT:    retq
1035 ; AVX512BW-LABEL: constant_funnnel_v8i32:
1036 ; AVX512BW:       # %bb.0:
1037 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1038 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm1 = [4,5,6,7,8,9,10,11]
1039 ; AVX512BW-NEXT:    vprolvd %zmm1, %zmm0, %zmm0
1040 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1041 ; AVX512BW-NEXT:    retq
1043 ; AVX512VLBW-LABEL: constant_funnnel_v8i32:
1044 ; AVX512VLBW:       # %bb.0:
1045 ; AVX512VLBW-NEXT:    vprolvd {{.*}}(%rip), %ymm0, %ymm0
1046 ; AVX512VLBW-NEXT:    retq
1048 ; XOPAVX1-LABEL: constant_funnnel_v8i32:
1049 ; XOPAVX1:       # %bb.0:
1050 ; XOPAVX1-NEXT:    vprotd {{.*}}(%rip), %xmm0, %xmm1
1051 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1052 ; XOPAVX1-NEXT:    vprotd {{.*}}(%rip), %xmm0, %xmm0
1053 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1054 ; XOPAVX1-NEXT:    retq
1056 ; XOPAVX2-LABEL: constant_funnnel_v8i32:
1057 ; XOPAVX2:       # %bb.0:
1058 ; XOPAVX2-NEXT:    vprotd {{.*}}(%rip), %xmm0, %xmm1
1059 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1060 ; XOPAVX2-NEXT:    vprotd {{.*}}(%rip), %xmm0, %xmm0
1061 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1062 ; XOPAVX2-NEXT:    retq
1063   %res = call <8 x i32> @llvm.fshl.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>)
1064   ret <8 x i32> %res
1067 define <16 x i16> @constant_funnnel_v16i16(<16 x i16> %x) nounwind {
1068 ; AVX1-LABEL: constant_funnnel_v16i16:
1069 ; AVX1:       # %bb.0:
1070 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1071 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [256,512,1024,2048,4096,8192,16384,32768]
1072 ; AVX1-NEXT:    vpmulhuw %xmm2, %xmm1, %xmm3
1073 ; AVX1-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
1074 ; AVX1-NEXT:    vpor %xmm3, %xmm1, %xmm1
1075 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128]
1076 ; AVX1-NEXT:    vpmulhuw %xmm2, %xmm0, %xmm3
1077 ; AVX1-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
1078 ; AVX1-NEXT:    vpor %xmm3, %xmm0, %xmm0
1079 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1080 ; AVX1-NEXT:    retq
1082 ; AVX2-LABEL: constant_funnnel_v16i16:
1083 ; AVX2:       # %bb.0:
1084 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
1085 ; AVX2-NEXT:    vpmulhuw %ymm1, %ymm0, %ymm2
1086 ; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1087 ; AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm0
1088 ; AVX2-NEXT:    retq
1090 ; AVX512F-LABEL: constant_funnnel_v16i16:
1091 ; AVX512F:       # %bb.0:
1092 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
1093 ; AVX512F-NEXT:    vpmulhuw %ymm1, %ymm0, %ymm2
1094 ; AVX512F-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1095 ; AVX512F-NEXT:    vpor %ymm2, %ymm0, %ymm0
1096 ; AVX512F-NEXT:    retq
1098 ; AVX512VL-LABEL: constant_funnnel_v16i16:
1099 ; AVX512VL:       # %bb.0:
1100 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
1101 ; AVX512VL-NEXT:    vpmulhuw %ymm1, %ymm0, %ymm2
1102 ; AVX512VL-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1103 ; AVX512VL-NEXT:    vpor %ymm2, %ymm0, %ymm0
1104 ; AVX512VL-NEXT:    retq
1106 ; AVX512BW-LABEL: constant_funnnel_v16i16:
1107 ; AVX512BW:       # %bb.0:
1108 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1109 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm1 = [16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1]
1110 ; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm1
1111 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
1112 ; AVX512BW-NEXT:    vpsllvw %zmm2, %zmm0, %zmm0
1113 ; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm0
1114 ; AVX512BW-NEXT:    retq
1116 ; AVX512VLBW-LABEL: constant_funnnel_v16i16:
1117 ; AVX512VLBW:       # %bb.0:
1118 ; AVX512VLBW-NEXT:    vpsrlvw {{.*}}(%rip), %ymm0, %ymm1
1119 ; AVX512VLBW-NEXT:    vpsllvw {{.*}}(%rip), %ymm0, %ymm0
1120 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm0
1121 ; AVX512VLBW-NEXT:    retq
1123 ; XOPAVX1-LABEL: constant_funnnel_v16i16:
1124 ; XOPAVX1:       # %bb.0:
1125 ; XOPAVX1-NEXT:    vprotw {{.*}}(%rip), %xmm0, %xmm1
1126 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1127 ; XOPAVX1-NEXT:    vprotw {{.*}}(%rip), %xmm0, %xmm0
1128 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1129 ; XOPAVX1-NEXT:    retq
1131 ; XOPAVX2-LABEL: constant_funnnel_v16i16:
1132 ; XOPAVX2:       # %bb.0:
1133 ; XOPAVX2-NEXT:    vprotw {{.*}}(%rip), %xmm0, %xmm1
1134 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1135 ; XOPAVX2-NEXT:    vprotw {{.*}}(%rip), %xmm0, %xmm0
1136 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1137 ; XOPAVX2-NEXT:    retq
1138   %res = call <16 x i16> @llvm.fshl.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>)
1139   ret <16 x i16> %res
1142 define <32 x i8> @constant_funnnel_v32i8(<32 x i8> %x) nounwind {
1143 ; AVX1-LABEL: constant_funnnel_v32i8:
1144 ; AVX1:       # %bb.0:
1145 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1146 ; AVX1-NEXT:    vpxor %xmm8, %xmm8, %xmm8
1147 ; 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]
1148 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm9 = [256,128,64,32,16,8,4,2]
1149 ; AVX1-NEXT:    vpmullw %xmm9, %xmm3, %xmm3
1150 ; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
1151 ; 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
1152 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [256,2,4,8,16,32,64,128]
1153 ; AVX1-NEXT:    vpmullw %xmm6, %xmm5, %xmm7
1154 ; AVX1-NEXT:    vpsrlw $8, %xmm7, %xmm7
1155 ; AVX1-NEXT:    vpackuswb %xmm3, %xmm7, %xmm3
1156 ; 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]
1157 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [1,128,64,32,16,8,4,2]
1158 ; AVX1-NEXT:    vpmullw %xmm7, %xmm1, %xmm1
1159 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
1160 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
1161 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128]
1162 ; AVX1-NEXT:    vpmullw %xmm4, %xmm5, %xmm5
1163 ; AVX1-NEXT:    vpand %xmm2, %xmm5, %xmm5
1164 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm5, %xmm1
1165 ; AVX1-NEXT:    vpor %xmm3, %xmm1, %xmm1
1166 ; 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]
1167 ; AVX1-NEXT:    vpmullw %xmm9, %xmm3, %xmm3
1168 ; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
1169 ; 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
1170 ; AVX1-NEXT:    vpmullw %xmm6, %xmm5, %xmm6
1171 ; AVX1-NEXT:    vpsrlw $8, %xmm6, %xmm6
1172 ; AVX1-NEXT:    vpackuswb %xmm3, %xmm6, %xmm3
1173 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1174 ; AVX1-NEXT:    vpmullw %xmm7, %xmm0, %xmm0
1175 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
1176 ; AVX1-NEXT:    vpmullw %xmm4, %xmm5, %xmm4
1177 ; AVX1-NEXT:    vpand %xmm2, %xmm4, %xmm2
1178 ; AVX1-NEXT:    vpackuswb %xmm0, %xmm2, %xmm0
1179 ; AVX1-NEXT:    vpor %xmm3, %xmm0, %xmm0
1180 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1181 ; AVX1-NEXT:    retq
1183 ; AVX2-LABEL: constant_funnnel_v32i8:
1184 ; AVX2:       # %bb.0:
1185 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm1
1186 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
1187 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [8192,24640,41088,57536,57344,41152,24704,8256,8192,24640,41088,57536,57344,41152,24704,8256]
1188 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm1
1189 ; AVX2-NEXT:    vpsllw $2, %ymm1, %ymm3
1190 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
1191 ; AVX2-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
1192 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
1193 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm3
1194 ; AVX2-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
1195 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
1196 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1197 ; 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]
1198 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm3, %ymm3
1199 ; AVX2-NEXT:    vpsrlw $8, %ymm3, %ymm3
1200 ; 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]
1201 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
1202 ; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
1203 ; AVX2-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
1204 ; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
1205 ; AVX2-NEXT:    retq
1207 ; AVX512F-LABEL: constant_funnnel_v32i8:
1208 ; AVX512F:       # %bb.0:
1209 ; AVX512F-NEXT:    vpsllw $4, %ymm0, %ymm1
1210 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
1211 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm2 = [8192,24640,41088,57536,57344,41152,24704,8256,8192,24640,41088,57536,57344,41152,24704,8256]
1212 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm1
1213 ; AVX512F-NEXT:    vpsllw $2, %ymm1, %ymm3
1214 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
1215 ; AVX512F-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
1216 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
1217 ; AVX512F-NEXT:    vpaddb %ymm1, %ymm1, %ymm3
1218 ; AVX512F-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
1219 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
1220 ; AVX512F-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1221 ; 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]
1222 ; AVX512F-NEXT:    vpmullw {{.*}}(%rip), %ymm3, %ymm3
1223 ; AVX512F-NEXT:    vpsrlw $8, %ymm3, %ymm3
1224 ; 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]
1225 ; AVX512F-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
1226 ; AVX512F-NEXT:    vpsrlw $8, %ymm0, %ymm0
1227 ; AVX512F-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
1228 ; AVX512F-NEXT:    vpor %ymm0, %ymm1, %ymm0
1229 ; AVX512F-NEXT:    retq
1231 ; AVX512VL-LABEL: constant_funnnel_v32i8:
1232 ; AVX512VL:       # %bb.0:
1233 ; AVX512VL-NEXT:    vpsllw $4, %ymm0, %ymm1
1234 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
1235 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm2 = [8192,24640,41088,57536,57344,41152,24704,8256,8192,24640,41088,57536,57344,41152,24704,8256]
1236 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm1
1237 ; AVX512VL-NEXT:    vpsllw $2, %ymm1, %ymm3
1238 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
1239 ; AVX512VL-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
1240 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
1241 ; AVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm3
1242 ; AVX512VL-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
1243 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
1244 ; 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]
1245 ; AVX512VL-NEXT:    vpsrlw $8, %ymm2, %ymm2
1246 ; AVX512VL-NEXT:    vpmullw {{.*}}(%rip), %ymm2, %ymm2
1247 ; AVX512VL-NEXT:    vpsrlw $8, %ymm2, %ymm2
1248 ; 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]
1249 ; AVX512VL-NEXT:    vpsrlw $8, %ymm0, %ymm0
1250 ; AVX512VL-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
1251 ; AVX512VL-NEXT:    vpsrlw $8, %ymm0, %ymm0
1252 ; AVX512VL-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
1253 ; AVX512VL-NEXT:    vpor %ymm0, %ymm1, %ymm0
1254 ; AVX512VL-NEXT:    retq
1256 ; AVX512BW-LABEL: constant_funnnel_v32i8:
1257 ; AVX512BW:       # %bb.0:
1258 ; 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
1259 ; AVX512BW-NEXT:    vpsrlvw {{.*}}(%rip), %zmm0, %zmm1
1260 ; AVX512BW-NEXT:    vpsllvw {{.*}}(%rip), %zmm0, %zmm0
1261 ; AVX512BW-NEXT:    vporq %zmm1, %zmm0, %zmm0
1262 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
1263 ; AVX512BW-NEXT:    retq
1265 ; AVX512VLBW-LABEL: constant_funnnel_v32i8:
1266 ; AVX512VLBW:       # %bb.0:
1267 ; 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
1268 ; AVX512VLBW-NEXT:    vpsrlvw {{.*}}(%rip), %zmm0, %zmm1
1269 ; AVX512VLBW-NEXT:    vpsllvw {{.*}}(%rip), %zmm0, %zmm0
1270 ; AVX512VLBW-NEXT:    vporq %zmm1, %zmm0, %zmm0
1271 ; AVX512VLBW-NEXT:    vpmovwb %zmm0, %ymm0
1272 ; AVX512VLBW-NEXT:    retq
1274 ; XOPAVX1-LABEL: constant_funnnel_v32i8:
1275 ; XOPAVX1:       # %bb.0:
1276 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1277 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1]
1278 ; XOPAVX1-NEXT:    vprotb %xmm2, %xmm1, %xmm1
1279 ; XOPAVX1-NEXT:    vprotb %xmm2, %xmm0, %xmm0
1280 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1281 ; XOPAVX1-NEXT:    retq
1283 ; XOPAVX2-LABEL: constant_funnnel_v32i8:
1284 ; XOPAVX2:       # %bb.0:
1285 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1286 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1]
1287 ; XOPAVX2-NEXT:    vprotb %xmm2, %xmm1, %xmm1
1288 ; XOPAVX2-NEXT:    vprotb %xmm2, %xmm0, %xmm0
1289 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1290 ; XOPAVX2-NEXT:    retq
1291   %res = call <32 x i8> @llvm.fshl.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>)
1292   ret <32 x i8> %res
1296 ; Uniform Constant Shifts
1299 define <4 x i64> @splatconstant_funnnel_v4i64(<4 x i64> %x) nounwind {
1300 ; AVX1-LABEL: splatconstant_funnnel_v4i64:
1301 ; AVX1:       # %bb.0:
1302 ; AVX1-NEXT:    vpsrlq $50, %xmm0, %xmm1
1303 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1304 ; AVX1-NEXT:    vpsrlq $50, %xmm2, %xmm3
1305 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1306 ; AVX1-NEXT:    vpsllq $14, %xmm0, %xmm0
1307 ; AVX1-NEXT:    vpsllq $14, %xmm2, %xmm2
1308 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1309 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1310 ; AVX1-NEXT:    retq
1312 ; AVX2-LABEL: splatconstant_funnnel_v4i64:
1313 ; AVX2:       # %bb.0:
1314 ; AVX2-NEXT:    vpsrlq $50, %ymm0, %ymm1
1315 ; AVX2-NEXT:    vpsllq $14, %ymm0, %ymm0
1316 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1317 ; AVX2-NEXT:    retq
1319 ; AVX512F-LABEL: splatconstant_funnnel_v4i64:
1320 ; AVX512F:       # %bb.0:
1321 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1322 ; AVX512F-NEXT:    vprolq $14, %zmm0, %zmm0
1323 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1324 ; AVX512F-NEXT:    retq
1326 ; AVX512VL-LABEL: splatconstant_funnnel_v4i64:
1327 ; AVX512VL:       # %bb.0:
1328 ; AVX512VL-NEXT:    vprolq $14, %ymm0, %ymm0
1329 ; AVX512VL-NEXT:    retq
1331 ; AVX512BW-LABEL: splatconstant_funnnel_v4i64:
1332 ; AVX512BW:       # %bb.0:
1333 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1334 ; AVX512BW-NEXT:    vprolq $14, %zmm0, %zmm0
1335 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1336 ; AVX512BW-NEXT:    retq
1338 ; AVX512VLBW-LABEL: splatconstant_funnnel_v4i64:
1339 ; AVX512VLBW:       # %bb.0:
1340 ; AVX512VLBW-NEXT:    vprolq $14, %ymm0, %ymm0
1341 ; AVX512VLBW-NEXT:    retq
1343 ; XOPAVX1-LABEL: splatconstant_funnnel_v4i64:
1344 ; XOPAVX1:       # %bb.0:
1345 ; XOPAVX1-NEXT:    vprotq $14, %xmm0, %xmm1
1346 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1347 ; XOPAVX1-NEXT:    vprotq $14, %xmm0, %xmm0
1348 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1349 ; XOPAVX1-NEXT:    retq
1351 ; XOPAVX2-LABEL: splatconstant_funnnel_v4i64:
1352 ; XOPAVX2:       # %bb.0:
1353 ; XOPAVX2-NEXT:    vprotq $14, %xmm0, %xmm1
1354 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1355 ; XOPAVX2-NEXT:    vprotq $14, %xmm0, %xmm0
1356 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1357 ; XOPAVX2-NEXT:    retq
1358   %res = call <4 x i64> @llvm.fshl.v4i64(<4 x i64> %x, <4 x i64> %x, <4 x i64> <i64 14, i64 14, i64 14, i64 14>)
1359   ret <4 x i64> %res
1362 define <8 x i32> @splatconstant_funnnel_v8i32(<8 x i32> %x) nounwind {
1363 ; AVX1-LABEL: splatconstant_funnnel_v8i32:
1364 ; AVX1:       # %bb.0:
1365 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1366 ; AVX1-NEXT:    vpsrld $28, %xmm1, %xmm2
1367 ; AVX1-NEXT:    vpslld $4, %xmm1, %xmm1
1368 ; AVX1-NEXT:    vpor %xmm2, %xmm1, %xmm1
1369 ; AVX1-NEXT:    vpsrld $28, %xmm0, %xmm2
1370 ; AVX1-NEXT:    vpslld $4, %xmm0, %xmm0
1371 ; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
1372 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1373 ; AVX1-NEXT:    retq
1375 ; AVX2-LABEL: splatconstant_funnnel_v8i32:
1376 ; AVX2:       # %bb.0:
1377 ; AVX2-NEXT:    vpsrld $28, %ymm0, %ymm1
1378 ; AVX2-NEXT:    vpslld $4, %ymm0, %ymm0
1379 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1380 ; AVX2-NEXT:    retq
1382 ; AVX512F-LABEL: splatconstant_funnnel_v8i32:
1383 ; AVX512F:       # %bb.0:
1384 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1385 ; AVX512F-NEXT:    vprold $4, %zmm0, %zmm0
1386 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1387 ; AVX512F-NEXT:    retq
1389 ; AVX512VL-LABEL: splatconstant_funnnel_v8i32:
1390 ; AVX512VL:       # %bb.0:
1391 ; AVX512VL-NEXT:    vprold $4, %ymm0, %ymm0
1392 ; AVX512VL-NEXT:    retq
1394 ; AVX512BW-LABEL: splatconstant_funnnel_v8i32:
1395 ; AVX512BW:       # %bb.0:
1396 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1397 ; AVX512BW-NEXT:    vprold $4, %zmm0, %zmm0
1398 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1399 ; AVX512BW-NEXT:    retq
1401 ; AVX512VLBW-LABEL: splatconstant_funnnel_v8i32:
1402 ; AVX512VLBW:       # %bb.0:
1403 ; AVX512VLBW-NEXT:    vprold $4, %ymm0, %ymm0
1404 ; AVX512VLBW-NEXT:    retq
1406 ; XOPAVX1-LABEL: splatconstant_funnnel_v8i32:
1407 ; XOPAVX1:       # %bb.0:
1408 ; XOPAVX1-NEXT:    vprotd $4, %xmm0, %xmm1
1409 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1410 ; XOPAVX1-NEXT:    vprotd $4, %xmm0, %xmm0
1411 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1412 ; XOPAVX1-NEXT:    retq
1414 ; XOPAVX2-LABEL: splatconstant_funnnel_v8i32:
1415 ; XOPAVX2:       # %bb.0:
1416 ; XOPAVX2-NEXT:    vprotd $4, %xmm0, %xmm1
1417 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1418 ; XOPAVX2-NEXT:    vprotd $4, %xmm0, %xmm0
1419 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1420 ; XOPAVX2-NEXT:    retq
1421   %res = call <8 x i32> @llvm.fshl.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>)
1422   ret <8 x i32> %res
1425 define <16 x i16> @splatconstant_funnnel_v16i16(<16 x i16> %x) nounwind {
1426 ; AVX1-LABEL: splatconstant_funnnel_v16i16:
1427 ; AVX1:       # %bb.0:
1428 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1429 ; AVX1-NEXT:    vpsrlw $9, %xmm1, %xmm2
1430 ; AVX1-NEXT:    vpsllw $7, %xmm1, %xmm1
1431 ; AVX1-NEXT:    vpor %xmm2, %xmm1, %xmm1
1432 ; AVX1-NEXT:    vpsrlw $9, %xmm0, %xmm2
1433 ; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
1434 ; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
1435 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1436 ; AVX1-NEXT:    retq
1438 ; AVX2-LABEL: splatconstant_funnnel_v16i16:
1439 ; AVX2:       # %bb.0:
1440 ; AVX2-NEXT:    vpsrlw $9, %ymm0, %ymm1
1441 ; AVX2-NEXT:    vpsllw $7, %ymm0, %ymm0
1442 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1443 ; AVX2-NEXT:    retq
1445 ; AVX512-LABEL: splatconstant_funnnel_v16i16:
1446 ; AVX512:       # %bb.0:
1447 ; AVX512-NEXT:    vpsrlw $9, %ymm0, %ymm1
1448 ; AVX512-NEXT:    vpsllw $7, %ymm0, %ymm0
1449 ; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
1450 ; AVX512-NEXT:    retq
1452 ; XOPAVX1-LABEL: splatconstant_funnnel_v16i16:
1453 ; XOPAVX1:       # %bb.0:
1454 ; XOPAVX1-NEXT:    vprotw $7, %xmm0, %xmm1
1455 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1456 ; XOPAVX1-NEXT:    vprotw $7, %xmm0, %xmm0
1457 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1458 ; XOPAVX1-NEXT:    retq
1460 ; XOPAVX2-LABEL: splatconstant_funnnel_v16i16:
1461 ; XOPAVX2:       # %bb.0:
1462 ; XOPAVX2-NEXT:    vprotw $7, %xmm0, %xmm1
1463 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1464 ; XOPAVX2-NEXT:    vprotw $7, %xmm0, %xmm0
1465 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1466 ; XOPAVX2-NEXT:    retq
1467   %res = call <16 x i16> @llvm.fshl.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>)
1468   ret <16 x i16> %res
1471 define <32 x i8> @splatconstant_funnnel_v32i8(<32 x i8> %x) nounwind {
1472 ; AVX1-LABEL: splatconstant_funnnel_v32i8:
1473 ; AVX1:       # %bb.0:
1474 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1475 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm2
1476 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
1477 ; AVX1-NEXT:    vpandn %xmm2, %xmm3, %xmm2
1478 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1
1479 ; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
1480 ; AVX1-NEXT:    vpor %xmm2, %xmm1, %xmm1
1481 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm2
1482 ; AVX1-NEXT:    vpandn %xmm2, %xmm3, %xmm2
1483 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm0
1484 ; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
1485 ; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
1486 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1487 ; AVX1-NEXT:    retq
1489 ; AVX2-LABEL: splatconstant_funnnel_v32i8:
1490 ; AVX2:       # %bb.0:
1491 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm1
1492 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
1493 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm0
1494 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
1495 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1496 ; AVX2-NEXT:    retq
1498 ; AVX512-LABEL: splatconstant_funnnel_v32i8:
1499 ; AVX512:       # %bb.0:
1500 ; AVX512-NEXT:    vpsrlw $4, %ymm0, %ymm1
1501 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
1502 ; AVX512-NEXT:    vpsllw $4, %ymm0, %ymm0
1503 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
1504 ; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
1505 ; AVX512-NEXT:    retq
1507 ; XOPAVX1-LABEL: splatconstant_funnnel_v32i8:
1508 ; XOPAVX1:       # %bb.0:
1509 ; XOPAVX1-NEXT:    vprotb $4, %xmm0, %xmm1
1510 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1511 ; XOPAVX1-NEXT:    vprotb $4, %xmm0, %xmm0
1512 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1513 ; XOPAVX1-NEXT:    retq
1515 ; XOPAVX2-LABEL: splatconstant_funnnel_v32i8:
1516 ; XOPAVX2:       # %bb.0:
1517 ; XOPAVX2-NEXT:    vprotb $4, %xmm0, %xmm1
1518 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1519 ; XOPAVX2-NEXT:    vprotb $4, %xmm0, %xmm0
1520 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1521 ; XOPAVX2-NEXT:    retq
1522   %res = call <32 x i8> @llvm.fshl.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>)
1523   ret <32 x i8> %res