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