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