Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / X86 / vector-fshl-256.ll
blob0133d9acca76e0bcead749c9ab9146ea30c42056
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,+avx512vbmi2 | FileCheck %s --check-prefixes=AVX512,AVX512VBMI2
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VLBW
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vbmi2,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VLVBMI2
10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefixes=XOP,XOPAVX1
11 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefixes=XOP,XOPAVX2
13 declare <4 x i64> @llvm.fshl.v4i64(<4 x i64>, <4 x i64>, <4 x i64>)
14 declare <8 x i32> @llvm.fshl.v8i32(<8 x i32>, <8 x i32>, <8 x i32>)
15 declare <16 x i16> @llvm.fshl.v16i16(<16 x i16>, <16 x i16>, <16 x i16>)
16 declare <32 x i8> @llvm.fshl.v32i8(<32 x i8>, <32 x i8>, <32 x i8>)
19 ; Variable Shifts
22 define <4 x i64> @var_funnnel_v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> %amt) nounwind {
23 ; AVX1-LABEL: var_funnnel_v4i64:
24 ; AVX1:       # %bb.0:
25 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
26 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
27 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
28 ; AVX1-NEXT:    vpsllq %xmm4, %xmm3, %xmm5
29 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm4[2,3,0,1]
30 ; AVX1-NEXT:    vpsllq %xmm6, %xmm3, %xmm3
31 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm5[0,1,2,3],xmm3[4,5,6,7]
32 ; AVX1-NEXT:    vpsllq %xmm2, %xmm0, %xmm5
33 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm2[2,3,0,1]
34 ; AVX1-NEXT:    vpsllq %xmm6, %xmm0, %xmm6
35 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm5 = xmm5[0,1,2,3],xmm6[4,5,6,7]
36 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm5, %ymm3
37 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm8 = [64,64]
38 ; AVX1-NEXT:    vpsubq %xmm4, %xmm8, %xmm6
39 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
40 ; AVX1-NEXT:    vpsrlq %xmm6, %xmm7, %xmm5
41 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm6[2,3,0,1]
42 ; AVX1-NEXT:    vpsrlq %xmm6, %xmm7, %xmm6
43 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm5 = xmm5[0,1,2,3],xmm6[4,5,6,7]
44 ; AVX1-NEXT:    vpsubq %xmm2, %xmm8, %xmm6
45 ; AVX1-NEXT:    vpsrlq %xmm6, %xmm1, %xmm7
46 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm6[2,3,0,1]
47 ; AVX1-NEXT:    vpsrlq %xmm6, %xmm1, %xmm1
48 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm7[0,1,2,3],xmm1[4,5,6,7]
49 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm1, %ymm1
50 ; AVX1-NEXT:    vorps %ymm1, %ymm3, %ymm1
51 ; AVX1-NEXT:    vxorps %xmm3, %xmm3, %xmm3
52 ; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm4, %xmm4
53 ; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm2, %xmm2
54 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
55 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
56 ; AVX1-NEXT:    retq
58 ; AVX2-LABEL: var_funnnel_v4i64:
59 ; AVX2:       # %bb.0:
60 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
61 ; AVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
62 ; AVX2-NEXT:    vpsllvq %ymm2, %ymm0, %ymm3
63 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [64,64,64,64]
64 ; AVX2-NEXT:    vpsubq %ymm2, %ymm4, %ymm4
65 ; AVX2-NEXT:    vpsrlvq %ymm4, %ymm1, %ymm1
66 ; AVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
67 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
68 ; AVX2-NEXT:    vpcmpeqq %ymm3, %ymm2, %ymm2
69 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
70 ; AVX2-NEXT:    retq
72 ; AVX512F-LABEL: var_funnnel_v4i64:
73 ; AVX512F:       # %bb.0:
74 ; AVX512F-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
75 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
76 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
77 ; AVX512F-NEXT:    vpand %ymm3, %ymm2, %ymm4
78 ; AVX512F-NEXT:    vpsllvq %ymm4, %ymm0, %ymm5
79 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm6 = [64,64,64,64]
80 ; AVX512F-NEXT:    vpsubq %ymm4, %ymm6, %ymm4
81 ; AVX512F-NEXT:    vpsrlvq %ymm4, %ymm1, %ymm1
82 ; AVX512F-NEXT:    vpor %ymm1, %ymm5, %ymm1
83 ; AVX512F-NEXT:    vptestnmq %zmm3, %zmm2, %k1
84 ; AVX512F-NEXT:    vmovdqa64 %zmm0, %zmm1 {%k1}
85 ; AVX512F-NEXT:    vmovdqa %ymm1, %ymm0
86 ; AVX512F-NEXT:    retq
88 ; AVX512VL-LABEL: var_funnnel_v4i64:
89 ; AVX512VL:       # %bb.0:
90 ; AVX512VL-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
91 ; AVX512VL-NEXT:    vpand %ymm3, %ymm2, %ymm4
92 ; AVX512VL-NEXT:    vpsllvq %ymm4, %ymm0, %ymm5
93 ; AVX512VL-NEXT:    vpbroadcastq {{.*#+}} ymm6 = [64,64,64,64]
94 ; AVX512VL-NEXT:    vpsubq %ymm4, %ymm6, %ymm4
95 ; AVX512VL-NEXT:    vpsrlvq %ymm4, %ymm1, %ymm1
96 ; AVX512VL-NEXT:    vpor %ymm1, %ymm5, %ymm1
97 ; AVX512VL-NEXT:    vptestnmq %ymm3, %ymm2, %k1
98 ; AVX512VL-NEXT:    vmovdqa64 %ymm0, %ymm1 {%k1}
99 ; AVX512VL-NEXT:    vmovdqa %ymm1, %ymm0
100 ; AVX512VL-NEXT:    retq
102 ; AVX512BW-LABEL: var_funnnel_v4i64:
103 ; AVX512BW:       # %bb.0:
104 ; AVX512BW-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
105 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
106 ; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
107 ; AVX512BW-NEXT:    vpand %ymm3, %ymm2, %ymm4
108 ; AVX512BW-NEXT:    vpsllvq %ymm4, %ymm0, %ymm5
109 ; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} ymm6 = [64,64,64,64]
110 ; AVX512BW-NEXT:    vpsubq %ymm4, %ymm6, %ymm4
111 ; AVX512BW-NEXT:    vpsrlvq %ymm4, %ymm1, %ymm1
112 ; AVX512BW-NEXT:    vpor %ymm1, %ymm5, %ymm1
113 ; AVX512BW-NEXT:    vptestnmq %zmm3, %zmm2, %k1
114 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, %zmm1 {%k1}
115 ; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm0
116 ; AVX512BW-NEXT:    retq
118 ; AVX512VBMI2-LABEL: var_funnnel_v4i64:
119 ; AVX512VBMI2:       # %bb.0:
120 ; AVX512VBMI2-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
121 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
122 ; AVX512VBMI2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
123 ; AVX512VBMI2-NEXT:    vpand %ymm3, %ymm2, %ymm4
124 ; AVX512VBMI2-NEXT:    vpsllvq %ymm4, %ymm0, %ymm5
125 ; AVX512VBMI2-NEXT:    vpbroadcastq {{.*#+}} ymm6 = [64,64,64,64]
126 ; AVX512VBMI2-NEXT:    vpsubq %ymm4, %ymm6, %ymm4
127 ; AVX512VBMI2-NEXT:    vpsrlvq %ymm4, %ymm1, %ymm1
128 ; AVX512VBMI2-NEXT:    vpor %ymm1, %ymm5, %ymm1
129 ; AVX512VBMI2-NEXT:    vptestnmq %zmm3, %zmm2, %k1
130 ; AVX512VBMI2-NEXT:    vmovdqa64 %zmm0, %zmm1 {%k1}
131 ; AVX512VBMI2-NEXT:    vmovdqa %ymm1, %ymm0
132 ; AVX512VBMI2-NEXT:    retq
134 ; AVX512VLBW-LABEL: var_funnnel_v4i64:
135 ; AVX512VLBW:       # %bb.0:
136 ; AVX512VLBW-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
137 ; AVX512VLBW-NEXT:    vpand %ymm3, %ymm2, %ymm4
138 ; AVX512VLBW-NEXT:    vpsllvq %ymm4, %ymm0, %ymm5
139 ; AVX512VLBW-NEXT:    vpbroadcastq {{.*#+}} ymm6 = [64,64,64,64]
140 ; AVX512VLBW-NEXT:    vpsubq %ymm4, %ymm6, %ymm4
141 ; AVX512VLBW-NEXT:    vpsrlvq %ymm4, %ymm1, %ymm1
142 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm5, %ymm1
143 ; AVX512VLBW-NEXT:    vptestnmq %ymm3, %ymm2, %k1
144 ; AVX512VLBW-NEXT:    vmovdqa64 %ymm0, %ymm1 {%k1}
145 ; AVX512VLBW-NEXT:    vmovdqa %ymm1, %ymm0
146 ; AVX512VLBW-NEXT:    retq
148 ; AVX512VLVBMI2-LABEL: var_funnnel_v4i64:
149 ; AVX512VLVBMI2:       # %bb.0:
150 ; AVX512VLVBMI2-NEXT:    vpshldvq %ymm2, %ymm1, %ymm0
151 ; AVX512VLVBMI2-NEXT:    retq
153 ; XOPAVX1-LABEL: var_funnnel_v4i64:
154 ; XOPAVX1:       # %bb.0:
155 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
156 ; XOPAVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
157 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
158 ; XOPAVX1-NEXT:    vpshlq %xmm4, %xmm3, %xmm3
159 ; XOPAVX1-NEXT:    vpshlq %xmm2, %xmm0, %xmm5
160 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm5, %ymm3
161 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [64,64]
162 ; XOPAVX1-NEXT:    vpsubq %xmm5, %xmm4, %xmm6
163 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
164 ; XOPAVX1-NEXT:    vpshlq %xmm6, %xmm7, %xmm6
165 ; XOPAVX1-NEXT:    vpsubq %xmm5, %xmm2, %xmm5
166 ; XOPAVX1-NEXT:    vpshlq %xmm5, %xmm1, %xmm1
167 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1
168 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm3, %ymm1
169 ; XOPAVX1-NEXT:    vxorps %xmm3, %xmm3, %xmm3
170 ; XOPAVX1-NEXT:    vpcomeqq %xmm3, %xmm4, %xmm4
171 ; XOPAVX1-NEXT:    vpcomeqq %xmm3, %xmm2, %xmm2
172 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
173 ; XOPAVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
174 ; XOPAVX1-NEXT:    retq
176 ; XOPAVX2-LABEL: var_funnnel_v4i64:
177 ; XOPAVX2:       # %bb.0:
178 ; XOPAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
179 ; XOPAVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
180 ; XOPAVX2-NEXT:    vpsllvq %ymm2, %ymm0, %ymm3
181 ; XOPAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [64,64,64,64]
182 ; XOPAVX2-NEXT:    vpsubq %ymm2, %ymm4, %ymm4
183 ; XOPAVX2-NEXT:    vpsrlvq %ymm4, %ymm1, %ymm1
184 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
185 ; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
186 ; XOPAVX2-NEXT:    vpcmpeqq %ymm3, %ymm2, %ymm2
187 ; XOPAVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
188 ; XOPAVX2-NEXT:    retq
189   %res = call <4 x i64> @llvm.fshl.v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> %amt)
190   ret <4 x i64> %res
193 define <8 x i32> @var_funnnel_v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i32> %amt) nounwind {
194 ; AVX1-LABEL: var_funnnel_v8i32:
195 ; AVX1:       # %bb.0:
196 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
197 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
198 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm8 = [32,32,32,32]
199 ; AVX1-NEXT:    vpsubd %xmm3, %xmm8, %xmm6
200 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm4 = xmm6[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
201 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
202 ; AVX1-NEXT:    vpsrld %xmm4, %xmm7, %xmm4
203 ; AVX1-NEXT:    vpsrlq $32, %xmm6, %xmm5
204 ; AVX1-NEXT:    vpsrld %xmm5, %xmm7, %xmm5
205 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm5 = xmm5[0,1,2,3],xmm4[4,5,6,7]
206 ; AVX1-NEXT:    vpxor %xmm9, %xmm9, %xmm9
207 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm4 = xmm6[2],xmm9[2],xmm6[3],xmm9[3]
208 ; AVX1-NEXT:    vpsrld %xmm4, %xmm7, %xmm4
209 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm6 = xmm6[0],zero,xmm6[1],zero
210 ; AVX1-NEXT:    vpsrld %xmm6, %xmm7, %xmm6
211 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm6[0,1,2,3],xmm4[4,5,6,7]
212 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7]
213 ; AVX1-NEXT:    vpsubd %xmm2, %xmm8, %xmm5
214 ; AVX1-NEXT:    vpsrldq {{.*#+}} xmm6 = xmm5[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
215 ; AVX1-NEXT:    vpsrld %xmm6, %xmm1, %xmm6
216 ; AVX1-NEXT:    vpsrlq $32, %xmm5, %xmm7
217 ; AVX1-NEXT:    vpsrld %xmm7, %xmm1, %xmm7
218 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm6 = xmm7[0,1,2,3],xmm6[4,5,6,7]
219 ; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm7 = xmm5[2],xmm9[2],xmm5[3],xmm9[3]
220 ; AVX1-NEXT:    vpsrld %xmm7, %xmm1, %xmm7
221 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm5 = xmm5[0],zero,xmm5[1],zero
222 ; AVX1-NEXT:    vpsrld %xmm5, %xmm1, %xmm1
223 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm7[4,5,6,7]
224 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm6[2,3],xmm1[4,5],xmm6[6,7]
225 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm1
226 ; AVX1-NEXT:    vpslld $23, %xmm3, %xmm4
227 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [1065353216,1065353216,1065353216,1065353216]
228 ; AVX1-NEXT:    vpaddd %xmm5, %xmm4, %xmm4
229 ; AVX1-NEXT:    vcvttps2dq %xmm4, %xmm4
230 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
231 ; AVX1-NEXT:    vpmulld %xmm4, %xmm6, %xmm4
232 ; AVX1-NEXT:    vpslld $23, %xmm2, %xmm6
233 ; AVX1-NEXT:    vpaddd %xmm5, %xmm6, %xmm5
234 ; AVX1-NEXT:    vcvttps2dq %xmm5, %xmm5
235 ; AVX1-NEXT:    vpmulld %xmm5, %xmm0, %xmm5
236 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm5, %ymm4
237 ; AVX1-NEXT:    vorps %ymm1, %ymm4, %ymm1
238 ; AVX1-NEXT:    vpcmpeqd %xmm9, %xmm3, %xmm3
239 ; AVX1-NEXT:    vpcmpeqd %xmm9, %xmm2, %xmm2
240 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
241 ; AVX1-NEXT:    vblendvps %ymm2, %ymm0, %ymm1, %ymm0
242 ; AVX1-NEXT:    retq
244 ; AVX2-LABEL: var_funnnel_v8i32:
245 ; AVX2:       # %bb.0:
246 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
247 ; AVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
248 ; AVX2-NEXT:    vpsllvd %ymm2, %ymm0, %ymm3
249 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm4 = [32,32,32,32,32,32,32,32]
250 ; AVX2-NEXT:    vpsubd %ymm2, %ymm4, %ymm4
251 ; AVX2-NEXT:    vpsrlvd %ymm4, %ymm1, %ymm1
252 ; AVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
253 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
254 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm2, %ymm2
255 ; AVX2-NEXT:    vblendvps %ymm2, %ymm0, %ymm1, %ymm0
256 ; AVX2-NEXT:    retq
258 ; AVX512F-LABEL: var_funnnel_v8i32:
259 ; AVX512F:       # %bb.0:
260 ; AVX512F-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
261 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
262 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
263 ; AVX512F-NEXT:    vpand %ymm3, %ymm2, %ymm4
264 ; AVX512F-NEXT:    vpsllvd %ymm4, %ymm0, %ymm5
265 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm6 = [32,32,32,32,32,32,32,32]
266 ; AVX512F-NEXT:    vpsubd %ymm4, %ymm6, %ymm4
267 ; AVX512F-NEXT:    vpsrlvd %ymm4, %ymm1, %ymm1
268 ; AVX512F-NEXT:    vpor %ymm1, %ymm5, %ymm1
269 ; AVX512F-NEXT:    vptestnmd %zmm3, %zmm2, %k1
270 ; AVX512F-NEXT:    vmovdqa32 %zmm0, %zmm1 {%k1}
271 ; AVX512F-NEXT:    vmovdqa %ymm1, %ymm0
272 ; AVX512F-NEXT:    retq
274 ; AVX512VL-LABEL: var_funnnel_v8i32:
275 ; AVX512VL:       # %bb.0:
276 ; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
277 ; AVX512VL-NEXT:    vpand %ymm3, %ymm2, %ymm4
278 ; AVX512VL-NEXT:    vpsllvd %ymm4, %ymm0, %ymm5
279 ; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} ymm6 = [32,32,32,32,32,32,32,32]
280 ; AVX512VL-NEXT:    vpsubd %ymm4, %ymm6, %ymm4
281 ; AVX512VL-NEXT:    vpsrlvd %ymm4, %ymm1, %ymm1
282 ; AVX512VL-NEXT:    vpor %ymm1, %ymm5, %ymm1
283 ; AVX512VL-NEXT:    vptestnmd %ymm3, %ymm2, %k1
284 ; AVX512VL-NEXT:    vmovdqa32 %ymm0, %ymm1 {%k1}
285 ; AVX512VL-NEXT:    vmovdqa %ymm1, %ymm0
286 ; AVX512VL-NEXT:    retq
288 ; AVX512BW-LABEL: var_funnnel_v8i32:
289 ; AVX512BW:       # %bb.0:
290 ; AVX512BW-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
291 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
292 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
293 ; AVX512BW-NEXT:    vpand %ymm3, %ymm2, %ymm4
294 ; AVX512BW-NEXT:    vpsllvd %ymm4, %ymm0, %ymm5
295 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} ymm6 = [32,32,32,32,32,32,32,32]
296 ; AVX512BW-NEXT:    vpsubd %ymm4, %ymm6, %ymm4
297 ; AVX512BW-NEXT:    vpsrlvd %ymm4, %ymm1, %ymm1
298 ; AVX512BW-NEXT:    vpor %ymm1, %ymm5, %ymm1
299 ; AVX512BW-NEXT:    vptestnmd %zmm3, %zmm2, %k1
300 ; AVX512BW-NEXT:    vmovdqa32 %zmm0, %zmm1 {%k1}
301 ; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm0
302 ; AVX512BW-NEXT:    retq
304 ; AVX512VBMI2-LABEL: var_funnnel_v8i32:
305 ; AVX512VBMI2:       # %bb.0:
306 ; AVX512VBMI2-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
307 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
308 ; AVX512VBMI2-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
309 ; AVX512VBMI2-NEXT:    vpand %ymm3, %ymm2, %ymm4
310 ; AVX512VBMI2-NEXT:    vpsllvd %ymm4, %ymm0, %ymm5
311 ; AVX512VBMI2-NEXT:    vpbroadcastd {{.*#+}} ymm6 = [32,32,32,32,32,32,32,32]
312 ; AVX512VBMI2-NEXT:    vpsubd %ymm4, %ymm6, %ymm4
313 ; AVX512VBMI2-NEXT:    vpsrlvd %ymm4, %ymm1, %ymm1
314 ; AVX512VBMI2-NEXT:    vpor %ymm1, %ymm5, %ymm1
315 ; AVX512VBMI2-NEXT:    vptestnmd %zmm3, %zmm2, %k1
316 ; AVX512VBMI2-NEXT:    vmovdqa32 %zmm0, %zmm1 {%k1}
317 ; AVX512VBMI2-NEXT:    vmovdqa %ymm1, %ymm0
318 ; AVX512VBMI2-NEXT:    retq
320 ; AVX512VLBW-LABEL: var_funnnel_v8i32:
321 ; AVX512VLBW:       # %bb.0:
322 ; AVX512VLBW-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
323 ; AVX512VLBW-NEXT:    vpand %ymm3, %ymm2, %ymm4
324 ; AVX512VLBW-NEXT:    vpsllvd %ymm4, %ymm0, %ymm5
325 ; AVX512VLBW-NEXT:    vpbroadcastd {{.*#+}} ymm6 = [32,32,32,32,32,32,32,32]
326 ; AVX512VLBW-NEXT:    vpsubd %ymm4, %ymm6, %ymm4
327 ; AVX512VLBW-NEXT:    vpsrlvd %ymm4, %ymm1, %ymm1
328 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm5, %ymm1
329 ; AVX512VLBW-NEXT:    vptestnmd %ymm3, %ymm2, %k1
330 ; AVX512VLBW-NEXT:    vmovdqa32 %ymm0, %ymm1 {%k1}
331 ; AVX512VLBW-NEXT:    vmovdqa %ymm1, %ymm0
332 ; AVX512VLBW-NEXT:    retq
334 ; AVX512VLVBMI2-LABEL: var_funnnel_v8i32:
335 ; AVX512VLVBMI2:       # %bb.0:
336 ; AVX512VLVBMI2-NEXT:    vpshldvd %ymm2, %ymm1, %ymm0
337 ; AVX512VLVBMI2-NEXT:    retq
339 ; XOPAVX1-LABEL: var_funnnel_v8i32:
340 ; XOPAVX1:       # %bb.0:
341 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
342 ; XOPAVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
343 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
344 ; XOPAVX1-NEXT:    vpshld %xmm4, %xmm3, %xmm3
345 ; XOPAVX1-NEXT:    vpshld %xmm2, %xmm0, %xmm5
346 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm5, %ymm3
347 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [32,32,32,32]
348 ; XOPAVX1-NEXT:    vpsubd %xmm5, %xmm4, %xmm6
349 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
350 ; XOPAVX1-NEXT:    vpshld %xmm6, %xmm7, %xmm6
351 ; XOPAVX1-NEXT:    vpsubd %xmm5, %xmm2, %xmm5
352 ; XOPAVX1-NEXT:    vpshld %xmm5, %xmm1, %xmm1
353 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1
354 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm3, %ymm1
355 ; XOPAVX1-NEXT:    vxorps %xmm3, %xmm3, %xmm3
356 ; XOPAVX1-NEXT:    vpcomeqd %xmm3, %xmm4, %xmm4
357 ; XOPAVX1-NEXT:    vpcomeqd %xmm3, %xmm2, %xmm2
358 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
359 ; XOPAVX1-NEXT:    vblendvps %ymm2, %ymm0, %ymm1, %ymm0
360 ; XOPAVX1-NEXT:    retq
362 ; XOPAVX2-LABEL: var_funnnel_v8i32:
363 ; XOPAVX2:       # %bb.0:
364 ; XOPAVX2-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
365 ; XOPAVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
366 ; XOPAVX2-NEXT:    vpsllvd %ymm2, %ymm0, %ymm3
367 ; XOPAVX2-NEXT:    vpbroadcastd {{.*#+}} ymm4 = [32,32,32,32,32,32,32,32]
368 ; XOPAVX2-NEXT:    vpsubd %ymm2, %ymm4, %ymm4
369 ; XOPAVX2-NEXT:    vpsrlvd %ymm4, %ymm1, %ymm1
370 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
371 ; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
372 ; XOPAVX2-NEXT:    vpcmpeqd %ymm3, %ymm2, %ymm2
373 ; XOPAVX2-NEXT:    vblendvps %ymm2, %ymm0, %ymm1, %ymm0
374 ; XOPAVX2-NEXT:    retq
375   %res = call <8 x i32> @llvm.fshl.v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i32> %amt)
376   ret <8 x i32> %res
379 define <16 x i16> @var_funnnel_v16i16(<16 x i16> %x, <16 x i16> %y, <16 x i16> %amt) nounwind {
380 ; AVX1-LABEL: var_funnnel_v16i16:
381 ; AVX1:       # %bb.0:
382 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
383 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
384 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm8 = [16,16,16,16,16,16,16,16]
385 ; AVX1-NEXT:    vpsubw %xmm3, %xmm8, %xmm5
386 ; AVX1-NEXT:    vpsllw $12, %xmm5, %xmm6
387 ; AVX1-NEXT:    vpsllw $4, %xmm5, %xmm5
388 ; AVX1-NEXT:    vpor %xmm6, %xmm5, %xmm5
389 ; AVX1-NEXT:    vpaddw %xmm5, %xmm5, %xmm6
390 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
391 ; AVX1-NEXT:    vpsrlw $8, %xmm7, %xmm4
392 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm4, %xmm7, %xmm4
393 ; AVX1-NEXT:    vpsrlw $4, %xmm4, %xmm5
394 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm4, %xmm4
395 ; AVX1-NEXT:    vpsrlw $2, %xmm4, %xmm5
396 ; AVX1-NEXT:    vpaddw %xmm6, %xmm6, %xmm6
397 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm4, %xmm4
398 ; AVX1-NEXT:    vpsrlw $1, %xmm4, %xmm5
399 ; AVX1-NEXT:    vpaddw %xmm6, %xmm6, %xmm6
400 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm4, %xmm4
401 ; AVX1-NEXT:    vpsubw %xmm2, %xmm8, %xmm5
402 ; AVX1-NEXT:    vpsllw $12, %xmm5, %xmm6
403 ; AVX1-NEXT:    vpsllw $4, %xmm5, %xmm5
404 ; AVX1-NEXT:    vpor %xmm6, %xmm5, %xmm5
405 ; AVX1-NEXT:    vpaddw %xmm5, %xmm5, %xmm6
406 ; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm7
407 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm7, %xmm1, %xmm1
408 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm5
409 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm1, %xmm1
410 ; AVX1-NEXT:    vpsrlw $2, %xmm1, %xmm5
411 ; AVX1-NEXT:    vpaddw %xmm6, %xmm6, %xmm6
412 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm1, %xmm1
413 ; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm5
414 ; AVX1-NEXT:    vpaddw %xmm6, %xmm6, %xmm6
415 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm1, %xmm1
416 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm8
417 ; AVX1-NEXT:    vpxor %xmm4, %xmm4, %xmm4
418 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm5 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
419 ; AVX1-NEXT:    vpslld $23, %xmm5, %xmm5
420 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [1065353216,1065353216,1065353216,1065353216]
421 ; AVX1-NEXT:    vpaddd %xmm6, %xmm5, %xmm5
422 ; AVX1-NEXT:    vcvttps2dq %xmm5, %xmm5
423 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm7 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero
424 ; AVX1-NEXT:    vpslld $23, %xmm7, %xmm7
425 ; AVX1-NEXT:    vpaddd %xmm6, %xmm7, %xmm7
426 ; AVX1-NEXT:    vcvttps2dq %xmm7, %xmm7
427 ; AVX1-NEXT:    vpackusdw %xmm5, %xmm7, %xmm5
428 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
429 ; AVX1-NEXT:    vpmullw %xmm5, %xmm7, %xmm5
430 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm7 = xmm2[4],xmm4[4],xmm2[5],xmm4[5],xmm2[6],xmm4[6],xmm2[7],xmm4[7]
431 ; AVX1-NEXT:    vpslld $23, %xmm7, %xmm7
432 ; AVX1-NEXT:    vpaddd %xmm6, %xmm7, %xmm7
433 ; AVX1-NEXT:    vcvttps2dq %xmm7, %xmm7
434 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm1 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero
435 ; AVX1-NEXT:    vpslld $23, %xmm1, %xmm1
436 ; AVX1-NEXT:    vpaddd %xmm6, %xmm1, %xmm1
437 ; AVX1-NEXT:    vcvttps2dq %xmm1, %xmm1
438 ; AVX1-NEXT:    vpackusdw %xmm7, %xmm1, %xmm1
439 ; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm1
440 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm1, %ymm1
441 ; AVX1-NEXT:    vorps %ymm8, %ymm1, %ymm1
442 ; AVX1-NEXT:    vpcmpeqw %xmm4, %xmm3, %xmm3
443 ; AVX1-NEXT:    vpcmpeqw %xmm4, %xmm2, %xmm2
444 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
445 ; AVX1-NEXT:    vandnps %ymm1, %ymm2, %ymm1
446 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
447 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
448 ; AVX1-NEXT:    retq
450 ; AVX2-LABEL: var_funnnel_v16i16:
451 ; AVX2:       # %bb.0:
452 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
453 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm4 = ymm3[4],ymm0[4],ymm3[5],ymm0[5],ymm3[6],ymm0[6],ymm3[7],ymm0[7],ymm3[12],ymm0[12],ymm3[13],ymm0[13],ymm3[14],ymm0[14],ymm3[15],ymm0[15]
454 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
455 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm5 = ymm2[4],ymm3[4],ymm2[5],ymm3[5],ymm2[6],ymm3[6],ymm2[7],ymm3[7],ymm2[12],ymm3[12],ymm2[13],ymm3[13],ymm2[14],ymm3[14],ymm2[15],ymm3[15]
456 ; AVX2-NEXT:    vpsllvd %ymm5, %ymm4, %ymm4
457 ; AVX2-NEXT:    vpsrld $16, %ymm4, %ymm4
458 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm5 = ymm3[0],ymm0[0],ymm3[1],ymm0[1],ymm3[2],ymm0[2],ymm3[3],ymm0[3],ymm3[8],ymm0[8],ymm3[9],ymm0[9],ymm3[10],ymm0[10],ymm3[11],ymm0[11]
459 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm6 = ymm2[0],ymm3[0],ymm2[1],ymm3[1],ymm2[2],ymm3[2],ymm2[3],ymm3[3],ymm2[8],ymm3[8],ymm2[9],ymm3[9],ymm2[10],ymm3[10],ymm2[11],ymm3[11]
460 ; AVX2-NEXT:    vpsllvd %ymm6, %ymm5, %ymm5
461 ; AVX2-NEXT:    vpsrld $16, %ymm5, %ymm5
462 ; AVX2-NEXT:    vpackusdw %ymm4, %ymm5, %ymm4
463 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm5 = ymm3[4],ymm1[4],ymm3[5],ymm1[5],ymm3[6],ymm1[6],ymm3[7],ymm1[7],ymm3[12],ymm1[12],ymm3[13],ymm1[13],ymm3[14],ymm1[14],ymm3[15],ymm1[15]
464 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm6 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
465 ; AVX2-NEXT:    vpsubw %ymm2, %ymm6, %ymm6
466 ; AVX2-NEXT:    vpunpckhwd {{.*#+}} ymm7 = ymm6[4],ymm3[4],ymm6[5],ymm3[5],ymm6[6],ymm3[6],ymm6[7],ymm3[7],ymm6[12],ymm3[12],ymm6[13],ymm3[13],ymm6[14],ymm3[14],ymm6[15],ymm3[15]
467 ; AVX2-NEXT:    vpsrlvd %ymm7, %ymm5, %ymm5
468 ; AVX2-NEXT:    vpsrld $16, %ymm5, %ymm5
469 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm1 = ymm3[0],ymm1[0],ymm3[1],ymm1[1],ymm3[2],ymm1[2],ymm3[3],ymm1[3],ymm3[8],ymm1[8],ymm3[9],ymm1[9],ymm3[10],ymm1[10],ymm3[11],ymm1[11]
470 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} ymm6 = ymm6[0],ymm3[0],ymm6[1],ymm3[1],ymm6[2],ymm3[2],ymm6[3],ymm3[3],ymm6[8],ymm3[8],ymm6[9],ymm3[9],ymm6[10],ymm3[10],ymm6[11],ymm3[11]
471 ; AVX2-NEXT:    vpsrlvd %ymm6, %ymm1, %ymm1
472 ; AVX2-NEXT:    vpsrld $16, %ymm1, %ymm1
473 ; AVX2-NEXT:    vpackusdw %ymm5, %ymm1, %ymm1
474 ; AVX2-NEXT:    vpor %ymm1, %ymm4, %ymm1
475 ; AVX2-NEXT:    vpcmpeqw %ymm3, %ymm2, %ymm2
476 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
477 ; AVX2-NEXT:    retq
479 ; AVX512F-LABEL: var_funnnel_v16i16:
480 ; AVX512F:       # %bb.0:
481 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm3 = 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
482 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
483 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm4 = ymm2[0],zero,ymm2[1],zero,ymm2[2],zero,ymm2[3],zero,ymm2[4],zero,ymm2[5],zero,ymm2[6],zero,ymm2[7],zero,ymm2[8],zero,ymm2[9],zero,ymm2[10],zero,ymm2[11],zero,ymm2[12],zero,ymm2[13],zero,ymm2[14],zero,ymm2[15],zero
484 ; AVX512F-NEXT:    vpsllvd %zmm4, %zmm3, %zmm3
485 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm4 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
486 ; AVX512F-NEXT:    vpsubw %ymm2, %ymm4, %ymm4
487 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm4 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero
488 ; 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
489 ; AVX512F-NEXT:    vpsrlvd %zmm4, %zmm1, %zmm1
490 ; AVX512F-NEXT:    vpord %zmm1, %zmm3, %zmm1
491 ; AVX512F-NEXT:    vpmovdw %zmm1, %ymm1
492 ; AVX512F-NEXT:    vpxor %xmm3, %xmm3, %xmm3
493 ; AVX512F-NEXT:    vpcmpeqw %ymm3, %ymm2, %ymm2
494 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
495 ; AVX512F-NEXT:    retq
497 ; AVX512VL-LABEL: var_funnnel_v16i16:
498 ; AVX512VL:       # %bb.0:
499 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm3 = 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
500 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
501 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm4 = ymm2[0],zero,ymm2[1],zero,ymm2[2],zero,ymm2[3],zero,ymm2[4],zero,ymm2[5],zero,ymm2[6],zero,ymm2[7],zero,ymm2[8],zero,ymm2[9],zero,ymm2[10],zero,ymm2[11],zero,ymm2[12],zero,ymm2[13],zero,ymm2[14],zero,ymm2[15],zero
502 ; AVX512VL-NEXT:    vpsllvd %zmm4, %zmm3, %zmm3
503 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm4 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
504 ; AVX512VL-NEXT:    vpsubw %ymm2, %ymm4, %ymm4
505 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm4 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero
506 ; 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
507 ; AVX512VL-NEXT:    vpsrlvd %zmm4, %zmm1, %zmm1
508 ; AVX512VL-NEXT:    vpord %zmm1, %zmm3, %zmm1
509 ; AVX512VL-NEXT:    vpmovdw %zmm1, %ymm1
510 ; AVX512VL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
511 ; AVX512VL-NEXT:    vpcmpeqw %ymm3, %ymm2, %ymm2
512 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
513 ; AVX512VL-NEXT:    retq
515 ; AVX512BW-LABEL: var_funnnel_v16i16:
516 ; AVX512BW:       # %bb.0:
517 ; AVX512BW-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
518 ; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
519 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
520 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
521 ; AVX512BW-NEXT:    vpand %ymm3, %ymm2, %ymm4
522 ; AVX512BW-NEXT:    vpsllvw %zmm4, %zmm0, %zmm5
523 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm6 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
524 ; AVX512BW-NEXT:    vpsubw %ymm4, %ymm6, %ymm4
525 ; AVX512BW-NEXT:    vpsrlvw %zmm4, %zmm1, %zmm1
526 ; AVX512BW-NEXT:    vpor %ymm1, %ymm5, %ymm1
527 ; AVX512BW-NEXT:    vptestnmw %zmm3, %zmm2, %k1
528 ; AVX512BW-NEXT:    vmovdqu16 %zmm0, %zmm1 {%k1}
529 ; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm0
530 ; AVX512BW-NEXT:    retq
532 ; AVX512VBMI2-LABEL: var_funnnel_v16i16:
533 ; AVX512VBMI2:       # %bb.0:
534 ; AVX512VBMI2-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
535 ; AVX512VBMI2-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
536 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
537 ; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
538 ; AVX512VBMI2-NEXT:    vpand %ymm3, %ymm2, %ymm4
539 ; AVX512VBMI2-NEXT:    vpsllvw %zmm4, %zmm0, %zmm5
540 ; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} ymm6 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
541 ; AVX512VBMI2-NEXT:    vpsubw %ymm4, %ymm6, %ymm4
542 ; AVX512VBMI2-NEXT:    vpsrlvw %zmm4, %zmm1, %zmm1
543 ; AVX512VBMI2-NEXT:    vpor %ymm1, %ymm5, %ymm1
544 ; AVX512VBMI2-NEXT:    vptestnmw %zmm3, %zmm2, %k1
545 ; AVX512VBMI2-NEXT:    vmovdqu16 %zmm0, %zmm1 {%k1}
546 ; AVX512VBMI2-NEXT:    vmovdqa %ymm1, %ymm0
547 ; AVX512VBMI2-NEXT:    retq
549 ; AVX512VLBW-LABEL: var_funnnel_v16i16:
550 ; AVX512VLBW:       # %bb.0:
551 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
552 ; AVX512VLBW-NEXT:    vpand %ymm3, %ymm2, %ymm4
553 ; AVX512VLBW-NEXT:    vpsllvw %ymm4, %ymm0, %ymm5
554 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} ymm6 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
555 ; AVX512VLBW-NEXT:    vpsubw %ymm4, %ymm6, %ymm4
556 ; AVX512VLBW-NEXT:    vpsrlvw %ymm4, %ymm1, %ymm1
557 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm5, %ymm1
558 ; AVX512VLBW-NEXT:    vptestnmw %ymm3, %ymm2, %k1
559 ; AVX512VLBW-NEXT:    vmovdqu16 %ymm0, %ymm1 {%k1}
560 ; AVX512VLBW-NEXT:    vmovdqa %ymm1, %ymm0
561 ; AVX512VLBW-NEXT:    retq
563 ; AVX512VLVBMI2-LABEL: var_funnnel_v16i16:
564 ; AVX512VLVBMI2:       # %bb.0:
565 ; AVX512VLVBMI2-NEXT:    vpshldvw %ymm2, %ymm1, %ymm0
566 ; AVX512VLVBMI2-NEXT:    retq
568 ; XOPAVX1-LABEL: var_funnnel_v16i16:
569 ; XOPAVX1:       # %bb.0:
570 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
571 ; XOPAVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
572 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
573 ; XOPAVX1-NEXT:    vpshlw %xmm4, %xmm3, %xmm3
574 ; XOPAVX1-NEXT:    vpshlw %xmm2, %xmm0, %xmm5
575 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm5, %ymm3
576 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [16,16,16,16,16,16,16,16]
577 ; XOPAVX1-NEXT:    vpsubw %xmm5, %xmm4, %xmm6
578 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
579 ; XOPAVX1-NEXT:    vpshlw %xmm6, %xmm7, %xmm6
580 ; XOPAVX1-NEXT:    vpsubw %xmm5, %xmm2, %xmm5
581 ; XOPAVX1-NEXT:    vpshlw %xmm5, %xmm1, %xmm1
582 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1
583 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm3, %ymm1
584 ; XOPAVX1-NEXT:    vxorps %xmm3, %xmm3, %xmm3
585 ; XOPAVX1-NEXT:    vpcomeqw %xmm3, %xmm4, %xmm4
586 ; XOPAVX1-NEXT:    vpcomeqw %xmm3, %xmm2, %xmm2
587 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
588 ; XOPAVX1-NEXT:    vpcmov %ymm2, %ymm1, %ymm0, %ymm0
589 ; XOPAVX1-NEXT:    retq
591 ; XOPAVX2-LABEL: var_funnnel_v16i16:
592 ; XOPAVX2:       # %bb.0:
593 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
594 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
595 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm2, %xmm4
596 ; XOPAVX2-NEXT:    vpshlw %xmm4, %xmm3, %xmm3
597 ; XOPAVX2-NEXT:    vpshlw %xmm2, %xmm0, %xmm4
598 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm3, %ymm4, %ymm3
599 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
600 ; XOPAVX2-NEXT:    vpsubw %ymm2, %ymm4, %ymm4
601 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm4, %xmm5
602 ; XOPAVX2-NEXT:    vpxor %xmm6, %xmm6, %xmm6
603 ; XOPAVX2-NEXT:    vpsubw %xmm5, %xmm6, %xmm5
604 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm7
605 ; XOPAVX2-NEXT:    vpshlw %xmm5, %xmm7, %xmm5
606 ; XOPAVX2-NEXT:    vpsubw %xmm4, %xmm6, %xmm4
607 ; XOPAVX2-NEXT:    vpshlw %xmm4, %xmm1, %xmm1
608 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm5, %ymm1, %ymm1
609 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
610 ; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
611 ; XOPAVX2-NEXT:    vpcmpeqw %ymm3, %ymm2, %ymm2
612 ; XOPAVX2-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
613 ; XOPAVX2-NEXT:    retq
614   %res = call <16 x i16> @llvm.fshl.v16i16(<16 x i16> %x, <16 x i16> %y, <16 x i16> %amt)
615   ret <16 x i16> %res
618 define <32 x i8> @var_funnnel_v32i8(<32 x i8> %x, <32 x i8> %y, <32 x i8> %amt) nounwind {
619 ; AVX1-LABEL: var_funnnel_v32i8:
620 ; AVX1:       # %bb.0:
621 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
622 ; AVX1-NEXT:    vpsrlw $4, %xmm4, %xmm3
623 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm8 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
624 ; AVX1-NEXT:    vpand %xmm8, %xmm3, %xmm6
625 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
626 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
627 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm9 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
628 ; AVX1-NEXT:    vpsubb %xmm3, %xmm9, %xmm5
629 ; AVX1-NEXT:    vpsllw $5, %xmm5, %xmm5
630 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm6, %xmm4, %xmm4
631 ; AVX1-NEXT:    vpsrlw $2, %xmm4, %xmm6
632 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm10 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
633 ; AVX1-NEXT:    vpand %xmm10, %xmm6, %xmm6
634 ; AVX1-NEXT:    vpaddb %xmm5, %xmm5, %xmm5
635 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm6, %xmm4, %xmm4
636 ; AVX1-NEXT:    vpsrlw $1, %xmm4, %xmm6
637 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
638 ; AVX1-NEXT:    vpand %xmm7, %xmm6, %xmm6
639 ; AVX1-NEXT:    vpaddb %xmm5, %xmm5, %xmm5
640 ; AVX1-NEXT:    vpblendvb %xmm5, %xmm6, %xmm4, %xmm4
641 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm5
642 ; AVX1-NEXT:    vpand %xmm8, %xmm5, %xmm5
643 ; AVX1-NEXT:    vpsubb %xmm2, %xmm9, %xmm6
644 ; AVX1-NEXT:    vpsllw $5, %xmm6, %xmm6
645 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm1, %xmm1
646 ; AVX1-NEXT:    vpsrlw $2, %xmm1, %xmm5
647 ; AVX1-NEXT:    vpand %xmm10, %xmm5, %xmm5
648 ; AVX1-NEXT:    vpaddb %xmm6, %xmm6, %xmm6
649 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm1, %xmm1
650 ; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm5
651 ; AVX1-NEXT:    vpand %xmm7, %xmm5, %xmm5
652 ; AVX1-NEXT:    vpaddb %xmm6, %xmm6, %xmm6
653 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm1, %xmm1
654 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm8
655 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
656 ; AVX1-NEXT:    vpsllw $4, %xmm4, %xmm5
657 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
658 ; AVX1-NEXT:    vpand %xmm6, %xmm5, %xmm5
659 ; AVX1-NEXT:    vpsllw $5, %xmm3, %xmm7
660 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm5, %xmm4, %xmm4
661 ; AVX1-NEXT:    vpsllw $2, %xmm4, %xmm5
662 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
663 ; AVX1-NEXT:    vpand %xmm1, %xmm5, %xmm5
664 ; AVX1-NEXT:    vpaddb %xmm7, %xmm7, %xmm7
665 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm5, %xmm4, %xmm4
666 ; AVX1-NEXT:    vpaddb %xmm4, %xmm4, %xmm5
667 ; AVX1-NEXT:    vpaddb %xmm7, %xmm7, %xmm7
668 ; AVX1-NEXT:    vpblendvb %xmm7, %xmm5, %xmm4, %xmm4
669 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm5
670 ; AVX1-NEXT:    vpand %xmm6, %xmm5, %xmm5
671 ; AVX1-NEXT:    vpsllw $5, %xmm2, %xmm6
672 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm0, %xmm5
673 ; AVX1-NEXT:    vpsllw $2, %xmm5, %xmm7
674 ; AVX1-NEXT:    vpand %xmm1, %xmm7, %xmm1
675 ; AVX1-NEXT:    vpaddb %xmm6, %xmm6, %xmm6
676 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm1, %xmm5, %xmm1
677 ; AVX1-NEXT:    vpaddb %xmm1, %xmm1, %xmm5
678 ; AVX1-NEXT:    vpaddb %xmm6, %xmm6, %xmm6
679 ; AVX1-NEXT:    vpblendvb %xmm6, %xmm5, %xmm1, %xmm1
680 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm1, %ymm1
681 ; AVX1-NEXT:    vorps %ymm8, %ymm1, %ymm1
682 ; AVX1-NEXT:    vpxor %xmm4, %xmm4, %xmm4
683 ; AVX1-NEXT:    vpcmpeqb %xmm4, %xmm3, %xmm3
684 ; AVX1-NEXT:    vpcmpeqb %xmm4, %xmm2, %xmm2
685 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
686 ; AVX1-NEXT:    vandnps %ymm1, %ymm2, %ymm1
687 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
688 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
689 ; AVX1-NEXT:    retq
691 ; AVX2-LABEL: var_funnnel_v32i8:
692 ; AVX2:       # %bb.0:
693 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
694 ; AVX2-NEXT:    vpsllw $5, %ymm2, %ymm3
695 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm4
696 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
697 ; AVX2-NEXT:    vpblendvb %ymm3, %ymm4, %ymm0, %ymm4
698 ; AVX2-NEXT:    vpsllw $2, %ymm4, %ymm5
699 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm5, %ymm5
700 ; AVX2-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
701 ; AVX2-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm4
702 ; AVX2-NEXT:    vpaddb %ymm4, %ymm4, %ymm5
703 ; AVX2-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
704 ; AVX2-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm3
705 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
706 ; AVX2-NEXT:    vpsubb %ymm2, %ymm4, %ymm4
707 ; AVX2-NEXT:    vpsllw $5, %ymm4, %ymm4
708 ; AVX2-NEXT:    vpaddb %ymm4, %ymm4, %ymm5
709 ; AVX2-NEXT:    vpsrlw $4, %ymm1, %ymm6
710 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm6, %ymm6
711 ; AVX2-NEXT:    vpblendvb %ymm4, %ymm6, %ymm1, %ymm1
712 ; AVX2-NEXT:    vpsrlw $2, %ymm1, %ymm4
713 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
714 ; AVX2-NEXT:    vpblendvb %ymm5, %ymm4, %ymm1, %ymm1
715 ; AVX2-NEXT:    vpsrlw $1, %ymm1, %ymm4
716 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
717 ; AVX2-NEXT:    vpaddb %ymm5, %ymm5, %ymm5
718 ; AVX2-NEXT:    vpblendvb %ymm5, %ymm4, %ymm1, %ymm1
719 ; AVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
720 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
721 ; AVX2-NEXT:    vpcmpeqb %ymm3, %ymm2, %ymm2
722 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
723 ; AVX2-NEXT:    retq
725 ; AVX512F-LABEL: var_funnnel_v32i8:
726 ; AVX512F:       # %bb.0:
727 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
728 ; AVX512F-NEXT:    vpsllw $5, %ymm2, %ymm3
729 ; AVX512F-NEXT:    vpsllw $4, %ymm0, %ymm4
730 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
731 ; AVX512F-NEXT:    vpblendvb %ymm3, %ymm4, %ymm0, %ymm4
732 ; AVX512F-NEXT:    vpsllw $2, %ymm4, %ymm5
733 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm5, %ymm5
734 ; AVX512F-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
735 ; AVX512F-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm4
736 ; AVX512F-NEXT:    vpaddb %ymm4, %ymm4, %ymm5
737 ; AVX512F-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
738 ; AVX512F-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm3
739 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
740 ; AVX512F-NEXT:    vpsubb %ymm2, %ymm4, %ymm4
741 ; AVX512F-NEXT:    vpsllw $5, %ymm4, %ymm4
742 ; AVX512F-NEXT:    vpaddb %ymm4, %ymm4, %ymm5
743 ; AVX512F-NEXT:    vpsrlw $4, %ymm1, %ymm6
744 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm6, %ymm6
745 ; AVX512F-NEXT:    vpblendvb %ymm4, %ymm6, %ymm1, %ymm1
746 ; AVX512F-NEXT:    vpsrlw $2, %ymm1, %ymm4
747 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
748 ; AVX512F-NEXT:    vpblendvb %ymm5, %ymm4, %ymm1, %ymm1
749 ; AVX512F-NEXT:    vpsrlw $1, %ymm1, %ymm4
750 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
751 ; AVX512F-NEXT:    vpaddb %ymm5, %ymm5, %ymm5
752 ; AVX512F-NEXT:    vpblendvb %ymm5, %ymm4, %ymm1, %ymm1
753 ; AVX512F-NEXT:    vpor %ymm1, %ymm3, %ymm1
754 ; AVX512F-NEXT:    vpxor %xmm3, %xmm3, %xmm3
755 ; AVX512F-NEXT:    vpcmpeqb %ymm3, %ymm2, %ymm2
756 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
757 ; AVX512F-NEXT:    retq
759 ; AVX512VL-LABEL: var_funnnel_v32i8:
760 ; AVX512VL:       # %bb.0:
761 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
762 ; AVX512VL-NEXT:    vpsllw $5, %ymm2, %ymm3
763 ; AVX512VL-NEXT:    vpsllw $4, %ymm0, %ymm4
764 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
765 ; AVX512VL-NEXT:    vpblendvb %ymm3, %ymm4, %ymm0, %ymm4
766 ; AVX512VL-NEXT:    vpsllw $2, %ymm4, %ymm5
767 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm5, %ymm5
768 ; AVX512VL-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
769 ; AVX512VL-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm4
770 ; AVX512VL-NEXT:    vpaddb %ymm4, %ymm4, %ymm5
771 ; AVX512VL-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
772 ; AVX512VL-NEXT:    vpblendvb %ymm3, %ymm5, %ymm4, %ymm3
773 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
774 ; AVX512VL-NEXT:    vpsubb %ymm2, %ymm4, %ymm4
775 ; AVX512VL-NEXT:    vpsllw $5, %ymm4, %ymm4
776 ; AVX512VL-NEXT:    vpaddb %ymm4, %ymm4, %ymm5
777 ; AVX512VL-NEXT:    vpsrlw $4, %ymm1, %ymm6
778 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm6, %ymm6
779 ; AVX512VL-NEXT:    vpblendvb %ymm4, %ymm6, %ymm1, %ymm1
780 ; AVX512VL-NEXT:    vpsrlw $2, %ymm1, %ymm4
781 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
782 ; AVX512VL-NEXT:    vpblendvb %ymm5, %ymm4, %ymm1, %ymm1
783 ; AVX512VL-NEXT:    vpsrlw $1, %ymm1, %ymm4
784 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
785 ; AVX512VL-NEXT:    vpaddb %ymm5, %ymm5, %ymm5
786 ; AVX512VL-NEXT:    vpblendvb %ymm5, %ymm4, %ymm1, %ymm1
787 ; AVX512VL-NEXT:    vpor %ymm1, %ymm3, %ymm1
788 ; AVX512VL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
789 ; AVX512VL-NEXT:    vpcmpeqb %ymm3, %ymm2, %ymm2
790 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
791 ; AVX512VL-NEXT:    retq
793 ; AVX512BW-LABEL: var_funnnel_v32i8:
794 ; AVX512BW:       # %bb.0:
795 ; AVX512BW-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
796 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
797 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
798 ; AVX512BW-NEXT:    vpand %ymm3, %ymm2, %ymm4
799 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm5 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero,ymm4[16],zero,ymm4[17],zero,ymm4[18],zero,ymm4[19],zero,ymm4[20],zero,ymm4[21],zero,ymm4[22],zero,ymm4[23],zero,ymm4[24],zero,ymm4[25],zero,ymm4[26],zero,ymm4[27],zero,ymm4[28],zero,ymm4[29],zero,ymm4[30],zero,ymm4[31],zero
800 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm6 = 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
801 ; AVX512BW-NEXT:    vpsllvw %zmm5, %zmm6, %zmm5
802 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm6 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
803 ; AVX512BW-NEXT:    vpsubb %ymm4, %ymm6, %ymm4
804 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm4 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero,ymm4[16],zero,ymm4[17],zero,ymm4[18],zero,ymm4[19],zero,ymm4[20],zero,ymm4[21],zero,ymm4[22],zero,ymm4[23],zero,ymm4[24],zero,ymm4[25],zero,ymm4[26],zero,ymm4[27],zero,ymm4[28],zero,ymm4[29],zero,ymm4[30],zero,ymm4[31],zero
805 ; 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
806 ; AVX512BW-NEXT:    vpsrlvw %zmm4, %zmm1, %zmm1
807 ; AVX512BW-NEXT:    vporq %zmm1, %zmm5, %zmm1
808 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
809 ; AVX512BW-NEXT:    vptestnmb %zmm3, %zmm2, %k1
810 ; AVX512BW-NEXT:    vmovdqu8 %zmm0, %zmm1 {%k1}
811 ; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm0
812 ; AVX512BW-NEXT:    retq
814 ; AVX512VBMI2-LABEL: var_funnnel_v32i8:
815 ; AVX512VBMI2:       # %bb.0:
816 ; AVX512VBMI2-NEXT:    # kill: def $ymm2 killed $ymm2 def $zmm2
817 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
818 ; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} ymm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
819 ; AVX512VBMI2-NEXT:    vpand %ymm3, %ymm2, %ymm4
820 ; AVX512VBMI2-NEXT:    vpmovzxbw {{.*#+}} zmm5 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero,ymm4[16],zero,ymm4[17],zero,ymm4[18],zero,ymm4[19],zero,ymm4[20],zero,ymm4[21],zero,ymm4[22],zero,ymm4[23],zero,ymm4[24],zero,ymm4[25],zero,ymm4[26],zero,ymm4[27],zero,ymm4[28],zero,ymm4[29],zero,ymm4[30],zero,ymm4[31],zero
821 ; AVX512VBMI2-NEXT:    vpmovzxbw {{.*#+}} zmm6 = 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
822 ; AVX512VBMI2-NEXT:    vpsllvw %zmm5, %zmm6, %zmm5
823 ; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} ymm6 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
824 ; AVX512VBMI2-NEXT:    vpsubb %ymm4, %ymm6, %ymm4
825 ; AVX512VBMI2-NEXT:    vpmovzxbw {{.*#+}} zmm4 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero,ymm4[16],zero,ymm4[17],zero,ymm4[18],zero,ymm4[19],zero,ymm4[20],zero,ymm4[21],zero,ymm4[22],zero,ymm4[23],zero,ymm4[24],zero,ymm4[25],zero,ymm4[26],zero,ymm4[27],zero,ymm4[28],zero,ymm4[29],zero,ymm4[30],zero,ymm4[31],zero
826 ; AVX512VBMI2-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
827 ; AVX512VBMI2-NEXT:    vpsrlvw %zmm4, %zmm1, %zmm1
828 ; AVX512VBMI2-NEXT:    vporq %zmm1, %zmm5, %zmm1
829 ; AVX512VBMI2-NEXT:    vpmovwb %zmm1, %ymm1
830 ; AVX512VBMI2-NEXT:    vptestnmb %zmm3, %zmm2, %k1
831 ; AVX512VBMI2-NEXT:    vmovdqu8 %zmm0, %zmm1 {%k1}
832 ; AVX512VBMI2-NEXT:    vmovdqa %ymm1, %ymm0
833 ; AVX512VBMI2-NEXT:    retq
835 ; AVX512VLBW-LABEL: var_funnnel_v32i8:
836 ; AVX512VLBW:       # %bb.0:
837 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} ymm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
838 ; AVX512VLBW-NEXT:    vpand %ymm3, %ymm2, %ymm4
839 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm5 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero,ymm4[16],zero,ymm4[17],zero,ymm4[18],zero,ymm4[19],zero,ymm4[20],zero,ymm4[21],zero,ymm4[22],zero,ymm4[23],zero,ymm4[24],zero,ymm4[25],zero,ymm4[26],zero,ymm4[27],zero,ymm4[28],zero,ymm4[29],zero,ymm4[30],zero,ymm4[31],zero
840 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm6 = 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
841 ; AVX512VLBW-NEXT:    vpsllvw %zmm5, %zmm6, %zmm5
842 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} ymm6 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
843 ; AVX512VLBW-NEXT:    vpsubb %ymm4, %ymm6, %ymm4
844 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm4 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero,ymm4[16],zero,ymm4[17],zero,ymm4[18],zero,ymm4[19],zero,ymm4[20],zero,ymm4[21],zero,ymm4[22],zero,ymm4[23],zero,ymm4[24],zero,ymm4[25],zero,ymm4[26],zero,ymm4[27],zero,ymm4[28],zero,ymm4[29],zero,ymm4[30],zero,ymm4[31],zero
845 ; 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
846 ; AVX512VLBW-NEXT:    vpsrlvw %zmm4, %zmm1, %zmm1
847 ; AVX512VLBW-NEXT:    vporq %zmm1, %zmm5, %zmm1
848 ; AVX512VLBW-NEXT:    vpmovwb %zmm1, %ymm1
849 ; AVX512VLBW-NEXT:    vptestnmb %ymm3, %ymm2, %k1
850 ; AVX512VLBW-NEXT:    vmovdqu8 %ymm0, %ymm1 {%k1}
851 ; AVX512VLBW-NEXT:    vmovdqa %ymm1, %ymm0
852 ; AVX512VLBW-NEXT:    retq
854 ; AVX512VLVBMI2-LABEL: var_funnnel_v32i8:
855 ; AVX512VLVBMI2:       # %bb.0:
856 ; AVX512VLVBMI2-NEXT:    vmovdqa {{.*#+}} ymm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
857 ; AVX512VLVBMI2-NEXT:    vpand %ymm3, %ymm2, %ymm4
858 ; AVX512VLVBMI2-NEXT:    vpmovzxbw {{.*#+}} zmm5 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero,ymm4[16],zero,ymm4[17],zero,ymm4[18],zero,ymm4[19],zero,ymm4[20],zero,ymm4[21],zero,ymm4[22],zero,ymm4[23],zero,ymm4[24],zero,ymm4[25],zero,ymm4[26],zero,ymm4[27],zero,ymm4[28],zero,ymm4[29],zero,ymm4[30],zero,ymm4[31],zero
859 ; AVX512VLVBMI2-NEXT:    vpmovzxbw {{.*#+}} zmm6 = 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 ; AVX512VLVBMI2-NEXT:    vpsllvw %zmm5, %zmm6, %zmm5
861 ; AVX512VLVBMI2-NEXT:    vmovdqa {{.*#+}} ymm6 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
862 ; AVX512VLVBMI2-NEXT:    vpsubb %ymm4, %ymm6, %ymm4
863 ; AVX512VLVBMI2-NEXT:    vpmovzxbw {{.*#+}} zmm4 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero,ymm4[16],zero,ymm4[17],zero,ymm4[18],zero,ymm4[19],zero,ymm4[20],zero,ymm4[21],zero,ymm4[22],zero,ymm4[23],zero,ymm4[24],zero,ymm4[25],zero,ymm4[26],zero,ymm4[27],zero,ymm4[28],zero,ymm4[29],zero,ymm4[30],zero,ymm4[31],zero
864 ; AVX512VLVBMI2-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 ; AVX512VLVBMI2-NEXT:    vpsrlvw %zmm4, %zmm1, %zmm1
866 ; AVX512VLVBMI2-NEXT:    vporq %zmm1, %zmm5, %zmm1
867 ; AVX512VLVBMI2-NEXT:    vpmovwb %zmm1, %ymm1
868 ; AVX512VLVBMI2-NEXT:    vptestnmb %ymm3, %ymm2, %k1
869 ; AVX512VLVBMI2-NEXT:    vmovdqu8 %ymm0, %ymm1 {%k1}
870 ; AVX512VLVBMI2-NEXT:    vmovdqa %ymm1, %ymm0
871 ; AVX512VLVBMI2-NEXT:    retq
873 ; XOPAVX1-LABEL: var_funnnel_v32i8:
874 ; XOPAVX1:       # %bb.0:
875 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
876 ; XOPAVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
877 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
878 ; XOPAVX1-NEXT:    vpshlb %xmm4, %xmm3, %xmm3
879 ; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm0, %xmm5
880 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm5, %ymm3
881 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
882 ; XOPAVX1-NEXT:    vpsubb %xmm5, %xmm4, %xmm6
883 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
884 ; XOPAVX1-NEXT:    vpshlb %xmm6, %xmm7, %xmm6
885 ; XOPAVX1-NEXT:    vpsubb %xmm5, %xmm2, %xmm5
886 ; XOPAVX1-NEXT:    vpshlb %xmm5, %xmm1, %xmm1
887 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1
888 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm3, %ymm1
889 ; XOPAVX1-NEXT:    vxorps %xmm3, %xmm3, %xmm3
890 ; XOPAVX1-NEXT:    vpcomeqb %xmm3, %xmm4, %xmm4
891 ; XOPAVX1-NEXT:    vpcomeqb %xmm3, %xmm2, %xmm2
892 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
893 ; XOPAVX1-NEXT:    vpcmov %ymm2, %ymm1, %ymm0, %ymm0
894 ; XOPAVX1-NEXT:    retq
896 ; XOPAVX2-LABEL: var_funnnel_v32i8:
897 ; XOPAVX2:       # %bb.0:
898 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
899 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
900 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm2, %xmm4
901 ; XOPAVX2-NEXT:    vpshlb %xmm4, %xmm3, %xmm3
902 ; XOPAVX2-NEXT:    vpshlb %xmm2, %xmm0, %xmm4
903 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm3, %ymm4, %ymm3
904 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
905 ; XOPAVX2-NEXT:    vpsubb %ymm2, %ymm4, %ymm4
906 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm4, %xmm5
907 ; XOPAVX2-NEXT:    vpxor %xmm6, %xmm6, %xmm6
908 ; XOPAVX2-NEXT:    vpsubb %xmm5, %xmm6, %xmm5
909 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm7
910 ; XOPAVX2-NEXT:    vpshlb %xmm5, %xmm7, %xmm5
911 ; XOPAVX2-NEXT:    vpsubb %xmm4, %xmm6, %xmm4
912 ; XOPAVX2-NEXT:    vpshlb %xmm4, %xmm1, %xmm1
913 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm5, %ymm1, %ymm1
914 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
915 ; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
916 ; XOPAVX2-NEXT:    vpcmpeqb %ymm3, %ymm2, %ymm2
917 ; XOPAVX2-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
918 ; XOPAVX2-NEXT:    retq
919   %res = call <32 x i8> @llvm.fshl.v32i8(<32 x i8> %x, <32 x i8> %y, <32 x i8> %amt)
920   ret <32 x i8> %res
924 ; Uniform Variable Shifts
927 define <4 x i64> @splatvar_funnnel_v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> %amt) nounwind {
928 ; AVX1-LABEL: splatvar_funnnel_v4i64:
929 ; AVX1:       # %bb.0:
930 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = xmm2[0,0]
931 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm2, %ymm2
932 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
933 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
934 ; AVX1-NEXT:    vpsllq %xmm2, %xmm3, %xmm3
935 ; AVX1-NEXT:    vpsllq %xmm2, %xmm0, %xmm4
936 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
937 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
938 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [64,64]
939 ; AVX1-NEXT:    vpsubq %xmm4, %xmm5, %xmm6
940 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
941 ; AVX1-NEXT:    vpsrlq %xmm6, %xmm7, %xmm6
942 ; AVX1-NEXT:    vpsubq %xmm2, %xmm5, %xmm5
943 ; AVX1-NEXT:    vpsrlq %xmm5, %xmm1, %xmm1
944 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1
945 ; AVX1-NEXT:    vorps %ymm1, %ymm3, %ymm1
946 ; AVX1-NEXT:    vxorps %xmm3, %xmm3, %xmm3
947 ; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm4, %xmm4
948 ; AVX1-NEXT:    vpcmpeqq %xmm3, %xmm2, %xmm2
949 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
950 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
951 ; AVX1-NEXT:    retq
953 ; AVX2-LABEL: splatvar_funnnel_v4i64:
954 ; AVX2:       # %bb.0:
955 ; AVX2-NEXT:    vpbroadcastq %xmm2, %ymm2
956 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
957 ; AVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
958 ; AVX2-NEXT:    vpsllq %xmm2, %ymm0, %ymm3
959 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm4 = [64,64]
960 ; AVX2-NEXT:    vpsubq %xmm2, %xmm4, %xmm4
961 ; AVX2-NEXT:    vpsrlq %xmm4, %ymm1, %ymm1
962 ; AVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
963 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
964 ; AVX2-NEXT:    vpcmpeqq %ymm3, %ymm2, %ymm2
965 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
966 ; AVX2-NEXT:    retq
968 ; AVX512F-LABEL: splatvar_funnnel_v4i64:
969 ; AVX512F:       # %bb.0:
970 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
971 ; AVX512F-NEXT:    vpbroadcastq %xmm2, %ymm2
972 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
973 ; AVX512F-NEXT:    vpand %ymm3, %ymm2, %ymm4
974 ; AVX512F-NEXT:    vpsllq %xmm4, %ymm0, %ymm5
975 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm6 = [64,64]
976 ; AVX512F-NEXT:    vpsubq %xmm4, %xmm6, %xmm4
977 ; AVX512F-NEXT:    vpsrlq %xmm4, %ymm1, %ymm1
978 ; AVX512F-NEXT:    vpor %ymm1, %ymm5, %ymm1
979 ; AVX512F-NEXT:    vptestnmq %zmm3, %zmm2, %k1
980 ; AVX512F-NEXT:    vmovdqa64 %zmm0, %zmm1 {%k1}
981 ; AVX512F-NEXT:    vmovdqa %ymm1, %ymm0
982 ; AVX512F-NEXT:    retq
984 ; AVX512VL-LABEL: splatvar_funnnel_v4i64:
985 ; AVX512VL:       # %bb.0:
986 ; AVX512VL-NEXT:    vpbroadcastq %xmm2, %ymm2
987 ; AVX512VL-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
988 ; AVX512VL-NEXT:    vpand %ymm3, %ymm2, %ymm4
989 ; AVX512VL-NEXT:    vpsllq %xmm4, %ymm0, %ymm5
990 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm6 = [64,64]
991 ; AVX512VL-NEXT:    vpsubq %xmm4, %xmm6, %xmm4
992 ; AVX512VL-NEXT:    vpsrlq %xmm4, %ymm1, %ymm1
993 ; AVX512VL-NEXT:    vpor %ymm1, %ymm5, %ymm1
994 ; AVX512VL-NEXT:    vptestnmq %ymm3, %ymm2, %k1
995 ; AVX512VL-NEXT:    vmovdqa64 %ymm0, %ymm1 {%k1}
996 ; AVX512VL-NEXT:    vmovdqa %ymm1, %ymm0
997 ; AVX512VL-NEXT:    retq
999 ; AVX512BW-LABEL: splatvar_funnnel_v4i64:
1000 ; AVX512BW:       # %bb.0:
1001 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1002 ; AVX512BW-NEXT:    vpbroadcastq %xmm2, %ymm2
1003 ; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
1004 ; AVX512BW-NEXT:    vpand %ymm3, %ymm2, %ymm4
1005 ; AVX512BW-NEXT:    vpsllq %xmm4, %ymm0, %ymm5
1006 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm6 = [64,64]
1007 ; AVX512BW-NEXT:    vpsubq %xmm4, %xmm6, %xmm4
1008 ; AVX512BW-NEXT:    vpsrlq %xmm4, %ymm1, %ymm1
1009 ; AVX512BW-NEXT:    vpor %ymm1, %ymm5, %ymm1
1010 ; AVX512BW-NEXT:    vptestnmq %zmm3, %zmm2, %k1
1011 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, %zmm1 {%k1}
1012 ; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm0
1013 ; AVX512BW-NEXT:    retq
1015 ; AVX512VBMI2-LABEL: splatvar_funnnel_v4i64:
1016 ; AVX512VBMI2:       # %bb.0:
1017 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1018 ; AVX512VBMI2-NEXT:    vpbroadcastq %xmm2, %ymm2
1019 ; AVX512VBMI2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
1020 ; AVX512VBMI2-NEXT:    vpand %ymm3, %ymm2, %ymm4
1021 ; AVX512VBMI2-NEXT:    vpsllq %xmm4, %ymm0, %ymm5
1022 ; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} xmm6 = [64,64]
1023 ; AVX512VBMI2-NEXT:    vpsubq %xmm4, %xmm6, %xmm4
1024 ; AVX512VBMI2-NEXT:    vpsrlq %xmm4, %ymm1, %ymm1
1025 ; AVX512VBMI2-NEXT:    vpor %ymm1, %ymm5, %ymm1
1026 ; AVX512VBMI2-NEXT:    vptestnmq %zmm3, %zmm2, %k1
1027 ; AVX512VBMI2-NEXT:    vmovdqa64 %zmm0, %zmm1 {%k1}
1028 ; AVX512VBMI2-NEXT:    vmovdqa %ymm1, %ymm0
1029 ; AVX512VBMI2-NEXT:    retq
1031 ; AVX512VLBW-LABEL: splatvar_funnnel_v4i64:
1032 ; AVX512VLBW:       # %bb.0:
1033 ; AVX512VLBW-NEXT:    vpbroadcastq %xmm2, %ymm2
1034 ; AVX512VLBW-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
1035 ; AVX512VLBW-NEXT:    vpand %ymm3, %ymm2, %ymm4
1036 ; AVX512VLBW-NEXT:    vpsllq %xmm4, %ymm0, %ymm5
1037 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm6 = [64,64]
1038 ; AVX512VLBW-NEXT:    vpsubq %xmm4, %xmm6, %xmm4
1039 ; AVX512VLBW-NEXT:    vpsrlq %xmm4, %ymm1, %ymm1
1040 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm5, %ymm1
1041 ; AVX512VLBW-NEXT:    vptestnmq %ymm3, %ymm2, %k1
1042 ; AVX512VLBW-NEXT:    vmovdqa64 %ymm0, %ymm1 {%k1}
1043 ; AVX512VLBW-NEXT:    vmovdqa %ymm1, %ymm0
1044 ; AVX512VLBW-NEXT:    retq
1046 ; AVX512VLVBMI2-LABEL: splatvar_funnnel_v4i64:
1047 ; AVX512VLVBMI2:       # %bb.0:
1048 ; AVX512VLVBMI2-NEXT:    vpbroadcastq %xmm2, %ymm2
1049 ; AVX512VLVBMI2-NEXT:    vpshldvq %ymm2, %ymm1, %ymm0
1050 ; AVX512VLVBMI2-NEXT:    retq
1052 ; XOPAVX1-LABEL: splatvar_funnnel_v4i64:
1053 ; XOPAVX1:       # %bb.0:
1054 ; XOPAVX1-NEXT:    vmovddup {{.*#+}} xmm2 = xmm2[0,0]
1055 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm2, %ymm2
1056 ; XOPAVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
1057 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1058 ; XOPAVX1-NEXT:    vpsllq %xmm2, %xmm3, %xmm3
1059 ; XOPAVX1-NEXT:    vpsllq %xmm2, %xmm0, %xmm4
1060 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
1061 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1062 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [64,64]
1063 ; XOPAVX1-NEXT:    vpsubq %xmm4, %xmm5, %xmm6
1064 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
1065 ; XOPAVX1-NEXT:    vpsrlq %xmm6, %xmm7, %xmm6
1066 ; XOPAVX1-NEXT:    vpsubq %xmm2, %xmm5, %xmm5
1067 ; XOPAVX1-NEXT:    vpsrlq %xmm5, %xmm1, %xmm1
1068 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1
1069 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm3, %ymm1
1070 ; XOPAVX1-NEXT:    vxorps %xmm3, %xmm3, %xmm3
1071 ; XOPAVX1-NEXT:    vpcomeqq %xmm3, %xmm4, %xmm4
1072 ; XOPAVX1-NEXT:    vpcomeqq %xmm3, %xmm2, %xmm2
1073 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
1074 ; XOPAVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1075 ; XOPAVX1-NEXT:    retq
1077 ; XOPAVX2-LABEL: splatvar_funnnel_v4i64:
1078 ; XOPAVX2:       # %bb.0:
1079 ; XOPAVX2-NEXT:    vpbroadcastq %xmm2, %ymm2
1080 ; XOPAVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [63,63,63,63]
1081 ; XOPAVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
1082 ; XOPAVX2-NEXT:    vpsllq %xmm2, %ymm0, %ymm3
1083 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm4 = [64,64]
1084 ; XOPAVX2-NEXT:    vpsubq %xmm2, %xmm4, %xmm4
1085 ; XOPAVX2-NEXT:    vpsrlq %xmm4, %ymm1, %ymm1
1086 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
1087 ; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1088 ; XOPAVX2-NEXT:    vpcmpeqq %ymm3, %ymm2, %ymm2
1089 ; XOPAVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1090 ; XOPAVX2-NEXT:    retq
1091   %splat = shufflevector <4 x i64> %amt, <4 x i64> undef, <4 x i32> zeroinitializer
1092   %res = call <4 x i64> @llvm.fshl.v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> %splat)
1093   ret <4 x i64> %res
1096 define <8 x i32> @splatvar_funnnel_v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i32> %amt) nounwind {
1097 ; AVX1-LABEL: splatvar_funnnel_v8i32:
1098 ; AVX1:       # %bb.0:
1099 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm2 = xmm2[0,0,0,0]
1100 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm2, %ymm2
1101 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
1102 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm3 = xmm2[0],zero,xmm2[1],zero
1103 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
1104 ; AVX1-NEXT:    vpslld %xmm3, %xmm4, %xmm4
1105 ; AVX1-NEXT:    vpslld %xmm3, %xmm0, %xmm3
1106 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm3
1107 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1108 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [32,32,32,32]
1109 ; AVX1-NEXT:    vpsubd %xmm4, %xmm5, %xmm6
1110 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm6 = xmm6[0],zero,xmm6[1],zero
1111 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
1112 ; AVX1-NEXT:    vpsrld %xmm6, %xmm7, %xmm6
1113 ; AVX1-NEXT:    vpsubd %xmm2, %xmm5, %xmm5
1114 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm5 = xmm5[0],zero,xmm5[1],zero
1115 ; AVX1-NEXT:    vpsrld %xmm5, %xmm1, %xmm1
1116 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1
1117 ; AVX1-NEXT:    vorps %ymm1, %ymm3, %ymm1
1118 ; AVX1-NEXT:    vxorps %xmm3, %xmm3, %xmm3
1119 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm4, %xmm4
1120 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm2
1121 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
1122 ; AVX1-NEXT:    vblendvps %ymm2, %ymm0, %ymm1, %ymm0
1123 ; AVX1-NEXT:    retq
1125 ; AVX2-LABEL: splatvar_funnnel_v8i32:
1126 ; AVX2:       # %bb.0:
1127 ; AVX2-NEXT:    vpbroadcastd %xmm2, %ymm2
1128 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
1129 ; AVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
1130 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm3 = xmm2[0],zero,xmm2[1],zero
1131 ; AVX2-NEXT:    vpslld %xmm3, %ymm0, %ymm3
1132 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm4 = [32,32,32,32]
1133 ; AVX2-NEXT:    vpsubd %xmm2, %xmm4, %xmm4
1134 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
1135 ; AVX2-NEXT:    vpsrld %xmm4, %ymm1, %ymm1
1136 ; AVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
1137 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1138 ; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm2, %ymm2
1139 ; AVX2-NEXT:    vblendvps %ymm2, %ymm0, %ymm1, %ymm0
1140 ; AVX2-NEXT:    retq
1142 ; AVX512F-LABEL: splatvar_funnnel_v8i32:
1143 ; AVX512F:       # %bb.0:
1144 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1145 ; AVX512F-NEXT:    vpbroadcastd %xmm2, %ymm2
1146 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
1147 ; AVX512F-NEXT:    vpand %ymm3, %ymm2, %ymm4
1148 ; AVX512F-NEXT:    vpmovzxdq {{.*#+}} xmm5 = xmm4[0],zero,xmm4[1],zero
1149 ; AVX512F-NEXT:    vpslld %xmm5, %ymm0, %ymm5
1150 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} xmm6 = [32,32,32,32]
1151 ; AVX512F-NEXT:    vpsubd %xmm4, %xmm6, %xmm4
1152 ; AVX512F-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
1153 ; AVX512F-NEXT:    vpsrld %xmm4, %ymm1, %ymm1
1154 ; AVX512F-NEXT:    vpor %ymm1, %ymm5, %ymm1
1155 ; AVX512F-NEXT:    vptestnmd %zmm3, %zmm2, %k1
1156 ; AVX512F-NEXT:    vmovdqa32 %zmm0, %zmm1 {%k1}
1157 ; AVX512F-NEXT:    vmovdqa %ymm1, %ymm0
1158 ; AVX512F-NEXT:    retq
1160 ; AVX512VL-LABEL: splatvar_funnnel_v8i32:
1161 ; AVX512VL:       # %bb.0:
1162 ; AVX512VL-NEXT:    vpbroadcastd %xmm2, %ymm2
1163 ; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
1164 ; AVX512VL-NEXT:    vpand %ymm3, %ymm2, %ymm4
1165 ; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm5 = xmm4[0],zero,xmm4[1],zero
1166 ; AVX512VL-NEXT:    vpslld %xmm5, %ymm0, %ymm5
1167 ; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} xmm6 = [32,32,32,32]
1168 ; AVX512VL-NEXT:    vpsubd %xmm4, %xmm6, %xmm4
1169 ; AVX512VL-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
1170 ; AVX512VL-NEXT:    vpsrld %xmm4, %ymm1, %ymm1
1171 ; AVX512VL-NEXT:    vpor %ymm1, %ymm5, %ymm1
1172 ; AVX512VL-NEXT:    vptestnmd %ymm3, %ymm2, %k1
1173 ; AVX512VL-NEXT:    vmovdqa32 %ymm0, %ymm1 {%k1}
1174 ; AVX512VL-NEXT:    vmovdqa %ymm1, %ymm0
1175 ; AVX512VL-NEXT:    retq
1177 ; AVX512BW-LABEL: splatvar_funnnel_v8i32:
1178 ; AVX512BW:       # %bb.0:
1179 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1180 ; AVX512BW-NEXT:    vpbroadcastd %xmm2, %ymm2
1181 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
1182 ; AVX512BW-NEXT:    vpand %ymm3, %ymm2, %ymm4
1183 ; AVX512BW-NEXT:    vpmovzxdq {{.*#+}} xmm5 = xmm4[0],zero,xmm4[1],zero
1184 ; AVX512BW-NEXT:    vpslld %xmm5, %ymm0, %ymm5
1185 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} xmm6 = [32,32,32,32]
1186 ; AVX512BW-NEXT:    vpsubd %xmm4, %xmm6, %xmm4
1187 ; AVX512BW-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
1188 ; AVX512BW-NEXT:    vpsrld %xmm4, %ymm1, %ymm1
1189 ; AVX512BW-NEXT:    vpor %ymm1, %ymm5, %ymm1
1190 ; AVX512BW-NEXT:    vptestnmd %zmm3, %zmm2, %k1
1191 ; AVX512BW-NEXT:    vmovdqa32 %zmm0, %zmm1 {%k1}
1192 ; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm0
1193 ; AVX512BW-NEXT:    retq
1195 ; AVX512VBMI2-LABEL: splatvar_funnnel_v8i32:
1196 ; AVX512VBMI2:       # %bb.0:
1197 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1198 ; AVX512VBMI2-NEXT:    vpbroadcastd %xmm2, %ymm2
1199 ; AVX512VBMI2-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
1200 ; AVX512VBMI2-NEXT:    vpand %ymm3, %ymm2, %ymm4
1201 ; AVX512VBMI2-NEXT:    vpmovzxdq {{.*#+}} xmm5 = xmm4[0],zero,xmm4[1],zero
1202 ; AVX512VBMI2-NEXT:    vpslld %xmm5, %ymm0, %ymm5
1203 ; AVX512VBMI2-NEXT:    vpbroadcastd {{.*#+}} xmm6 = [32,32,32,32]
1204 ; AVX512VBMI2-NEXT:    vpsubd %xmm4, %xmm6, %xmm4
1205 ; AVX512VBMI2-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
1206 ; AVX512VBMI2-NEXT:    vpsrld %xmm4, %ymm1, %ymm1
1207 ; AVX512VBMI2-NEXT:    vpor %ymm1, %ymm5, %ymm1
1208 ; AVX512VBMI2-NEXT:    vptestnmd %zmm3, %zmm2, %k1
1209 ; AVX512VBMI2-NEXT:    vmovdqa32 %zmm0, %zmm1 {%k1}
1210 ; AVX512VBMI2-NEXT:    vmovdqa %ymm1, %ymm0
1211 ; AVX512VBMI2-NEXT:    retq
1213 ; AVX512VLBW-LABEL: splatvar_funnnel_v8i32:
1214 ; AVX512VLBW:       # %bb.0:
1215 ; AVX512VLBW-NEXT:    vpbroadcastd %xmm2, %ymm2
1216 ; AVX512VLBW-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
1217 ; AVX512VLBW-NEXT:    vpand %ymm3, %ymm2, %ymm4
1218 ; AVX512VLBW-NEXT:    vpmovzxdq {{.*#+}} xmm5 = xmm4[0],zero,xmm4[1],zero
1219 ; AVX512VLBW-NEXT:    vpslld %xmm5, %ymm0, %ymm5
1220 ; AVX512VLBW-NEXT:    vpbroadcastd {{.*#+}} xmm6 = [32,32,32,32]
1221 ; AVX512VLBW-NEXT:    vpsubd %xmm4, %xmm6, %xmm4
1222 ; AVX512VLBW-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
1223 ; AVX512VLBW-NEXT:    vpsrld %xmm4, %ymm1, %ymm1
1224 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm5, %ymm1
1225 ; AVX512VLBW-NEXT:    vptestnmd %ymm3, %ymm2, %k1
1226 ; AVX512VLBW-NEXT:    vmovdqa32 %ymm0, %ymm1 {%k1}
1227 ; AVX512VLBW-NEXT:    vmovdqa %ymm1, %ymm0
1228 ; AVX512VLBW-NEXT:    retq
1230 ; AVX512VLVBMI2-LABEL: splatvar_funnnel_v8i32:
1231 ; AVX512VLVBMI2:       # %bb.0:
1232 ; AVX512VLVBMI2-NEXT:    vpbroadcastd %xmm2, %ymm2
1233 ; AVX512VLVBMI2-NEXT:    vpshldvd %ymm2, %ymm1, %ymm0
1234 ; AVX512VLVBMI2-NEXT:    retq
1236 ; XOPAVX1-LABEL: splatvar_funnnel_v8i32:
1237 ; XOPAVX1:       # %bb.0:
1238 ; XOPAVX1-NEXT:    vpermilps {{.*#+}} xmm2 = xmm2[0,0,0,0]
1239 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm2, %ymm2
1240 ; XOPAVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
1241 ; XOPAVX1-NEXT:    vpmovzxdq {{.*#+}} xmm3 = xmm2[0],zero,xmm2[1],zero
1242 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
1243 ; XOPAVX1-NEXT:    vpslld %xmm3, %xmm4, %xmm4
1244 ; XOPAVX1-NEXT:    vpslld %xmm3, %xmm0, %xmm3
1245 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm3
1246 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1247 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [32,32,32,32]
1248 ; XOPAVX1-NEXT:    vpsubd %xmm4, %xmm5, %xmm6
1249 ; XOPAVX1-NEXT:    vpmovzxdq {{.*#+}} xmm6 = xmm6[0],zero,xmm6[1],zero
1250 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
1251 ; XOPAVX1-NEXT:    vpsrld %xmm6, %xmm7, %xmm6
1252 ; XOPAVX1-NEXT:    vpsubd %xmm2, %xmm5, %xmm5
1253 ; XOPAVX1-NEXT:    vpmovzxdq {{.*#+}} xmm5 = xmm5[0],zero,xmm5[1],zero
1254 ; XOPAVX1-NEXT:    vpsrld %xmm5, %xmm1, %xmm1
1255 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1
1256 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm3, %ymm1
1257 ; XOPAVX1-NEXT:    vxorps %xmm3, %xmm3, %xmm3
1258 ; XOPAVX1-NEXT:    vpcomeqd %xmm3, %xmm4, %xmm4
1259 ; XOPAVX1-NEXT:    vpcomeqd %xmm3, %xmm2, %xmm2
1260 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
1261 ; XOPAVX1-NEXT:    vblendvps %ymm2, %ymm0, %ymm1, %ymm0
1262 ; XOPAVX1-NEXT:    retq
1264 ; XOPAVX2-LABEL: splatvar_funnnel_v8i32:
1265 ; XOPAVX2:       # %bb.0:
1266 ; XOPAVX2-NEXT:    vpbroadcastd %xmm2, %ymm2
1267 ; XOPAVX2-NEXT:    vpbroadcastd {{.*#+}} ymm3 = [31,31,31,31,31,31,31,31]
1268 ; XOPAVX2-NEXT:    vpand %ymm3, %ymm2, %ymm2
1269 ; XOPAVX2-NEXT:    vpmovzxdq {{.*#+}} xmm3 = xmm2[0],zero,xmm2[1],zero
1270 ; XOPAVX2-NEXT:    vpslld %xmm3, %ymm0, %ymm3
1271 ; XOPAVX2-NEXT:    vpbroadcastd {{.*#+}} xmm4 = [32,32,32,32]
1272 ; XOPAVX2-NEXT:    vpsubd %xmm2, %xmm4, %xmm4
1273 ; XOPAVX2-NEXT:    vpmovzxdq {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero
1274 ; XOPAVX2-NEXT:    vpsrld %xmm4, %ymm1, %ymm1
1275 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
1276 ; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1277 ; XOPAVX2-NEXT:    vpcmpeqd %ymm3, %ymm2, %ymm2
1278 ; XOPAVX2-NEXT:    vblendvps %ymm2, %ymm0, %ymm1, %ymm0
1279 ; XOPAVX2-NEXT:    retq
1280   %splat = shufflevector <8 x i32> %amt, <8 x i32> undef, <8 x i32> zeroinitializer
1281   %res = call <8 x i32> @llvm.fshl.v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i32> %splat)
1282   ret <8 x i32> %res
1285 define <16 x i16> @splatvar_funnnel_v16i16(<16 x i16> %x, <16 x i16> %y, <16 x i16> %amt) nounwind {
1286 ; AVX1-LABEL: splatvar_funnnel_v16i16:
1287 ; AVX1:       # %bb.0:
1288 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm2 = xmm2[0,0,2,3,4,5,6,7]
1289 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]
1290 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm2, %ymm2
1291 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
1292 ; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm3 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
1293 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
1294 ; AVX1-NEXT:    vpsllw %xmm3, %xmm4, %xmm4
1295 ; AVX1-NEXT:    vpsllw %xmm3, %xmm0, %xmm3
1296 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm3
1297 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1298 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [16,16,16,16,16,16,16,16]
1299 ; AVX1-NEXT:    vpsubw %xmm4, %xmm5, %xmm6
1300 ; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm6 = xmm6[0],zero,zero,zero,xmm6[1],zero,zero,zero
1301 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
1302 ; AVX1-NEXT:    vpsrlw %xmm6, %xmm7, %xmm6
1303 ; AVX1-NEXT:    vpsubw %xmm2, %xmm5, %xmm5
1304 ; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm5 = xmm5[0],zero,zero,zero,xmm5[1],zero,zero,zero
1305 ; AVX1-NEXT:    vpsrlw %xmm5, %xmm1, %xmm1
1306 ; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1
1307 ; AVX1-NEXT:    vorps %ymm1, %ymm3, %ymm1
1308 ; AVX1-NEXT:    vxorps %xmm3, %xmm3, %xmm3
1309 ; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm4, %xmm4
1310 ; AVX1-NEXT:    vpcmpeqw %xmm3, %xmm2, %xmm2
1311 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
1312 ; AVX1-NEXT:    vandnps %ymm1, %ymm2, %ymm1
1313 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
1314 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1315 ; AVX1-NEXT:    retq
1317 ; AVX2-LABEL: splatvar_funnnel_v16i16:
1318 ; AVX2:       # %bb.0:
1319 ; AVX2-NEXT:    vpbroadcastw %xmm2, %ymm2
1320 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
1321 ; AVX2-NEXT:    vpmovzxwq {{.*#+}} xmm3 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
1322 ; AVX2-NEXT:    vpsllw %xmm3, %ymm0, %ymm3
1323 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm4 = [16,16,16,16,16,16,16,16]
1324 ; AVX2-NEXT:    vpsubw %xmm2, %xmm4, %xmm4
1325 ; AVX2-NEXT:    vpmovzxwq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1326 ; AVX2-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1327 ; AVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
1328 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1329 ; AVX2-NEXT:    vpcmpeqw %ymm3, %ymm2, %ymm2
1330 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1331 ; AVX2-NEXT:    retq
1333 ; AVX512F-LABEL: splatvar_funnnel_v16i16:
1334 ; AVX512F:       # %bb.0:
1335 ; AVX512F-NEXT:    vpbroadcastw %xmm2, %ymm2
1336 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
1337 ; AVX512F-NEXT:    vpmovzxwq {{.*#+}} xmm3 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
1338 ; AVX512F-NEXT:    vpsllw %xmm3, %ymm0, %ymm3
1339 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm4 = [16,16,16,16,16,16,16,16]
1340 ; AVX512F-NEXT:    vpsubw %xmm2, %xmm4, %xmm4
1341 ; AVX512F-NEXT:    vpmovzxwq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1342 ; AVX512F-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1343 ; AVX512F-NEXT:    vpor %ymm1, %ymm3, %ymm1
1344 ; AVX512F-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1345 ; AVX512F-NEXT:    vpcmpeqw %ymm3, %ymm2, %ymm2
1346 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1347 ; AVX512F-NEXT:    retq
1349 ; AVX512VL-LABEL: splatvar_funnnel_v16i16:
1350 ; AVX512VL:       # %bb.0:
1351 ; AVX512VL-NEXT:    vpbroadcastw %xmm2, %ymm2
1352 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
1353 ; AVX512VL-NEXT:    vpmovzxwq {{.*#+}} xmm3 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
1354 ; AVX512VL-NEXT:    vpsllw %xmm3, %ymm0, %ymm3
1355 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm4 = [16,16,16,16,16,16,16,16]
1356 ; AVX512VL-NEXT:    vpsubw %xmm2, %xmm4, %xmm4
1357 ; AVX512VL-NEXT:    vpmovzxwq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1358 ; AVX512VL-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1359 ; AVX512VL-NEXT:    vpor %ymm1, %ymm3, %ymm1
1360 ; AVX512VL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1361 ; AVX512VL-NEXT:    vpcmpeqw %ymm3, %ymm2, %ymm2
1362 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1363 ; AVX512VL-NEXT:    retq
1365 ; AVX512BW-LABEL: splatvar_funnnel_v16i16:
1366 ; AVX512BW:       # %bb.0:
1367 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1368 ; AVX512BW-NEXT:    vpbroadcastw %xmm2, %ymm2
1369 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1370 ; AVX512BW-NEXT:    vpand %ymm3, %ymm2, %ymm4
1371 ; AVX512BW-NEXT:    vpmovzxwq {{.*#+}} xmm5 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1372 ; AVX512BW-NEXT:    vpsllw %xmm5, %ymm0, %ymm5
1373 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm6 = [16,16,16,16,16,16,16,16]
1374 ; AVX512BW-NEXT:    vpsubw %xmm4, %xmm6, %xmm4
1375 ; AVX512BW-NEXT:    vpmovzxwq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1376 ; AVX512BW-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1377 ; AVX512BW-NEXT:    vpor %ymm1, %ymm5, %ymm1
1378 ; AVX512BW-NEXT:    vptestnmw %zmm3, %zmm2, %k1
1379 ; AVX512BW-NEXT:    vmovdqu16 %zmm0, %zmm1 {%k1}
1380 ; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm0
1381 ; AVX512BW-NEXT:    retq
1383 ; AVX512VBMI2-LABEL: splatvar_funnnel_v16i16:
1384 ; AVX512VBMI2:       # %bb.0:
1385 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1386 ; AVX512VBMI2-NEXT:    vpbroadcastw %xmm2, %ymm2
1387 ; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1388 ; AVX512VBMI2-NEXT:    vpand %ymm3, %ymm2, %ymm4
1389 ; AVX512VBMI2-NEXT:    vpmovzxwq {{.*#+}} xmm5 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1390 ; AVX512VBMI2-NEXT:    vpsllw %xmm5, %ymm0, %ymm5
1391 ; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} xmm6 = [16,16,16,16,16,16,16,16]
1392 ; AVX512VBMI2-NEXT:    vpsubw %xmm4, %xmm6, %xmm4
1393 ; AVX512VBMI2-NEXT:    vpmovzxwq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1394 ; AVX512VBMI2-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1395 ; AVX512VBMI2-NEXT:    vpor %ymm1, %ymm5, %ymm1
1396 ; AVX512VBMI2-NEXT:    vptestnmw %zmm3, %zmm2, %k1
1397 ; AVX512VBMI2-NEXT:    vmovdqu16 %zmm0, %zmm1 {%k1}
1398 ; AVX512VBMI2-NEXT:    vmovdqa %ymm1, %ymm0
1399 ; AVX512VBMI2-NEXT:    retq
1401 ; AVX512VLBW-LABEL: splatvar_funnnel_v16i16:
1402 ; AVX512VLBW:       # %bb.0:
1403 ; AVX512VLBW-NEXT:    vpbroadcastw %xmm2, %ymm2
1404 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} ymm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1405 ; AVX512VLBW-NEXT:    vpand %ymm3, %ymm2, %ymm4
1406 ; AVX512VLBW-NEXT:    vpmovzxwq {{.*#+}} xmm5 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1407 ; AVX512VLBW-NEXT:    vpsllw %xmm5, %ymm0, %ymm5
1408 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} xmm6 = [16,16,16,16,16,16,16,16]
1409 ; AVX512VLBW-NEXT:    vpsubw %xmm4, %xmm6, %xmm4
1410 ; AVX512VLBW-NEXT:    vpmovzxwq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1411 ; AVX512VLBW-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1412 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm5, %ymm1
1413 ; AVX512VLBW-NEXT:    vptestnmw %ymm3, %ymm2, %k1
1414 ; AVX512VLBW-NEXT:    vmovdqu16 %ymm0, %ymm1 {%k1}
1415 ; AVX512VLBW-NEXT:    vmovdqa %ymm1, %ymm0
1416 ; AVX512VLBW-NEXT:    retq
1418 ; AVX512VLVBMI2-LABEL: splatvar_funnnel_v16i16:
1419 ; AVX512VLVBMI2:       # %bb.0:
1420 ; AVX512VLVBMI2-NEXT:    vpbroadcastw %xmm2, %ymm2
1421 ; AVX512VLVBMI2-NEXT:    vpshldvw %ymm2, %ymm1, %ymm0
1422 ; AVX512VLVBMI2-NEXT:    retq
1424 ; XOPAVX1-LABEL: splatvar_funnnel_v16i16:
1425 ; XOPAVX1:       # %bb.0:
1426 ; XOPAVX1-NEXT:    vpshuflw {{.*#+}} xmm2 = xmm2[0,0,2,3,4,5,6,7]
1427 ; XOPAVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]
1428 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm2, %ymm2
1429 ; XOPAVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
1430 ; XOPAVX1-NEXT:    vpmovzxwq {{.*#+}} xmm3 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
1431 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
1432 ; XOPAVX1-NEXT:    vpsllw %xmm3, %xmm4, %xmm4
1433 ; XOPAVX1-NEXT:    vpsllw %xmm3, %xmm0, %xmm3
1434 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm3, %ymm3
1435 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1436 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [16,16,16,16,16,16,16,16]
1437 ; XOPAVX1-NEXT:    vpsubw %xmm4, %xmm5, %xmm6
1438 ; XOPAVX1-NEXT:    vpmovzxwq {{.*#+}} xmm6 = xmm6[0],zero,zero,zero,xmm6[1],zero,zero,zero
1439 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
1440 ; XOPAVX1-NEXT:    vpsrlw %xmm6, %xmm7, %xmm6
1441 ; XOPAVX1-NEXT:    vpsubw %xmm2, %xmm5, %xmm5
1442 ; XOPAVX1-NEXT:    vpmovzxwq {{.*#+}} xmm5 = xmm5[0],zero,zero,zero,xmm5[1],zero,zero,zero
1443 ; XOPAVX1-NEXT:    vpsrlw %xmm5, %xmm1, %xmm1
1444 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm1, %ymm1
1445 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm3, %ymm1
1446 ; XOPAVX1-NEXT:    vxorps %xmm3, %xmm3, %xmm3
1447 ; XOPAVX1-NEXT:    vpcomeqw %xmm3, %xmm4, %xmm4
1448 ; XOPAVX1-NEXT:    vpcomeqw %xmm3, %xmm2, %xmm2
1449 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm2, %ymm2
1450 ; XOPAVX1-NEXT:    vpcmov %ymm2, %ymm1, %ymm0, %ymm0
1451 ; XOPAVX1-NEXT:    retq
1453 ; XOPAVX2-LABEL: splatvar_funnnel_v16i16:
1454 ; XOPAVX2:       # %bb.0:
1455 ; XOPAVX2-NEXT:    vpbroadcastw %xmm2, %ymm2
1456 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
1457 ; XOPAVX2-NEXT:    vpmovzxwq {{.*#+}} xmm3 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
1458 ; XOPAVX2-NEXT:    vpsllw %xmm3, %ymm0, %ymm3
1459 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm4 = [16,16,16,16,16,16,16,16]
1460 ; XOPAVX2-NEXT:    vpsubw %xmm2, %xmm4, %xmm4
1461 ; XOPAVX2-NEXT:    vpmovzxwq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero
1462 ; XOPAVX2-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1463 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
1464 ; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1465 ; XOPAVX2-NEXT:    vpcmpeqw %ymm3, %ymm2, %ymm2
1466 ; XOPAVX2-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1467 ; XOPAVX2-NEXT:    retq
1468   %splat = shufflevector <16 x i16> %amt, <16 x i16> undef, <16 x i32> zeroinitializer
1469   %res = call <16 x i16> @llvm.fshl.v16i16(<16 x i16> %x, <16 x i16> %y, <16 x i16> %splat)
1470   ret <16 x i16> %res
1473 define <32 x i8> @splatvar_funnnel_v32i8(<32 x i8> %x, <32 x i8> %y, <32 x i8> %amt) nounwind {
1474 ; AVX1-LABEL: splatvar_funnnel_v32i8:
1475 ; AVX1:       # %bb.0:
1476 ; AVX1-NEXT:    vpxor %xmm8, %xmm8, %xmm8
1477 ; AVX1-NEXT:    vpshufb %xmm8, %xmm2, %xmm2
1478 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm2, %ymm2
1479 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
1480 ; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm4 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero
1481 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
1482 ; AVX1-NEXT:    vpsllw %xmm4, %xmm5, %xmm5
1483 ; AVX1-NEXT:    vpcmpeqd %xmm9, %xmm9, %xmm9
1484 ; AVX1-NEXT:    vpsllw %xmm4, %xmm9, %xmm7
1485 ; AVX1-NEXT:    vpshufb %xmm8, %xmm7, %xmm7
1486 ; AVX1-NEXT:    vpand %xmm7, %xmm5, %xmm5
1487 ; AVX1-NEXT:    vpsllw %xmm4, %xmm0, %xmm4
1488 ; AVX1-NEXT:    vpand %xmm7, %xmm4, %xmm4
1489 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm4, %ymm4
1490 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
1491 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm10 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1492 ; AVX1-NEXT:    vpsubb %xmm5, %xmm10, %xmm3
1493 ; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,zero,zero,zero,zero,xmm3[1],zero,zero,zero,zero,zero,zero,zero
1494 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm6
1495 ; AVX1-NEXT:    vpsrlw %xmm3, %xmm6, %xmm6
1496 ; AVX1-NEXT:    vpsrlw %xmm3, %xmm9, %xmm3
1497 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1498 ; AVX1-NEXT:    vpshufb %xmm7, %xmm3, %xmm3
1499 ; AVX1-NEXT:    vpand %xmm3, %xmm6, %xmm3
1500 ; AVX1-NEXT:    vpsubb %xmm2, %xmm10, %xmm6
1501 ; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm6 = xmm6[0],zero,zero,zero,zero,zero,zero,zero,xmm6[1],zero,zero,zero,zero,zero,zero,zero
1502 ; AVX1-NEXT:    vpsrlw %xmm6, %xmm1, %xmm1
1503 ; AVX1-NEXT:    vpsrlw %xmm6, %xmm9, %xmm6
1504 ; AVX1-NEXT:    vpshufb %xmm7, %xmm6, %xmm6
1505 ; AVX1-NEXT:    vpand %xmm6, %xmm1, %xmm1
1506 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1507 ; AVX1-NEXT:    vorps %ymm1, %ymm4, %ymm1
1508 ; AVX1-NEXT:    vpcmpeqb %xmm8, %xmm5, %xmm3
1509 ; AVX1-NEXT:    vpcmpeqb %xmm8, %xmm2, %xmm2
1510 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
1511 ; AVX1-NEXT:    vandnps %ymm1, %ymm2, %ymm1
1512 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
1513 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1514 ; AVX1-NEXT:    retq
1516 ; AVX2-LABEL: splatvar_funnnel_v32i8:
1517 ; AVX2:       # %bb.0:
1518 ; AVX2-NEXT:    vpbroadcastb %xmm2, %ymm2
1519 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
1520 ; AVX2-NEXT:    vpmovzxbq {{.*#+}} xmm3 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero
1521 ; AVX2-NEXT:    vpsllw %xmm3, %ymm0, %ymm4
1522 ; AVX2-NEXT:    vpcmpeqd %ymm5, %ymm5, %ymm5
1523 ; AVX2-NEXT:    vpsllw %xmm3, %ymm5, %ymm3
1524 ; AVX2-NEXT:    vpbroadcastb %xmm3, %ymm3
1525 ; AVX2-NEXT:    vpand %ymm3, %ymm4, %ymm3
1526 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1527 ; AVX2-NEXT:    vpsubb %xmm2, %xmm4, %xmm4
1528 ; AVX2-NEXT:    vpmovzxbq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,zero,zero,zero,zero,xmm4[1],zero,zero,zero,zero,zero,zero,zero
1529 ; AVX2-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1530 ; AVX2-NEXT:    vpsrlw %xmm4, %ymm5, %ymm4
1531 ; AVX2-NEXT:    vpsrlw $8, %ymm4, %ymm4
1532 ; AVX2-NEXT:    vpbroadcastb %xmm4, %ymm4
1533 ; AVX2-NEXT:    vpand %ymm4, %ymm1, %ymm1
1534 ; AVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
1535 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1536 ; AVX2-NEXT:    vpcmpeqb %ymm3, %ymm2, %ymm2
1537 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1538 ; AVX2-NEXT:    retq
1540 ; AVX512F-LABEL: splatvar_funnnel_v32i8:
1541 ; AVX512F:       # %bb.0:
1542 ; AVX512F-NEXT:    vpbroadcastb %xmm2, %ymm2
1543 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
1544 ; AVX512F-NEXT:    vpmovzxbq {{.*#+}} xmm3 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero
1545 ; AVX512F-NEXT:    vpsllw %xmm3, %ymm0, %ymm4
1546 ; AVX512F-NEXT:    vpcmpeqd %ymm5, %ymm5, %ymm5
1547 ; AVX512F-NEXT:    vpsllw %xmm3, %ymm5, %ymm3
1548 ; AVX512F-NEXT:    vpbroadcastb %xmm3, %ymm3
1549 ; AVX512F-NEXT:    vpand %ymm3, %ymm4, %ymm3
1550 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1551 ; AVX512F-NEXT:    vpsubb %xmm2, %xmm4, %xmm4
1552 ; AVX512F-NEXT:    vpmovzxbq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,zero,zero,zero,zero,xmm4[1],zero,zero,zero,zero,zero,zero,zero
1553 ; AVX512F-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1554 ; AVX512F-NEXT:    vpsrlw %xmm4, %ymm5, %ymm4
1555 ; AVX512F-NEXT:    vpsrlw $8, %ymm4, %ymm4
1556 ; AVX512F-NEXT:    vpbroadcastb %xmm4, %ymm4
1557 ; AVX512F-NEXT:    vpand %ymm4, %ymm1, %ymm1
1558 ; AVX512F-NEXT:    vpor %ymm1, %ymm3, %ymm1
1559 ; AVX512F-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1560 ; AVX512F-NEXT:    vpcmpeqb %ymm3, %ymm2, %ymm2
1561 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1562 ; AVX512F-NEXT:    retq
1564 ; AVX512VL-LABEL: splatvar_funnnel_v32i8:
1565 ; AVX512VL:       # %bb.0:
1566 ; AVX512VL-NEXT:    vpbroadcastb %xmm2, %ymm2
1567 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
1568 ; AVX512VL-NEXT:    vpmovzxbq {{.*#+}} xmm3 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero
1569 ; AVX512VL-NEXT:    vpsllw %xmm3, %ymm0, %ymm4
1570 ; AVX512VL-NEXT:    vpcmpeqd %ymm5, %ymm5, %ymm5
1571 ; AVX512VL-NEXT:    vpsllw %xmm3, %ymm5, %ymm3
1572 ; AVX512VL-NEXT:    vpbroadcastb %xmm3, %ymm3
1573 ; AVX512VL-NEXT:    vpand %ymm3, %ymm4, %ymm3
1574 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1575 ; AVX512VL-NEXT:    vpsubb %xmm2, %xmm4, %xmm4
1576 ; AVX512VL-NEXT:    vpmovzxbq {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,zero,zero,zero,zero,xmm4[1],zero,zero,zero,zero,zero,zero,zero
1577 ; AVX512VL-NEXT:    vpsrlw %xmm4, %ymm1, %ymm1
1578 ; AVX512VL-NEXT:    vpsrlw %xmm4, %ymm5, %ymm4
1579 ; AVX512VL-NEXT:    vpsrlw $8, %ymm4, %ymm4
1580 ; AVX512VL-NEXT:    vpbroadcastb %xmm4, %ymm4
1581 ; AVX512VL-NEXT:    vpand %ymm4, %ymm1, %ymm1
1582 ; AVX512VL-NEXT:    vpor %ymm1, %ymm3, %ymm1
1583 ; AVX512VL-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1584 ; AVX512VL-NEXT:    vpcmpeqb %ymm3, %ymm2, %ymm2
1585 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1586 ; AVX512VL-NEXT:    retq
1588 ; AVX512BW-LABEL: splatvar_funnnel_v32i8:
1589 ; AVX512BW:       # %bb.0:
1590 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1591 ; AVX512BW-NEXT:    vpbroadcastb %xmm2, %ymm2
1592 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1593 ; AVX512BW-NEXT:    vpand %ymm3, %ymm2, %ymm4
1594 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm5 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero,ymm4[16],zero,ymm4[17],zero,ymm4[18],zero,ymm4[19],zero,ymm4[20],zero,ymm4[21],zero,ymm4[22],zero,ymm4[23],zero,ymm4[24],zero,ymm4[25],zero,ymm4[26],zero,ymm4[27],zero,ymm4[28],zero,ymm4[29],zero,ymm4[30],zero,ymm4[31],zero
1595 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm6 = 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
1596 ; AVX512BW-NEXT:    vpsllvw %zmm5, %zmm6, %zmm5
1597 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm6 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1598 ; AVX512BW-NEXT:    vpsubb %ymm4, %ymm6, %ymm4
1599 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm4 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero,ymm4[16],zero,ymm4[17],zero,ymm4[18],zero,ymm4[19],zero,ymm4[20],zero,ymm4[21],zero,ymm4[22],zero,ymm4[23],zero,ymm4[24],zero,ymm4[25],zero,ymm4[26],zero,ymm4[27],zero,ymm4[28],zero,ymm4[29],zero,ymm4[30],zero,ymm4[31],zero
1600 ; 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
1601 ; AVX512BW-NEXT:    vpsrlvw %zmm4, %zmm1, %zmm1
1602 ; AVX512BW-NEXT:    vporq %zmm1, %zmm5, %zmm1
1603 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
1604 ; AVX512BW-NEXT:    vptestnmb %zmm3, %zmm2, %k1
1605 ; AVX512BW-NEXT:    vmovdqu8 %zmm0, %zmm1 {%k1}
1606 ; AVX512BW-NEXT:    vmovdqa %ymm1, %ymm0
1607 ; AVX512BW-NEXT:    retq
1609 ; AVX512VBMI2-LABEL: splatvar_funnnel_v32i8:
1610 ; AVX512VBMI2:       # %bb.0:
1611 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1612 ; AVX512VBMI2-NEXT:    vpbroadcastb %xmm2, %ymm2
1613 ; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} ymm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1614 ; AVX512VBMI2-NEXT:    vpand %ymm3, %ymm2, %ymm4
1615 ; AVX512VBMI2-NEXT:    vpmovzxbw {{.*#+}} zmm5 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero,ymm4[16],zero,ymm4[17],zero,ymm4[18],zero,ymm4[19],zero,ymm4[20],zero,ymm4[21],zero,ymm4[22],zero,ymm4[23],zero,ymm4[24],zero,ymm4[25],zero,ymm4[26],zero,ymm4[27],zero,ymm4[28],zero,ymm4[29],zero,ymm4[30],zero,ymm4[31],zero
1616 ; AVX512VBMI2-NEXT:    vpmovzxbw {{.*#+}} zmm6 = 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
1617 ; AVX512VBMI2-NEXT:    vpsllvw %zmm5, %zmm6, %zmm5
1618 ; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} ymm6 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1619 ; AVX512VBMI2-NEXT:    vpsubb %ymm4, %ymm6, %ymm4
1620 ; AVX512VBMI2-NEXT:    vpmovzxbw {{.*#+}} zmm4 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero,ymm4[16],zero,ymm4[17],zero,ymm4[18],zero,ymm4[19],zero,ymm4[20],zero,ymm4[21],zero,ymm4[22],zero,ymm4[23],zero,ymm4[24],zero,ymm4[25],zero,ymm4[26],zero,ymm4[27],zero,ymm4[28],zero,ymm4[29],zero,ymm4[30],zero,ymm4[31],zero
1621 ; AVX512VBMI2-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
1622 ; AVX512VBMI2-NEXT:    vpsrlvw %zmm4, %zmm1, %zmm1
1623 ; AVX512VBMI2-NEXT:    vporq %zmm1, %zmm5, %zmm1
1624 ; AVX512VBMI2-NEXT:    vpmovwb %zmm1, %ymm1
1625 ; AVX512VBMI2-NEXT:    vptestnmb %zmm3, %zmm2, %k1
1626 ; AVX512VBMI2-NEXT:    vmovdqu8 %zmm0, %zmm1 {%k1}
1627 ; AVX512VBMI2-NEXT:    vmovdqa %ymm1, %ymm0
1628 ; AVX512VBMI2-NEXT:    retq
1630 ; AVX512VLBW-LABEL: splatvar_funnnel_v32i8:
1631 ; AVX512VLBW:       # %bb.0:
1632 ; AVX512VLBW-NEXT:    vpbroadcastb %xmm2, %ymm2
1633 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} ymm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1634 ; AVX512VLBW-NEXT:    vpand %ymm3, %ymm2, %ymm4
1635 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm5 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero,ymm4[16],zero,ymm4[17],zero,ymm4[18],zero,ymm4[19],zero,ymm4[20],zero,ymm4[21],zero,ymm4[22],zero,ymm4[23],zero,ymm4[24],zero,ymm4[25],zero,ymm4[26],zero,ymm4[27],zero,ymm4[28],zero,ymm4[29],zero,ymm4[30],zero,ymm4[31],zero
1636 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm6 = 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
1637 ; AVX512VLBW-NEXT:    vpsllvw %zmm5, %zmm6, %zmm5
1638 ; AVX512VLBW-NEXT:    vmovdqa {{.*#+}} ymm6 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1639 ; AVX512VLBW-NEXT:    vpsubb %ymm4, %ymm6, %ymm4
1640 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm4 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero,ymm4[16],zero,ymm4[17],zero,ymm4[18],zero,ymm4[19],zero,ymm4[20],zero,ymm4[21],zero,ymm4[22],zero,ymm4[23],zero,ymm4[24],zero,ymm4[25],zero,ymm4[26],zero,ymm4[27],zero,ymm4[28],zero,ymm4[29],zero,ymm4[30],zero,ymm4[31],zero
1641 ; 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
1642 ; AVX512VLBW-NEXT:    vpsrlvw %zmm4, %zmm1, %zmm1
1643 ; AVX512VLBW-NEXT:    vporq %zmm1, %zmm5, %zmm1
1644 ; AVX512VLBW-NEXT:    vpmovwb %zmm1, %ymm1
1645 ; AVX512VLBW-NEXT:    vptestnmb %ymm3, %ymm2, %k1
1646 ; AVX512VLBW-NEXT:    vmovdqu8 %ymm0, %ymm1 {%k1}
1647 ; AVX512VLBW-NEXT:    vmovdqa %ymm1, %ymm0
1648 ; AVX512VLBW-NEXT:    retq
1650 ; AVX512VLVBMI2-LABEL: splatvar_funnnel_v32i8:
1651 ; AVX512VLVBMI2:       # %bb.0:
1652 ; AVX512VLVBMI2-NEXT:    vpbroadcastb %xmm2, %ymm2
1653 ; AVX512VLVBMI2-NEXT:    vmovdqa {{.*#+}} ymm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
1654 ; AVX512VLVBMI2-NEXT:    vpand %ymm3, %ymm2, %ymm4
1655 ; AVX512VLVBMI2-NEXT:    vpmovzxbw {{.*#+}} zmm5 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero,ymm4[16],zero,ymm4[17],zero,ymm4[18],zero,ymm4[19],zero,ymm4[20],zero,ymm4[21],zero,ymm4[22],zero,ymm4[23],zero,ymm4[24],zero,ymm4[25],zero,ymm4[26],zero,ymm4[27],zero,ymm4[28],zero,ymm4[29],zero,ymm4[30],zero,ymm4[31],zero
1656 ; AVX512VLVBMI2-NEXT:    vpmovzxbw {{.*#+}} zmm6 = 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
1657 ; AVX512VLVBMI2-NEXT:    vpsllvw %zmm5, %zmm6, %zmm5
1658 ; AVX512VLVBMI2-NEXT:    vmovdqa {{.*#+}} ymm6 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1659 ; AVX512VLVBMI2-NEXT:    vpsubb %ymm4, %ymm6, %ymm4
1660 ; AVX512VLVBMI2-NEXT:    vpmovzxbw {{.*#+}} zmm4 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero,ymm4[16],zero,ymm4[17],zero,ymm4[18],zero,ymm4[19],zero,ymm4[20],zero,ymm4[21],zero,ymm4[22],zero,ymm4[23],zero,ymm4[24],zero,ymm4[25],zero,ymm4[26],zero,ymm4[27],zero,ymm4[28],zero,ymm4[29],zero,ymm4[30],zero,ymm4[31],zero
1661 ; AVX512VLVBMI2-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
1662 ; AVX512VLVBMI2-NEXT:    vpsrlvw %zmm4, %zmm1, %zmm1
1663 ; AVX512VLVBMI2-NEXT:    vporq %zmm1, %zmm5, %zmm1
1664 ; AVX512VLVBMI2-NEXT:    vpmovwb %zmm1, %ymm1
1665 ; AVX512VLVBMI2-NEXT:    vptestnmb %ymm3, %ymm2, %k1
1666 ; AVX512VLVBMI2-NEXT:    vmovdqu8 %ymm0, %ymm1 {%k1}
1667 ; AVX512VLVBMI2-NEXT:    vmovdqa %ymm1, %ymm0
1668 ; AVX512VLVBMI2-NEXT:    retq
1670 ; XOPAVX1-LABEL: splatvar_funnnel_v32i8:
1671 ; XOPAVX1:       # %bb.0:
1672 ; XOPAVX1-NEXT:    vpxor %xmm8, %xmm8, %xmm8
1673 ; XOPAVX1-NEXT:    vpshufb %xmm8, %xmm2, %xmm2
1674 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm2, %ymm2
1675 ; XOPAVX1-NEXT:    vandps {{.*}}(%rip), %ymm2, %ymm2
1676 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1677 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
1678 ; XOPAVX1-NEXT:    vpshlb %xmm4, %xmm5, %xmm5
1679 ; XOPAVX1-NEXT:    vpshlb %xmm2, %xmm0, %xmm6
1680 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm6, %ymm5
1681 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1682 ; XOPAVX1-NEXT:    vpsubb %xmm6, %xmm4, %xmm7
1683 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1684 ; XOPAVX1-NEXT:    vpshlb %xmm7, %xmm3, %xmm3
1685 ; XOPAVX1-NEXT:    vpsubb %xmm6, %xmm2, %xmm6
1686 ; XOPAVX1-NEXT:    vpshlb %xmm6, %xmm1, %xmm1
1687 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1688 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm5, %ymm1
1689 ; XOPAVX1-NEXT:    vpcomeqb %xmm8, %xmm4, %xmm3
1690 ; XOPAVX1-NEXT:    vpcomeqb %xmm8, %xmm2, %xmm2
1691 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
1692 ; XOPAVX1-NEXT:    vpcmov %ymm2, %ymm1, %ymm0, %ymm0
1693 ; XOPAVX1-NEXT:    retq
1695 ; XOPAVX2-LABEL: splatvar_funnnel_v32i8:
1696 ; XOPAVX2:       # %bb.0:
1697 ; XOPAVX2-NEXT:    vpbroadcastb %xmm2, %ymm2
1698 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
1699 ; XOPAVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
1700 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm2, %xmm4
1701 ; XOPAVX2-NEXT:    vpshlb %xmm4, %xmm3, %xmm3
1702 ; XOPAVX2-NEXT:    vpshlb %xmm2, %xmm0, %xmm4
1703 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm3, %ymm4, %ymm3
1704 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
1705 ; XOPAVX2-NEXT:    vpsubb %ymm2, %ymm4, %ymm4
1706 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm4, %xmm5
1707 ; XOPAVX2-NEXT:    vpxor %xmm6, %xmm6, %xmm6
1708 ; XOPAVX2-NEXT:    vpsubb %xmm5, %xmm6, %xmm5
1709 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm7
1710 ; XOPAVX2-NEXT:    vpshlb %xmm5, %xmm7, %xmm5
1711 ; XOPAVX2-NEXT:    vpsubb %xmm4, %xmm6, %xmm4
1712 ; XOPAVX2-NEXT:    vpshlb %xmm4, %xmm1, %xmm1
1713 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm5, %ymm1, %ymm1
1714 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm3, %ymm1
1715 ; XOPAVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1716 ; XOPAVX2-NEXT:    vpcmpeqb %ymm3, %ymm2, %ymm2
1717 ; XOPAVX2-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1718 ; XOPAVX2-NEXT:    retq
1719   %splat = shufflevector <32 x i8> %amt, <32 x i8> undef, <32 x i32> zeroinitializer
1720   %res = call <32 x i8> @llvm.fshl.v32i8(<32 x i8> %x, <32 x i8> %y, <32 x i8> %splat)
1721   ret <32 x i8> %res
1725 ; Constant Shifts
1728 define <4 x i64> @constant_funnnel_v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
1729 ; AVX1-LABEL: constant_funnnel_v4i64:
1730 ; AVX1:       # %bb.0:
1731 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1732 ; AVX1-NEXT:    vpsrlq $4, %xmm2, %xmm3
1733 ; AVX1-NEXT:    vpsrlq $14, %xmm2, %xmm2
1734 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm3[4,5,6,7]
1735 ; AVX1-NEXT:    vpsrlq $50, %xmm1, %xmm3
1736 ; AVX1-NEXT:    vpsrlq $60, %xmm1, %xmm1
1737 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm3[4,5,6,7]
1738 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1739 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1740 ; AVX1-NEXT:    vpsllq $60, %xmm2, %xmm3
1741 ; AVX1-NEXT:    vpsllq $50, %xmm2, %xmm2
1742 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm3[4,5,6,7]
1743 ; AVX1-NEXT:    vpsllq $14, %xmm0, %xmm3
1744 ; AVX1-NEXT:    vpsllq $4, %xmm0, %xmm0
1745 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]
1746 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1747 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1748 ; AVX1-NEXT:    retq
1750 ; AVX2-LABEL: constant_funnnel_v4i64:
1751 ; AVX2:       # %bb.0:
1752 ; AVX2-NEXT:    vpsrlvq {{.*}}(%rip), %ymm1, %ymm1
1753 ; AVX2-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
1754 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1755 ; AVX2-NEXT:    retq
1757 ; AVX512F-LABEL: constant_funnnel_v4i64:
1758 ; AVX512F:       # %bb.0:
1759 ; AVX512F-NEXT:    vpsrlvq {{.*}}(%rip), %ymm1, %ymm1
1760 ; AVX512F-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
1761 ; AVX512F-NEXT:    vpor %ymm1, %ymm0, %ymm0
1762 ; AVX512F-NEXT:    retq
1764 ; AVX512VL-LABEL: constant_funnnel_v4i64:
1765 ; AVX512VL:       # %bb.0:
1766 ; AVX512VL-NEXT:    vpsrlvq {{.*}}(%rip), %ymm1, %ymm1
1767 ; AVX512VL-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
1768 ; AVX512VL-NEXT:    vpor %ymm1, %ymm0, %ymm0
1769 ; AVX512VL-NEXT:    retq
1771 ; AVX512BW-LABEL: constant_funnnel_v4i64:
1772 ; AVX512BW:       # %bb.0:
1773 ; AVX512BW-NEXT:    vpsrlvq {{.*}}(%rip), %ymm1, %ymm1
1774 ; AVX512BW-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
1775 ; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm0
1776 ; AVX512BW-NEXT:    retq
1778 ; AVX512VBMI2-LABEL: constant_funnnel_v4i64:
1779 ; AVX512VBMI2:       # %bb.0:
1780 ; AVX512VBMI2-NEXT:    vpsrlvq {{.*}}(%rip), %ymm1, %ymm1
1781 ; AVX512VBMI2-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
1782 ; AVX512VBMI2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1783 ; AVX512VBMI2-NEXT:    retq
1785 ; AVX512VLBW-LABEL: constant_funnnel_v4i64:
1786 ; AVX512VLBW:       # %bb.0:
1787 ; AVX512VLBW-NEXT:    vpsrlvq {{.*}}(%rip), %ymm1, %ymm1
1788 ; AVX512VLBW-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
1789 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm0
1790 ; AVX512VLBW-NEXT:    retq
1792 ; AVX512VLVBMI2-LABEL: constant_funnnel_v4i64:
1793 ; AVX512VLVBMI2:       # %bb.0:
1794 ; AVX512VLVBMI2-NEXT:    vpshldvq {{.*}}(%rip), %ymm1, %ymm0
1795 ; AVX512VLVBMI2-NEXT:    retq
1797 ; XOPAVX1-LABEL: constant_funnnel_v4i64:
1798 ; XOPAVX1:       # %bb.0:
1799 ; XOPAVX1-NEXT:    vpshlq {{.*}}(%rip), %xmm1, %xmm2
1800 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1801 ; XOPAVX1-NEXT:    vpshlq {{.*}}(%rip), %xmm1, %xmm1
1802 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
1803 ; XOPAVX1-NEXT:    vpshlq {{.*}}(%rip), %xmm0, %xmm2
1804 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1805 ; XOPAVX1-NEXT:    vpshlq {{.*}}(%rip), %xmm0, %xmm0
1806 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
1807 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1808 ; XOPAVX1-NEXT:    retq
1810 ; XOPAVX2-LABEL: constant_funnnel_v4i64:
1811 ; XOPAVX2:       # %bb.0:
1812 ; XOPAVX2-NEXT:    vpsrlvq {{.*}}(%rip), %ymm1, %ymm1
1813 ; XOPAVX2-NEXT:    vpsllvq {{.*}}(%rip), %ymm0, %ymm0
1814 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1815 ; XOPAVX2-NEXT:    retq
1816   %res = call <4 x i64> @llvm.fshl.v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> <i64 4, i64 14, i64 50, i64 60>)
1817   ret <4 x i64> %res
1820 define <8 x i32> @constant_funnnel_v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
1821 ; AVX1-LABEL: constant_funnnel_v8i32:
1822 ; AVX1:       # %bb.0:
1823 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1824 ; AVX1-NEXT:    vpsrld $21, %xmm2, %xmm3
1825 ; AVX1-NEXT:    vpsrld $23, %xmm2, %xmm4
1826 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
1827 ; AVX1-NEXT:    vpsrld $22, %xmm2, %xmm4
1828 ; AVX1-NEXT:    vpsrld $24, %xmm2, %xmm2
1829 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm4[4,5,6,7]
1830 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
1831 ; AVX1-NEXT:    vpsrld $25, %xmm1, %xmm3
1832 ; AVX1-NEXT:    vpsrld $27, %xmm1, %xmm4
1833 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
1834 ; AVX1-NEXT:    vpsrld $26, %xmm1, %xmm4
1835 ; AVX1-NEXT:    vpsrld $28, %xmm1, %xmm1
1836 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm4[4,5,6,7]
1837 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]
1838 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1839 ; AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm2
1840 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1841 ; AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm0
1842 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
1843 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1844 ; AVX1-NEXT:    retq
1846 ; AVX2-LABEL: constant_funnnel_v8i32:
1847 ; AVX2:       # %bb.0:
1848 ; AVX2-NEXT:    vpsrlvd {{.*}}(%rip), %ymm1, %ymm1
1849 ; AVX2-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
1850 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1851 ; AVX2-NEXT:    retq
1853 ; AVX512F-LABEL: constant_funnnel_v8i32:
1854 ; AVX512F:       # %bb.0:
1855 ; AVX512F-NEXT:    vpsrlvd {{.*}}(%rip), %ymm1, %ymm1
1856 ; AVX512F-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
1857 ; AVX512F-NEXT:    vpor %ymm1, %ymm0, %ymm0
1858 ; AVX512F-NEXT:    retq
1860 ; AVX512VL-LABEL: constant_funnnel_v8i32:
1861 ; AVX512VL:       # %bb.0:
1862 ; AVX512VL-NEXT:    vpsrlvd {{.*}}(%rip), %ymm1, %ymm1
1863 ; AVX512VL-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
1864 ; AVX512VL-NEXT:    vpor %ymm1, %ymm0, %ymm0
1865 ; AVX512VL-NEXT:    retq
1867 ; AVX512BW-LABEL: constant_funnnel_v8i32:
1868 ; AVX512BW:       # %bb.0:
1869 ; AVX512BW-NEXT:    vpsrlvd {{.*}}(%rip), %ymm1, %ymm1
1870 ; AVX512BW-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
1871 ; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm0
1872 ; AVX512BW-NEXT:    retq
1874 ; AVX512VBMI2-LABEL: constant_funnnel_v8i32:
1875 ; AVX512VBMI2:       # %bb.0:
1876 ; AVX512VBMI2-NEXT:    vpsrlvd {{.*}}(%rip), %ymm1, %ymm1
1877 ; AVX512VBMI2-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
1878 ; AVX512VBMI2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1879 ; AVX512VBMI2-NEXT:    retq
1881 ; AVX512VLBW-LABEL: constant_funnnel_v8i32:
1882 ; AVX512VLBW:       # %bb.0:
1883 ; AVX512VLBW-NEXT:    vpsrlvd {{.*}}(%rip), %ymm1, %ymm1
1884 ; AVX512VLBW-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
1885 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm0
1886 ; AVX512VLBW-NEXT:    retq
1888 ; AVX512VLVBMI2-LABEL: constant_funnnel_v8i32:
1889 ; AVX512VLVBMI2:       # %bb.0:
1890 ; AVX512VLVBMI2-NEXT:    vpshldvd {{.*}}(%rip), %ymm1, %ymm0
1891 ; AVX512VLVBMI2-NEXT:    retq
1893 ; XOPAVX1-LABEL: constant_funnnel_v8i32:
1894 ; XOPAVX1:       # %bb.0:
1895 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm1, %xmm2
1896 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1897 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm1, %xmm1
1898 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
1899 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm2
1900 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1901 ; XOPAVX1-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm0
1902 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
1903 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
1904 ; XOPAVX1-NEXT:    retq
1906 ; XOPAVX2-LABEL: constant_funnnel_v8i32:
1907 ; XOPAVX2:       # %bb.0:
1908 ; XOPAVX2-NEXT:    vpsrlvd {{.*}}(%rip), %ymm1, %ymm1
1909 ; XOPAVX2-NEXT:    vpsllvd {{.*}}(%rip), %ymm0, %ymm0
1910 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
1911 ; XOPAVX2-NEXT:    retq
1912   %res = call <8 x i32> @llvm.fshl.v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11>)
1913   ret <8 x i32> %res
1916 define <16 x i16> @constant_funnnel_v16i16(<16 x i16> %x, <16 x i16> %y) nounwind {
1917 ; AVX1-LABEL: constant_funnnel_v16i16:
1918 ; AVX1:       # %bb.0:
1919 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1920 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [256,512,1024,2048,4096,8192,16384,32768]
1921 ; AVX1-NEXT:    vpmulhuw %xmm3, %xmm2, %xmm2
1922 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [1,2,4,8,16,32,64,128]
1923 ; AVX1-NEXT:    vpmulhuw %xmm4, %xmm1, %xmm1
1924 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1925 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1926 ; AVX1-NEXT:    vpmullw %xmm3, %xmm2, %xmm2
1927 ; AVX1-NEXT:    vpmullw %xmm4, %xmm0, %xmm3
1928 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
1929 ; AVX1-NEXT:    vorps %ymm1, %ymm2, %ymm1
1930 ; AVX1-NEXT:    vmovaps {{.*#+}} ymm2 = [0,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535]
1931 ; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
1932 ; AVX1-NEXT:    vandnps %ymm0, %ymm2, %ymm0
1933 ; AVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
1934 ; AVX1-NEXT:    retq
1936 ; AVX2-LABEL: constant_funnnel_v16i16:
1937 ; AVX2:       # %bb.0:
1938 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
1939 ; AVX2-NEXT:    vpmulhuw %ymm2, %ymm1, %ymm1
1940 ; AVX2-NEXT:    vpmullw %ymm2, %ymm0, %ymm2
1941 ; AVX2-NEXT:    vpor %ymm1, %ymm2, %ymm1
1942 ; AVX2-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7],ymm0[8],ymm1[9,10,11,12,13,14,15]
1943 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
1944 ; AVX2-NEXT:    retq
1946 ; AVX512F-LABEL: constant_funnnel_v16i16:
1947 ; AVX512F:       # %bb.0:
1948 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
1949 ; AVX512F-NEXT:    vpmulhuw %ymm2, %ymm1, %ymm1
1950 ; AVX512F-NEXT:    vpmullw %ymm2, %ymm0, %ymm2
1951 ; AVX512F-NEXT:    vpor %ymm1, %ymm2, %ymm1
1952 ; AVX512F-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7],ymm0[8],ymm1[9,10,11,12,13,14,15]
1953 ; AVX512F-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
1954 ; AVX512F-NEXT:    retq
1956 ; AVX512VL-LABEL: constant_funnnel_v16i16:
1957 ; AVX512VL:       # %bb.0:
1958 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
1959 ; AVX512VL-NEXT:    vpmulhuw %ymm2, %ymm1, %ymm1
1960 ; AVX512VL-NEXT:    vpmullw %ymm2, %ymm0, %ymm2
1961 ; AVX512VL-NEXT:    vpor %ymm1, %ymm2, %ymm1
1962 ; AVX512VL-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7],ymm0[8],ymm1[9,10,11,12,13,14,15]
1963 ; AVX512VL-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
1964 ; AVX512VL-NEXT:    retq
1966 ; AVX512BW-LABEL: constant_funnnel_v16i16:
1967 ; AVX512BW:       # %bb.0:
1968 ; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1969 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1970 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm2 = [16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1]
1971 ; AVX512BW-NEXT:    vpsrlvw %zmm2, %zmm1, %zmm1
1972 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
1973 ; AVX512BW-NEXT:    vpsllvw %zmm2, %zmm0, %zmm2
1974 ; AVX512BW-NEXT:    vpor %ymm1, %ymm2, %ymm1
1975 ; AVX512BW-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7],ymm0[8],ymm1[9,10,11,12,13,14,15]
1976 ; AVX512BW-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
1977 ; AVX512BW-NEXT:    retq
1979 ; AVX512VBMI2-LABEL: constant_funnnel_v16i16:
1980 ; AVX512VBMI2:       # %bb.0:
1981 ; AVX512VBMI2-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1982 ; AVX512VBMI2-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1983 ; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} ymm2 = [16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1]
1984 ; AVX512VBMI2-NEXT:    vpsrlvw %zmm2, %zmm1, %zmm1
1985 ; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
1986 ; AVX512VBMI2-NEXT:    vpsllvw %zmm2, %zmm0, %zmm2
1987 ; AVX512VBMI2-NEXT:    vpor %ymm1, %ymm2, %ymm1
1988 ; AVX512VBMI2-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7],ymm0[8],ymm1[9,10,11,12,13,14,15]
1989 ; AVX512VBMI2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
1990 ; AVX512VBMI2-NEXT:    retq
1992 ; AVX512VLBW-LABEL: constant_funnnel_v16i16:
1993 ; AVX512VLBW:       # %bb.0:
1994 ; AVX512VLBW-NEXT:    vpsrlvw {{.*}}(%rip), %ymm1, %ymm1
1995 ; AVX512VLBW-NEXT:    vpsllvw {{.*}}(%rip), %ymm0, %ymm2
1996 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm2, %ymm1
1997 ; AVX512VLBW-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7],ymm0[8],ymm1[9,10,11,12,13,14,15]
1998 ; AVX512VLBW-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
1999 ; AVX512VLBW-NEXT:    retq
2001 ; AVX512VLVBMI2-LABEL: constant_funnnel_v16i16:
2002 ; AVX512VLVBMI2:       # %bb.0:
2003 ; AVX512VLVBMI2-NEXT:    vpshldvw {{.*}}(%rip), %ymm1, %ymm0
2004 ; AVX512VLVBMI2-NEXT:    retq
2006 ; XOPAVX1-LABEL: constant_funnnel_v16i16:
2007 ; XOPAVX1:       # %bb.0:
2008 ; XOPAVX1-NEXT:    vpshlw {{.*}}(%rip), %xmm1, %xmm2
2009 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2010 ; XOPAVX1-NEXT:    vpshlw {{.*}}(%rip), %xmm1, %xmm1
2011 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
2012 ; XOPAVX1-NEXT:    vpshlw {{.*}}(%rip), %xmm0, %xmm2
2013 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2014 ; XOPAVX1-NEXT:    vpshlw {{.*}}(%rip), %xmm3, %xmm3
2015 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
2016 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm2, %ymm1
2017 ; XOPAVX1-NEXT:    vpcmov {{.*}}(%rip), %ymm0, %ymm1, %ymm0
2018 ; XOPAVX1-NEXT:    retq
2020 ; XOPAVX2-LABEL: constant_funnnel_v16i16:
2021 ; XOPAVX2:       # %bb.0:
2022 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768]
2023 ; XOPAVX2-NEXT:    vpmulhuw %ymm2, %ymm1, %ymm1
2024 ; XOPAVX2-NEXT:    vpmullw %ymm2, %ymm0, %ymm2
2025 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm2, %ymm1
2026 ; XOPAVX2-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5,6,7],ymm0[8],ymm1[9,10,11,12,13,14,15]
2027 ; XOPAVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]
2028 ; XOPAVX2-NEXT:    retq
2029   %res = call <16 x i16> @llvm.fshl.v16i16(<16 x i16> %x, <16 x i16> %y, <16 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>)
2030   ret <16 x i16> %res
2033 define <32 x i8> @constant_funnnel_v32i8(<32 x i8> %x, <32 x i8> %y) nounwind {
2034 ; AVX1-LABEL: constant_funnnel_v32i8:
2035 ; AVX1:       # %bb.0:
2036 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2037 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
2038 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm2[8],xmm3[8],xmm2[9],xmm3[9],xmm2[10],xmm3[10],xmm2[11],xmm3[11],xmm2[12],xmm3[12],xmm2[13],xmm3[13],xmm2[14],xmm3[14],xmm2[15],xmm3[15]
2039 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [1,128,64,32,16,8,4,2]
2040 ; AVX1-NEXT:    vpmullw %xmm5, %xmm4, %xmm4
2041 ; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm4
2042 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
2043 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [1,2,4,8,16,32,64,128]
2044 ; AVX1-NEXT:    vpmullw %xmm6, %xmm2, %xmm2
2045 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
2046 ; AVX1-NEXT:    vpackuswb %xmm4, %xmm2, %xmm2
2047 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm1[8],xmm3[8],xmm1[9],xmm3[9],xmm1[10],xmm3[10],xmm1[11],xmm3[11],xmm1[12],xmm3[12],xmm1[13],xmm3[13],xmm1[14],xmm3[14],xmm1[15],xmm3[15]
2048 ; AVX1-NEXT:    vpmullw %xmm5, %xmm3, %xmm3
2049 ; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
2050 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero
2051 ; AVX1-NEXT:    vpmullw %xmm6, %xmm1, %xmm1
2052 ; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1
2053 ; AVX1-NEXT:    vpackuswb %xmm3, %xmm1, %xmm1
2054 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2055 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2056 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
2057 ; AVX1-NEXT:    vpmullw %xmm5, %xmm3, %xmm3
2058 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
2059 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
2060 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
2061 ; AVX1-NEXT:    vpmullw %xmm6, %xmm2, %xmm2
2062 ; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
2063 ; AVX1-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
2064 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2065 ; AVX1-NEXT:    vpmullw %xmm5, %xmm3, %xmm3
2066 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
2067 ; 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
2068 ; AVX1-NEXT:    vpmullw %xmm6, %xmm5, %xmm5
2069 ; AVX1-NEXT:    vpand %xmm4, %xmm5, %xmm4
2070 ; AVX1-NEXT:    vpackuswb %xmm3, %xmm4, %xmm3
2071 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
2072 ; AVX1-NEXT:    vorps %ymm1, %ymm2, %ymm1
2073 ; AVX1-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [NaN,NaN,NaN,NaN]
2074 ; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
2075 ; AVX1-NEXT:    vandnps %ymm0, %ymm2, %ymm0
2076 ; AVX1-NEXT:    vorps %ymm0, %ymm1, %ymm0
2077 ; AVX1-NEXT:    retq
2079 ; AVX2-LABEL: constant_funnnel_v32i8:
2080 ; AVX2:       # %bb.0:
2081 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm2
2082 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
2083 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [8192,24640,41088,57536,57344,41152,24704,8256,8192,24640,41088,57536,57344,41152,24704,8256]
2084 ; AVX2-NEXT:    vpblendvb %ymm3, %ymm2, %ymm0, %ymm2
2085 ; AVX2-NEXT:    vpsllw $2, %ymm2, %ymm4
2086 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
2087 ; AVX2-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
2088 ; AVX2-NEXT:    vpblendvb %ymm3, %ymm4, %ymm2, %ymm2
2089 ; AVX2-NEXT:    vpaddb %ymm2, %ymm2, %ymm4
2090 ; AVX2-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
2091 ; AVX2-NEXT:    vpblendvb %ymm3, %ymm4, %ymm2, %ymm2
2092 ; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
2093 ; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm1[8],ymm3[8],ymm1[9],ymm3[9],ymm1[10],ymm3[10],ymm1[11],ymm3[11],ymm1[12],ymm3[12],ymm1[13],ymm3[13],ymm1[14],ymm3[14],ymm1[15],ymm3[15],ymm1[24],ymm3[24],ymm1[25],ymm3[25],ymm1[26],ymm3[26],ymm1[27],ymm3[27],ymm1[28],ymm3[28],ymm1[29],ymm3[29],ymm1[30],ymm3[30],ymm1[31],ymm3[31]
2094 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm4, %ymm4
2095 ; AVX2-NEXT:    vpsrlw $8, %ymm4, %ymm4
2096 ; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm3[0],ymm1[1],ymm3[1],ymm1[2],ymm3[2],ymm1[3],ymm3[3],ymm1[4],ymm3[4],ymm1[5],ymm3[5],ymm1[6],ymm3[6],ymm1[7],ymm3[7],ymm1[16],ymm3[16],ymm1[17],ymm3[17],ymm1[18],ymm3[18],ymm1[19],ymm3[19],ymm1[20],ymm3[20],ymm1[21],ymm3[21],ymm1[22],ymm3[22],ymm1[23],ymm3[23]
2097 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
2098 ; AVX2-NEXT:    vpsrlw $8, %ymm1, %ymm1
2099 ; AVX2-NEXT:    vpackuswb %ymm4, %ymm1, %ymm1
2100 ; AVX2-NEXT:    vpor %ymm1, %ymm2, %ymm1
2101 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255]
2102 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
2103 ; AVX2-NEXT:    retq
2105 ; AVX512F-LABEL: constant_funnnel_v32i8:
2106 ; AVX512F:       # %bb.0:
2107 ; AVX512F-NEXT:    vpsllw $4, %ymm0, %ymm2
2108 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
2109 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm3 = [8192,24640,41088,57536,57344,41152,24704,8256,8192,24640,41088,57536,57344,41152,24704,8256]
2110 ; AVX512F-NEXT:    vpblendvb %ymm3, %ymm2, %ymm0, %ymm2
2111 ; AVX512F-NEXT:    vpsllw $2, %ymm2, %ymm4
2112 ; AVX512F-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
2113 ; AVX512F-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
2114 ; AVX512F-NEXT:    vpblendvb %ymm3, %ymm4, %ymm2, %ymm2
2115 ; AVX512F-NEXT:    vpaddb %ymm2, %ymm2, %ymm4
2116 ; AVX512F-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
2117 ; AVX512F-NEXT:    vpblendvb %ymm3, %ymm4, %ymm2, %ymm2
2118 ; AVX512F-NEXT:    vpxor %xmm3, %xmm3, %xmm3
2119 ; AVX512F-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm1[8],ymm3[8],ymm1[9],ymm3[9],ymm1[10],ymm3[10],ymm1[11],ymm3[11],ymm1[12],ymm3[12],ymm1[13],ymm3[13],ymm1[14],ymm3[14],ymm1[15],ymm3[15],ymm1[24],ymm3[24],ymm1[25],ymm3[25],ymm1[26],ymm3[26],ymm1[27],ymm3[27],ymm1[28],ymm3[28],ymm1[29],ymm3[29],ymm1[30],ymm3[30],ymm1[31],ymm3[31]
2120 ; AVX512F-NEXT:    vpmullw {{.*}}(%rip), %ymm4, %ymm4
2121 ; AVX512F-NEXT:    vpsrlw $8, %ymm4, %ymm4
2122 ; AVX512F-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[0],ymm3[0],ymm1[1],ymm3[1],ymm1[2],ymm3[2],ymm1[3],ymm3[3],ymm1[4],ymm3[4],ymm1[5],ymm3[5],ymm1[6],ymm3[6],ymm1[7],ymm3[7],ymm1[16],ymm3[16],ymm1[17],ymm3[17],ymm1[18],ymm3[18],ymm1[19],ymm3[19],ymm1[20],ymm3[20],ymm1[21],ymm3[21],ymm1[22],ymm3[22],ymm1[23],ymm3[23]
2123 ; AVX512F-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
2124 ; AVX512F-NEXT:    vpsrlw $8, %ymm1, %ymm1
2125 ; AVX512F-NEXT:    vpackuswb %ymm4, %ymm1, %ymm1
2126 ; AVX512F-NEXT:    vpor %ymm1, %ymm2, %ymm1
2127 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255]
2128 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
2129 ; AVX512F-NEXT:    retq
2131 ; AVX512VL-LABEL: constant_funnnel_v32i8:
2132 ; AVX512VL:       # %bb.0:
2133 ; AVX512VL-NEXT:    vpsllw $4, %ymm0, %ymm2
2134 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
2135 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm3 = [8192,24640,41088,57536,57344,41152,24704,8256,8192,24640,41088,57536,57344,41152,24704,8256]
2136 ; AVX512VL-NEXT:    vpblendvb %ymm3, %ymm2, %ymm0, %ymm2
2137 ; AVX512VL-NEXT:    vpsllw $2, %ymm2, %ymm4
2138 ; AVX512VL-NEXT:    vpand {{.*}}(%rip), %ymm4, %ymm4
2139 ; AVX512VL-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
2140 ; AVX512VL-NEXT:    vpblendvb %ymm3, %ymm4, %ymm2, %ymm2
2141 ; AVX512VL-NEXT:    vpaddb %ymm2, %ymm2, %ymm4
2142 ; AVX512VL-NEXT:    vpaddb %ymm3, %ymm3, %ymm3
2143 ; AVX512VL-NEXT:    vpblendvb %ymm3, %ymm4, %ymm2, %ymm2
2144 ; AVX512VL-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm1[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]
2145 ; AVX512VL-NEXT:    vpsrlw $8, %ymm3, %ymm3
2146 ; AVX512VL-NEXT:    vpmullw {{.*}}(%rip), %ymm3, %ymm3
2147 ; AVX512VL-NEXT:    vpsrlw $8, %ymm3, %ymm3
2148 ; AVX512VL-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm1[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]
2149 ; AVX512VL-NEXT:    vpsrlw $8, %ymm1, %ymm1
2150 ; AVX512VL-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
2151 ; AVX512VL-NEXT:    vpsrlw $8, %ymm1, %ymm1
2152 ; AVX512VL-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
2153 ; AVX512VL-NEXT:    vpor %ymm1, %ymm2, %ymm1
2154 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255]
2155 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
2156 ; AVX512VL-NEXT:    retq
2158 ; AVX512BW-LABEL: constant_funnnel_v32i8:
2159 ; AVX512BW:       # %bb.0:
2160 ; 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
2161 ; AVX512BW-NEXT:    vpsrlvw {{.*}}(%rip), %zmm1, %zmm1
2162 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm2 = 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
2163 ; AVX512BW-NEXT:    vpsllvw {{.*}}(%rip), %zmm2, %zmm2
2164 ; AVX512BW-NEXT:    vporq %zmm1, %zmm2, %zmm1
2165 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
2166 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255]
2167 ; AVX512BW-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
2168 ; AVX512BW-NEXT:    retq
2170 ; AVX512VBMI2-LABEL: constant_funnnel_v32i8:
2171 ; AVX512VBMI2:       # %bb.0:
2172 ; AVX512VBMI2-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
2173 ; AVX512VBMI2-NEXT:    vpsrlvw {{.*}}(%rip), %zmm1, %zmm1
2174 ; AVX512VBMI2-NEXT:    vpmovzxbw {{.*#+}} zmm2 = 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
2175 ; AVX512VBMI2-NEXT:    vpsllvw {{.*}}(%rip), %zmm2, %zmm2
2176 ; AVX512VBMI2-NEXT:    vporq %zmm1, %zmm2, %zmm1
2177 ; AVX512VBMI2-NEXT:    vpmovwb %zmm1, %ymm1
2178 ; AVX512VBMI2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255]
2179 ; AVX512VBMI2-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
2180 ; AVX512VBMI2-NEXT:    retq
2182 ; AVX512VLBW-LABEL: constant_funnnel_v32i8:
2183 ; AVX512VLBW:       # %bb.0:
2184 ; 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
2185 ; AVX512VLBW-NEXT:    vpsrlvw {{.*}}(%rip), %zmm1, %zmm1
2186 ; AVX512VLBW-NEXT:    vpmovzxbw {{.*#+}} zmm2 = 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
2187 ; AVX512VLBW-NEXT:    vpsllvw {{.*}}(%rip), %zmm2, %zmm2
2188 ; AVX512VLBW-NEXT:    vporq %zmm1, %zmm2, %zmm1
2189 ; AVX512VLBW-NEXT:    vpmovwb %zmm1, %ymm1
2190 ; AVX512VLBW-NEXT:    movl $16843009, %eax # imm = 0x1010101
2191 ; AVX512VLBW-NEXT:    kmovd %eax, %k1
2192 ; AVX512VLBW-NEXT:    vmovdqu8 %ymm0, %ymm1 {%k1}
2193 ; AVX512VLBW-NEXT:    vmovdqa %ymm1, %ymm0
2194 ; AVX512VLBW-NEXT:    retq
2196 ; AVX512VLVBMI2-LABEL: constant_funnnel_v32i8:
2197 ; AVX512VLVBMI2:       # %bb.0:
2198 ; AVX512VLVBMI2-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
2199 ; AVX512VLVBMI2-NEXT:    vpsrlvw {{.*}}(%rip), %zmm1, %zmm1
2200 ; AVX512VLVBMI2-NEXT:    vpmovzxbw {{.*#+}} zmm2 = 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
2201 ; AVX512VLVBMI2-NEXT:    vpsllvw {{.*}}(%rip), %zmm2, %zmm2
2202 ; AVX512VLVBMI2-NEXT:    vporq %zmm1, %zmm2, %zmm1
2203 ; AVX512VLVBMI2-NEXT:    vpmovwb %zmm1, %ymm1
2204 ; AVX512VLVBMI2-NEXT:    movl $16843009, %eax # imm = 0x1010101
2205 ; AVX512VLVBMI2-NEXT:    kmovd %eax, %k1
2206 ; AVX512VLVBMI2-NEXT:    vmovdqu8 %ymm0, %ymm1 {%k1}
2207 ; AVX512VLVBMI2-NEXT:    vmovdqa %ymm1, %ymm0
2208 ; AVX512VLVBMI2-NEXT:    retq
2210 ; XOPAVX1-LABEL: constant_funnnel_v32i8:
2211 ; XOPAVX1:       # %bb.0:
2212 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2213 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [248,249,250,251,252,253,254,255,248,255,254,253,252,251,250,249]
2214 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm2, %xmm2
2215 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm1, %xmm1
2216 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2217 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2218 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,2,3,4,5,6,7,0,7,6,5,4,3,2,1]
2219 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm2, %xmm2
2220 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm0, %xmm3
2221 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
2222 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm2, %ymm1
2223 ; XOPAVX1-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [NaN,NaN,NaN,NaN]
2224 ; XOPAVX1-NEXT:    vpcmov %ymm2, %ymm0, %ymm1, %ymm0
2225 ; XOPAVX1-NEXT:    retq
2227 ; XOPAVX2-LABEL: constant_funnnel_v32i8:
2228 ; XOPAVX2:       # %bb.0:
2229 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
2230 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [248,249,250,251,252,253,254,255,248,255,254,253,252,251,250,249]
2231 ; XOPAVX2-NEXT:    vpshlb %xmm3, %xmm2, %xmm2
2232 ; XOPAVX2-NEXT:    vpshlb %xmm3, %xmm1, %xmm1
2233 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
2234 ; XOPAVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
2235 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,2,3,4,5,6,7,0,7,6,5,4,3,2,1]
2236 ; XOPAVX2-NEXT:    vpshlb %xmm3, %xmm2, %xmm2
2237 ; XOPAVX2-NEXT:    vpshlb %xmm3, %xmm0, %xmm3
2238 ; XOPAVX2-NEXT:    vinserti128 $1, %xmm2, %ymm3, %ymm2
2239 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm2, %ymm1
2240 ; XOPAVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255]
2241 ; XOPAVX2-NEXT:    vpblendvb %ymm2, %ymm1, %ymm0, %ymm0
2242 ; XOPAVX2-NEXT:    retq
2243   %res = call <32 x i8> @llvm.fshl.v32i8(<32 x i8> %x, <32 x i8> %y, <32 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1>)
2244   ret <32 x i8> %res
2248 ; Uniform Constant Shifts
2251 define <4 x i64> @splatconstant_funnnel_v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
2252 ; AVX1-LABEL: splatconstant_funnnel_v4i64:
2253 ; AVX1:       # %bb.0:
2254 ; AVX1-NEXT:    vpsrlq $50, %xmm1, %xmm2
2255 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2256 ; AVX1-NEXT:    vpsrlq $50, %xmm1, %xmm1
2257 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
2258 ; AVX1-NEXT:    vpsllq $14, %xmm0, %xmm2
2259 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2260 ; AVX1-NEXT:    vpsllq $14, %xmm0, %xmm0
2261 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
2262 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2263 ; AVX1-NEXT:    retq
2265 ; AVX2-LABEL: splatconstant_funnnel_v4i64:
2266 ; AVX2:       # %bb.0:
2267 ; AVX2-NEXT:    vpsrlq $50, %ymm1, %ymm1
2268 ; AVX2-NEXT:    vpsllq $14, %ymm0, %ymm0
2269 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2270 ; AVX2-NEXT:    retq
2272 ; AVX512F-LABEL: splatconstant_funnnel_v4i64:
2273 ; AVX512F:       # %bb.0:
2274 ; AVX512F-NEXT:    vpsrlq $50, %ymm1, %ymm1
2275 ; AVX512F-NEXT:    vpsllq $14, %ymm0, %ymm0
2276 ; AVX512F-NEXT:    vpor %ymm1, %ymm0, %ymm0
2277 ; AVX512F-NEXT:    retq
2279 ; AVX512VL-LABEL: splatconstant_funnnel_v4i64:
2280 ; AVX512VL:       # %bb.0:
2281 ; AVX512VL-NEXT:    vpsrlq $50, %ymm1, %ymm1
2282 ; AVX512VL-NEXT:    vpsllq $14, %ymm0, %ymm0
2283 ; AVX512VL-NEXT:    vpor %ymm1, %ymm0, %ymm0
2284 ; AVX512VL-NEXT:    retq
2286 ; AVX512BW-LABEL: splatconstant_funnnel_v4i64:
2287 ; AVX512BW:       # %bb.0:
2288 ; AVX512BW-NEXT:    vpsrlq $50, %ymm1, %ymm1
2289 ; AVX512BW-NEXT:    vpsllq $14, %ymm0, %ymm0
2290 ; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm0
2291 ; AVX512BW-NEXT:    retq
2293 ; AVX512VBMI2-LABEL: splatconstant_funnnel_v4i64:
2294 ; AVX512VBMI2:       # %bb.0:
2295 ; AVX512VBMI2-NEXT:    vpsrlq $50, %ymm1, %ymm1
2296 ; AVX512VBMI2-NEXT:    vpsllq $14, %ymm0, %ymm0
2297 ; AVX512VBMI2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2298 ; AVX512VBMI2-NEXT:    retq
2300 ; AVX512VLBW-LABEL: splatconstant_funnnel_v4i64:
2301 ; AVX512VLBW:       # %bb.0:
2302 ; AVX512VLBW-NEXT:    vpsrlq $50, %ymm1, %ymm1
2303 ; AVX512VLBW-NEXT:    vpsllq $14, %ymm0, %ymm0
2304 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm0
2305 ; AVX512VLBW-NEXT:    retq
2307 ; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v4i64:
2308 ; AVX512VLVBMI2:       # %bb.0:
2309 ; AVX512VLVBMI2-NEXT:    vpshldq $14, %ymm1, %ymm0, %ymm0
2310 ; AVX512VLVBMI2-NEXT:    retq
2312 ; XOPAVX1-LABEL: splatconstant_funnnel_v4i64:
2313 ; XOPAVX1:       # %bb.0:
2314 ; XOPAVX1-NEXT:    vpsrlq $50, %xmm1, %xmm2
2315 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2316 ; XOPAVX1-NEXT:    vpsrlq $50, %xmm1, %xmm1
2317 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
2318 ; XOPAVX1-NEXT:    vpsllq $14, %xmm0, %xmm2
2319 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2320 ; XOPAVX1-NEXT:    vpsllq $14, %xmm0, %xmm0
2321 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
2322 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2323 ; XOPAVX1-NEXT:    retq
2325 ; XOPAVX2-LABEL: splatconstant_funnnel_v4i64:
2326 ; XOPAVX2:       # %bb.0:
2327 ; XOPAVX2-NEXT:    vpsrlq $50, %ymm1, %ymm1
2328 ; XOPAVX2-NEXT:    vpsllq $14, %ymm0, %ymm0
2329 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2330 ; XOPAVX2-NEXT:    retq
2331   %res = call <4 x i64> @llvm.fshl.v4i64(<4 x i64> %x, <4 x i64> %y, <4 x i64> <i64 14, i64 14, i64 14, i64 14>)
2332   ret <4 x i64> %res
2335 define <8 x i32> @splatconstant_funnnel_v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
2336 ; AVX1-LABEL: splatconstant_funnnel_v8i32:
2337 ; AVX1:       # %bb.0:
2338 ; AVX1-NEXT:    vpsrld $28, %xmm1, %xmm2
2339 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2340 ; AVX1-NEXT:    vpsrld $28, %xmm1, %xmm1
2341 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
2342 ; AVX1-NEXT:    vpslld $4, %xmm0, %xmm2
2343 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2344 ; AVX1-NEXT:    vpslld $4, %xmm0, %xmm0
2345 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
2346 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2347 ; AVX1-NEXT:    retq
2349 ; AVX2-LABEL: splatconstant_funnnel_v8i32:
2350 ; AVX2:       # %bb.0:
2351 ; AVX2-NEXT:    vpsrld $28, %ymm1, %ymm1
2352 ; AVX2-NEXT:    vpslld $4, %ymm0, %ymm0
2353 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2354 ; AVX2-NEXT:    retq
2356 ; AVX512F-LABEL: splatconstant_funnnel_v8i32:
2357 ; AVX512F:       # %bb.0:
2358 ; AVX512F-NEXT:    vpsrld $28, %ymm1, %ymm1
2359 ; AVX512F-NEXT:    vpslld $4, %ymm0, %ymm0
2360 ; AVX512F-NEXT:    vpor %ymm1, %ymm0, %ymm0
2361 ; AVX512F-NEXT:    retq
2363 ; AVX512VL-LABEL: splatconstant_funnnel_v8i32:
2364 ; AVX512VL:       # %bb.0:
2365 ; AVX512VL-NEXT:    vpsrld $28, %ymm1, %ymm1
2366 ; AVX512VL-NEXT:    vpslld $4, %ymm0, %ymm0
2367 ; AVX512VL-NEXT:    vpor %ymm1, %ymm0, %ymm0
2368 ; AVX512VL-NEXT:    retq
2370 ; AVX512BW-LABEL: splatconstant_funnnel_v8i32:
2371 ; AVX512BW:       # %bb.0:
2372 ; AVX512BW-NEXT:    vpsrld $28, %ymm1, %ymm1
2373 ; AVX512BW-NEXT:    vpslld $4, %ymm0, %ymm0
2374 ; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm0
2375 ; AVX512BW-NEXT:    retq
2377 ; AVX512VBMI2-LABEL: splatconstant_funnnel_v8i32:
2378 ; AVX512VBMI2:       # %bb.0:
2379 ; AVX512VBMI2-NEXT:    vpsrld $28, %ymm1, %ymm1
2380 ; AVX512VBMI2-NEXT:    vpslld $4, %ymm0, %ymm0
2381 ; AVX512VBMI2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2382 ; AVX512VBMI2-NEXT:    retq
2384 ; AVX512VLBW-LABEL: splatconstant_funnnel_v8i32:
2385 ; AVX512VLBW:       # %bb.0:
2386 ; AVX512VLBW-NEXT:    vpsrld $28, %ymm1, %ymm1
2387 ; AVX512VLBW-NEXT:    vpslld $4, %ymm0, %ymm0
2388 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm0
2389 ; AVX512VLBW-NEXT:    retq
2391 ; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v8i32:
2392 ; AVX512VLVBMI2:       # %bb.0:
2393 ; AVX512VLVBMI2-NEXT:    vpshldd $4, %ymm1, %ymm0, %ymm0
2394 ; AVX512VLVBMI2-NEXT:    retq
2396 ; XOPAVX1-LABEL: splatconstant_funnnel_v8i32:
2397 ; XOPAVX1:       # %bb.0:
2398 ; XOPAVX1-NEXT:    vpsrld $28, %xmm1, %xmm2
2399 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2400 ; XOPAVX1-NEXT:    vpsrld $28, %xmm1, %xmm1
2401 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
2402 ; XOPAVX1-NEXT:    vpslld $4, %xmm0, %xmm2
2403 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2404 ; XOPAVX1-NEXT:    vpslld $4, %xmm0, %xmm0
2405 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
2406 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2407 ; XOPAVX1-NEXT:    retq
2409 ; XOPAVX2-LABEL: splatconstant_funnnel_v8i32:
2410 ; XOPAVX2:       # %bb.0:
2411 ; XOPAVX2-NEXT:    vpsrld $28, %ymm1, %ymm1
2412 ; XOPAVX2-NEXT:    vpslld $4, %ymm0, %ymm0
2413 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2414 ; XOPAVX2-NEXT:    retq
2415   %res = call <8 x i32> @llvm.fshl.v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i32> <i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4, i32 4>)
2416   ret <8 x i32> %res
2419 define <16 x i16> @splatconstant_funnnel_v16i16(<16 x i16> %x, <16 x i16> %y) nounwind {
2420 ; AVX1-LABEL: splatconstant_funnnel_v16i16:
2421 ; AVX1:       # %bb.0:
2422 ; AVX1-NEXT:    vpsrlw $9, %xmm1, %xmm2
2423 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2424 ; AVX1-NEXT:    vpsrlw $9, %xmm1, %xmm1
2425 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
2426 ; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm2
2427 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2428 ; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
2429 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
2430 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2431 ; AVX1-NEXT:    retq
2433 ; AVX2-LABEL: splatconstant_funnnel_v16i16:
2434 ; AVX2:       # %bb.0:
2435 ; AVX2-NEXT:    vpsrlw $9, %ymm1, %ymm1
2436 ; AVX2-NEXT:    vpsllw $7, %ymm0, %ymm0
2437 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2438 ; AVX2-NEXT:    retq
2440 ; AVX512F-LABEL: splatconstant_funnnel_v16i16:
2441 ; AVX512F:       # %bb.0:
2442 ; AVX512F-NEXT:    vpsrlw $9, %ymm1, %ymm1
2443 ; AVX512F-NEXT:    vpsllw $7, %ymm0, %ymm0
2444 ; AVX512F-NEXT:    vpor %ymm1, %ymm0, %ymm0
2445 ; AVX512F-NEXT:    retq
2447 ; AVX512VL-LABEL: splatconstant_funnnel_v16i16:
2448 ; AVX512VL:       # %bb.0:
2449 ; AVX512VL-NEXT:    vpsrlw $9, %ymm1, %ymm1
2450 ; AVX512VL-NEXT:    vpsllw $7, %ymm0, %ymm0
2451 ; AVX512VL-NEXT:    vpor %ymm1, %ymm0, %ymm0
2452 ; AVX512VL-NEXT:    retq
2454 ; AVX512BW-LABEL: splatconstant_funnnel_v16i16:
2455 ; AVX512BW:       # %bb.0:
2456 ; AVX512BW-NEXT:    vpsrlw $9, %ymm1, %ymm1
2457 ; AVX512BW-NEXT:    vpsllw $7, %ymm0, %ymm0
2458 ; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm0
2459 ; AVX512BW-NEXT:    retq
2461 ; AVX512VBMI2-LABEL: splatconstant_funnnel_v16i16:
2462 ; AVX512VBMI2:       # %bb.0:
2463 ; AVX512VBMI2-NEXT:    vpsrlw $9, %ymm1, %ymm1
2464 ; AVX512VBMI2-NEXT:    vpsllw $7, %ymm0, %ymm0
2465 ; AVX512VBMI2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2466 ; AVX512VBMI2-NEXT:    retq
2468 ; AVX512VLBW-LABEL: splatconstant_funnnel_v16i16:
2469 ; AVX512VLBW:       # %bb.0:
2470 ; AVX512VLBW-NEXT:    vpsrlw $9, %ymm1, %ymm1
2471 ; AVX512VLBW-NEXT:    vpsllw $7, %ymm0, %ymm0
2472 ; AVX512VLBW-NEXT:    vpor %ymm1, %ymm0, %ymm0
2473 ; AVX512VLBW-NEXT:    retq
2475 ; AVX512VLVBMI2-LABEL: splatconstant_funnnel_v16i16:
2476 ; AVX512VLVBMI2:       # %bb.0:
2477 ; AVX512VLVBMI2-NEXT:    vpshldw $7, %ymm1, %ymm0, %ymm0
2478 ; AVX512VLVBMI2-NEXT:    retq
2480 ; XOPAVX1-LABEL: splatconstant_funnnel_v16i16:
2481 ; XOPAVX1:       # %bb.0:
2482 ; XOPAVX1-NEXT:    vpsrlw $9, %xmm1, %xmm2
2483 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2484 ; XOPAVX1-NEXT:    vpsrlw $9, %xmm1, %xmm1
2485 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
2486 ; XOPAVX1-NEXT:    vpsllw $7, %xmm0, %xmm2
2487 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2488 ; XOPAVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
2489 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
2490 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2491 ; XOPAVX1-NEXT:    retq
2493 ; XOPAVX2-LABEL: splatconstant_funnnel_v16i16:
2494 ; XOPAVX2:       # %bb.0:
2495 ; XOPAVX2-NEXT:    vpsrlw $9, %ymm1, %ymm1
2496 ; XOPAVX2-NEXT:    vpsllw $7, %ymm0, %ymm0
2497 ; XOPAVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2498 ; XOPAVX2-NEXT:    retq
2499   %res = call <16 x i16> @llvm.fshl.v16i16(<16 x i16> %x, <16 x i16> %y, <16 x i16> <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>)
2500   ret <16 x i16> %res
2503 define <32 x i8> @splatconstant_funnnel_v32i8(<32 x i8> %x, <32 x i8> %y) nounwind {
2504 ; AVX1-LABEL: splatconstant_funnnel_v32i8:
2505 ; AVX1:       # %bb.0:
2506 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2507 ; AVX1-NEXT:    vpsrlw $4, %xmm2, %xmm2
2508 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
2509 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
2510 ; AVX1-NEXT:    vpsrlw $4, %xmm1, %xmm1
2511 ; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
2512 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2513 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2514 ; AVX1-NEXT:    vpsllw $4, %xmm2, %xmm2
2515 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
2516 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
2517 ; AVX1-NEXT:    vpsllw $4, %xmm0, %xmm0
2518 ; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
2519 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2520 ; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2521 ; AVX1-NEXT:    retq
2523 ; AVX2-LABEL: splatconstant_funnnel_v32i8:
2524 ; AVX2:       # %bb.0:
2525 ; AVX2-NEXT:    vpsrlw $4, %ymm1, %ymm1
2526 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
2527 ; AVX2-NEXT:    vpsllw $4, %ymm0, %ymm0
2528 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
2529 ; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
2530 ; AVX2-NEXT:    retq
2532 ; AVX512-LABEL: splatconstant_funnnel_v32i8:
2533 ; AVX512:       # %bb.0:
2534 ; AVX512-NEXT:    vpsrlw $4, %ymm1, %ymm1
2535 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
2536 ; AVX512-NEXT:    vpsllw $4, %ymm0, %ymm0
2537 ; AVX512-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
2538 ; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
2539 ; AVX512-NEXT:    retq
2541 ; XOPAVX1-LABEL: splatconstant_funnnel_v32i8:
2542 ; XOPAVX1:       # %bb.0:
2543 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2544 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
2545 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm2, %xmm2
2546 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm1, %xmm1
2547 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2548 ; XOPAVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2549 ; XOPAVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4]
2550 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm2, %xmm2
2551 ; XOPAVX1-NEXT:    vpshlb %xmm3, %xmm0, %xmm0
2552 ; XOPAVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2553 ; XOPAVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
2554 ; XOPAVX1-NEXT:    retq
2556 ; XOPAVX2-LABEL: splatconstant_funnnel_v32i8:
2557 ; XOPAVX2:       # %bb.0:
2558 ; XOPAVX2-NEXT:    vpsrlw $4, %ymm1, %ymm1
2559 ; XOPAVX2-NEXT:    vpsllw $4, %ymm0, %ymm0
2560 ; XOPAVX2-NEXT:    vpcmov {{.*}}(%rip), %ymm1, %ymm0, %ymm0
2561 ; XOPAVX2-NEXT:    retq
2562   %res = call <32 x i8> @llvm.fshl.v32i8(<32 x i8> %x, <32 x i8> %y, <32 x i8> <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>)
2563   ret <32 x i8> %res