1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE41
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx | FileCheck %s --check-prefixes=XOP,XOPAVX1
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop,+avx2 | FileCheck %s --check-prefixes=XOP,XOPAVX2
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefixes=AVX512DQ
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512BW
11 ; Shifts of uniform vXi8 constant values can be performed by a PSHUFB LUT
13 define <16 x i8> @uniform_shl_v16i8(<16 x i8> %a) nounwind {
14 ; SSE2-LABEL: uniform_shl_v16i8:
16 ; SSE2-NEXT: movdqa %xmm0, %xmm1
17 ; SSE2-NEXT: psllw $5, %xmm1
18 ; SSE2-NEXT: pxor %xmm2, %xmm2
19 ; SSE2-NEXT: pxor %xmm3, %xmm3
20 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm3
21 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
22 ; SSE2-NEXT: pand %xmm3, %xmm0
23 ; SSE2-NEXT: paddb %xmm3, %xmm0
24 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm3
25 ; SSE2-NEXT: psubb %xmm3, %xmm0
26 ; SSE2-NEXT: paddb %xmm1, %xmm1
27 ; SSE2-NEXT: pxor %xmm3, %xmm3
28 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm3
29 ; SSE2-NEXT: movdqa %xmm3, %xmm4
30 ; SSE2-NEXT: pandn %xmm0, %xmm4
31 ; SSE2-NEXT: psllw $2, %xmm0
32 ; SSE2-NEXT: pand %xmm3, %xmm0
33 ; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
34 ; SSE2-NEXT: por %xmm4, %xmm0
35 ; SSE2-NEXT: paddb %xmm1, %xmm1
36 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm2
37 ; SSE2-NEXT: movdqa %xmm2, %xmm1
38 ; SSE2-NEXT: pandn %xmm0, %xmm1
39 ; SSE2-NEXT: paddb %xmm0, %xmm0
40 ; SSE2-NEXT: pand %xmm2, %xmm0
41 ; SSE2-NEXT: por %xmm1, %xmm0
44 ; SSE41-LABEL: uniform_shl_v16i8:
46 ; SSE41-NEXT: movq {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0]
47 ; SSE41-NEXT: pshufb %xmm0, %xmm1
48 ; SSE41-NEXT: movdqa %xmm1, %xmm0
51 ; AVX-LABEL: uniform_shl_v16i8:
53 ; AVX-NEXT: vmovq {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0]
54 ; AVX-NEXT: vpshufb %xmm0, %xmm1, %xmm0
57 ; XOP-LABEL: uniform_shl_v16i8:
59 ; XOP-NEXT: vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
62 ; AVX512DQ-LABEL: uniform_shl_v16i8:
64 ; AVX512DQ-NEXT: vmovq {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0]
65 ; AVX512DQ-NEXT: vpshufb %xmm0, %xmm1, %xmm0
68 ; AVX512BW-LABEL: uniform_shl_v16i8:
70 ; AVX512BW-NEXT: vmovq {{.*#+}} xmm1 = [1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0]
71 ; AVX512BW-NEXT: vpshufb %xmm0, %xmm1, %xmm0
73 %shift = shl <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>, %a
77 define <16 x i8> @uniform_lshr_v16i8(<16 x i8> %a) nounwind {
78 ; SSE2-LABEL: uniform_lshr_v16i8:
80 ; SSE2-NEXT: psllw $5, %xmm0
81 ; SSE2-NEXT: pxor %xmm1, %xmm1
82 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm1
83 ; SSE2-NEXT: movdqa %xmm0, %xmm2
84 ; SSE2-NEXT: paddb %xmm0, %xmm2
85 ; SSE2-NEXT: pxor %xmm3, %xmm3
86 ; SSE2-NEXT: pxor %xmm0, %xmm0
87 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm0
88 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
89 ; SSE2-NEXT: pandn %xmm1, %xmm0
90 ; SSE2-NEXT: paddb %xmm2, %xmm2
91 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm3
92 ; SSE2-NEXT: movdqa %xmm3, %xmm1
93 ; SSE2-NEXT: pandn %xmm0, %xmm1
94 ; SSE2-NEXT: psrlw $1, %xmm0
95 ; SSE2-NEXT: pand %xmm3, %xmm0
96 ; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
97 ; SSE2-NEXT: por %xmm1, %xmm0
100 ; SSE41-LABEL: uniform_lshr_v16i8:
102 ; SSE41-NEXT: movd {{.*#+}} xmm1 = [2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
103 ; SSE41-NEXT: pshufb %xmm0, %xmm1
104 ; SSE41-NEXT: movdqa %xmm1, %xmm0
107 ; AVX-LABEL: uniform_lshr_v16i8:
109 ; AVX-NEXT: vmovd {{.*#+}} xmm1 = [2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
110 ; AVX-NEXT: vpshufb %xmm0, %xmm1, %xmm0
113 ; XOP-LABEL: uniform_lshr_v16i8:
115 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
116 ; XOP-NEXT: vpsubb %xmm0, %xmm1, %xmm0
117 ; XOP-NEXT: vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
120 ; AVX512DQ-LABEL: uniform_lshr_v16i8:
122 ; AVX512DQ-NEXT: vmovd {{.*#+}} xmm1 = [2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
123 ; AVX512DQ-NEXT: vpshufb %xmm0, %xmm1, %xmm0
124 ; AVX512DQ-NEXT: retq
126 ; AVX512BW-LABEL: uniform_lshr_v16i8:
128 ; AVX512BW-NEXT: vmovd {{.*#+}} xmm1 = [2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
129 ; AVX512BW-NEXT: vpshufb %xmm0, %xmm1, %xmm0
130 ; AVX512BW-NEXT: retq
131 %shift = lshr <16 x i8> <i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>, %a
135 define <16 x i8> @uniform_ashr_v16i8(<16 x i8> %a) nounwind {
136 ; SSE2-LABEL: uniform_ashr_v16i8:
138 ; SSE2-NEXT: psllw $5, %xmm0
139 ; SSE2-NEXT: pxor %xmm1, %xmm1
140 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm1
141 ; SSE2-NEXT: movdqa %xmm0, %xmm2
142 ; SSE2-NEXT: paddb %xmm0, %xmm2
143 ; SSE2-NEXT: pxor %xmm3, %xmm3
144 ; SSE2-NEXT: pxor %xmm0, %xmm0
145 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm0
146 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
147 ; SSE2-NEXT: pandn %xmm1, %xmm0
148 ; SSE2-NEXT: paddb %xmm2, %xmm2
149 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm3
150 ; SSE2-NEXT: movdqa %xmm3, %xmm1
151 ; SSE2-NEXT: pandn %xmm0, %xmm1
152 ; SSE2-NEXT: psrlw $1, %xmm0
153 ; SSE2-NEXT: pand %xmm3, %xmm0
154 ; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
155 ; SSE2-NEXT: por %xmm1, %xmm0
158 ; SSE41-LABEL: uniform_ashr_v16i8:
160 ; SSE41-NEXT: movd {{.*#+}} xmm1 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
161 ; SSE41-NEXT: pshufb %xmm0, %xmm1
162 ; SSE41-NEXT: movdqa %xmm1, %xmm0
165 ; AVX-LABEL: uniform_ashr_v16i8:
167 ; AVX-NEXT: vmovd {{.*#+}} xmm1 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
168 ; AVX-NEXT: vpshufb %xmm0, %xmm1, %xmm0
171 ; XOP-LABEL: uniform_ashr_v16i8:
173 ; XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
174 ; XOP-NEXT: vpsubb %xmm0, %xmm1, %xmm0
175 ; XOP-NEXT: vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
178 ; AVX512DQ-LABEL: uniform_ashr_v16i8:
180 ; AVX512DQ-NEXT: vmovd {{.*#+}} xmm1 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
181 ; AVX512DQ-NEXT: vpshufb %xmm0, %xmm1, %xmm0
182 ; AVX512DQ-NEXT: retq
184 ; AVX512BW-LABEL: uniform_ashr_v16i8:
186 ; AVX512BW-NEXT: vmovd {{.*#+}} xmm1 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
187 ; AVX512BW-NEXT: vpshufb %xmm0, %xmm1, %xmm0
188 ; AVX512BW-NEXT: retq
189 %shift = ashr <16 x i8> <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>, %a
193 define <32 x i8> @uniform_shl_v32i8(<32 x i8> %a) nounwind {
194 ; SSE2-LABEL: uniform_shl_v32i8:
196 ; SSE2-NEXT: movdqa %xmm0, %xmm2
197 ; SSE2-NEXT: psllw $5, %xmm2
198 ; SSE2-NEXT: pxor %xmm3, %xmm3
199 ; SSE2-NEXT: pxor %xmm7, %xmm7
200 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm7
201 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4]
202 ; SSE2-NEXT: movdqa %xmm7, %xmm0
203 ; SSE2-NEXT: pandn %xmm4, %xmm0
204 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64]
205 ; SSE2-NEXT: pand %xmm5, %xmm7
206 ; SSE2-NEXT: por %xmm0, %xmm7
207 ; SSE2-NEXT: paddb %xmm2, %xmm2
208 ; SSE2-NEXT: pxor %xmm0, %xmm0
209 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm0
210 ; SSE2-NEXT: movdqa %xmm0, %xmm8
211 ; SSE2-NEXT: pandn %xmm7, %xmm8
212 ; SSE2-NEXT: psllw $2, %xmm7
213 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
214 ; SSE2-NEXT: pand %xmm6, %xmm0
215 ; SSE2-NEXT: pand %xmm7, %xmm0
216 ; SSE2-NEXT: por %xmm8, %xmm0
217 ; SSE2-NEXT: paddb %xmm2, %xmm2
218 ; SSE2-NEXT: pxor %xmm7, %xmm7
219 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm7
220 ; SSE2-NEXT: movdqa %xmm7, %xmm2
221 ; SSE2-NEXT: pandn %xmm0, %xmm2
222 ; SSE2-NEXT: paddb %xmm0, %xmm0
223 ; SSE2-NEXT: pand %xmm7, %xmm0
224 ; SSE2-NEXT: por %xmm2, %xmm0
225 ; SSE2-NEXT: psllw $5, %xmm1
226 ; SSE2-NEXT: pxor %xmm7, %xmm7
227 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm7
228 ; SSE2-NEXT: movdqa %xmm7, %xmm2
229 ; SSE2-NEXT: pandn %xmm4, %xmm2
230 ; SSE2-NEXT: pand %xmm5, %xmm7
231 ; SSE2-NEXT: por %xmm2, %xmm7
232 ; SSE2-NEXT: paddb %xmm1, %xmm1
233 ; SSE2-NEXT: pxor %xmm2, %xmm2
234 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm2
235 ; SSE2-NEXT: movdqa %xmm2, %xmm4
236 ; SSE2-NEXT: pandn %xmm7, %xmm4
237 ; SSE2-NEXT: psllw $2, %xmm7
238 ; SSE2-NEXT: pand %xmm6, %xmm2
239 ; SSE2-NEXT: pand %xmm7, %xmm2
240 ; SSE2-NEXT: por %xmm4, %xmm2
241 ; SSE2-NEXT: paddb %xmm1, %xmm1
242 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm3
243 ; SSE2-NEXT: movdqa %xmm3, %xmm1
244 ; SSE2-NEXT: pandn %xmm2, %xmm1
245 ; SSE2-NEXT: paddb %xmm2, %xmm2
246 ; SSE2-NEXT: pand %xmm3, %xmm2
247 ; SSE2-NEXT: por %xmm1, %xmm2
248 ; SSE2-NEXT: movdqa %xmm2, %xmm1
251 ; SSE41-LABEL: uniform_shl_v32i8:
253 ; SSE41-NEXT: movq {{.*#+}} xmm2 = [4,8,16,32,64,128,0,0,0,0,0,0,0,0,0,0]
254 ; SSE41-NEXT: movdqa %xmm2, %xmm3
255 ; SSE41-NEXT: pshufb %xmm0, %xmm3
256 ; SSE41-NEXT: pshufb %xmm1, %xmm2
257 ; SSE41-NEXT: movdqa %xmm3, %xmm0
258 ; SSE41-NEXT: movdqa %xmm2, %xmm1
261 ; AVX1-LABEL: uniform_shl_v32i8:
263 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
264 ; AVX1-NEXT: vmovq {{.*#+}} xmm2 = [4,8,16,32,64,128,0,0,0,0,0,0,0,0,0,0]
265 ; AVX1-NEXT: vpshufb %xmm1, %xmm2, %xmm1
266 ; AVX1-NEXT: vpshufb %xmm0, %xmm2, %xmm0
267 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
270 ; AVX2-LABEL: uniform_shl_v32i8:
272 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0]
273 ; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0
276 ; XOPAVX1-LABEL: uniform_shl_v32i8:
278 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
279 ; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4]
280 ; XOPAVX1-NEXT: vpshlb %xmm1, %xmm2, %xmm1
281 ; XOPAVX1-NEXT: vpshlb %xmm0, %xmm2, %xmm0
282 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
285 ; XOPAVX2-LABEL: uniform_shl_v32i8:
287 ; XOPAVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0]
288 ; XOPAVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0
291 ; AVX512DQ-LABEL: uniform_shl_v32i8:
293 ; AVX512DQ-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0]
294 ; AVX512DQ-NEXT: vpshufb %ymm0, %ymm1, %ymm0
295 ; AVX512DQ-NEXT: retq
297 ; AVX512BW-LABEL: uniform_shl_v32i8:
299 ; AVX512BW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0,4,8,16,32,64,128,0,0]
300 ; AVX512BW-NEXT: vpshufb %ymm0, %ymm1, %ymm0
301 ; AVX512BW-NEXT: retq
302 %shift = shl <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>, %a
306 define <32 x i8> @uniform_lshr_v32i8(<32 x i8> %a) nounwind {
307 ; SSE2-LABEL: uniform_lshr_v32i8:
309 ; SSE2-NEXT: movdqa %xmm1, %xmm2
310 ; SSE2-NEXT: movdqa %xmm0, %xmm3
311 ; SSE2-NEXT: psllw $5, %xmm3
312 ; SSE2-NEXT: pxor %xmm1, %xmm1
313 ; SSE2-NEXT: pxor %xmm0, %xmm0
314 ; SSE2-NEXT: pcmpgtb %xmm3, %xmm0
315 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5]
316 ; SSE2-NEXT: pandn %xmm4, %xmm0
317 ; SSE2-NEXT: paddb %xmm3, %xmm3
318 ; SSE2-NEXT: pxor %xmm6, %xmm6
319 ; SSE2-NEXT: pcmpgtb %xmm3, %xmm6
320 ; SSE2-NEXT: movdqa %xmm6, %xmm7
321 ; SSE2-NEXT: pandn %xmm0, %xmm7
322 ; SSE2-NEXT: psrlw $2, %xmm0
323 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
324 ; SSE2-NEXT: pand %xmm5, %xmm6
325 ; SSE2-NEXT: pand %xmm0, %xmm6
326 ; SSE2-NEXT: por %xmm7, %xmm6
327 ; SSE2-NEXT: paddb %xmm3, %xmm3
328 ; SSE2-NEXT: pxor %xmm0, %xmm0
329 ; SSE2-NEXT: pcmpgtb %xmm3, %xmm0
330 ; SSE2-NEXT: movdqa %xmm0, %xmm7
331 ; SSE2-NEXT: pandn %xmm6, %xmm7
332 ; SSE2-NEXT: psrlw $1, %xmm6
333 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
334 ; SSE2-NEXT: pand %xmm3, %xmm0
335 ; SSE2-NEXT: pand %xmm6, %xmm0
336 ; SSE2-NEXT: por %xmm7, %xmm0
337 ; SSE2-NEXT: psllw $5, %xmm2
338 ; SSE2-NEXT: pxor %xmm6, %xmm6
339 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm6
340 ; SSE2-NEXT: pandn %xmm4, %xmm6
341 ; SSE2-NEXT: paddb %xmm2, %xmm2
342 ; SSE2-NEXT: pxor %xmm4, %xmm4
343 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm4
344 ; SSE2-NEXT: movdqa %xmm4, %xmm7
345 ; SSE2-NEXT: pandn %xmm6, %xmm7
346 ; SSE2-NEXT: psrlw $2, %xmm6
347 ; SSE2-NEXT: pand %xmm5, %xmm4
348 ; SSE2-NEXT: pand %xmm6, %xmm4
349 ; SSE2-NEXT: por %xmm7, %xmm4
350 ; SSE2-NEXT: paddb %xmm2, %xmm2
351 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm1
352 ; SSE2-NEXT: movdqa %xmm1, %xmm2
353 ; SSE2-NEXT: pandn %xmm4, %xmm2
354 ; SSE2-NEXT: psrlw $1, %xmm4
355 ; SSE2-NEXT: pand %xmm3, %xmm1
356 ; SSE2-NEXT: pand %xmm4, %xmm1
357 ; SSE2-NEXT: por %xmm2, %xmm1
360 ; SSE41-LABEL: uniform_lshr_v32i8:
362 ; SSE41-NEXT: movd {{.*#+}} xmm2 = [5,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0]
363 ; SSE41-NEXT: movdqa %xmm2, %xmm3
364 ; SSE41-NEXT: pshufb %xmm0, %xmm3
365 ; SSE41-NEXT: pshufb %xmm1, %xmm2
366 ; SSE41-NEXT: movdqa %xmm3, %xmm0
367 ; SSE41-NEXT: movdqa %xmm2, %xmm1
370 ; AVX1-LABEL: uniform_lshr_v32i8:
372 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
373 ; AVX1-NEXT: vmovd {{.*#+}} xmm2 = [5,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0]
374 ; AVX1-NEXT: vpshufb %xmm1, %xmm2, %xmm1
375 ; AVX1-NEXT: vpshufb %xmm0, %xmm2, %xmm0
376 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
379 ; AVX2-LABEL: uniform_lshr_v32i8:
381 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0]
382 ; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0
385 ; XOPAVX1-LABEL: uniform_lshr_v32i8:
387 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
388 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
389 ; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm1
390 ; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5]
391 ; XOPAVX1-NEXT: vpshlb %xmm1, %xmm3, %xmm1
392 ; XOPAVX1-NEXT: vpsubb %xmm0, %xmm2, %xmm0
393 ; XOPAVX1-NEXT: vpshlb %xmm0, %xmm3, %xmm0
394 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
397 ; XOPAVX2-LABEL: uniform_lshr_v32i8:
399 ; XOPAVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0]
400 ; XOPAVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0
403 ; AVX512DQ-LABEL: uniform_lshr_v32i8:
405 ; AVX512DQ-NEXT: vpbroadcastq {{.*#+}} ymm1 = [5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0]
406 ; AVX512DQ-NEXT: vpshufb %ymm0, %ymm1, %ymm0
407 ; AVX512DQ-NEXT: retq
409 ; AVX512BW-LABEL: uniform_lshr_v32i8:
411 ; AVX512BW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0,5,2,1,0,0,0,0,0]
412 ; AVX512BW-NEXT: vpshufb %ymm0, %ymm1, %ymm0
413 ; AVX512BW-NEXT: retq
414 %shift = lshr <32 x i8> <i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5>, %a
418 define <32 x i8> @uniform_ashr_v32i8(<32 x i8> %a) nounwind {
419 ; SSE2-LABEL: uniform_ashr_v32i8:
421 ; SSE2-NEXT: movdqa %xmm1, %xmm2
422 ; SSE2-NEXT: movdqa %xmm0, %xmm3
423 ; SSE2-NEXT: psllw $5, %xmm3
424 ; SSE2-NEXT: pxor %xmm1, %xmm1
425 ; SSE2-NEXT: pxor %xmm0, %xmm0
426 ; SSE2-NEXT: pcmpgtb %xmm3, %xmm0
427 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6]
428 ; SSE2-NEXT: pandn %xmm4, %xmm0
429 ; SSE2-NEXT: paddb %xmm3, %xmm3
430 ; SSE2-NEXT: pxor %xmm6, %xmm6
431 ; SSE2-NEXT: pcmpgtb %xmm3, %xmm6
432 ; SSE2-NEXT: movdqa %xmm6, %xmm7
433 ; SSE2-NEXT: pandn %xmm0, %xmm7
434 ; SSE2-NEXT: psrlw $2, %xmm0
435 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
436 ; SSE2-NEXT: pand %xmm5, %xmm6
437 ; SSE2-NEXT: pand %xmm0, %xmm6
438 ; SSE2-NEXT: por %xmm7, %xmm6
439 ; SSE2-NEXT: paddb %xmm3, %xmm3
440 ; SSE2-NEXT: pxor %xmm0, %xmm0
441 ; SSE2-NEXT: pcmpgtb %xmm3, %xmm0
442 ; SSE2-NEXT: movdqa %xmm0, %xmm7
443 ; SSE2-NEXT: pandn %xmm6, %xmm7
444 ; SSE2-NEXT: psrlw $1, %xmm6
445 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
446 ; SSE2-NEXT: pand %xmm3, %xmm0
447 ; SSE2-NEXT: pand %xmm6, %xmm0
448 ; SSE2-NEXT: por %xmm7, %xmm0
449 ; SSE2-NEXT: psllw $5, %xmm2
450 ; SSE2-NEXT: pxor %xmm6, %xmm6
451 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm6
452 ; SSE2-NEXT: pandn %xmm4, %xmm6
453 ; SSE2-NEXT: paddb %xmm2, %xmm2
454 ; SSE2-NEXT: pxor %xmm4, %xmm4
455 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm4
456 ; SSE2-NEXT: movdqa %xmm4, %xmm7
457 ; SSE2-NEXT: pandn %xmm6, %xmm7
458 ; SSE2-NEXT: psrlw $2, %xmm6
459 ; SSE2-NEXT: pand %xmm5, %xmm4
460 ; SSE2-NEXT: pand %xmm6, %xmm4
461 ; SSE2-NEXT: por %xmm7, %xmm4
462 ; SSE2-NEXT: paddb %xmm2, %xmm2
463 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm1
464 ; SSE2-NEXT: movdqa %xmm1, %xmm2
465 ; SSE2-NEXT: pandn %xmm4, %xmm2
466 ; SSE2-NEXT: psrlw $1, %xmm4
467 ; SSE2-NEXT: pand %xmm3, %xmm1
468 ; SSE2-NEXT: pand %xmm4, %xmm1
469 ; SSE2-NEXT: por %xmm2, %xmm1
472 ; SSE41-LABEL: uniform_ashr_v32i8:
474 ; SSE41-NEXT: movd {{.*#+}} xmm2 = [6,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0]
475 ; SSE41-NEXT: movdqa %xmm2, %xmm3
476 ; SSE41-NEXT: pshufb %xmm0, %xmm3
477 ; SSE41-NEXT: pshufb %xmm1, %xmm2
478 ; SSE41-NEXT: movdqa %xmm3, %xmm0
479 ; SSE41-NEXT: movdqa %xmm2, %xmm1
482 ; AVX1-LABEL: uniform_ashr_v32i8:
484 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
485 ; AVX1-NEXT: vmovd {{.*#+}} xmm2 = [6,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0]
486 ; AVX1-NEXT: vpshufb %xmm1, %xmm2, %xmm1
487 ; AVX1-NEXT: vpshufb %xmm0, %xmm2, %xmm0
488 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
491 ; AVX2-LABEL: uniform_ashr_v32i8:
493 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0]
494 ; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0
497 ; XOPAVX1-LABEL: uniform_ashr_v32i8:
499 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
500 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
501 ; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm1
502 ; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6]
503 ; XOPAVX1-NEXT: vpshlb %xmm1, %xmm3, %xmm1
504 ; XOPAVX1-NEXT: vpsubb %xmm0, %xmm2, %xmm0
505 ; XOPAVX1-NEXT: vpshlb %xmm0, %xmm3, %xmm0
506 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
509 ; XOPAVX2-LABEL: uniform_ashr_v32i8:
511 ; XOPAVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0]
512 ; XOPAVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0
515 ; AVX512DQ-LABEL: uniform_ashr_v32i8:
517 ; AVX512DQ-NEXT: vpbroadcastq {{.*#+}} ymm1 = [6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0]
518 ; AVX512DQ-NEXT: vpshufb %ymm0, %ymm1, %ymm0
519 ; AVX512DQ-NEXT: retq
521 ; AVX512BW-LABEL: uniform_ashr_v32i8:
523 ; AVX512BW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0,6,3,1,0,0,0,0,0]
524 ; AVX512BW-NEXT: vpshufb %ymm0, %ymm1, %ymm0
525 ; AVX512BW-NEXT: retq
526 %shift = ashr <32 x i8> <i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6>, %a
530 define <64 x i8> @uniform_shl_v64i8(<64 x i8> %a) nounwind {
531 ; SSE2-LABEL: uniform_shl_v64i8:
533 ; SSE2-NEXT: movdqa %xmm1, %xmm4
534 ; SSE2-NEXT: movdqa %xmm0, %xmm1
535 ; SSE2-NEXT: psllw $5, %xmm1
536 ; SSE2-NEXT: pxor %xmm6, %xmm6
537 ; SSE2-NEXT: pxor %xmm9, %xmm9
538 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm9
539 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
540 ; SSE2-NEXT: movdqa %xmm9, %xmm0
541 ; SSE2-NEXT: pandn %xmm5, %xmm0
542 ; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112]
543 ; SSE2-NEXT: pand %xmm7, %xmm9
544 ; SSE2-NEXT: por %xmm0, %xmm9
545 ; SSE2-NEXT: paddb %xmm1, %xmm1
546 ; SSE2-NEXT: pxor %xmm0, %xmm0
547 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm0
548 ; SSE2-NEXT: movdqa %xmm0, %xmm10
549 ; SSE2-NEXT: pandn %xmm9, %xmm10
550 ; SSE2-NEXT: psllw $2, %xmm9
551 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
552 ; SSE2-NEXT: pand %xmm8, %xmm0
553 ; SSE2-NEXT: pand %xmm9, %xmm0
554 ; SSE2-NEXT: por %xmm10, %xmm0
555 ; SSE2-NEXT: paddb %xmm1, %xmm1
556 ; SSE2-NEXT: pxor %xmm9, %xmm9
557 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm9
558 ; SSE2-NEXT: movdqa %xmm9, %xmm1
559 ; SSE2-NEXT: pandn %xmm0, %xmm1
560 ; SSE2-NEXT: paddb %xmm0, %xmm0
561 ; SSE2-NEXT: pand %xmm9, %xmm0
562 ; SSE2-NEXT: por %xmm1, %xmm0
563 ; SSE2-NEXT: psllw $5, %xmm4
564 ; SSE2-NEXT: pxor %xmm9, %xmm9
565 ; SSE2-NEXT: pcmpgtb %xmm4, %xmm9
566 ; SSE2-NEXT: movdqa %xmm9, %xmm1
567 ; SSE2-NEXT: pandn %xmm5, %xmm1
568 ; SSE2-NEXT: pand %xmm7, %xmm9
569 ; SSE2-NEXT: por %xmm1, %xmm9
570 ; SSE2-NEXT: paddb %xmm4, %xmm4
571 ; SSE2-NEXT: pxor %xmm1, %xmm1
572 ; SSE2-NEXT: pcmpgtb %xmm4, %xmm1
573 ; SSE2-NEXT: movdqa %xmm1, %xmm10
574 ; SSE2-NEXT: pandn %xmm9, %xmm10
575 ; SSE2-NEXT: psllw $2, %xmm9
576 ; SSE2-NEXT: pand %xmm8, %xmm1
577 ; SSE2-NEXT: pand %xmm9, %xmm1
578 ; SSE2-NEXT: por %xmm10, %xmm1
579 ; SSE2-NEXT: paddb %xmm4, %xmm4
580 ; SSE2-NEXT: pxor %xmm9, %xmm9
581 ; SSE2-NEXT: pcmpgtb %xmm4, %xmm9
582 ; SSE2-NEXT: movdqa %xmm9, %xmm4
583 ; SSE2-NEXT: pandn %xmm1, %xmm4
584 ; SSE2-NEXT: paddb %xmm1, %xmm1
585 ; SSE2-NEXT: pand %xmm9, %xmm1
586 ; SSE2-NEXT: por %xmm4, %xmm1
587 ; SSE2-NEXT: psllw $5, %xmm2
588 ; SSE2-NEXT: pxor %xmm9, %xmm9
589 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm9
590 ; SSE2-NEXT: movdqa %xmm9, %xmm4
591 ; SSE2-NEXT: pandn %xmm5, %xmm4
592 ; SSE2-NEXT: pand %xmm7, %xmm9
593 ; SSE2-NEXT: por %xmm4, %xmm9
594 ; SSE2-NEXT: paddb %xmm2, %xmm2
595 ; SSE2-NEXT: pxor %xmm4, %xmm4
596 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm4
597 ; SSE2-NEXT: movdqa %xmm4, %xmm10
598 ; SSE2-NEXT: pandn %xmm9, %xmm10
599 ; SSE2-NEXT: psllw $2, %xmm9
600 ; SSE2-NEXT: pand %xmm8, %xmm4
601 ; SSE2-NEXT: pand %xmm9, %xmm4
602 ; SSE2-NEXT: por %xmm10, %xmm4
603 ; SSE2-NEXT: paddb %xmm2, %xmm2
604 ; SSE2-NEXT: pxor %xmm9, %xmm9
605 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm9
606 ; SSE2-NEXT: movdqa %xmm9, %xmm2
607 ; SSE2-NEXT: pandn %xmm4, %xmm2
608 ; SSE2-NEXT: paddb %xmm4, %xmm4
609 ; SSE2-NEXT: pand %xmm9, %xmm4
610 ; SSE2-NEXT: por %xmm2, %xmm4
611 ; SSE2-NEXT: psllw $5, %xmm3
612 ; SSE2-NEXT: pxor %xmm2, %xmm2
613 ; SSE2-NEXT: pcmpgtb %xmm3, %xmm2
614 ; SSE2-NEXT: movdqa %xmm2, %xmm9
615 ; SSE2-NEXT: pandn %xmm5, %xmm9
616 ; SSE2-NEXT: pand %xmm7, %xmm2
617 ; SSE2-NEXT: por %xmm9, %xmm2
618 ; SSE2-NEXT: paddb %xmm3, %xmm3
619 ; SSE2-NEXT: pxor %xmm5, %xmm5
620 ; SSE2-NEXT: pcmpgtb %xmm3, %xmm5
621 ; SSE2-NEXT: movdqa %xmm5, %xmm7
622 ; SSE2-NEXT: pandn %xmm2, %xmm7
623 ; SSE2-NEXT: psllw $2, %xmm2
624 ; SSE2-NEXT: pand %xmm8, %xmm5
625 ; SSE2-NEXT: pand %xmm2, %xmm5
626 ; SSE2-NEXT: por %xmm7, %xmm5
627 ; SSE2-NEXT: paddb %xmm3, %xmm3
628 ; SSE2-NEXT: pcmpgtb %xmm3, %xmm6
629 ; SSE2-NEXT: movdqa %xmm6, %xmm2
630 ; SSE2-NEXT: pandn %xmm5, %xmm2
631 ; SSE2-NEXT: paddb %xmm5, %xmm5
632 ; SSE2-NEXT: pand %xmm6, %xmm5
633 ; SSE2-NEXT: por %xmm2, %xmm5
634 ; SSE2-NEXT: movdqa %xmm4, %xmm2
635 ; SSE2-NEXT: movdqa %xmm5, %xmm3
638 ; SSE41-LABEL: uniform_shl_v64i8:
640 ; SSE41-NEXT: movq {{.*#+}} xmm4 = [7,14,28,56,112,224,192,128,0,0,0,0,0,0,0,0]
641 ; SSE41-NEXT: movdqa %xmm4, %xmm5
642 ; SSE41-NEXT: pshufb %xmm0, %xmm5
643 ; SSE41-NEXT: movdqa %xmm4, %xmm6
644 ; SSE41-NEXT: pshufb %xmm1, %xmm6
645 ; SSE41-NEXT: movdqa %xmm4, %xmm7
646 ; SSE41-NEXT: pshufb %xmm2, %xmm7
647 ; SSE41-NEXT: pshufb %xmm3, %xmm4
648 ; SSE41-NEXT: movdqa %xmm5, %xmm0
649 ; SSE41-NEXT: movdqa %xmm6, %xmm1
650 ; SSE41-NEXT: movdqa %xmm7, %xmm2
651 ; SSE41-NEXT: movdqa %xmm4, %xmm3
654 ; AVX1-LABEL: uniform_shl_v64i8:
656 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
657 ; AVX1-NEXT: vmovq {{.*#+}} xmm3 = [7,14,28,56,112,224,192,128,0,0,0,0,0,0,0,0]
658 ; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2
659 ; AVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm0
660 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
661 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
662 ; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2
663 ; AVX1-NEXT: vpshufb %xmm1, %xmm3, %xmm1
664 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
667 ; AVX2-LABEL: uniform_shl_v64i8:
669 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128]
670 ; AVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0
671 ; AVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1
674 ; XOPAVX1-LABEL: uniform_shl_v64i8:
676 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
677 ; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7]
678 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm3, %xmm2
679 ; XOPAVX1-NEXT: vpshlb %xmm0, %xmm3, %xmm0
680 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
681 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
682 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm3, %xmm2
683 ; XOPAVX1-NEXT: vpshlb %xmm1, %xmm3, %xmm1
684 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
687 ; XOPAVX2-LABEL: uniform_shl_v64i8:
689 ; XOPAVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128]
690 ; XOPAVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0
691 ; XOPAVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1
694 ; AVX512DQ-LABEL: uniform_shl_v64i8:
696 ; AVX512DQ-NEXT: vextracti64x4 $1, %zmm0, %ymm1
697 ; AVX512DQ-NEXT: vpbroadcastq {{.*#+}} ymm2 = [7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128]
698 ; AVX512DQ-NEXT: vpshufb %ymm1, %ymm2, %ymm1
699 ; AVX512DQ-NEXT: vpshufb %ymm0, %ymm2, %ymm0
700 ; AVX512DQ-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0
701 ; AVX512DQ-NEXT: retq
703 ; AVX512BW-LABEL: uniform_shl_v64i8:
705 ; AVX512BW-NEXT: vpbroadcastq {{.*#+}} zmm1 = [7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128,7,14,28,56,112,224,192,128]
706 ; AVX512BW-NEXT: vpshufb %zmm0, %zmm1, %zmm0
707 ; AVX512BW-NEXT: retq
708 %shift = shl <64 x i8> <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>, %a
712 define <64 x i8> @uniform_lshr_v64i8(<64 x i8> %a) nounwind {
713 ; SSE2-LABEL: uniform_lshr_v64i8:
715 ; SSE2-NEXT: movdqa %xmm3, %xmm4
716 ; SSE2-NEXT: movdqa %xmm1, %xmm5
717 ; SSE2-NEXT: movdqa %xmm0, %xmm1
718 ; SSE2-NEXT: psllw $5, %xmm1
719 ; SSE2-NEXT: pxor %xmm3, %xmm3
720 ; SSE2-NEXT: pxor %xmm0, %xmm0
721 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm0
722 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
723 ; SSE2-NEXT: pandn %xmm6, %xmm0
724 ; SSE2-NEXT: paddb %xmm1, %xmm1
725 ; SSE2-NEXT: pxor %xmm8, %xmm8
726 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm8
727 ; SSE2-NEXT: pandn %xmm0, %xmm8
728 ; SSE2-NEXT: paddb %xmm1, %xmm1
729 ; SSE2-NEXT: pxor %xmm0, %xmm0
730 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm0
731 ; SSE2-NEXT: movdqa %xmm0, %xmm1
732 ; SSE2-NEXT: pandn %xmm8, %xmm1
733 ; SSE2-NEXT: psrlw $1, %xmm8
734 ; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
735 ; SSE2-NEXT: pand %xmm7, %xmm0
736 ; SSE2-NEXT: pand %xmm8, %xmm0
737 ; SSE2-NEXT: por %xmm1, %xmm0
738 ; SSE2-NEXT: psllw $5, %xmm5
739 ; SSE2-NEXT: pxor %xmm1, %xmm1
740 ; SSE2-NEXT: pcmpgtb %xmm5, %xmm1
741 ; SSE2-NEXT: pandn %xmm6, %xmm1
742 ; SSE2-NEXT: paddb %xmm5, %xmm5
743 ; SSE2-NEXT: pxor %xmm8, %xmm8
744 ; SSE2-NEXT: pcmpgtb %xmm5, %xmm8
745 ; SSE2-NEXT: pandn %xmm1, %xmm8
746 ; SSE2-NEXT: paddb %xmm5, %xmm5
747 ; SSE2-NEXT: pxor %xmm1, %xmm1
748 ; SSE2-NEXT: pcmpgtb %xmm5, %xmm1
749 ; SSE2-NEXT: movdqa %xmm1, %xmm5
750 ; SSE2-NEXT: pandn %xmm8, %xmm5
751 ; SSE2-NEXT: psrlw $1, %xmm8
752 ; SSE2-NEXT: pand %xmm7, %xmm1
753 ; SSE2-NEXT: pand %xmm8, %xmm1
754 ; SSE2-NEXT: por %xmm5, %xmm1
755 ; SSE2-NEXT: psllw $5, %xmm2
756 ; SSE2-NEXT: pxor %xmm5, %xmm5
757 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm5
758 ; SSE2-NEXT: pandn %xmm6, %xmm5
759 ; SSE2-NEXT: paddb %xmm2, %xmm2
760 ; SSE2-NEXT: pxor %xmm8, %xmm8
761 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm8
762 ; SSE2-NEXT: pandn %xmm5, %xmm8
763 ; SSE2-NEXT: paddb %xmm2, %xmm2
764 ; SSE2-NEXT: pxor %xmm5, %xmm5
765 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm5
766 ; SSE2-NEXT: movdqa %xmm5, %xmm2
767 ; SSE2-NEXT: pandn %xmm8, %xmm2
768 ; SSE2-NEXT: psrlw $1, %xmm8
769 ; SSE2-NEXT: pand %xmm7, %xmm5
770 ; SSE2-NEXT: pand %xmm8, %xmm5
771 ; SSE2-NEXT: por %xmm2, %xmm5
772 ; SSE2-NEXT: psllw $5, %xmm4
773 ; SSE2-NEXT: pxor %xmm2, %xmm2
774 ; SSE2-NEXT: pcmpgtb %xmm4, %xmm2
775 ; SSE2-NEXT: pandn %xmm6, %xmm2
776 ; SSE2-NEXT: paddb %xmm4, %xmm4
777 ; SSE2-NEXT: pxor %xmm6, %xmm6
778 ; SSE2-NEXT: pcmpgtb %xmm4, %xmm6
779 ; SSE2-NEXT: pandn %xmm2, %xmm6
780 ; SSE2-NEXT: paddb %xmm4, %xmm4
781 ; SSE2-NEXT: pcmpgtb %xmm4, %xmm3
782 ; SSE2-NEXT: movdqa %xmm3, %xmm2
783 ; SSE2-NEXT: pandn %xmm6, %xmm2
784 ; SSE2-NEXT: psrlw $1, %xmm6
785 ; SSE2-NEXT: pand %xmm7, %xmm3
786 ; SSE2-NEXT: pand %xmm6, %xmm3
787 ; SSE2-NEXT: por %xmm2, %xmm3
788 ; SSE2-NEXT: movdqa %xmm5, %xmm2
791 ; SSE41-LABEL: uniform_lshr_v64i8:
793 ; SSE41-NEXT: pmovsxbq {{.*#+}} xmm4 = [1,0]
794 ; SSE41-NEXT: movdqa %xmm4, %xmm5
795 ; SSE41-NEXT: pshufb %xmm0, %xmm5
796 ; SSE41-NEXT: movdqa %xmm4, %xmm6
797 ; SSE41-NEXT: pshufb %xmm1, %xmm6
798 ; SSE41-NEXT: movdqa %xmm4, %xmm7
799 ; SSE41-NEXT: pshufb %xmm2, %xmm7
800 ; SSE41-NEXT: pshufb %xmm3, %xmm4
801 ; SSE41-NEXT: movdqa %xmm5, %xmm0
802 ; SSE41-NEXT: movdqa %xmm6, %xmm1
803 ; SSE41-NEXT: movdqa %xmm7, %xmm2
804 ; SSE41-NEXT: movdqa %xmm4, %xmm3
807 ; AVX1-LABEL: uniform_lshr_v64i8:
809 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
810 ; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm3 = [1,0]
811 ; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2
812 ; AVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm0
813 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
814 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
815 ; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2
816 ; AVX1-NEXT: vpshufb %xmm1, %xmm3, %xmm1
817 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
820 ; AVX2-LABEL: uniform_lshr_v64i8:
822 ; AVX2-NEXT: vpmovsxbq {{.*#+}} ymm2 = [1,0,1,0]
823 ; AVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0
824 ; AVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1
827 ; XOPAVX1-LABEL: uniform_lshr_v64i8:
829 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
830 ; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
831 ; XOPAVX1-NEXT: vpsubb %xmm2, %xmm3, %xmm2
832 ; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
833 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm4, %xmm2
834 ; XOPAVX1-NEXT: vpsubb %xmm0, %xmm3, %xmm0
835 ; XOPAVX1-NEXT: vpshlb %xmm0, %xmm4, %xmm0
836 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
837 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
838 ; XOPAVX1-NEXT: vpsubb %xmm2, %xmm3, %xmm2
839 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm4, %xmm2
840 ; XOPAVX1-NEXT: vpsubb %xmm1, %xmm3, %xmm1
841 ; XOPAVX1-NEXT: vpshlb %xmm1, %xmm4, %xmm1
842 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
845 ; XOPAVX2-LABEL: uniform_lshr_v64i8:
847 ; XOPAVX2-NEXT: vpmovsxbq {{.*#+}} ymm2 = [1,0,1,0]
848 ; XOPAVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0
849 ; XOPAVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1
852 ; AVX512DQ-LABEL: uniform_lshr_v64i8:
854 ; AVX512DQ-NEXT: vextracti64x4 $1, %zmm0, %ymm1
855 ; AVX512DQ-NEXT: vpmovsxbq {{.*#+}} ymm2 = [1,0,1,0]
856 ; AVX512DQ-NEXT: vpshufb %ymm1, %ymm2, %ymm1
857 ; AVX512DQ-NEXT: vpshufb %ymm0, %ymm2, %ymm0
858 ; AVX512DQ-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0
859 ; AVX512DQ-NEXT: retq
861 ; AVX512BW-LABEL: uniform_lshr_v64i8:
863 ; AVX512BW-NEXT: vpbroadcastq {{.*#+}} zmm1 = [1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0]
864 ; AVX512BW-NEXT: vpshufb %zmm0, %zmm1, %zmm0
865 ; AVX512BW-NEXT: retq
866 %shift = lshr <64 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>, %a
870 define <64 x i8> @uniform_ashr_v64i8(<64 x i8> %a) nounwind {
871 ; SSE2-LABEL: uniform_ashr_v64i8:
873 ; SSE2-NEXT: movdqa %xmm3, %xmm4
874 ; SSE2-NEXT: movdqa %xmm1, %xmm5
875 ; SSE2-NEXT: movdqa %xmm0, %xmm1
876 ; SSE2-NEXT: psllw $5, %xmm1
877 ; SSE2-NEXT: pxor %xmm3, %xmm3
878 ; SSE2-NEXT: pxor %xmm0, %xmm0
879 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm0
880 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
881 ; SSE2-NEXT: pandn %xmm6, %xmm0
882 ; SSE2-NEXT: paddb %xmm1, %xmm1
883 ; SSE2-NEXT: pxor %xmm8, %xmm8
884 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm8
885 ; SSE2-NEXT: pandn %xmm0, %xmm8
886 ; SSE2-NEXT: paddb %xmm1, %xmm1
887 ; SSE2-NEXT: pxor %xmm0, %xmm0
888 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm0
889 ; SSE2-NEXT: movdqa %xmm0, %xmm1
890 ; SSE2-NEXT: pandn %xmm8, %xmm1
891 ; SSE2-NEXT: psrlw $1, %xmm8
892 ; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
893 ; SSE2-NEXT: pand %xmm7, %xmm0
894 ; SSE2-NEXT: pand %xmm8, %xmm0
895 ; SSE2-NEXT: por %xmm1, %xmm0
896 ; SSE2-NEXT: psllw $5, %xmm5
897 ; SSE2-NEXT: pxor %xmm1, %xmm1
898 ; SSE2-NEXT: pcmpgtb %xmm5, %xmm1
899 ; SSE2-NEXT: pandn %xmm6, %xmm1
900 ; SSE2-NEXT: paddb %xmm5, %xmm5
901 ; SSE2-NEXT: pxor %xmm8, %xmm8
902 ; SSE2-NEXT: pcmpgtb %xmm5, %xmm8
903 ; SSE2-NEXT: pandn %xmm1, %xmm8
904 ; SSE2-NEXT: paddb %xmm5, %xmm5
905 ; SSE2-NEXT: pxor %xmm1, %xmm1
906 ; SSE2-NEXT: pcmpgtb %xmm5, %xmm1
907 ; SSE2-NEXT: movdqa %xmm1, %xmm5
908 ; SSE2-NEXT: pandn %xmm8, %xmm5
909 ; SSE2-NEXT: psrlw $1, %xmm8
910 ; SSE2-NEXT: pand %xmm7, %xmm1
911 ; SSE2-NEXT: pand %xmm8, %xmm1
912 ; SSE2-NEXT: por %xmm5, %xmm1
913 ; SSE2-NEXT: psllw $5, %xmm2
914 ; SSE2-NEXT: pxor %xmm5, %xmm5
915 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm5
916 ; SSE2-NEXT: pandn %xmm6, %xmm5
917 ; SSE2-NEXT: paddb %xmm2, %xmm2
918 ; SSE2-NEXT: pxor %xmm8, %xmm8
919 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm8
920 ; SSE2-NEXT: pandn %xmm5, %xmm8
921 ; SSE2-NEXT: paddb %xmm2, %xmm2
922 ; SSE2-NEXT: pxor %xmm5, %xmm5
923 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm5
924 ; SSE2-NEXT: movdqa %xmm5, %xmm2
925 ; SSE2-NEXT: pandn %xmm8, %xmm2
926 ; SSE2-NEXT: psrlw $1, %xmm8
927 ; SSE2-NEXT: pand %xmm7, %xmm5
928 ; SSE2-NEXT: pand %xmm8, %xmm5
929 ; SSE2-NEXT: por %xmm2, %xmm5
930 ; SSE2-NEXT: psllw $5, %xmm4
931 ; SSE2-NEXT: pxor %xmm2, %xmm2
932 ; SSE2-NEXT: pcmpgtb %xmm4, %xmm2
933 ; SSE2-NEXT: pandn %xmm6, %xmm2
934 ; SSE2-NEXT: paddb %xmm4, %xmm4
935 ; SSE2-NEXT: pxor %xmm6, %xmm6
936 ; SSE2-NEXT: pcmpgtb %xmm4, %xmm6
937 ; SSE2-NEXT: pandn %xmm2, %xmm6
938 ; SSE2-NEXT: paddb %xmm4, %xmm4
939 ; SSE2-NEXT: pcmpgtb %xmm4, %xmm3
940 ; SSE2-NEXT: movdqa %xmm3, %xmm2
941 ; SSE2-NEXT: pandn %xmm6, %xmm2
942 ; SSE2-NEXT: psrlw $1, %xmm6
943 ; SSE2-NEXT: pand %xmm7, %xmm3
944 ; SSE2-NEXT: pand %xmm6, %xmm3
945 ; SSE2-NEXT: por %xmm2, %xmm3
946 ; SSE2-NEXT: movdqa %xmm5, %xmm2
949 ; SSE41-LABEL: uniform_ashr_v64i8:
951 ; SSE41-NEXT: movd {{.*#+}} xmm4 = [2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
952 ; SSE41-NEXT: movdqa %xmm4, %xmm5
953 ; SSE41-NEXT: pshufb %xmm0, %xmm5
954 ; SSE41-NEXT: movdqa %xmm4, %xmm6
955 ; SSE41-NEXT: pshufb %xmm1, %xmm6
956 ; SSE41-NEXT: movdqa %xmm4, %xmm7
957 ; SSE41-NEXT: pshufb %xmm2, %xmm7
958 ; SSE41-NEXT: pshufb %xmm3, %xmm4
959 ; SSE41-NEXT: movdqa %xmm5, %xmm0
960 ; SSE41-NEXT: movdqa %xmm6, %xmm1
961 ; SSE41-NEXT: movdqa %xmm7, %xmm2
962 ; SSE41-NEXT: movdqa %xmm4, %xmm3
965 ; AVX1-LABEL: uniform_ashr_v64i8:
967 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
968 ; AVX1-NEXT: vmovd {{.*#+}} xmm3 = [2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
969 ; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2
970 ; AVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm0
971 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
972 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
973 ; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2
974 ; AVX1-NEXT: vpshufb %xmm1, %xmm3, %xmm1
975 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
978 ; AVX2-LABEL: uniform_ashr_v64i8:
980 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0]
981 ; AVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0
982 ; AVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1
985 ; XOPAVX1-LABEL: uniform_ashr_v64i8:
987 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
988 ; XOPAVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
989 ; XOPAVX1-NEXT: vpsubb %xmm2, %xmm3, %xmm2
990 ; XOPAVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
991 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm4, %xmm2
992 ; XOPAVX1-NEXT: vpsubb %xmm0, %xmm3, %xmm0
993 ; XOPAVX1-NEXT: vpshlb %xmm0, %xmm4, %xmm0
994 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
995 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
996 ; XOPAVX1-NEXT: vpsubb %xmm2, %xmm3, %xmm2
997 ; XOPAVX1-NEXT: vpshlb %xmm2, %xmm4, %xmm2
998 ; XOPAVX1-NEXT: vpsubb %xmm1, %xmm3, %xmm1
999 ; XOPAVX1-NEXT: vpshlb %xmm1, %xmm4, %xmm1
1000 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
1001 ; XOPAVX1-NEXT: retq
1003 ; XOPAVX2-LABEL: uniform_ashr_v64i8:
1005 ; XOPAVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0]
1006 ; XOPAVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0
1007 ; XOPAVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1
1008 ; XOPAVX2-NEXT: retq
1010 ; AVX512DQ-LABEL: uniform_ashr_v64i8:
1011 ; AVX512DQ: # %bb.0:
1012 ; AVX512DQ-NEXT: vextracti64x4 $1, %zmm0, %ymm1
1013 ; AVX512DQ-NEXT: vpbroadcastq {{.*#+}} ymm2 = [2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0]
1014 ; AVX512DQ-NEXT: vpshufb %ymm1, %ymm2, %ymm1
1015 ; AVX512DQ-NEXT: vpshufb %ymm0, %ymm2, %ymm0
1016 ; AVX512DQ-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0
1017 ; AVX512DQ-NEXT: retq
1019 ; AVX512BW-LABEL: uniform_ashr_v64i8:
1020 ; AVX512BW: # %bb.0:
1021 ; AVX512BW-NEXT: vpbroadcastq {{.*#+}} zmm1 = [2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,1,0,0,0,0,0,0]
1022 ; AVX512BW-NEXT: vpshufb %zmm0, %zmm1, %zmm0
1023 ; AVX512BW-NEXT: retq
1024 %shift = ashr <64 x i8> <i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>, %a
1025 ret <64 x i8> %shift
1028 ; Test where each 128-bit lane has a different value
1030 define <32 x i8> @perlane_shl_v32i8(<32 x i8> %a) nounwind {
1031 ; SSE2-LABEL: perlane_shl_v32i8:
1033 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1034 ; SSE2-NEXT: psllw $5, %xmm2
1035 ; SSE2-NEXT: pxor %xmm3, %xmm3
1036 ; SSE2-NEXT: pxor %xmm5, %xmm5
1037 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm5
1038 ; SSE2-NEXT: movdqa %xmm5, %xmm1
1039 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1040 ; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5
1041 ; SSE2-NEXT: por %xmm1, %xmm5
1042 ; SSE2-NEXT: paddb %xmm2, %xmm2
1043 ; SSE2-NEXT: pxor %xmm1, %xmm1
1044 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm1
1045 ; SSE2-NEXT: movdqa %xmm1, %xmm6
1046 ; SSE2-NEXT: pandn %xmm5, %xmm6
1047 ; SSE2-NEXT: psllw $2, %xmm5
1048 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
1049 ; SSE2-NEXT: pand %xmm4, %xmm1
1050 ; SSE2-NEXT: pand %xmm5, %xmm1
1051 ; SSE2-NEXT: por %xmm6, %xmm1
1052 ; SSE2-NEXT: paddb %xmm2, %xmm2
1053 ; SSE2-NEXT: pxor %xmm5, %xmm5
1054 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm5
1055 ; SSE2-NEXT: movdqa %xmm5, %xmm2
1056 ; SSE2-NEXT: pandn %xmm1, %xmm2
1057 ; SSE2-NEXT: paddb %xmm1, %xmm1
1058 ; SSE2-NEXT: pand %xmm5, %xmm1
1059 ; SSE2-NEXT: por %xmm2, %xmm1
1060 ; SSE2-NEXT: psllw $5, %xmm0
1061 ; SSE2-NEXT: pxor %xmm2, %xmm2
1062 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm2
1063 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
1064 ; SSE2-NEXT: pand %xmm2, %xmm5
1065 ; SSE2-NEXT: paddb %xmm2, %xmm5
1066 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2
1067 ; SSE2-NEXT: psubb %xmm2, %xmm5
1068 ; SSE2-NEXT: paddb %xmm0, %xmm0
1069 ; SSE2-NEXT: pxor %xmm2, %xmm2
1070 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm2
1071 ; SSE2-NEXT: movdqa %xmm2, %xmm6
1072 ; SSE2-NEXT: pandn %xmm5, %xmm6
1073 ; SSE2-NEXT: psllw $2, %xmm5
1074 ; SSE2-NEXT: pand %xmm4, %xmm2
1075 ; SSE2-NEXT: pand %xmm5, %xmm2
1076 ; SSE2-NEXT: por %xmm6, %xmm2
1077 ; SSE2-NEXT: paddb %xmm0, %xmm0
1078 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm3
1079 ; SSE2-NEXT: movdqa %xmm3, %xmm0
1080 ; SSE2-NEXT: pandn %xmm2, %xmm0
1081 ; SSE2-NEXT: paddb %xmm2, %xmm2
1082 ; SSE2-NEXT: pand %xmm3, %xmm2
1083 ; SSE2-NEXT: por %xmm0, %xmm2
1084 ; SSE2-NEXT: movdqa %xmm2, %xmm0
1087 ; SSE41-LABEL: perlane_shl_v32i8:
1089 ; SSE41-NEXT: movq {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0]
1090 ; SSE41-NEXT: pshufb %xmm0, %xmm2
1091 ; SSE41-NEXT: movq {{.*#+}} xmm3 = [2,4,8,16,32,64,128,0,0,0,0,0,0,0,0,0]
1092 ; SSE41-NEXT: pshufb %xmm1, %xmm3
1093 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1094 ; SSE41-NEXT: movdqa %xmm3, %xmm1
1097 ; AVX1-LABEL: perlane_shl_v32i8:
1099 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1100 ; AVX1-NEXT: vmovq {{.*#+}} xmm2 = [2,4,8,16,32,64,128,0,0,0,0,0,0,0,0,0]
1101 ; AVX1-NEXT: vpshufb %xmm1, %xmm2, %xmm1
1102 ; AVX1-NEXT: vmovq {{.*#+}} xmm2 = [1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0]
1103 ; AVX1-NEXT: vpshufb %xmm0, %xmm2, %xmm0
1104 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1107 ; AVX2-LABEL: perlane_shl_v32i8:
1109 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,u,u,u,u,u,u,u,u,2,4,8,16,32,64,128,0,u,u,u,u,u,u,u,u]
1110 ; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0
1113 ; XOPAVX1-LABEL: perlane_shl_v32i8:
1115 ; XOPAVX1-NEXT: vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1116 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1117 ; XOPAVX1-NEXT: vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1118 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1119 ; XOPAVX1-NEXT: retq
1121 ; XOPAVX2-LABEL: perlane_shl_v32i8:
1123 ; XOPAVX2-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,u,u,u,u,u,u,u,u,2,4,8,16,32,64,128,0,u,u,u,u,u,u,u,u]
1124 ; XOPAVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0
1125 ; XOPAVX2-NEXT: retq
1127 ; AVX512DQ-LABEL: perlane_shl_v32i8:
1128 ; AVX512DQ: # %bb.0:
1129 ; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,u,u,u,u,u,u,u,u,2,4,8,16,32,64,128,0,u,u,u,u,u,u,u,u]
1130 ; AVX512DQ-NEXT: vpshufb %ymm0, %ymm1, %ymm0
1131 ; AVX512DQ-NEXT: retq
1133 ; AVX512BW-LABEL: perlane_shl_v32i8:
1134 ; AVX512BW: # %bb.0:
1135 ; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm1 = [1,2,4,8,16,32,64,128,u,u,u,u,u,u,u,u,2,4,8,16,32,64,128,0,u,u,u,u,u,u,u,u]
1136 ; AVX512BW-NEXT: vpshufb %ymm0, %ymm1, %ymm0
1137 ; AVX512BW-NEXT: retq
1138 %shift = shl <32 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>, %a
1139 ret <32 x i8> %shift
1142 define <32 x i8> @perlane_lshr_v32i8(<32 x i8> %a) nounwind {
1143 ; SSE2-LABEL: perlane_lshr_v32i8:
1145 ; SSE2-NEXT: psllw $5, %xmm1
1146 ; SSE2-NEXT: pxor %xmm3, %xmm3
1147 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm3
1148 ; SSE2-NEXT: movdqa %xmm1, %xmm4
1149 ; SSE2-NEXT: paddb %xmm1, %xmm4
1150 ; SSE2-NEXT: pxor %xmm2, %xmm2
1151 ; SSE2-NEXT: pxor %xmm1, %xmm1
1152 ; SSE2-NEXT: pcmpgtb %xmm4, %xmm1
1153 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
1154 ; SSE2-NEXT: movdqa %xmm1, %xmm5
1155 ; SSE2-NEXT: pandn %xmm3, %xmm5
1156 ; SSE2-NEXT: psrlw $2, %xmm3
1157 ; SSE2-NEXT: pand %xmm1, %xmm3
1158 ; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
1159 ; SSE2-NEXT: por %xmm5, %xmm3
1160 ; SSE2-NEXT: paddb %xmm4, %xmm4
1161 ; SSE2-NEXT: pxor %xmm1, %xmm1
1162 ; SSE2-NEXT: pcmpgtb %xmm4, %xmm1
1163 ; SSE2-NEXT: movdqa %xmm1, %xmm4
1164 ; SSE2-NEXT: pandn %xmm3, %xmm4
1165 ; SSE2-NEXT: psrlw $1, %xmm3
1166 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
1167 ; SSE2-NEXT: pand %xmm5, %xmm1
1168 ; SSE2-NEXT: pand %xmm3, %xmm1
1169 ; SSE2-NEXT: por %xmm4, %xmm1
1170 ; SSE2-NEXT: psllw $5, %xmm0
1171 ; SSE2-NEXT: pxor %xmm3, %xmm3
1172 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm3
1173 ; SSE2-NEXT: paddb %xmm0, %xmm0
1174 ; SSE2-NEXT: pxor %xmm4, %xmm4
1175 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm4
1176 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
1177 ; SSE2-NEXT: pandn %xmm3, %xmm4
1178 ; SSE2-NEXT: paddb %xmm0, %xmm0
1179 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm2
1180 ; SSE2-NEXT: movdqa %xmm2, %xmm0
1181 ; SSE2-NEXT: pandn %xmm4, %xmm0
1182 ; SSE2-NEXT: psrlw $1, %xmm4
1183 ; SSE2-NEXT: pand %xmm5, %xmm2
1184 ; SSE2-NEXT: pand %xmm4, %xmm2
1185 ; SSE2-NEXT: por %xmm0, %xmm2
1186 ; SSE2-NEXT: movdqa %xmm2, %xmm0
1189 ; SSE41-LABEL: perlane_lshr_v32i8:
1191 ; SSE41-NEXT: movd {{.*#+}} xmm2 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
1192 ; SSE41-NEXT: pshufb %xmm0, %xmm2
1193 ; SSE41-NEXT: movd {{.*#+}} xmm3 = [4,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0]
1194 ; SSE41-NEXT: pshufb %xmm1, %xmm3
1195 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1196 ; SSE41-NEXT: movdqa %xmm3, %xmm1
1199 ; AVX1-LABEL: perlane_lshr_v32i8:
1201 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1202 ; AVX1-NEXT: vmovd {{.*#+}} xmm2 = [4,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0]
1203 ; AVX1-NEXT: vpshufb %xmm1, %xmm2, %xmm1
1204 ; AVX1-NEXT: vmovd {{.*#+}} xmm2 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
1205 ; AVX1-NEXT: vpshufb %xmm0, %xmm2, %xmm0
1206 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1209 ; AVX2-LABEL: perlane_lshr_v32i8:
1211 ; AVX2-NEXT: vpmovsxdq {{.*#+}} ymm1 = [259,0,66052,0]
1212 ; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0
1215 ; XOPAVX1-LABEL: perlane_lshr_v32i8:
1217 ; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
1218 ; XOPAVX1-NEXT: vpsubb %xmm0, %xmm1, %xmm2
1219 ; XOPAVX1-NEXT: vpshlb %xmm2, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
1220 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1221 ; XOPAVX1-NEXT: vpsubb %xmm0, %xmm1, %xmm0
1222 ; XOPAVX1-NEXT: vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1223 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
1224 ; XOPAVX1-NEXT: retq
1226 ; XOPAVX2-LABEL: perlane_lshr_v32i8:
1228 ; XOPAVX2-NEXT: vpmovsxdq {{.*#+}} ymm1 = [259,0,66052,0]
1229 ; XOPAVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0
1230 ; XOPAVX2-NEXT: retq
1232 ; AVX512DQ-LABEL: perlane_lshr_v32i8:
1233 ; AVX512DQ: # %bb.0:
1234 ; AVX512DQ-NEXT: vpmovsxdq {{.*#+}} ymm1 = [259,0,66052,0]
1235 ; AVX512DQ-NEXT: vpshufb %ymm0, %ymm1, %ymm0
1236 ; AVX512DQ-NEXT: retq
1238 ; AVX512BW-LABEL: perlane_lshr_v32i8:
1239 ; AVX512BW: # %bb.0:
1240 ; AVX512BW-NEXT: vpmovsxdq {{.*#+}} ymm1 = [259,0,66052,0]
1241 ; AVX512BW-NEXT: vpshufb %ymm0, %ymm1, %ymm0
1242 ; AVX512BW-NEXT: retq
1243 %shift = lshr <32 x i8> <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 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>, %a
1244 ret <32 x i8> %shift
1247 define <32 x i8> @perlane_ashr_v32i8(<32 x i8> %a) nounwind {
1248 ; SSE2-LABEL: perlane_ashr_v32i8:
1250 ; SSE2-NEXT: psllw $5, %xmm0
1251 ; SSE2-NEXT: pxor %xmm4, %xmm4
1252 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm4
1253 ; SSE2-NEXT: movdqa %xmm0, %xmm5
1254 ; SSE2-NEXT: paddb %xmm0, %xmm5
1255 ; SSE2-NEXT: pxor %xmm2, %xmm2
1256 ; SSE2-NEXT: pxor %xmm6, %xmm6
1257 ; SSE2-NEXT: pcmpgtb %xmm5, %xmm6
1258 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
1259 ; SSE2-NEXT: movdqa %xmm6, %xmm0
1260 ; SSE2-NEXT: pandn %xmm4, %xmm0
1261 ; SSE2-NEXT: psrlw $2, %xmm4
1262 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
1263 ; SSE2-NEXT: pand %xmm3, %xmm6
1264 ; SSE2-NEXT: pand %xmm4, %xmm6
1265 ; SSE2-NEXT: por %xmm0, %xmm6
1266 ; SSE2-NEXT: paddb %xmm5, %xmm5
1267 ; SSE2-NEXT: pxor %xmm0, %xmm0
1268 ; SSE2-NEXT: pcmpgtb %xmm5, %xmm0
1269 ; SSE2-NEXT: movdqa %xmm0, %xmm5
1270 ; SSE2-NEXT: pandn %xmm6, %xmm5
1271 ; SSE2-NEXT: psrlw $1, %xmm6
1272 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
1273 ; SSE2-NEXT: pand %xmm4, %xmm0
1274 ; SSE2-NEXT: pand %xmm6, %xmm0
1275 ; SSE2-NEXT: por %xmm5, %xmm0
1276 ; SSE2-NEXT: psllw $5, %xmm1
1277 ; SSE2-NEXT: pxor %xmm5, %xmm5
1278 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm5
1279 ; SSE2-NEXT: paddb %xmm1, %xmm1
1280 ; SSE2-NEXT: pxor %xmm6, %xmm6
1281 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm6
1282 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5
1283 ; SSE2-NEXT: movdqa %xmm6, %xmm7
1284 ; SSE2-NEXT: pandn %xmm5, %xmm7
1285 ; SSE2-NEXT: psrlw $2, %xmm5
1286 ; SSE2-NEXT: pand %xmm3, %xmm6
1287 ; SSE2-NEXT: pand %xmm5, %xmm6
1288 ; SSE2-NEXT: por %xmm7, %xmm6
1289 ; SSE2-NEXT: paddb %xmm1, %xmm1
1290 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm2
1291 ; SSE2-NEXT: movdqa %xmm2, %xmm1
1292 ; SSE2-NEXT: pandn %xmm6, %xmm1
1293 ; SSE2-NEXT: psrlw $1, %xmm6
1294 ; SSE2-NEXT: pand %xmm4, %xmm2
1295 ; SSE2-NEXT: pand %xmm6, %xmm2
1296 ; SSE2-NEXT: por %xmm1, %xmm2
1297 ; SSE2-NEXT: movdqa %xmm2, %xmm1
1300 ; SSE41-LABEL: perlane_ashr_v32i8:
1302 ; SSE41-NEXT: movd {{.*#+}} xmm2 = [5,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0]
1303 ; SSE41-NEXT: pshufb %xmm0, %xmm2
1304 ; SSE41-NEXT: movd {{.*#+}} xmm3 = [6,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0]
1305 ; SSE41-NEXT: pshufb %xmm1, %xmm3
1306 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1307 ; SSE41-NEXT: movdqa %xmm3, %xmm1
1310 ; AVX1-LABEL: perlane_ashr_v32i8:
1312 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1313 ; AVX1-NEXT: vmovd {{.*#+}} xmm2 = [6,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0]
1314 ; AVX1-NEXT: vpshufb %xmm1, %xmm2, %xmm1
1315 ; AVX1-NEXT: vmovd {{.*#+}} xmm2 = [5,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0]
1316 ; AVX1-NEXT: vpshufb %xmm0, %xmm2, %xmm0
1317 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1320 ; AVX2-LABEL: perlane_ashr_v32i8:
1322 ; AVX2-NEXT: vpmovsxdq {{.*#+}} ymm1 = [66053,0,66310,0]
1323 ; AVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0
1326 ; XOPAVX1-LABEL: perlane_ashr_v32i8:
1328 ; XOPAVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
1329 ; XOPAVX1-NEXT: vpsubb %xmm0, %xmm1, %xmm2
1330 ; XOPAVX1-NEXT: vpshlb %xmm2, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
1331 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1332 ; XOPAVX1-NEXT: vpsubb %xmm0, %xmm1, %xmm0
1333 ; XOPAVX1-NEXT: vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1334 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
1335 ; XOPAVX1-NEXT: retq
1337 ; XOPAVX2-LABEL: perlane_ashr_v32i8:
1339 ; XOPAVX2-NEXT: vpmovsxdq {{.*#+}} ymm1 = [66053,0,66310,0]
1340 ; XOPAVX2-NEXT: vpshufb %ymm0, %ymm1, %ymm0
1341 ; XOPAVX2-NEXT: retq
1343 ; AVX512DQ-LABEL: perlane_ashr_v32i8:
1344 ; AVX512DQ: # %bb.0:
1345 ; AVX512DQ-NEXT: vpmovsxdq {{.*#+}} ymm1 = [66053,0,66310,0]
1346 ; AVX512DQ-NEXT: vpshufb %ymm0, %ymm1, %ymm0
1347 ; AVX512DQ-NEXT: retq
1349 ; AVX512BW-LABEL: perlane_ashr_v32i8:
1350 ; AVX512BW: # %bb.0:
1351 ; AVX512BW-NEXT: vpmovsxdq {{.*#+}} ymm1 = [66053,0,66310,0]
1352 ; AVX512BW-NEXT: vpshufb %ymm0, %ymm1, %ymm0
1353 ; AVX512BW-NEXT: retq
1354 %shift = ashr <32 x i8> <i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6>, %a
1355 ret <32 x i8> %shift
1358 define <64 x i8> @perlane_shl_v64i8(<64 x i8> %a) nounwind {
1359 ; SSE2-LABEL: perlane_shl_v64i8:
1361 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1362 ; SSE2-NEXT: psllw $5, %xmm1
1363 ; SSE2-NEXT: pxor %xmm5, %xmm5
1364 ; SSE2-NEXT: pxor %xmm4, %xmm4
1365 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm4
1366 ; SSE2-NEXT: movdqa %xmm4, %xmm0
1367 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1368 ; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
1369 ; SSE2-NEXT: por %xmm0, %xmm4
1370 ; SSE2-NEXT: paddb %xmm1, %xmm1
1371 ; SSE2-NEXT: pxor %xmm0, %xmm0
1372 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm0
1373 ; SSE2-NEXT: movdqa %xmm0, %xmm7
1374 ; SSE2-NEXT: pandn %xmm4, %xmm7
1375 ; SSE2-NEXT: psllw $2, %xmm4
1376 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
1377 ; SSE2-NEXT: pand %xmm6, %xmm0
1378 ; SSE2-NEXT: pand %xmm4, %xmm0
1379 ; SSE2-NEXT: por %xmm7, %xmm0
1380 ; SSE2-NEXT: paddb %xmm1, %xmm1
1381 ; SSE2-NEXT: pxor %xmm4, %xmm4
1382 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm4
1383 ; SSE2-NEXT: movdqa %xmm4, %xmm1
1384 ; SSE2-NEXT: pandn %xmm0, %xmm1
1385 ; SSE2-NEXT: paddb %xmm0, %xmm0
1386 ; SSE2-NEXT: pand %xmm4, %xmm0
1387 ; SSE2-NEXT: por %xmm1, %xmm0
1388 ; SSE2-NEXT: psllw $5, %xmm3
1389 ; SSE2-NEXT: pxor %xmm1, %xmm1
1390 ; SSE2-NEXT: pcmpgtb %xmm3, %xmm1
1391 ; SSE2-NEXT: movdqa %xmm1, %xmm4
1392 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
1393 ; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1394 ; SSE2-NEXT: por %xmm4, %xmm1
1395 ; SSE2-NEXT: paddb %xmm3, %xmm3
1396 ; SSE2-NEXT: pxor %xmm4, %xmm4
1397 ; SSE2-NEXT: pcmpgtb %xmm3, %xmm4
1398 ; SSE2-NEXT: movdqa %xmm4, %xmm7
1399 ; SSE2-NEXT: pandn %xmm1, %xmm7
1400 ; SSE2-NEXT: psllw $2, %xmm1
1401 ; SSE2-NEXT: pand %xmm6, %xmm4
1402 ; SSE2-NEXT: pand %xmm1, %xmm4
1403 ; SSE2-NEXT: por %xmm7, %xmm4
1404 ; SSE2-NEXT: paddb %xmm3, %xmm3
1405 ; SSE2-NEXT: pxor %xmm1, %xmm1
1406 ; SSE2-NEXT: pcmpgtb %xmm3, %xmm1
1407 ; SSE2-NEXT: movdqa %xmm1, %xmm3
1408 ; SSE2-NEXT: pandn %xmm4, %xmm3
1409 ; SSE2-NEXT: paddb %xmm4, %xmm4
1410 ; SSE2-NEXT: pand %xmm1, %xmm4
1411 ; SSE2-NEXT: por %xmm3, %xmm4
1412 ; SSE2-NEXT: psllw $5, %xmm2
1413 ; SSE2-NEXT: pxor %xmm1, %xmm1
1414 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm1
1415 ; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
1416 ; SSE2-NEXT: pand %xmm1, %xmm7
1417 ; SSE2-NEXT: paddb %xmm1, %xmm7
1418 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
1419 ; SSE2-NEXT: psubb %xmm1, %xmm7
1420 ; SSE2-NEXT: paddb %xmm2, %xmm2
1421 ; SSE2-NEXT: pxor %xmm3, %xmm3
1422 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm3
1423 ; SSE2-NEXT: movdqa %xmm3, %xmm1
1424 ; SSE2-NEXT: pandn %xmm7, %xmm1
1425 ; SSE2-NEXT: psllw $2, %xmm7
1426 ; SSE2-NEXT: pand %xmm6, %xmm3
1427 ; SSE2-NEXT: pand %xmm7, %xmm3
1428 ; SSE2-NEXT: por %xmm1, %xmm3
1429 ; SSE2-NEXT: paddb %xmm2, %xmm2
1430 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm5
1431 ; SSE2-NEXT: movdqa %xmm5, %xmm1
1432 ; SSE2-NEXT: pandn %xmm3, %xmm1
1433 ; SSE2-NEXT: paddb %xmm3, %xmm3
1434 ; SSE2-NEXT: pand %xmm5, %xmm3
1435 ; SSE2-NEXT: por %xmm1, %xmm3
1436 ; SSE2-NEXT: pxor %xmm1, %xmm1
1437 ; SSE2-NEXT: movdqa %xmm3, %xmm2
1438 ; SSE2-NEXT: movdqa %xmm4, %xmm3
1441 ; SSE41-LABEL: perlane_shl_v64i8:
1443 ; SSE41-NEXT: movq {{.*#+}} xmm4 = [7,14,28,56,112,224,192,128,0,0,0,0,0,0,0,0]
1444 ; SSE41-NEXT: pshufb %xmm0, %xmm4
1445 ; SSE41-NEXT: movq {{.*#+}} xmm5 = [1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0]
1446 ; SSE41-NEXT: pshufb %xmm2, %xmm5
1447 ; SSE41-NEXT: movq {{.*#+}} xmm6 = [2,4,8,16,32,64,128,0,0,0,0,0,0,0,0,0]
1448 ; SSE41-NEXT: pshufb %xmm3, %xmm6
1449 ; SSE41-NEXT: xorps %xmm1, %xmm1
1450 ; SSE41-NEXT: movdqa %xmm4, %xmm0
1451 ; SSE41-NEXT: movdqa %xmm5, %xmm2
1452 ; SSE41-NEXT: movdqa %xmm6, %xmm3
1455 ; AVX1-LABEL: perlane_shl_v64i8:
1457 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1458 ; AVX1-NEXT: vmovq {{.*#+}} xmm3 = [2,4,8,16,32,64,128,0,0,0,0,0,0,0,0,0]
1459 ; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2
1460 ; AVX1-NEXT: vmovq {{.*#+}} xmm3 = [1,2,4,8,16,32,64,128,0,0,0,0,0,0,0,0]
1461 ; AVX1-NEXT: vpshufb %xmm1, %xmm3, %xmm1
1462 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
1463 ; AVX1-NEXT: vmovq {{.*#+}} xmm2 = [7,14,28,56,112,224,192,128,0,0,0,0,0,0,0,0]
1464 ; AVX1-NEXT: vpshufb %xmm0, %xmm2, %xmm0
1467 ; AVX2-LABEL: perlane_shl_v64i8:
1469 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [7,14,28,56,112,224,192,128,u,u,u,u,u,u,u,u,0,0,0,0,0,0,0,0,u,u,u,u,u,u,u,u]
1470 ; AVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0
1471 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,u,u,u,u,u,u,u,u,2,4,8,16,32,64,128,0,u,u,u,u,u,u,u,u]
1472 ; AVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1
1475 ; XOPAVX1-LABEL: perlane_shl_v64i8:
1477 ; XOPAVX1-NEXT: vpshlb %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
1478 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
1479 ; XOPAVX1-NEXT: vpshlb %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1480 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
1481 ; XOPAVX1-NEXT: vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1482 ; XOPAVX1-NEXT: retq
1484 ; XOPAVX2-LABEL: perlane_shl_v64i8:
1486 ; XOPAVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [7,14,28,56,112,224,192,128,u,u,u,u,u,u,u,u,0,0,0,0,0,0,0,0,u,u,u,u,u,u,u,u]
1487 ; XOPAVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0
1488 ; XOPAVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,u,u,u,u,u,u,u,u,2,4,8,16,32,64,128,0,u,u,u,u,u,u,u,u]
1489 ; XOPAVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1
1490 ; XOPAVX2-NEXT: retq
1492 ; AVX512DQ-LABEL: perlane_shl_v64i8:
1493 ; AVX512DQ: # %bb.0:
1494 ; AVX512DQ-NEXT: vextracti64x4 $1, %zmm0, %ymm1
1495 ; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm2 = [1,2,4,8,16,32,64,128,u,u,u,u,u,u,u,u,2,4,8,16,32,64,128,0,u,u,u,u,u,u,u,u]
1496 ; AVX512DQ-NEXT: vpshufb %ymm1, %ymm2, %ymm1
1497 ; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm2 = [7,14,28,56,112,224,192,128,u,u,u,u,u,u,u,u,0,0,0,0,0,0,0,0,u,u,u,u,u,u,u,u]
1498 ; AVX512DQ-NEXT: vpshufb %ymm0, %ymm2, %ymm0
1499 ; AVX512DQ-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0
1500 ; AVX512DQ-NEXT: retq
1502 ; AVX512BW-LABEL: perlane_shl_v64i8:
1503 ; AVX512BW: # %bb.0:
1504 ; AVX512BW-NEXT: vmovdqa64 {{.*#+}} zmm1 = [7,14,28,56,112,224,192,128,u,u,u,u,u,u,u,u,0,0,0,0,0,0,0,0,u,u,u,u,u,u,u,u,1,2,4,8,16,32,64,128,u,u,u,u,u,u,u,u,2,4,8,16,32,64,128,0,u,u,u,u,u,u,u,u]
1505 ; AVX512BW-NEXT: vpshufb %zmm0, %zmm1, %zmm0
1506 ; AVX512BW-NEXT: retq
1507 %shift = shl <64 x i8> <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2>, %a
1508 ret <64 x i8> %shift
1511 define <64 x i8> @perlane_lshr_v64i8(<64 x i8> %a) nounwind {
1512 ; SSE2-LABEL: perlane_lshr_v64i8:
1514 ; SSE2-NEXT: movdqa %xmm2, %xmm5
1515 ; SSE2-NEXT: psllw $5, %xmm1
1516 ; SSE2-NEXT: pxor %xmm2, %xmm2
1517 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm2
1518 ; SSE2-NEXT: movdqa %xmm1, %xmm6
1519 ; SSE2-NEXT: paddb %xmm1, %xmm6
1520 ; SSE2-NEXT: pxor %xmm4, %xmm4
1521 ; SSE2-NEXT: pxor %xmm8, %xmm8
1522 ; SSE2-NEXT: pcmpgtb %xmm6, %xmm8
1523 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
1524 ; SSE2-NEXT: movdqa %xmm8, %xmm1
1525 ; SSE2-NEXT: pandn %xmm2, %xmm1
1526 ; SSE2-NEXT: psrlw $2, %xmm2
1527 ; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
1528 ; SSE2-NEXT: pand %xmm7, %xmm8
1529 ; SSE2-NEXT: pand %xmm2, %xmm8
1530 ; SSE2-NEXT: por %xmm1, %xmm8
1531 ; SSE2-NEXT: paddb %xmm6, %xmm6
1532 ; SSE2-NEXT: pxor %xmm1, %xmm1
1533 ; SSE2-NEXT: pcmpgtb %xmm6, %xmm1
1534 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1535 ; SSE2-NEXT: pandn %xmm8, %xmm2
1536 ; SSE2-NEXT: psrlw $1, %xmm8
1537 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
1538 ; SSE2-NEXT: pand %xmm6, %xmm1
1539 ; SSE2-NEXT: pand %xmm8, %xmm1
1540 ; SSE2-NEXT: por %xmm2, %xmm1
1541 ; SSE2-NEXT: psllw $5, %xmm5
1542 ; SSE2-NEXT: pxor %xmm2, %xmm2
1543 ; SSE2-NEXT: pcmpgtb %xmm5, %xmm2
1544 ; SSE2-NEXT: paddb %xmm5, %xmm5
1545 ; SSE2-NEXT: pxor %xmm8, %xmm8
1546 ; SSE2-NEXT: pcmpgtb %xmm5, %xmm8
1547 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
1548 ; SSE2-NEXT: movdqa %xmm8, %xmm9
1549 ; SSE2-NEXT: pandn %xmm2, %xmm9
1550 ; SSE2-NEXT: psrlw $2, %xmm2
1551 ; SSE2-NEXT: pand %xmm7, %xmm8
1552 ; SSE2-NEXT: pand %xmm2, %xmm8
1553 ; SSE2-NEXT: por %xmm9, %xmm8
1554 ; SSE2-NEXT: paddb %xmm5, %xmm5
1555 ; SSE2-NEXT: pxor %xmm2, %xmm2
1556 ; SSE2-NEXT: pcmpgtb %xmm5, %xmm2
1557 ; SSE2-NEXT: movdqa %xmm2, %xmm5
1558 ; SSE2-NEXT: pandn %xmm8, %xmm5
1559 ; SSE2-NEXT: psrlw $1, %xmm8
1560 ; SSE2-NEXT: pand %xmm6, %xmm2
1561 ; SSE2-NEXT: pand %xmm8, %xmm2
1562 ; SSE2-NEXT: por %xmm5, %xmm2
1563 ; SSE2-NEXT: psllw $5, %xmm3
1564 ; SSE2-NEXT: pxor %xmm5, %xmm5
1565 ; SSE2-NEXT: pcmpgtb %xmm3, %xmm5
1566 ; SSE2-NEXT: paddb %xmm3, %xmm3
1567 ; SSE2-NEXT: pxor %xmm8, %xmm8
1568 ; SSE2-NEXT: pcmpgtb %xmm3, %xmm8
1569 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5
1570 ; SSE2-NEXT: movdqa %xmm8, %xmm9
1571 ; SSE2-NEXT: pandn %xmm5, %xmm9
1572 ; SSE2-NEXT: psrlw $2, %xmm5
1573 ; SSE2-NEXT: pand %xmm7, %xmm8
1574 ; SSE2-NEXT: pand %xmm5, %xmm8
1575 ; SSE2-NEXT: por %xmm9, %xmm8
1576 ; SSE2-NEXT: paddb %xmm3, %xmm3
1577 ; SSE2-NEXT: pxor %xmm5, %xmm5
1578 ; SSE2-NEXT: pcmpgtb %xmm3, %xmm5
1579 ; SSE2-NEXT: movdqa %xmm5, %xmm3
1580 ; SSE2-NEXT: pandn %xmm8, %xmm3
1581 ; SSE2-NEXT: psrlw $1, %xmm8
1582 ; SSE2-NEXT: pand %xmm6, %xmm5
1583 ; SSE2-NEXT: pand %xmm8, %xmm5
1584 ; SSE2-NEXT: por %xmm3, %xmm5
1585 ; SSE2-NEXT: psllw $5, %xmm0
1586 ; SSE2-NEXT: pxor %xmm3, %xmm3
1587 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm3
1588 ; SSE2-NEXT: paddb %xmm0, %xmm0
1589 ; SSE2-NEXT: pxor %xmm7, %xmm7
1590 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm7
1591 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
1592 ; SSE2-NEXT: pandn %xmm3, %xmm7
1593 ; SSE2-NEXT: paddb %xmm0, %xmm0
1594 ; SSE2-NEXT: pcmpgtb %xmm0, %xmm4
1595 ; SSE2-NEXT: movdqa %xmm4, %xmm0
1596 ; SSE2-NEXT: pandn %xmm7, %xmm0
1597 ; SSE2-NEXT: psrlw $1, %xmm7
1598 ; SSE2-NEXT: pand %xmm6, %xmm4
1599 ; SSE2-NEXT: pand %xmm7, %xmm4
1600 ; SSE2-NEXT: por %xmm0, %xmm4
1601 ; SSE2-NEXT: movdqa %xmm4, %xmm0
1602 ; SSE2-NEXT: movdqa %xmm5, %xmm3
1605 ; SSE41-LABEL: perlane_lshr_v64i8:
1607 ; SSE41-NEXT: movd {{.*#+}} xmm4 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
1608 ; SSE41-NEXT: pshufb %xmm0, %xmm4
1609 ; SSE41-NEXT: movd {{.*#+}} xmm5 = [4,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0]
1610 ; SSE41-NEXT: pshufb %xmm1, %xmm5
1611 ; SSE41-NEXT: movd {{.*#+}} xmm6 = [5,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0]
1612 ; SSE41-NEXT: pshufb %xmm2, %xmm6
1613 ; SSE41-NEXT: movd {{.*#+}} xmm7 = [6,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0]
1614 ; SSE41-NEXT: pshufb %xmm3, %xmm7
1615 ; SSE41-NEXT: movdqa %xmm4, %xmm0
1616 ; SSE41-NEXT: movdqa %xmm5, %xmm1
1617 ; SSE41-NEXT: movdqa %xmm6, %xmm2
1618 ; SSE41-NEXT: movdqa %xmm7, %xmm3
1621 ; AVX1-LABEL: perlane_lshr_v64i8:
1623 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
1624 ; AVX1-NEXT: vmovd {{.*#+}} xmm3 = [4,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0]
1625 ; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2
1626 ; AVX1-NEXT: vmovd {{.*#+}} xmm3 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
1627 ; AVX1-NEXT: vpshufb %xmm0, %xmm3, %xmm0
1628 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1629 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1630 ; AVX1-NEXT: vmovd {{.*#+}} xmm3 = [6,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0]
1631 ; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2
1632 ; AVX1-NEXT: vmovd {{.*#+}} xmm3 = [5,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0]
1633 ; AVX1-NEXT: vpshufb %xmm1, %xmm3, %xmm1
1634 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
1637 ; AVX2-LABEL: perlane_lshr_v64i8:
1639 ; AVX2-NEXT: vpmovsxdq {{.*#+}} ymm2 = [259,0,66052,0]
1640 ; AVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0
1641 ; AVX2-NEXT: vpmovsxdq {{.*#+}} ymm2 = [66053,0,66310,0]
1642 ; AVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1
1645 ; XOPAVX1-LABEL: perlane_lshr_v64i8:
1647 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
1648 ; XOPAVX1-NEXT: vpsubb %xmm0, %xmm2, %xmm3
1649 ; XOPAVX1-NEXT: vpshlb %xmm3, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
1650 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1651 ; XOPAVX1-NEXT: vpsubb %xmm0, %xmm2, %xmm0
1652 ; XOPAVX1-NEXT: vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1653 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm3, %ymm0
1654 ; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm3
1655 ; XOPAVX1-NEXT: vpshlb %xmm3, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
1656 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
1657 ; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm1
1658 ; XOPAVX1-NEXT: vpshlb %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1659 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm1
1660 ; XOPAVX1-NEXT: retq
1662 ; XOPAVX2-LABEL: perlane_lshr_v64i8:
1664 ; XOPAVX2-NEXT: vpmovsxdq {{.*#+}} ymm2 = [259,0,66052,0]
1665 ; XOPAVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0
1666 ; XOPAVX2-NEXT: vpmovsxdq {{.*#+}} ymm2 = [66053,0,66310,0]
1667 ; XOPAVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1
1668 ; XOPAVX2-NEXT: retq
1670 ; AVX512DQ-LABEL: perlane_lshr_v64i8:
1671 ; AVX512DQ: # %bb.0:
1672 ; AVX512DQ-NEXT: vextracti64x4 $1, %zmm0, %ymm1
1673 ; AVX512DQ-NEXT: vpmovsxdq {{.*#+}} ymm2 = [66053,0,66310,0]
1674 ; AVX512DQ-NEXT: vpshufb %ymm1, %ymm2, %ymm1
1675 ; AVX512DQ-NEXT: vpmovsxdq {{.*#+}} ymm2 = [259,0,66052,0]
1676 ; AVX512DQ-NEXT: vpshufb %ymm0, %ymm2, %ymm0
1677 ; AVX512DQ-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0
1678 ; AVX512DQ-NEXT: retq
1680 ; AVX512BW-LABEL: perlane_lshr_v64i8:
1681 ; AVX512BW: # %bb.0:
1682 ; AVX512BW-NEXT: vpmovsxdq {{.*#+}} zmm1 = [259,0,66052,0,66053,0,66310,0]
1683 ; AVX512BW-NEXT: vpshufb %zmm0, %zmm1, %zmm0
1684 ; AVX512BW-NEXT: retq
1685 %shift = lshr <64 x i8> <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 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 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6, i8 6>, %a
1686 ret <64 x i8> %shift
1689 define <64 x i8> @perlane_ashr_v64i8(<64 x i8> %a) nounwind {
1690 ; SSE2-LABEL: perlane_ashr_v64i8:
1692 ; SSE2-NEXT: psllw $5, %xmm1
1693 ; SSE2-NEXT: pxor %xmm0, %xmm0
1694 ; SSE2-NEXT: pcmpgtb %xmm1, %xmm0
1695 ; SSE2-NEXT: movdqa %xmm1, %xmm5
1696 ; SSE2-NEXT: paddb %xmm1, %xmm5
1697 ; SSE2-NEXT: pxor %xmm4, %xmm4
1698 ; SSE2-NEXT: pxor %xmm6, %xmm6
1699 ; SSE2-NEXT: pcmpgtb %xmm5, %xmm6
1700 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1701 ; SSE2-NEXT: pandn %xmm0, %xmm6
1702 ; SSE2-NEXT: paddb %xmm5, %xmm5
1703 ; SSE2-NEXT: pxor %xmm1, %xmm1
1704 ; SSE2-NEXT: pcmpgtb %xmm5, %xmm1
1705 ; SSE2-NEXT: movdqa %xmm1, %xmm5
1706 ; SSE2-NEXT: pandn %xmm6, %xmm5
1707 ; SSE2-NEXT: psrlw $1, %xmm6
1708 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
1709 ; SSE2-NEXT: pand %xmm0, %xmm1
1710 ; SSE2-NEXT: pand %xmm6, %xmm1
1711 ; SSE2-NEXT: por %xmm5, %xmm1
1712 ; SSE2-NEXT: psllw $5, %xmm2
1713 ; SSE2-NEXT: pxor %xmm5, %xmm5
1714 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm5
1715 ; SSE2-NEXT: paddb %xmm2, %xmm2
1716 ; SSE2-NEXT: pxor %xmm6, %xmm6
1717 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm6
1718 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5
1719 ; SSE2-NEXT: pandn %xmm5, %xmm6
1720 ; SSE2-NEXT: paddb %xmm2, %xmm2
1721 ; SSE2-NEXT: pxor %xmm5, %xmm5
1722 ; SSE2-NEXT: pcmpgtb %xmm2, %xmm5
1723 ; SSE2-NEXT: movdqa %xmm5, %xmm2
1724 ; SSE2-NEXT: pandn %xmm6, %xmm2
1725 ; SSE2-NEXT: psrlw $1, %xmm6
1726 ; SSE2-NEXT: pand %xmm0, %xmm5
1727 ; SSE2-NEXT: pand %xmm6, %xmm5
1728 ; SSE2-NEXT: por %xmm2, %xmm5
1729 ; SSE2-NEXT: psllw $5, %xmm3
1730 ; SSE2-NEXT: pxor %xmm2, %xmm2
1731 ; SSE2-NEXT: pcmpgtb %xmm3, %xmm2
1732 ; SSE2-NEXT: paddb %xmm3, %xmm3
1733 ; SSE2-NEXT: pxor %xmm6, %xmm6
1734 ; SSE2-NEXT: pcmpgtb %xmm3, %xmm6
1735 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
1736 ; SSE2-NEXT: pandn %xmm2, %xmm6
1737 ; SSE2-NEXT: paddb %xmm3, %xmm3
1738 ; SSE2-NEXT: pcmpgtb %xmm3, %xmm4
1739 ; SSE2-NEXT: movdqa %xmm4, %xmm2
1740 ; SSE2-NEXT: pandn %xmm6, %xmm2
1741 ; SSE2-NEXT: psrlw $1, %xmm6
1742 ; SSE2-NEXT: pand %xmm0, %xmm4
1743 ; SSE2-NEXT: pand %xmm6, %xmm4
1744 ; SSE2-NEXT: por %xmm2, %xmm4
1745 ; SSE2-NEXT: pxor %xmm0, %xmm0
1746 ; SSE2-NEXT: movdqa %xmm5, %xmm2
1747 ; SSE2-NEXT: movdqa %xmm4, %xmm3
1750 ; SSE41-LABEL: perlane_ashr_v64i8:
1752 ; SSE41-NEXT: pmovsxbq {{.*#+}} xmm4 = [1,0]
1753 ; SSE41-NEXT: pshufb %xmm1, %xmm4
1754 ; SSE41-NEXT: movd {{.*#+}} xmm5 = [2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
1755 ; SSE41-NEXT: pshufb %xmm2, %xmm5
1756 ; SSE41-NEXT: movd {{.*#+}} xmm6 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
1757 ; SSE41-NEXT: pshufb %xmm3, %xmm6
1758 ; SSE41-NEXT: xorps %xmm0, %xmm0
1759 ; SSE41-NEXT: movdqa %xmm4, %xmm1
1760 ; SSE41-NEXT: movdqa %xmm5, %xmm2
1761 ; SSE41-NEXT: movdqa %xmm6, %xmm3
1764 ; AVX1-LABEL: perlane_ashr_v64i8:
1766 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1767 ; AVX1-NEXT: vmovd {{.*#+}} xmm3 = [3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
1768 ; AVX1-NEXT: vpshufb %xmm2, %xmm3, %xmm2
1769 ; AVX1-NEXT: vmovd {{.*#+}} xmm3 = [2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
1770 ; AVX1-NEXT: vpshufb %xmm1, %xmm3, %xmm1
1771 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
1772 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1773 ; AVX1-NEXT: vpmovsxbq {{.*#+}} xmm2 = [1,0]
1774 ; AVX1-NEXT: vpshufb %xmm0, %xmm2, %xmm0
1775 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
1776 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
1779 ; AVX2-LABEL: perlane_ashr_v64i8:
1781 ; AVX2-NEXT: vpmovsxbq {{.*#+}} ymm2 = [0,0,1,0]
1782 ; AVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0
1783 ; AVX2-NEXT: vpmovsxwq {{.*#+}} ymm2 = [258,0,259,0]
1784 ; AVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1
1787 ; XOPAVX1-LABEL: perlane_ashr_v64i8:
1789 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
1790 ; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm3
1791 ; XOPAVX1-NEXT: vpshlb %xmm3, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
1792 ; XOPAVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
1793 ; XOPAVX1-NEXT: vpsubb %xmm1, %xmm2, %xmm1
1794 ; XOPAVX1-NEXT: vpshlb %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1795 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm1, %ymm3, %ymm1
1796 ; XOPAVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1797 ; XOPAVX1-NEXT: vpsubb %xmm0, %xmm2, %xmm0
1798 ; XOPAVX1-NEXT: vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1799 ; XOPAVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
1800 ; XOPAVX1-NEXT: vinsertf128 $1, %xmm0, %ymm2, %ymm0
1801 ; XOPAVX1-NEXT: retq
1803 ; XOPAVX2-LABEL: perlane_ashr_v64i8:
1805 ; XOPAVX2-NEXT: vpmovsxbq {{.*#+}} ymm2 = [0,0,1,0]
1806 ; XOPAVX2-NEXT: vpshufb %ymm0, %ymm2, %ymm0
1807 ; XOPAVX2-NEXT: vpmovsxwq {{.*#+}} ymm2 = [258,0,259,0]
1808 ; XOPAVX2-NEXT: vpshufb %ymm1, %ymm2, %ymm1
1809 ; XOPAVX2-NEXT: retq
1811 ; AVX512DQ-LABEL: perlane_ashr_v64i8:
1812 ; AVX512DQ: # %bb.0:
1813 ; AVX512DQ-NEXT: vextracti64x4 $1, %zmm0, %ymm1
1814 ; AVX512DQ-NEXT: vpmovsxwq {{.*#+}} ymm2 = [258,0,259,0]
1815 ; AVX512DQ-NEXT: vpshufb %ymm1, %ymm2, %ymm1
1816 ; AVX512DQ-NEXT: vpmovsxbq {{.*#+}} ymm2 = [0,0,1,0]
1817 ; AVX512DQ-NEXT: vpshufb %ymm0, %ymm2, %ymm0
1818 ; AVX512DQ-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0
1819 ; AVX512DQ-NEXT: retq
1821 ; AVX512BW-LABEL: perlane_ashr_v64i8:
1822 ; AVX512BW: # %bb.0:
1823 ; AVX512BW-NEXT: vpmovsxwq {{.*#+}} zmm1 = [0,0,1,0,258,0,259,0]
1824 ; AVX512BW-NEXT: vpshufb %zmm0, %zmm1, %zmm0
1825 ; AVX512BW-NEXT: retq
1826 %shift = ashr <64 x i8> <i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, i8 2, 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>, %a
1827 ret <64 x i8> %shift
1830 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: