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-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2
6 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW
11 define <4 x i64> @var_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
12 ; AVX1-LABEL: var_shift_v4i64:
14 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
15 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
16 ; AVX1-NEXT: vpsrlq %xmm2, %xmm3, %xmm4
17 ; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm2[2,3,0,1]
18 ; AVX1-NEXT: vpsrlq %xmm5, %xmm3, %xmm6
19 ; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm4[0,1,2,3],xmm6[4,5,6,7]
20 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6
21 ; AVX1-NEXT: vpsrlq %xmm2, %xmm6, %xmm2
22 ; AVX1-NEXT: vpsrlq %xmm5, %xmm6, %xmm5
23 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm5[4,5,6,7]
24 ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
25 ; AVX1-NEXT: vpsubq %xmm4, %xmm2, %xmm2
26 ; AVX1-NEXT: vpsrlq %xmm1, %xmm3, %xmm4
27 ; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm1[2,3,0,1]
28 ; AVX1-NEXT: vpsrlq %xmm5, %xmm3, %xmm3
29 ; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
30 ; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm1
31 ; AVX1-NEXT: vpsrlq %xmm5, %xmm0, %xmm0
32 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
33 ; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm0
34 ; AVX1-NEXT: vpsubq %xmm3, %xmm0, %xmm0
35 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
38 ; AVX2-LABEL: var_shift_v4i64:
40 ; AVX2-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2
41 ; AVX2-NEXT: vpsrlvq %ymm1, %ymm2, %ymm3
42 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
43 ; AVX2-NEXT: vpsrlvq %ymm1, %ymm0, %ymm0
44 ; AVX2-NEXT: vpsubq %ymm3, %ymm0, %ymm0
47 ; XOPAVX1-LABEL: var_shift_v4i64:
49 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
50 ; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
51 ; XOPAVX1-NEXT: vpsubq %xmm2, %xmm3, %xmm2
52 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
53 ; XOPAVX1-NEXT: vpshaq %xmm2, %xmm4, %xmm2
54 ; XOPAVX1-NEXT: vpsubq %xmm1, %xmm3, %xmm1
55 ; XOPAVX1-NEXT: vpshaq %xmm1, %xmm0, %xmm0
56 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
59 ; XOPAVX2-LABEL: var_shift_v4i64:
61 ; XOPAVX2-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2
62 ; XOPAVX2-NEXT: vpsrlvq %ymm1, %ymm2, %ymm3
63 ; XOPAVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
64 ; XOPAVX2-NEXT: vpsrlvq %ymm1, %ymm0, %ymm0
65 ; XOPAVX2-NEXT: vpsubq %ymm3, %ymm0, %ymm0
68 ; AVX512-LABEL: var_shift_v4i64:
70 ; AVX512-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2
71 ; AVX512-NEXT: vpsrlvq %ymm1, %ymm2, %ymm3
72 ; AVX512-NEXT: vpxor %ymm2, %ymm0, %ymm0
73 ; AVX512-NEXT: vpsrlvq %ymm1, %ymm0, %ymm0
74 ; AVX512-NEXT: vpsubq %ymm3, %ymm0, %ymm0
76 %shift = ashr <4 x i64> %a, %b
80 define <8 x i32> @var_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
81 ; AVX1-LABEL: var_shift_v8i32:
83 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
84 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
85 ; AVX1-NEXT: vpsrldq {{.*#+}} xmm4 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
86 ; AVX1-NEXT: vpsrad %xmm4, %xmm2, %xmm4
87 ; AVX1-NEXT: vpsrlq $32, %xmm3, %xmm5
88 ; AVX1-NEXT: vpsrad %xmm5, %xmm2, %xmm5
89 ; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm5[0,1,2,3],xmm4[4,5,6,7]
90 ; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5
91 ; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm6 = xmm3[2],xmm5[2],xmm3[3],xmm5[3]
92 ; AVX1-NEXT: vpsrad %xmm6, %xmm2, %xmm6
93 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero
94 ; AVX1-NEXT: vpsrad %xmm3, %xmm2, %xmm2
95 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm6[4,5,6,7]
96 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]
97 ; AVX1-NEXT: vpsrldq {{.*#+}} xmm3 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
98 ; AVX1-NEXT: vpsrad %xmm3, %xmm0, %xmm3
99 ; AVX1-NEXT: vpsrlq $32, %xmm1, %xmm4
100 ; AVX1-NEXT: vpsrad %xmm4, %xmm0, %xmm4
101 ; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm4[0,1,2,3],xmm3[4,5,6,7]
102 ; AVX1-NEXT: vpunpckhdq {{.*#+}} xmm4 = xmm1[2],xmm5[2],xmm1[3],xmm5[3]
103 ; AVX1-NEXT: vpsrad %xmm4, %xmm0, %xmm4
104 ; AVX1-NEXT: vpmovzxdq {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero
105 ; AVX1-NEXT: vpsrad %xmm1, %xmm0, %xmm0
106 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7]
107 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5],xmm3[6,7]
108 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
111 ; AVX2-LABEL: var_shift_v8i32:
113 ; AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0
116 ; XOPAVX1-LABEL: var_shift_v8i32:
118 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
119 ; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
120 ; XOPAVX1-NEXT: vpsubd %xmm2, %xmm3, %xmm2
121 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
122 ; XOPAVX1-NEXT: vpshad %xmm2, %xmm4, %xmm2
123 ; XOPAVX1-NEXT: vpsubd %xmm1, %xmm3, %xmm1
124 ; XOPAVX1-NEXT: vpshad %xmm1, %xmm0, %xmm0
125 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
128 ; XOPAVX2-LABEL: var_shift_v8i32:
130 ; XOPAVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0
133 ; AVX512-LABEL: var_shift_v8i32:
135 ; AVX512-NEXT: vpsravd %ymm1, %ymm0, %ymm0
137 %shift = ashr <8 x i32> %a, %b
141 define <16 x i16> @var_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
142 ; AVX1-LABEL: var_shift_v16i16:
144 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
145 ; AVX1-NEXT: vpsllw $12, %xmm2, %xmm3
146 ; AVX1-NEXT: vpsllw $4, %xmm2, %xmm2
147 ; AVX1-NEXT: vpor %xmm3, %xmm2, %xmm2
148 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm3
149 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
150 ; AVX1-NEXT: vpsraw $8, %xmm4, %xmm5
151 ; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm2
152 ; AVX1-NEXT: vpsraw $4, %xmm2, %xmm4
153 ; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
154 ; AVX1-NEXT: vpsraw $2, %xmm2, %xmm4
155 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
156 ; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
157 ; AVX1-NEXT: vpsraw $1, %xmm2, %xmm4
158 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
159 ; AVX1-NEXT: vpblendvb %xmm3, %xmm4, %xmm2, %xmm2
160 ; AVX1-NEXT: vpsllw $12, %xmm1, %xmm3
161 ; AVX1-NEXT: vpsllw $4, %xmm1, %xmm1
162 ; AVX1-NEXT: vpor %xmm3, %xmm1, %xmm1
163 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm3
164 ; AVX1-NEXT: vpsraw $8, %xmm0, %xmm4
165 ; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
166 ; AVX1-NEXT: vpsraw $4, %xmm0, %xmm1
167 ; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
168 ; AVX1-NEXT: vpsraw $2, %xmm0, %xmm1
169 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
170 ; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
171 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm1
172 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
173 ; AVX1-NEXT: vpblendvb %xmm3, %xmm1, %xmm0, %xmm0
174 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
177 ; AVX2-LABEL: var_shift_v16i16:
179 ; AVX2-NEXT: vpxor %ymm2, %ymm2, %ymm2
180 ; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm3 = ymm1[4],ymm2[4],ymm1[5],ymm2[5],ymm1[6],ymm2[6],ymm1[7],ymm2[7],ymm1[12],ymm2[12],ymm1[13],ymm2[13],ymm1[14],ymm2[14],ymm1[15],ymm2[15]
181 ; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
182 ; AVX2-NEXT: vpsravd %ymm3, %ymm4, %ymm3
183 ; AVX2-NEXT: vpsrld $16, %ymm3, %ymm3
184 ; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm1[0],ymm2[0],ymm1[1],ymm2[1],ymm1[2],ymm2[2],ymm1[3],ymm2[3],ymm1[8],ymm2[8],ymm1[9],ymm2[9],ymm1[10],ymm2[10],ymm1[11],ymm2[11]
185 ; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
186 ; AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0
187 ; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0
188 ; AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0
191 ; XOPAVX1-LABEL: var_shift_v16i16:
193 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
194 ; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
195 ; XOPAVX1-NEXT: vpsubw %xmm2, %xmm3, %xmm2
196 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
197 ; XOPAVX1-NEXT: vpshaw %xmm2, %xmm4, %xmm2
198 ; XOPAVX1-NEXT: vpsubw %xmm1, %xmm3, %xmm1
199 ; XOPAVX1-NEXT: vpshaw %xmm1, %xmm0, %xmm0
200 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
203 ; XOPAVX2-LABEL: var_shift_v16i16:
205 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
206 ; XOPAVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
207 ; XOPAVX2-NEXT: vpsubw %xmm2, %xmm3, %xmm2
208 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm4
209 ; XOPAVX2-NEXT: vpshaw %xmm2, %xmm4, %xmm2
210 ; XOPAVX2-NEXT: vpsubw %xmm1, %xmm3, %xmm1
211 ; XOPAVX2-NEXT: vpshaw %xmm1, %xmm0, %xmm0
212 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
215 ; AVX512-LABEL: var_shift_v16i16:
217 ; AVX512-NEXT: vpsravw %zmm1, %zmm0, %zmm0
219 %shift = ashr <16 x i16> %a, %b
220 ret <16 x i16> %shift
223 define <32 x i8> @var_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
224 ; AVX1-LABEL: var_shift_v32i8:
226 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
227 ; AVX1-NEXT: vpsllw $5, %xmm2, %xmm2
228 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8],xmm2[8],xmm0[9],xmm2[9],xmm0[10],xmm2[10],xmm0[11],xmm2[11],xmm0[12],xmm2[12],xmm0[13],xmm2[13],xmm0[14],xmm2[14],xmm0[15],xmm2[15]
229 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
230 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8],xmm4[8],xmm0[9],xmm4[9],xmm0[10],xmm4[10],xmm0[11],xmm4[11],xmm0[12],xmm4[12],xmm0[13],xmm4[13],xmm0[14],xmm4[14],xmm0[15],xmm4[15]
231 ; AVX1-NEXT: vpsraw $4, %xmm5, %xmm6
232 ; AVX1-NEXT: vpblendvb %xmm3, %xmm6, %xmm5, %xmm5
233 ; AVX1-NEXT: vpsraw $2, %xmm5, %xmm6
234 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
235 ; AVX1-NEXT: vpblendvb %xmm3, %xmm6, %xmm5, %xmm5
236 ; AVX1-NEXT: vpsraw $1, %xmm5, %xmm6
237 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
238 ; AVX1-NEXT: vpblendvb %xmm3, %xmm6, %xmm5, %xmm3
239 ; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3
240 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm2 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
241 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm4 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
242 ; AVX1-NEXT: vpsraw $4, %xmm4, %xmm5
243 ; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4
244 ; AVX1-NEXT: vpsraw $2, %xmm4, %xmm5
245 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2
246 ; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4
247 ; AVX1-NEXT: vpsraw $1, %xmm4, %xmm5
248 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm2
249 ; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm2
250 ; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2
251 ; AVX1-NEXT: vpackuswb %xmm3, %xmm2, %xmm2
252 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1
253 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm3 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
254 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
255 ; AVX1-NEXT: vpsraw $4, %xmm4, %xmm5
256 ; AVX1-NEXT: vpblendvb %xmm3, %xmm5, %xmm4, %xmm4
257 ; AVX1-NEXT: vpsraw $2, %xmm4, %xmm5
258 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
259 ; AVX1-NEXT: vpblendvb %xmm3, %xmm5, %xmm4, %xmm4
260 ; AVX1-NEXT: vpsraw $1, %xmm4, %xmm5
261 ; AVX1-NEXT: vpaddw %xmm3, %xmm3, %xmm3
262 ; AVX1-NEXT: vpblendvb %xmm3, %xmm5, %xmm4, %xmm3
263 ; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3
264 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
265 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
266 ; AVX1-NEXT: vpsraw $4, %xmm0, %xmm4
267 ; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
268 ; AVX1-NEXT: vpsraw $2, %xmm0, %xmm4
269 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm1
270 ; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
271 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm4
272 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm1
273 ; AVX1-NEXT: vpblendvb %xmm1, %xmm4, %xmm0, %xmm0
274 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0
275 ; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm0
276 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
279 ; AVX2-LABEL: var_shift_v32i8:
281 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1
282 ; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]
283 ; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
284 ; AVX2-NEXT: vpsraw $4, %ymm3, %ymm4
285 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
286 ; AVX2-NEXT: vpsraw $2, %ymm3, %ymm4
287 ; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2
288 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
289 ; AVX2-NEXT: vpsraw $1, %ymm3, %ymm4
290 ; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2
291 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
292 ; AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2
293 ; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
294 ; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
295 ; AVX2-NEXT: vpsraw $4, %ymm0, %ymm3
296 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
297 ; AVX2-NEXT: vpsraw $2, %ymm0, %ymm3
298 ; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1
299 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
300 ; AVX2-NEXT: vpsraw $1, %ymm0, %ymm3
301 ; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1
302 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
303 ; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0
304 ; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
307 ; XOPAVX1-LABEL: var_shift_v32i8:
309 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
310 ; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
311 ; XOPAVX1-NEXT: vpsubb %xmm2, %xmm3, %xmm2
312 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
313 ; XOPAVX1-NEXT: vpshab %xmm2, %xmm4, %xmm2
314 ; XOPAVX1-NEXT: vpsubb %xmm1, %xmm3, %xmm1
315 ; XOPAVX1-NEXT: vpshab %xmm1, %xmm0, %xmm0
316 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
319 ; XOPAVX2-LABEL: var_shift_v32i8:
321 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
322 ; XOPAVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
323 ; XOPAVX2-NEXT: vpsubb %xmm2, %xmm3, %xmm2
324 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm4
325 ; XOPAVX2-NEXT: vpshab %xmm2, %xmm4, %xmm2
326 ; XOPAVX2-NEXT: vpsubb %xmm1, %xmm3, %xmm1
327 ; XOPAVX2-NEXT: vpshab %xmm1, %xmm0, %xmm0
328 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
331 ; AVX512-LABEL: var_shift_v32i8:
333 ; AVX512-NEXT: vpsllw $5, %ymm1, %ymm1
334 ; AVX512-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]
335 ; AVX512-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
336 ; AVX512-NEXT: vpsraw $4, %ymm3, %ymm4
337 ; AVX512-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
338 ; AVX512-NEXT: vpsraw $2, %ymm3, %ymm4
339 ; AVX512-NEXT: vpaddw %ymm2, %ymm2, %ymm2
340 ; AVX512-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
341 ; AVX512-NEXT: vpsraw $1, %ymm3, %ymm4
342 ; AVX512-NEXT: vpaddw %ymm2, %ymm2, %ymm2
343 ; AVX512-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
344 ; AVX512-NEXT: vpsrlw $8, %ymm2, %ymm2
345 ; AVX512-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
346 ; AVX512-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
347 ; AVX512-NEXT: vpsraw $4, %ymm0, %ymm3
348 ; AVX512-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
349 ; AVX512-NEXT: vpsraw $2, %ymm0, %ymm3
350 ; AVX512-NEXT: vpaddw %ymm1, %ymm1, %ymm1
351 ; AVX512-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
352 ; AVX512-NEXT: vpsraw $1, %ymm0, %ymm3
353 ; AVX512-NEXT: vpaddw %ymm1, %ymm1, %ymm1
354 ; AVX512-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
355 ; AVX512-NEXT: vpsrlw $8, %ymm0, %ymm0
356 ; AVX512-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
358 %shift = ashr <32 x i8> %a, %b
363 ; Uniform Variable Shifts
366 define <4 x i64> @splatvar_shift_v4i64(<4 x i64> %a, <4 x i64> %b) nounwind {
367 ; AVX1-LABEL: splatvar_shift_v4i64:
369 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
370 ; AVX1-NEXT: vpsrlq %xmm1, %xmm2, %xmm2
371 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
372 ; AVX1-NEXT: vpsrlq %xmm1, %xmm3, %xmm3
373 ; AVX1-NEXT: vpxor %xmm2, %xmm3, %xmm3
374 ; AVX1-NEXT: vpsubq %xmm2, %xmm3, %xmm3
375 ; AVX1-NEXT: vpsrlq %xmm1, %xmm0, %xmm0
376 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
377 ; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0
378 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
381 ; AVX2-LABEL: splatvar_shift_v4i64:
383 ; AVX2-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2
384 ; AVX2-NEXT: vpsrlq %xmm1, %ymm2, %ymm2
385 ; AVX2-NEXT: vpsrlq %xmm1, %ymm0, %ymm0
386 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
387 ; AVX2-NEXT: vpsubq %ymm2, %ymm0, %ymm0
390 ; XOPAVX1-LABEL: splatvar_shift_v4i64:
392 ; XOPAVX1-NEXT: vmovddup {{.*#+}} xmm1 = xmm1[0,0]
393 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
394 ; XOPAVX1-NEXT: vpsubq %xmm1, %xmm2, %xmm1
395 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
396 ; XOPAVX1-NEXT: vpshaq %xmm1, %xmm2, %xmm2
397 ; XOPAVX1-NEXT: vpshaq %xmm1, %xmm0, %xmm0
398 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
401 ; XOPAVX2-LABEL: splatvar_shift_v4i64:
403 ; XOPAVX2-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2
404 ; XOPAVX2-NEXT: vpsrlq %xmm1, %ymm2, %ymm2
405 ; XOPAVX2-NEXT: vpsrlq %xmm1, %ymm0, %ymm0
406 ; XOPAVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
407 ; XOPAVX2-NEXT: vpsubq %ymm2, %ymm0, %ymm0
410 ; AVX512-LABEL: splatvar_shift_v4i64:
412 ; AVX512-NEXT: vpbroadcastq {{.*}}(%rip), %ymm2
413 ; AVX512-NEXT: vpsrlq %xmm1, %ymm2, %ymm2
414 ; AVX512-NEXT: vpsrlq %xmm1, %ymm0, %ymm0
415 ; AVX512-NEXT: vpxor %ymm2, %ymm0, %ymm0
416 ; AVX512-NEXT: vpsubq %ymm2, %ymm0, %ymm0
418 %splat = shufflevector <4 x i64> %b, <4 x i64> undef, <4 x i32> zeroinitializer
419 %shift = ashr <4 x i64> %a, %splat
423 define <8 x i32> @splatvar_shift_v8i32(<8 x i32> %a, <8 x i32> %b) nounwind {
424 ; AVX1-LABEL: splatvar_shift_v8i32:
426 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
427 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
428 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
429 ; AVX1-NEXT: vpsrad %xmm1, %xmm2, %xmm2
430 ; AVX1-NEXT: vpsrad %xmm1, %xmm0, %xmm0
431 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
434 ; AVX2-LABEL: splatvar_shift_v8i32:
436 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
437 ; AVX2-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
438 ; AVX2-NEXT: vpsrad %xmm1, %ymm0, %ymm0
441 ; XOPAVX1-LABEL: splatvar_shift_v8i32:
443 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
444 ; XOPAVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
445 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
446 ; XOPAVX1-NEXT: vpsrad %xmm1, %xmm2, %xmm2
447 ; XOPAVX1-NEXT: vpsrad %xmm1, %xmm0, %xmm0
448 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
451 ; XOPAVX2-LABEL: splatvar_shift_v8i32:
453 ; XOPAVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
454 ; XOPAVX2-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
455 ; XOPAVX2-NEXT: vpsrad %xmm1, %ymm0, %ymm0
458 ; AVX512-LABEL: splatvar_shift_v8i32:
460 ; AVX512-NEXT: vxorps %xmm2, %xmm2, %xmm2
461 ; AVX512-NEXT: vmovss %xmm1, %xmm2, %xmm1
462 ; AVX512-NEXT: vpsrad %xmm1, %ymm0, %ymm0
464 %splat = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> zeroinitializer
465 %shift = ashr <8 x i32> %a, %splat
469 define <16 x i16> @splatvar_shift_v16i16(<16 x i16> %a, <16 x i16> %b) nounwind {
470 ; AVX1-LABEL: splatvar_shift_v16i16:
472 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
473 ; AVX1-NEXT: vmovd %xmm1, %eax
474 ; AVX1-NEXT: movzwl %ax, %eax
475 ; AVX1-NEXT: vmovd %eax, %xmm1
476 ; AVX1-NEXT: vpsraw %xmm1, %xmm2, %xmm2
477 ; AVX1-NEXT: vpsraw %xmm1, %xmm0, %xmm0
478 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
481 ; AVX2-LABEL: splatvar_shift_v16i16:
483 ; AVX2-NEXT: vmovd %xmm1, %eax
484 ; AVX2-NEXT: movzwl %ax, %eax
485 ; AVX2-NEXT: vmovd %eax, %xmm1
486 ; AVX2-NEXT: vpsraw %xmm1, %ymm0, %ymm0
489 ; XOPAVX1-LABEL: splatvar_shift_v16i16:
491 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
492 ; XOPAVX1-NEXT: vmovd %xmm1, %eax
493 ; XOPAVX1-NEXT: movzwl %ax, %eax
494 ; XOPAVX1-NEXT: vmovd %eax, %xmm1
495 ; XOPAVX1-NEXT: vpsraw %xmm1, %xmm2, %xmm2
496 ; XOPAVX1-NEXT: vpsraw %xmm1, %xmm0, %xmm0
497 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
500 ; XOPAVX2-LABEL: splatvar_shift_v16i16:
502 ; XOPAVX2-NEXT: vmovd %xmm1, %eax
503 ; XOPAVX2-NEXT: movzwl %ax, %eax
504 ; XOPAVX2-NEXT: vmovd %eax, %xmm1
505 ; XOPAVX2-NEXT: vpsraw %xmm1, %ymm0, %ymm0
508 ; AVX512-LABEL: splatvar_shift_v16i16:
510 ; AVX512-NEXT: vmovd %xmm1, %eax
511 ; AVX512-NEXT: movzwl %ax, %eax
512 ; AVX512-NEXT: vmovd %eax, %xmm1
513 ; AVX512-NEXT: vpsraw %xmm1, %ymm0, %ymm0
515 %splat = shufflevector <16 x i16> %b, <16 x i16> undef, <16 x i32> zeroinitializer
516 %shift = ashr <16 x i16> %a, %splat
517 ret <16 x i16> %shift
520 define <32 x i8> @splatvar_shift_v32i8(<32 x i8> %a, <32 x i8> %b) nounwind {
521 ; AVX1-LABEL: splatvar_shift_v32i8:
523 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
524 ; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1
525 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1
526 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
527 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
528 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm0[8],xmm3[8],xmm0[9],xmm3[9],xmm0[10],xmm3[10],xmm0[11],xmm3[11],xmm0[12],xmm3[12],xmm0[13],xmm3[13],xmm0[14],xmm3[14],xmm0[15],xmm3[15]
529 ; AVX1-NEXT: vpsraw $4, %xmm4, %xmm5
530 ; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4
531 ; AVX1-NEXT: vpsraw $2, %xmm4, %xmm5
532 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm6
533 ; AVX1-NEXT: vpblendvb %xmm6, %xmm5, %xmm4, %xmm4
534 ; AVX1-NEXT: vpsraw $1, %xmm4, %xmm5
535 ; AVX1-NEXT: vpaddw %xmm6, %xmm6, %xmm9
536 ; AVX1-NEXT: vpblendvb %xmm9, %xmm5, %xmm4, %xmm4
537 ; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm8
538 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
539 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm3 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
540 ; AVX1-NEXT: vpsraw $4, %xmm3, %xmm5
541 ; AVX1-NEXT: vpblendvb %xmm1, %xmm5, %xmm3, %xmm3
542 ; AVX1-NEXT: vpsraw $2, %xmm3, %xmm5
543 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm4
544 ; AVX1-NEXT: vpblendvb %xmm4, %xmm5, %xmm3, %xmm3
545 ; AVX1-NEXT: vpsraw $1, %xmm3, %xmm5
546 ; AVX1-NEXT: vpaddw %xmm4, %xmm4, %xmm7
547 ; AVX1-NEXT: vpblendvb %xmm7, %xmm5, %xmm3, %xmm3
548 ; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3
549 ; AVX1-NEXT: vpackuswb %xmm8, %xmm3, %xmm8
550 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
551 ; AVX1-NEXT: vpsraw $4, %xmm5, %xmm3
552 ; AVX1-NEXT: vpblendvb %xmm2, %xmm3, %xmm5, %xmm2
553 ; AVX1-NEXT: vpsraw $2, %xmm2, %xmm3
554 ; AVX1-NEXT: vpblendvb %xmm6, %xmm3, %xmm2, %xmm2
555 ; AVX1-NEXT: vpsraw $1, %xmm2, %xmm3
556 ; AVX1-NEXT: vpblendvb %xmm9, %xmm3, %xmm2, %xmm2
557 ; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2
558 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
559 ; AVX1-NEXT: vpsraw $4, %xmm0, %xmm3
560 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
561 ; AVX1-NEXT: vpsraw $2, %xmm0, %xmm1
562 ; AVX1-NEXT: vpblendvb %xmm4, %xmm1, %xmm0, %xmm0
563 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm1
564 ; AVX1-NEXT: vpblendvb %xmm7, %xmm1, %xmm0, %xmm0
565 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0
566 ; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
567 ; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm0, %ymm0
570 ; AVX2-LABEL: splatvar_shift_v32i8:
572 ; AVX2-NEXT: vpbroadcastb %xmm1, %ymm1
573 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1
574 ; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]
575 ; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
576 ; AVX2-NEXT: vpsraw $4, %ymm3, %ymm4
577 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
578 ; AVX2-NEXT: vpsraw $2, %ymm3, %ymm4
579 ; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2
580 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
581 ; AVX2-NEXT: vpsraw $1, %ymm3, %ymm4
582 ; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2
583 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
584 ; AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2
585 ; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
586 ; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
587 ; AVX2-NEXT: vpsraw $4, %ymm0, %ymm3
588 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
589 ; AVX2-NEXT: vpsraw $2, %ymm0, %ymm3
590 ; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1
591 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
592 ; AVX2-NEXT: vpsraw $1, %ymm0, %ymm3
593 ; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1
594 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
595 ; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0
596 ; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
599 ; XOPAVX1-LABEL: splatvar_shift_v32i8:
601 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
602 ; XOPAVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1
603 ; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm1
604 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
605 ; XOPAVX1-NEXT: vpshab %xmm1, %xmm2, %xmm2
606 ; XOPAVX1-NEXT: vpshab %xmm1, %xmm0, %xmm0
607 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
610 ; XOPAVX2-LABEL: splatvar_shift_v32i8:
612 ; XOPAVX2-NEXT: vpbroadcastb %xmm1, %ymm1
613 ; XOPAVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
614 ; XOPAVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
615 ; XOPAVX2-NEXT: vpsubb %xmm2, %xmm3, %xmm2
616 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm4
617 ; XOPAVX2-NEXT: vpshab %xmm2, %xmm4, %xmm2
618 ; XOPAVX2-NEXT: vpsubb %xmm1, %xmm3, %xmm1
619 ; XOPAVX2-NEXT: vpshab %xmm1, %xmm0, %xmm0
620 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
623 ; AVX512-LABEL: splatvar_shift_v32i8:
625 ; AVX512-NEXT: vpbroadcastb %xmm1, %ymm1
626 ; AVX512-NEXT: vpsllw $5, %ymm1, %ymm1
627 ; AVX512-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]
628 ; AVX512-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
629 ; AVX512-NEXT: vpsraw $4, %ymm3, %ymm4
630 ; AVX512-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
631 ; AVX512-NEXT: vpsraw $2, %ymm3, %ymm4
632 ; AVX512-NEXT: vpaddw %ymm2, %ymm2, %ymm2
633 ; AVX512-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
634 ; AVX512-NEXT: vpsraw $1, %ymm3, %ymm4
635 ; AVX512-NEXT: vpaddw %ymm2, %ymm2, %ymm2
636 ; AVX512-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
637 ; AVX512-NEXT: vpsrlw $8, %ymm2, %ymm2
638 ; AVX512-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
639 ; AVX512-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
640 ; AVX512-NEXT: vpsraw $4, %ymm0, %ymm3
641 ; AVX512-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
642 ; AVX512-NEXT: vpsraw $2, %ymm0, %ymm3
643 ; AVX512-NEXT: vpaddw %ymm1, %ymm1, %ymm1
644 ; AVX512-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
645 ; AVX512-NEXT: vpsraw $1, %ymm0, %ymm3
646 ; AVX512-NEXT: vpaddw %ymm1, %ymm1, %ymm1
647 ; AVX512-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
648 ; AVX512-NEXT: vpsrlw $8, %ymm0, %ymm0
649 ; AVX512-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
651 %splat = shufflevector <32 x i8> %b, <32 x i8> undef, <32 x i32> zeroinitializer
652 %shift = ashr <32 x i8> %a, %splat
660 define <4 x i64> @constant_shift_v4i64(<4 x i64> %a) nounwind {
661 ; AVX1-LABEL: constant_shift_v4i64:
663 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
664 ; AVX1-NEXT: vpsrlq $62, %xmm1, %xmm2
665 ; AVX1-NEXT: vpsrlq $31, %xmm1, %xmm1
666 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm2[4,5,6,7]
667 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [4294967296,2]
668 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1
669 ; AVX1-NEXT: vpsubq %xmm2, %xmm1, %xmm1
670 ; AVX1-NEXT: vpsrlq $7, %xmm0, %xmm2
671 ; AVX1-NEXT: vpsrlq $1, %xmm0, %xmm0
672 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
673 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [4611686018427387904,72057594037927936]
674 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
675 ; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0
676 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
679 ; AVX2-LABEL: constant_shift_v4i64:
681 ; AVX2-NEXT: vpsrlvq {{.*}}(%rip), %ymm0, %ymm0
682 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [4611686018427387904,72057594037927936,4294967296,2]
683 ; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
684 ; AVX2-NEXT: vpsubq %ymm1, %ymm0, %ymm0
687 ; XOPAVX1-LABEL: constant_shift_v4i64:
689 ; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
690 ; XOPAVX1-NEXT: vpsubq {{.*}}(%rip), %xmm1, %xmm2
691 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
692 ; XOPAVX1-NEXT: vpshaq %xmm2, %xmm3, %xmm2
693 ; XOPAVX1-NEXT: vpsubq {{.*}}(%rip), %xmm1, %xmm1
694 ; XOPAVX1-NEXT: vpshaq %xmm1, %xmm0, %xmm0
695 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
698 ; XOPAVX2-LABEL: constant_shift_v4i64:
700 ; XOPAVX2-NEXT: vpsrlvq {{.*}}(%rip), %ymm0, %ymm0
701 ; XOPAVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [4611686018427387904,72057594037927936,4294967296,2]
702 ; XOPAVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
703 ; XOPAVX2-NEXT: vpsubq %ymm1, %ymm0, %ymm0
706 ; AVX512-LABEL: constant_shift_v4i64:
708 ; AVX512-NEXT: vpsrlvq {{.*}}(%rip), %ymm0, %ymm0
709 ; AVX512-NEXT: vmovdqa {{.*#+}} ymm1 = [4611686018427387904,72057594037927936,4294967296,2]
710 ; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0
711 ; AVX512-NEXT: vpsubq %ymm1, %ymm0, %ymm0
713 %shift = ashr <4 x i64> %a, <i64 1, i64 7, i64 31, i64 62>
717 define <8 x i32> @constant_shift_v8i32(<8 x i32> %a) nounwind {
718 ; AVX1-LABEL: constant_shift_v8i32:
720 ; AVX1-NEXT: vpsrad $7, %xmm0, %xmm1
721 ; AVX1-NEXT: vpsrad $5, %xmm0, %xmm2
722 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3],xmm1[4,5,6,7]
723 ; AVX1-NEXT: vpsrad $6, %xmm0, %xmm2
724 ; AVX1-NEXT: vpsrad $4, %xmm0, %xmm3
725 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
726 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
727 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
728 ; AVX1-NEXT: vpsrad $7, %xmm0, %xmm2
729 ; AVX1-NEXT: vpsrad $9, %xmm0, %xmm3
730 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm3[0,1,2,3],xmm2[4,5,6,7]
731 ; AVX1-NEXT: vpsrad $8, %xmm0, %xmm0
732 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
733 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
736 ; AVX2-LABEL: constant_shift_v8i32:
738 ; AVX2-NEXT: vpsravd {{.*}}(%rip), %ymm0, %ymm0
741 ; XOPAVX1-LABEL: constant_shift_v8i32:
743 ; XOPAVX1-NEXT: vpshad {{.*}}(%rip), %xmm0, %xmm1
744 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
745 ; XOPAVX1-NEXT: vpshad {{.*}}(%rip), %xmm0, %xmm0
746 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
749 ; XOPAVX2-LABEL: constant_shift_v8i32:
751 ; XOPAVX2-NEXT: vpsravd {{.*}}(%rip), %ymm0, %ymm0
754 ; AVX512-LABEL: constant_shift_v8i32:
756 ; AVX512-NEXT: vpsravd {{.*}}(%rip), %ymm0, %ymm0
758 %shift = ashr <8 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7>
762 define <16 x i16> @constant_shift_v16i16(<16 x i16> %a) nounwind {
763 ; AVX1-LABEL: constant_shift_v16i16:
765 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
766 ; AVX1-NEXT: vpsraw $8, %xmm1, %xmm2
767 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [32896,37008,41120,45232,49344,53456,57568,61680]
768 ; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm1, %xmm1
769 ; AVX1-NEXT: vpsraw $4, %xmm1, %xmm2
770 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [256,8480,16704,24928,33152,41376,49600,57824]
771 ; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm1, %xmm1
772 ; AVX1-NEXT: vpsraw $2, %xmm1, %xmm2
773 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [512,16960,33408,49856,768,17216,33664,50112]
774 ; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm1, %xmm1
775 ; AVX1-NEXT: vpsraw $1, %xmm1, %xmm2
776 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [1024,33920,1280,34176,1536,34432,1792,34688]
777 ; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm1, %xmm1
778 ; AVX1-NEXT: vpsraw $8, %xmm0, %xmm2
779 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,4112,8224,12336,16448,20560,24672,28784]
780 ; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
781 ; AVX1-NEXT: vpsraw $4, %xmm0, %xmm2
782 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,8224,16448,24672,32896,41120,49344,57568]
783 ; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
784 ; AVX1-NEXT: vpsraw $2, %xmm0, %xmm2
785 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,16448,32896,49344,256,16704,33152,49600]
786 ; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
787 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm2
788 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [0,32896,256,33152,512,33408,768,33664]
789 ; AVX1-NEXT: vpblendvb %xmm3, %xmm2, %xmm0, %xmm0
790 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
793 ; AVX2-LABEL: constant_shift_v16i16:
795 ; AVX2-NEXT: vpxor %ymm1, %ymm1, %ymm1
796 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
797 ; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm3 = ymm2[4],ymm1[4],ymm2[5],ymm1[5],ymm2[6],ymm1[6],ymm2[7],ymm1[7],ymm2[12],ymm1[12],ymm2[13],ymm1[13],ymm2[14],ymm1[14],ymm2[15],ymm1[15]
798 ; AVX2-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm0[4,4,5,5,6,6,7,7,12,12,13,13,14,14,15,15]
799 ; AVX2-NEXT: vpsravd %ymm3, %ymm4, %ymm3
800 ; AVX2-NEXT: vpsrld $16, %ymm3, %ymm3
801 ; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm2[0],ymm1[0],ymm2[1],ymm1[1],ymm2[2],ymm1[2],ymm2[3],ymm1[3],ymm2[8],ymm1[8],ymm2[9],ymm1[9],ymm2[10],ymm1[10],ymm2[11],ymm1[11]
802 ; AVX2-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,8,8,9,9,10,10,11,11]
803 ; AVX2-NEXT: vpsravd %ymm1, %ymm0, %ymm0
804 ; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0
805 ; AVX2-NEXT: vpackusdw %ymm3, %ymm0, %ymm0
808 ; XOPAVX1-LABEL: constant_shift_v16i16:
810 ; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
811 ; XOPAVX1-NEXT: vpsubw {{.*}}(%rip), %xmm1, %xmm2
812 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
813 ; XOPAVX1-NEXT: vpshaw %xmm2, %xmm3, %xmm2
814 ; XOPAVX1-NEXT: vpsubw {{.*}}(%rip), %xmm1, %xmm1
815 ; XOPAVX1-NEXT: vpshaw %xmm1, %xmm0, %xmm0
816 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
819 ; XOPAVX2-LABEL: constant_shift_v16i16:
821 ; XOPAVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
822 ; XOPAVX2-NEXT: vpsubw {{.*}}(%rip), %xmm1, %xmm2
823 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
824 ; XOPAVX2-NEXT: vpshaw %xmm2, %xmm3, %xmm2
825 ; XOPAVX2-NEXT: vpsubw {{.*}}(%rip), %xmm1, %xmm1
826 ; XOPAVX2-NEXT: vpshaw %xmm1, %xmm0, %xmm0
827 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
830 ; AVX512-LABEL: constant_shift_v16i16:
832 ; AVX512-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
833 ; AVX512-NEXT: vpsravw %zmm1, %zmm0, %zmm0
835 %shift = ashr <16 x i16> %a, <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>
836 ret <16 x i16> %shift
839 define <32 x i8> @constant_shift_v32i8(<32 x i8> %a) nounwind {
840 ; AVX1-LABEL: constant_shift_v32i8:
842 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
843 ; AVX1-NEXT: vpsllw $5, %xmm1, %xmm1
844 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
845 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
846 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm4 = xmm0[8],xmm3[8],xmm0[9],xmm3[9],xmm0[10],xmm3[10],xmm0[11],xmm3[11],xmm0[12],xmm3[12],xmm0[13],xmm3[13],xmm0[14],xmm3[14],xmm0[15],xmm3[15]
847 ; AVX1-NEXT: vpsraw $4, %xmm4, %xmm5
848 ; AVX1-NEXT: vpblendvb %xmm2, %xmm5, %xmm4, %xmm4
849 ; AVX1-NEXT: vpsraw $2, %xmm4, %xmm5
850 ; AVX1-NEXT: vpaddw %xmm2, %xmm2, %xmm6
851 ; AVX1-NEXT: vpblendvb %xmm6, %xmm5, %xmm4, %xmm4
852 ; AVX1-NEXT: vpsraw $1, %xmm4, %xmm5
853 ; AVX1-NEXT: vpaddw %xmm6, %xmm6, %xmm9
854 ; AVX1-NEXT: vpblendvb %xmm9, %xmm5, %xmm4, %xmm4
855 ; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm8
856 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm1 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
857 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm3 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
858 ; AVX1-NEXT: vpsraw $4, %xmm3, %xmm5
859 ; AVX1-NEXT: vpblendvb %xmm1, %xmm5, %xmm3, %xmm3
860 ; AVX1-NEXT: vpsraw $2, %xmm3, %xmm5
861 ; AVX1-NEXT: vpaddw %xmm1, %xmm1, %xmm4
862 ; AVX1-NEXT: vpblendvb %xmm4, %xmm5, %xmm3, %xmm3
863 ; AVX1-NEXT: vpsraw $1, %xmm3, %xmm5
864 ; AVX1-NEXT: vpaddw %xmm4, %xmm4, %xmm7
865 ; AVX1-NEXT: vpblendvb %xmm7, %xmm5, %xmm3, %xmm3
866 ; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3
867 ; AVX1-NEXT: vpackuswb %xmm8, %xmm3, %xmm8
868 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm5 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
869 ; AVX1-NEXT: vpsraw $4, %xmm5, %xmm3
870 ; AVX1-NEXT: vpblendvb %xmm2, %xmm3, %xmm5, %xmm2
871 ; AVX1-NEXT: vpsraw $2, %xmm2, %xmm3
872 ; AVX1-NEXT: vpblendvb %xmm6, %xmm3, %xmm2, %xmm2
873 ; AVX1-NEXT: vpsraw $1, %xmm2, %xmm3
874 ; AVX1-NEXT: vpblendvb %xmm9, %xmm3, %xmm2, %xmm2
875 ; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2
876 ; AVX1-NEXT: vpunpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
877 ; AVX1-NEXT: vpsraw $4, %xmm0, %xmm3
878 ; AVX1-NEXT: vpblendvb %xmm1, %xmm3, %xmm0, %xmm0
879 ; AVX1-NEXT: vpsraw $2, %xmm0, %xmm1
880 ; AVX1-NEXT: vpblendvb %xmm4, %xmm1, %xmm0, %xmm0
881 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm1
882 ; AVX1-NEXT: vpblendvb %xmm7, %xmm1, %xmm0, %xmm0
883 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm0
884 ; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
885 ; AVX1-NEXT: vinsertf128 $1, %xmm8, %ymm0, %ymm0
888 ; AVX2-LABEL: constant_shift_v32i8:
890 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
891 ; AVX2-NEXT: vpsllw $5, %ymm1, %ymm1
892 ; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]
893 ; AVX2-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
894 ; AVX2-NEXT: vpsraw $4, %ymm3, %ymm4
895 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
896 ; AVX2-NEXT: vpsraw $2, %ymm3, %ymm4
897 ; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2
898 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
899 ; AVX2-NEXT: vpsraw $1, %ymm3, %ymm4
900 ; AVX2-NEXT: vpaddw %ymm2, %ymm2, %ymm2
901 ; AVX2-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
902 ; AVX2-NEXT: vpsrlw $8, %ymm2, %ymm2
903 ; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
904 ; AVX2-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
905 ; AVX2-NEXT: vpsraw $4, %ymm0, %ymm3
906 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
907 ; AVX2-NEXT: vpsraw $2, %ymm0, %ymm3
908 ; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1
909 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
910 ; AVX2-NEXT: vpsraw $1, %ymm0, %ymm3
911 ; AVX2-NEXT: vpaddw %ymm1, %ymm1, %ymm1
912 ; AVX2-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
913 ; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0
914 ; AVX2-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
917 ; XOPAVX1-LABEL: constant_shift_v32i8:
919 ; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
920 ; XOPAVX1-NEXT: vpsubb {{.*}}(%rip), %xmm1, %xmm1
921 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
922 ; XOPAVX1-NEXT: vpshab %xmm1, %xmm2, %xmm2
923 ; XOPAVX1-NEXT: vpshab %xmm1, %xmm0, %xmm0
924 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
927 ; XOPAVX2-LABEL: constant_shift_v32i8:
929 ; XOPAVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
930 ; XOPAVX2-NEXT: vpsubb {{.*}}(%rip), %xmm1, %xmm1
931 ; XOPAVX2-NEXT: vextracti128 $1, %ymm0, %xmm2
932 ; XOPAVX2-NEXT: vpshab %xmm1, %xmm2, %xmm2
933 ; XOPAVX2-NEXT: vpshab %xmm1, %xmm0, %xmm0
934 ; XOPAVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
937 ; AVX512-LABEL: constant_shift_v32i8:
939 ; AVX512-NEXT: vmovdqa {{.*#+}} ymm1 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0]
940 ; AVX512-NEXT: vpsllw $5, %ymm1, %ymm1
941 ; AVX512-NEXT: vpunpckhbw {{.*#+}} ymm2 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31]
942 ; AVX512-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
943 ; AVX512-NEXT: vpsraw $4, %ymm3, %ymm4
944 ; AVX512-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
945 ; AVX512-NEXT: vpsraw $2, %ymm3, %ymm4
946 ; AVX512-NEXT: vpaddw %ymm2, %ymm2, %ymm2
947 ; AVX512-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm3
948 ; AVX512-NEXT: vpsraw $1, %ymm3, %ymm4
949 ; AVX512-NEXT: vpaddw %ymm2, %ymm2, %ymm2
950 ; AVX512-NEXT: vpblendvb %ymm2, %ymm4, %ymm3, %ymm2
951 ; AVX512-NEXT: vpsrlw $8, %ymm2, %ymm2
952 ; AVX512-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23]
953 ; AVX512-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
954 ; AVX512-NEXT: vpsraw $4, %ymm0, %ymm3
955 ; AVX512-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
956 ; AVX512-NEXT: vpsraw $2, %ymm0, %ymm3
957 ; AVX512-NEXT: vpaddw %ymm1, %ymm1, %ymm1
958 ; AVX512-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
959 ; AVX512-NEXT: vpsraw $1, %ymm0, %ymm3
960 ; AVX512-NEXT: vpaddw %ymm1, %ymm1, %ymm1
961 ; AVX512-NEXT: vpblendvb %ymm1, %ymm3, %ymm0, %ymm0
962 ; AVX512-NEXT: vpsrlw $8, %ymm0, %ymm0
963 ; AVX512-NEXT: vpackuswb %ymm2, %ymm0, %ymm0
965 %shift = ashr <32 x i8> %a, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0>
970 ; Uniform Constant Shifts
973 define <4 x i64> @splatconstant_shift_v4i64(<4 x i64> %a) nounwind {
974 ; AVX1-LABEL: splatconstant_shift_v4i64:
976 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
977 ; AVX1-NEXT: vpsrad $7, %xmm1, %xmm2
978 ; AVX1-NEXT: vpsrlq $7, %xmm1, %xmm1
979 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
980 ; AVX1-NEXT: vpsrad $7, %xmm0, %xmm2
981 ; AVX1-NEXT: vpsrlq $7, %xmm0, %xmm0
982 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
983 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
986 ; AVX2-LABEL: splatconstant_shift_v4i64:
988 ; AVX2-NEXT: vpsrad $7, %ymm0, %ymm1
989 ; AVX2-NEXT: vpsrlq $7, %ymm0, %ymm0
990 ; AVX2-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
993 ; XOPAVX1-LABEL: splatconstant_shift_v4i64:
995 ; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
996 ; XOPAVX1-NEXT: vpsubq {{.*}}(%rip), %xmm1, %xmm1
997 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
998 ; XOPAVX1-NEXT: vpshaq %xmm1, %xmm2, %xmm2
999 ; XOPAVX1-NEXT: vpshaq %xmm1, %xmm0, %xmm0
1000 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1001 ; XOPAVX1-NEXT: retq
1003 ; XOPAVX2-LABEL: splatconstant_shift_v4i64:
1005 ; XOPAVX2-NEXT: vpsrlq $7, %ymm0, %ymm0
1006 ; XOPAVX2-NEXT: vpbroadcastq {{.*}}(%rip), %ymm1
1007 ; XOPAVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
1008 ; XOPAVX2-NEXT: vpsubq %ymm1, %ymm0, %ymm0
1009 ; XOPAVX2-NEXT: retq
1011 ; AVX512-LABEL: splatconstant_shift_v4i64:
1013 ; AVX512-NEXT: vpsrad $7, %ymm0, %ymm1
1014 ; AVX512-NEXT: vpsrlq $7, %ymm0, %ymm0
1015 ; AVX512-NEXT: vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
1017 %shift = ashr <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
1018 ret <4 x i64> %shift
1021 define <8 x i32> @splatconstant_shift_v8i32(<8 x i32> %a) nounwind {
1022 ; AVX1-LABEL: splatconstant_shift_v8i32:
1024 ; AVX1-NEXT: vpsrad $5, %xmm0, %xmm1
1025 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1026 ; AVX1-NEXT: vpsrad $5, %xmm0, %xmm0
1027 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1030 ; AVX2-LABEL: splatconstant_shift_v8i32:
1032 ; AVX2-NEXT: vpsrad $5, %ymm0, %ymm0
1035 ; XOPAVX1-LABEL: splatconstant_shift_v8i32:
1037 ; XOPAVX1-NEXT: vpsrad $5, %xmm0, %xmm1
1038 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1039 ; XOPAVX1-NEXT: vpsrad $5, %xmm0, %xmm0
1040 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1041 ; XOPAVX1-NEXT: retq
1043 ; XOPAVX2-LABEL: splatconstant_shift_v8i32:
1045 ; XOPAVX2-NEXT: vpsrad $5, %ymm0, %ymm0
1046 ; XOPAVX2-NEXT: retq
1048 ; AVX512-LABEL: splatconstant_shift_v8i32:
1050 ; AVX512-NEXT: vpsrad $5, %ymm0, %ymm0
1052 %shift = ashr <8 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5>
1053 ret <8 x i32> %shift
1056 define <16 x i16> @splatconstant_shift_v16i16(<16 x i16> %a) nounwind {
1057 ; AVX1-LABEL: splatconstant_shift_v16i16:
1059 ; AVX1-NEXT: vpsraw $3, %xmm0, %xmm1
1060 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1061 ; AVX1-NEXT: vpsraw $3, %xmm0, %xmm0
1062 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1065 ; AVX2-LABEL: splatconstant_shift_v16i16:
1067 ; AVX2-NEXT: vpsraw $3, %ymm0, %ymm0
1070 ; XOPAVX1-LABEL: splatconstant_shift_v16i16:
1072 ; XOPAVX1-NEXT: vpsraw $3, %xmm0, %xmm1
1073 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1074 ; XOPAVX1-NEXT: vpsraw $3, %xmm0, %xmm0
1075 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1076 ; XOPAVX1-NEXT: retq
1078 ; XOPAVX2-LABEL: splatconstant_shift_v16i16:
1080 ; XOPAVX2-NEXT: vpsraw $3, %ymm0, %ymm0
1081 ; XOPAVX2-NEXT: retq
1083 ; AVX512-LABEL: splatconstant_shift_v16i16:
1085 ; AVX512-NEXT: vpsraw $3, %ymm0, %ymm0
1087 %shift = ashr <16 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
1088 ret <16 x i16> %shift
1091 define <32 x i8> @splatconstant_shift_v32i8(<32 x i8> %a) nounwind {
1092 ; AVX1-LABEL: splatconstant_shift_v32i8:
1094 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1095 ; AVX1-NEXT: vpsrlw $3, %xmm1, %xmm1
1096 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31]
1097 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
1098 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
1099 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1
1100 ; AVX1-NEXT: vpsubb %xmm3, %xmm1, %xmm1
1101 ; AVX1-NEXT: vpsrlw $3, %xmm0, %xmm0
1102 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
1103 ; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm0
1104 ; AVX1-NEXT: vpsubb %xmm3, %xmm0, %xmm0
1105 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1108 ; AVX2-LABEL: splatconstant_shift_v32i8:
1110 ; AVX2-NEXT: vpsrlw $3, %ymm0, %ymm0
1111 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1112 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
1113 ; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
1114 ; AVX2-NEXT: vpsubb %ymm1, %ymm0, %ymm0
1117 ; XOPAVX1-LABEL: splatconstant_shift_v32i8:
1119 ; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
1120 ; XOPAVX1-NEXT: vpsubb {{.*}}(%rip), %xmm1, %xmm1
1121 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
1122 ; XOPAVX1-NEXT: vpshab %xmm1, %xmm2, %xmm2
1123 ; XOPAVX1-NEXT: vpshab %xmm1, %xmm0, %xmm0
1124 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1125 ; XOPAVX1-NEXT: retq
1127 ; XOPAVX2-LABEL: splatconstant_shift_v32i8:
1129 ; XOPAVX2-NEXT: vpsrlw $3, %ymm0, %ymm0
1130 ; XOPAVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1131 ; XOPAVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
1132 ; XOPAVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
1133 ; XOPAVX2-NEXT: vpsubb %ymm1, %ymm0, %ymm0
1134 ; XOPAVX2-NEXT: retq
1136 ; AVX512-LABEL: splatconstant_shift_v32i8:
1138 ; AVX512-NEXT: vpsrlw $3, %ymm0, %ymm0
1139 ; AVX512-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1140 ; AVX512-NEXT: vmovdqa {{.*#+}} ymm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
1141 ; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0
1142 ; AVX512-NEXT: vpsubb %ymm1, %ymm0, %ymm0
1144 %shift = ashr <32 x i8> %a, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
1145 ret <32 x i8> %shift