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