[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / X86 / vector-fshl-rot-256.ll
blobf2da60536167a2bf97b750f78188005499040cfd
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:    vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
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, %xmm1
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:    vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
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, %xmm1
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, %xmm1
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, %xmm1
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, %xmm1
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 %xmm4, %xmm4, %xmm4
797 ; AVX2-NEXT:    vpsllw %xmm2, %xmm4, %xmm2
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, %xmm4, %xmm1
805 ; AVX2-NEXT:    vpsrlw $8, %xmm1, %xmm1
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, %xmm1
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 %xmm4, %xmm4, %xmm4
818 ; AVX512F-NEXT:    vpsllw %xmm2, %xmm4, %xmm2
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, %xmm4, %xmm1
826 ; AVX512F-NEXT:    vpsrlw $8, %xmm1, %xmm1
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, %xmm1
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 %xmm4, %xmm4, %xmm4
839 ; AVX512VL-NEXT:    vpsllw %xmm2, %xmm4, %xmm2
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, %xmm4, %xmm1
847 ; AVX512VL-NEXT:    vpsrlw $8, %xmm1, %xmm1
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:    vbroadcasti128 {{.*#+}} ymm2 = [8192,24640,41088,57536,57344,41152,24704,8256,8192,24640,41088,57536,57344,41152,24704,8256]
1188 ; AVX2-NEXT:    # ymm2 = mem[0,1,0,1]
1189 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm1
1190 ; AVX2-NEXT:    vpsllw $2, %ymm1, %ymm3
1191 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
1192 ; AVX2-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
1193 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
1194 ; AVX2-NEXT:    vpaddb %ymm1, %ymm1, %ymm3
1195 ; AVX2-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
1196 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
1197 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1198 ; 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]
1199 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm3, %ymm3
1200 ; AVX2-NEXT:    vpsrlw $8, %ymm3, %ymm3
1201 ; 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]
1202 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
1203 ; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
1204 ; AVX2-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
1205 ; AVX2-NEXT:    vpor %ymm0, %ymm1, %ymm0
1206 ; AVX2-NEXT:    retq
1208 ; AVX512F-LABEL: constant_funnnel_v32i8:
1209 ; AVX512F:       # %bb.0:
1210 ; AVX512F-NEXT:    vpsllw $4, %ymm0, %ymm1
1211 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
1212 ; AVX512F-NEXT:    vbroadcasti128 {{.*#+}} ymm2 = [8192,24640,41088,57536,57344,41152,24704,8256,8192,24640,41088,57536,57344,41152,24704,8256]
1213 ; AVX512F-NEXT:    # ymm2 = mem[0,1,0,1]
1214 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm1
1215 ; AVX512F-NEXT:    vpsllw $2, %ymm1, %ymm3
1216 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
1217 ; AVX512F-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
1218 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
1219 ; AVX512F-NEXT:    vpaddb %ymm1, %ymm1, %ymm3
1220 ; AVX512F-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
1221 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
1222 ; AVX512F-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1223 ; 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]
1224 ; AVX512F-NEXT:    vpmullw {{.*}}(%rip), %ymm3, %ymm3
1225 ; AVX512F-NEXT:    vpsrlw $8, %ymm3, %ymm3
1226 ; 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]
1227 ; AVX512F-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
1228 ; AVX512F-NEXT:    vpsrlw $8, %ymm0, %ymm0
1229 ; AVX512F-NEXT:    vpackuswb %ymm3, %ymm0, %ymm0
1230 ; AVX512F-NEXT:    vpor %ymm0, %ymm1, %ymm0
1231 ; AVX512F-NEXT:    retq
1233 ; AVX512VL-LABEL: constant_funnnel_v32i8:
1234 ; AVX512VL:       # %bb.0:
1235 ; AVX512VL-NEXT:    vpsllw $4, %ymm0, %ymm1
1236 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
1237 ; AVX512VL-NEXT:    vbroadcasti128 {{.*#+}} ymm2 = [8192,24640,41088,57536,57344,41152,24704,8256,8192,24640,41088,57536,57344,41152,24704,8256]
1238 ; AVX512VL-NEXT:    # ymm2 = mem[0,1,0,1]
1239 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm1
1240 ; AVX512VL-NEXT:    vpsllw $2, %ymm1, %ymm3
1241 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm3, %ymm3
1242 ; AVX512VL-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
1243 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
1244 ; AVX512VL-NEXT:    vpaddb %ymm1, %ymm1, %ymm3
1245 ; AVX512VL-NEXT:    vpaddb %ymm2, %ymm2, %ymm2
1246 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm3, %ymm1, %ymm1
1247 ; 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]
1248 ; AVX512VL-NEXT:    vpsrlw $8, %ymm2, %ymm2
1249 ; AVX512VL-NEXT:    vpmullw {{.*}}(%rip), %ymm2, %ymm2
1250 ; AVX512VL-NEXT:    vpsrlw $8, %ymm2, %ymm2
1251 ; 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]
1252 ; AVX512VL-NEXT:    vpsrlw $8, %ymm0, %ymm0
1253 ; AVX512VL-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
1254 ; AVX512VL-NEXT:    vpsrlw $8, %ymm0, %ymm0
1255 ; AVX512VL-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
1256 ; AVX512VL-NEXT:    vpor %ymm0, %ymm1, %ymm0
1257 ; AVX512VL-NEXT:    retq
1259 ; AVX512BW-LABEL: constant_funnnel_v32i8:
1260 ; AVX512BW:       # %bb.0:
1261 ; 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
1262 ; AVX512BW-NEXT:    vpsrlvw {{.*}}(%rip), %zmm0, %zmm1
1263 ; AVX512BW-NEXT:    vpsllvw {{.*}}(%rip), %zmm0, %zmm0
1264 ; AVX512BW-NEXT:    vporq %zmm1, %zmm0, %zmm0
1265 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
1266 ; AVX512BW-NEXT:    retq
1268 ; AVX512VLBW-LABEL: constant_funnnel_v32i8:
1269 ; AVX512VLBW:       # %bb.0:
1270 ; 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
1271 ; AVX512VLBW-NEXT:    vpsrlvw {{.*}}(%rip), %zmm0, %zmm1
1272 ; AVX512VLBW-NEXT:    vpsllvw {{.*}}(%rip), %zmm0, %zmm0
1273 ; AVX512VLBW-NEXT:    vporq %zmm1, %zmm0, %zmm0
1274 ; AVX512VLBW-NEXT:    vpmovwb %zmm0, %ymm0
1275 ; AVX512VLBW-NEXT:    retq
1277 ; XOPAVX1-LABEL: constant_funnnel_v32i8:
1278 ; XOPAVX1:       # %bb.0:
1279 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1280 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1]
1281 ; XOPAVX1-NEXT:    vprotb %xmm2, %xmm1, %xmm1
1282 ; XOPAVX1-NEXT:    vprotb %xmm2, %xmm0, %xmm0
1283 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1284 ; XOPAVX1-NEXT:    retq
1286 ; XOPAVX2-LABEL: constant_funnnel_v32i8:
1287 ; XOPAVX2:       # %bb.0:
1288 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1289 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1]
1290 ; XOPAVX2-NEXT:    vprotb %xmm2, %xmm1, %xmm1
1291 ; XOPAVX2-NEXT:    vprotb %xmm2, %xmm0, %xmm0
1292 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1293 ; XOPAVX2-NEXT:    retq
1294   %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>)
1295   ret <32 x i8> %res
1299 ; Uniform Constant Shifts
1302 define <4 x i64> @splatconstant_funnnel_v4i64(<4 x i64> %x) nounwind {
1303 ; AVX1-LABEL: splatconstant_funnnel_v4i64:
1304 ; AVX1:       # %bb.0:
1305 ; AVX1-NEXT:    vpsrlq $50, %xmm0, %xmm1
1306 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1307 ; AVX1-NEXT:    vpsrlq $50, %xmm2, %xmm3
1308 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1309 ; AVX1-NEXT:    vpsllq $14, %xmm0, %xmm0
1310 ; AVX1-NEXT:    vpsllq $14, %xmm2, %xmm2
1311 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1312 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1313 ; AVX1-NEXT:    retq
1315 ; AVX2-LABEL: splatconstant_funnnel_v4i64:
1316 ; AVX2:       # %bb.0:
1317 ; AVX2-NEXT:    vpsrlq $50, %ymm0, %ymm1
1318 ; AVX2-NEXT:    vpsllq $14, %ymm0, %ymm0
1319 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1320 ; AVX2-NEXT:    retq
1322 ; AVX512F-LABEL: splatconstant_funnnel_v4i64:
1323 ; AVX512F:       # %bb.0:
1324 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1325 ; AVX512F-NEXT:    vprolq $14, %zmm0, %zmm0
1326 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1327 ; AVX512F-NEXT:    retq
1329 ; AVX512VL-LABEL: splatconstant_funnnel_v4i64:
1330 ; AVX512VL:       # %bb.0:
1331 ; AVX512VL-NEXT:    vprolq $14, %ymm0, %ymm0
1332 ; AVX512VL-NEXT:    retq
1334 ; AVX512BW-LABEL: splatconstant_funnnel_v4i64:
1335 ; AVX512BW:       # %bb.0:
1336 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1337 ; AVX512BW-NEXT:    vprolq $14, %zmm0, %zmm0
1338 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1339 ; AVX512BW-NEXT:    retq
1341 ; AVX512VLBW-LABEL: splatconstant_funnnel_v4i64:
1342 ; AVX512VLBW:       # %bb.0:
1343 ; AVX512VLBW-NEXT:    vprolq $14, %ymm0, %ymm0
1344 ; AVX512VLBW-NEXT:    retq
1346 ; XOPAVX1-LABEL: splatconstant_funnnel_v4i64:
1347 ; XOPAVX1:       # %bb.0:
1348 ; XOPAVX1-NEXT:    vprotq $14, %xmm0, %xmm1
1349 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1350 ; XOPAVX1-NEXT:    vprotq $14, %xmm0, %xmm0
1351 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1352 ; XOPAVX1-NEXT:    retq
1354 ; XOPAVX2-LABEL: splatconstant_funnnel_v4i64:
1355 ; XOPAVX2:       # %bb.0:
1356 ; XOPAVX2-NEXT:    vprotq $14, %xmm0, %xmm1
1357 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1358 ; XOPAVX2-NEXT:    vprotq $14, %xmm0, %xmm0
1359 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1360 ; XOPAVX2-NEXT:    retq
1361   %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>)
1362   ret <4 x i64> %res
1365 define <8 x i32> @splatconstant_funnnel_v8i32(<8 x i32> %x) nounwind {
1366 ; AVX1-LABEL: splatconstant_funnnel_v8i32:
1367 ; AVX1:       # %bb.0:
1368 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1369 ; AVX1-NEXT:    vpsrld $28, %xmm1, %xmm2
1370 ; AVX1-NEXT:    vpslld $4, %xmm1, %xmm1
1371 ; AVX1-NEXT:    vpor %xmm2, %xmm1, %xmm1
1372 ; AVX1-NEXT:    vpsrld $28, %xmm0, %xmm2
1373 ; AVX1-NEXT:    vpslld $4, %xmm0, %xmm0
1374 ; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
1375 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1376 ; AVX1-NEXT:    retq
1378 ; AVX2-LABEL: splatconstant_funnnel_v8i32:
1379 ; AVX2:       # %bb.0:
1380 ; AVX2-NEXT:    vpsrld $28, %ymm0, %ymm1
1381 ; AVX2-NEXT:    vpslld $4, %ymm0, %ymm0
1382 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1383 ; AVX2-NEXT:    retq
1385 ; AVX512F-LABEL: splatconstant_funnnel_v8i32:
1386 ; AVX512F:       # %bb.0:
1387 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1388 ; AVX512F-NEXT:    vprold $4, %zmm0, %zmm0
1389 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1390 ; AVX512F-NEXT:    retq
1392 ; AVX512VL-LABEL: splatconstant_funnnel_v8i32:
1393 ; AVX512VL:       # %bb.0:
1394 ; AVX512VL-NEXT:    vprold $4, %ymm0, %ymm0
1395 ; AVX512VL-NEXT:    retq
1397 ; AVX512BW-LABEL: splatconstant_funnnel_v8i32:
1398 ; AVX512BW:       # %bb.0:
1399 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1400 ; AVX512BW-NEXT:    vprold $4, %zmm0, %zmm0
1401 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0
1402 ; AVX512BW-NEXT:    retq
1404 ; AVX512VLBW-LABEL: splatconstant_funnnel_v8i32:
1405 ; AVX512VLBW:       # %bb.0:
1406 ; AVX512VLBW-NEXT:    vprold $4, %ymm0, %ymm0
1407 ; AVX512VLBW-NEXT:    retq
1409 ; XOPAVX1-LABEL: splatconstant_funnnel_v8i32:
1410 ; XOPAVX1:       # %bb.0:
1411 ; XOPAVX1-NEXT:    vprotd $4, %xmm0, %xmm1
1412 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1413 ; XOPAVX1-NEXT:    vprotd $4, %xmm0, %xmm0
1414 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1415 ; XOPAVX1-NEXT:    retq
1417 ; XOPAVX2-LABEL: splatconstant_funnnel_v8i32:
1418 ; XOPAVX2:       # %bb.0:
1419 ; XOPAVX2-NEXT:    vprotd $4, %xmm0, %xmm1
1420 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1421 ; XOPAVX2-NEXT:    vprotd $4, %xmm0, %xmm0
1422 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1423 ; XOPAVX2-NEXT:    retq
1424   %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>)
1425   ret <8 x i32> %res
1428 define <16 x i16> @splatconstant_funnnel_v16i16(<16 x i16> %x) nounwind {
1429 ; AVX1-LABEL: splatconstant_funnnel_v16i16:
1430 ; AVX1:       # %bb.0:
1431 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1432 ; AVX1-NEXT:    vpsrlw $9, %xmm1, %xmm2
1433 ; AVX1-NEXT:    vpsllw $7, %xmm1, %xmm1
1434 ; AVX1-NEXT:    vpor %xmm2, %xmm1, %xmm1
1435 ; AVX1-NEXT:    vpsrlw $9, %xmm0, %xmm2
1436 ; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
1437 ; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
1438 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1439 ; AVX1-NEXT:    retq
1441 ; AVX2-LABEL: splatconstant_funnnel_v16i16:
1442 ; AVX2:       # %bb.0:
1443 ; AVX2-NEXT:    vpsrlw $9, %ymm0, %ymm1
1444 ; AVX2-NEXT:    vpsllw $7, %ymm0, %ymm0
1445 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1446 ; AVX2-NEXT:    retq
1448 ; AVX512-LABEL: splatconstant_funnnel_v16i16:
1449 ; AVX512:       # %bb.0:
1450 ; AVX512-NEXT:    vpsrlw $9, %ymm0, %ymm1
1451 ; AVX512-NEXT:    vpsllw $7, %ymm0, %ymm0
1452 ; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
1453 ; AVX512-NEXT:    retq
1455 ; XOPAVX1-LABEL: splatconstant_funnnel_v16i16:
1456 ; XOPAVX1:       # %bb.0:
1457 ; XOPAVX1-NEXT:    vprotw $7, %xmm0, %xmm1
1458 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1459 ; XOPAVX1-NEXT:    vprotw $7, %xmm0, %xmm0
1460 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1461 ; XOPAVX1-NEXT:    retq
1463 ; XOPAVX2-LABEL: splatconstant_funnnel_v16i16:
1464 ; XOPAVX2:       # %bb.0:
1465 ; XOPAVX2-NEXT:    vprotw $7, %xmm0, %xmm1
1466 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1467 ; XOPAVX2-NEXT:    vprotw $7, %xmm0, %xmm0
1468 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1469 ; XOPAVX2-NEXT:    retq
1470   %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>)
1471   ret <16 x i16> %res
1474 define <32 x i8> @splatconstant_funnnel_v32i8(<32 x i8> %x) nounwind {
1475 ; AVX1-LABEL: splatconstant_funnnel_v32i8:
1476 ; AVX1:       # %bb.0:
1477 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1478 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm2
1479 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
1480 ; AVX1-NEXT:    vpandn %xmm2, %xmm3, %xmm2
1481 ; AVX1-NEXT:    vpsllw $4, %xmm1, %xmm1
1482 ; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
1483 ; AVX1-NEXT:    vpor %xmm2, %xmm1, %xmm1
1484 ; AVX1-NEXT:    vpsrlw $4, %xmm0, %xmm2
1485 ; AVX1-NEXT:    vpandn %xmm2, %xmm3, %xmm2
1486 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm0
1487 ; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
1488 ; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
1489 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1490 ; AVX1-NEXT:    retq
1492 ; AVX2-LABEL: splatconstant_funnnel_v32i8:
1493 ; AVX2:       # %bb.0:
1494 ; AVX2-NEXT:    vpsrlw $4, %ymm0, %ymm1
1495 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
1496 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm0
1497 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
1498 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1499 ; AVX2-NEXT:    retq
1501 ; AVX512-LABEL: splatconstant_funnnel_v32i8:
1502 ; AVX512:       # %bb.0:
1503 ; AVX512-NEXT:    vpsrlw $4, %ymm0, %ymm1
1504 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
1505 ; AVX512-NEXT:    vpsllw $4, %ymm0, %ymm0
1506 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
1507 ; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
1508 ; AVX512-NEXT:    retq
1510 ; XOPAVX1-LABEL: splatconstant_funnnel_v32i8:
1511 ; XOPAVX1:       # %bb.0:
1512 ; XOPAVX1-NEXT:    vprotb $4, %xmm0, %xmm1
1513 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1514 ; XOPAVX1-NEXT:    vprotb $4, %xmm0, %xmm0
1515 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1516 ; XOPAVX1-NEXT:    retq
1518 ; XOPAVX2-LABEL: splatconstant_funnnel_v32i8:
1519 ; XOPAVX2:       # %bb.0:
1520 ; XOPAVX2-NEXT:    vprotb $4, %xmm0, %xmm1
1521 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1522 ; XOPAVX2-NEXT:    vprotb $4, %xmm0, %xmm0
1523 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1524 ; XOPAVX2-NEXT:    retq
1525   %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>)
1526   ret <32 x i8> %res