xref: /llvm-project/llvm/test/CodeGen/X86/vector-shift-lut.ll (revision ccb9835edb4612f73abc9f13880ea671117347ce)
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
10
11; Shifts of uniform vXi8 constant values can be performed by a PSHUFB LUT
12
13define <16 x i8> @uniform_shl_v16i8(<16 x i8> %a) nounwind {
14; SSE2-LABEL: uniform_shl_v16i8:
15; SSE2:       # %bb.0:
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
42; SSE2-NEXT:    retq
43;
44; SSE41-LABEL: uniform_shl_v16i8:
45; SSE41:       # %bb.0:
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
49; SSE41-NEXT:    retq
50;
51; AVX-LABEL: uniform_shl_v16i8:
52; AVX:       # %bb.0:
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
55; AVX-NEXT:    retq
56;
57; XOP-LABEL: uniform_shl_v16i8:
58; XOP:       # %bb.0:
59; XOP-NEXT:    vpshlb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
60; XOP-NEXT:    retq
61;
62; AVX512DQ-LABEL: uniform_shl_v16i8:
63; AVX512DQ:       # %bb.0:
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
66; AVX512DQ-NEXT:    retq
67;
68; AVX512BW-LABEL: uniform_shl_v16i8:
69; AVX512BW:       # %bb.0:
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
72; AVX512BW-NEXT:    retq
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
74  ret <16 x i8> %shift
75}
76
77define <16 x i8> @uniform_lshr_v16i8(<16 x i8> %a) nounwind {
78; SSE2-LABEL: uniform_lshr_v16i8:
79; SSE2:       # %bb.0:
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
98; SSE2-NEXT:    retq
99;
100; SSE41-LABEL: uniform_lshr_v16i8:
101; SSE41:       # %bb.0:
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
105; SSE41-NEXT:    retq
106;
107; AVX-LABEL: uniform_lshr_v16i8:
108; AVX:       # %bb.0:
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
111; AVX-NEXT:    retq
112;
113; XOP-LABEL: uniform_lshr_v16i8:
114; XOP:       # %bb.0:
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
118; XOP-NEXT:    retq
119;
120; AVX512DQ-LABEL: uniform_lshr_v16i8:
121; AVX512DQ:       # %bb.0:
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
125;
126; AVX512BW-LABEL: uniform_lshr_v16i8:
127; AVX512BW:       # %bb.0:
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
132  ret <16 x i8> %shift
133}
134
135define <16 x i8> @uniform_ashr_v16i8(<16 x i8> %a) nounwind {
136; SSE2-LABEL: uniform_ashr_v16i8:
137; SSE2:       # %bb.0:
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
156; SSE2-NEXT:    retq
157;
158; SSE41-LABEL: uniform_ashr_v16i8:
159; SSE41:       # %bb.0:
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
163; SSE41-NEXT:    retq
164;
165; AVX-LABEL: uniform_ashr_v16i8:
166; AVX:       # %bb.0:
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
169; AVX-NEXT:    retq
170;
171; XOP-LABEL: uniform_ashr_v16i8:
172; XOP:       # %bb.0:
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
176; XOP-NEXT:    retq
177;
178; AVX512DQ-LABEL: uniform_ashr_v16i8:
179; AVX512DQ:       # %bb.0:
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
183;
184; AVX512BW-LABEL: uniform_ashr_v16i8:
185; AVX512BW:       # %bb.0:
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
190  ret <16 x i8> %shift
191}
192
193define <32 x i8> @uniform_shl_v32i8(<32 x i8> %a) nounwind {
194; SSE2-LABEL: uniform_shl_v32i8:
195; SSE2:       # %bb.0:
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
249; SSE2-NEXT:    retq
250;
251; SSE41-LABEL: uniform_shl_v32i8:
252; SSE41:       # %bb.0:
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
259; SSE41-NEXT:    retq
260;
261; AVX1-LABEL: uniform_shl_v32i8:
262; AVX1:       # %bb.0:
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
268; AVX1-NEXT:    retq
269;
270; AVX2-LABEL: uniform_shl_v32i8:
271; AVX2:       # %bb.0:
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
274; AVX2-NEXT:    retq
275;
276; XOPAVX1-LABEL: uniform_shl_v32i8:
277; XOPAVX1:       # %bb.0:
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
283; XOPAVX1-NEXT:    retq
284;
285; XOPAVX2-LABEL: uniform_shl_v32i8:
286; XOPAVX2:       # %bb.0:
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
289; XOPAVX2-NEXT:    retq
290;
291; AVX512DQ-LABEL: uniform_shl_v32i8:
292; AVX512DQ:       # %bb.0:
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
296;
297; AVX512BW-LABEL: uniform_shl_v32i8:
298; AVX512BW:       # %bb.0:
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
303  ret <32 x i8> %shift
304}
305
306define <32 x i8> @uniform_lshr_v32i8(<32 x i8> %a) nounwind {
307; SSE2-LABEL: uniform_lshr_v32i8:
308; SSE2:       # %bb.0:
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
358; SSE2-NEXT:    retq
359;
360; SSE41-LABEL: uniform_lshr_v32i8:
361; SSE41:       # %bb.0:
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
368; SSE41-NEXT:    retq
369;
370; AVX1-LABEL: uniform_lshr_v32i8:
371; AVX1:       # %bb.0:
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
377; AVX1-NEXT:    retq
378;
379; AVX2-LABEL: uniform_lshr_v32i8:
380; AVX2:       # %bb.0:
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
383; AVX2-NEXT:    retq
384;
385; XOPAVX1-LABEL: uniform_lshr_v32i8:
386; XOPAVX1:       # %bb.0:
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
395; XOPAVX1-NEXT:    retq
396;
397; XOPAVX2-LABEL: uniform_lshr_v32i8:
398; XOPAVX2:       # %bb.0:
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
401; XOPAVX2-NEXT:    retq
402;
403; AVX512DQ-LABEL: uniform_lshr_v32i8:
404; AVX512DQ:       # %bb.0:
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
408;
409; AVX512BW-LABEL: uniform_lshr_v32i8:
410; AVX512BW:       # %bb.0:
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
415  ret <32 x i8> %shift
416}
417
418define <32 x i8> @uniform_ashr_v32i8(<32 x i8> %a) nounwind {
419; SSE2-LABEL: uniform_ashr_v32i8:
420; SSE2:       # %bb.0:
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
470; SSE2-NEXT:    retq
471;
472; SSE41-LABEL: uniform_ashr_v32i8:
473; SSE41:       # %bb.0:
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
480; SSE41-NEXT:    retq
481;
482; AVX1-LABEL: uniform_ashr_v32i8:
483; AVX1:       # %bb.0:
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
489; AVX1-NEXT:    retq
490;
491; AVX2-LABEL: uniform_ashr_v32i8:
492; AVX2:       # %bb.0:
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
495; AVX2-NEXT:    retq
496;
497; XOPAVX1-LABEL: uniform_ashr_v32i8:
498; XOPAVX1:       # %bb.0:
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
507; XOPAVX1-NEXT:    retq
508;
509; XOPAVX2-LABEL: uniform_ashr_v32i8:
510; XOPAVX2:       # %bb.0:
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
513; XOPAVX2-NEXT:    retq
514;
515; AVX512DQ-LABEL: uniform_ashr_v32i8:
516; AVX512DQ:       # %bb.0:
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
520;
521; AVX512BW-LABEL: uniform_ashr_v32i8:
522; AVX512BW:       # %bb.0:
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
527  ret <32 x i8> %shift
528}
529
530define <64 x i8> @uniform_shl_v64i8(<64 x i8> %a) nounwind {
531; SSE2-LABEL: uniform_shl_v64i8:
532; SSE2:       # %bb.0:
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
636; SSE2-NEXT:    retq
637;
638; SSE41-LABEL: uniform_shl_v64i8:
639; SSE41:       # %bb.0:
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
652; SSE41-NEXT:    retq
653;
654; AVX1-LABEL: uniform_shl_v64i8:
655; AVX1:       # %bb.0:
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
665; AVX1-NEXT:    retq
666;
667; AVX2-LABEL: uniform_shl_v64i8:
668; AVX2:       # %bb.0:
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
672; AVX2-NEXT:    retq
673;
674; XOPAVX1-LABEL: uniform_shl_v64i8:
675; XOPAVX1:       # %bb.0:
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
685; XOPAVX1-NEXT:    retq
686;
687; XOPAVX2-LABEL: uniform_shl_v64i8:
688; XOPAVX2:       # %bb.0:
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
692; XOPAVX2-NEXT:    retq
693;
694; AVX512DQ-LABEL: uniform_shl_v64i8:
695; AVX512DQ:       # %bb.0:
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
702;
703; AVX512BW-LABEL: uniform_shl_v64i8:
704; AVX512BW:       # %bb.0:
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
709  ret <64 x i8> %shift
710}
711
712define <64 x i8> @uniform_lshr_v64i8(<64 x i8> %a) nounwind {
713; SSE2-LABEL: uniform_lshr_v64i8:
714; SSE2:       # %bb.0:
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
789; SSE2-NEXT:    retq
790;
791; SSE41-LABEL: uniform_lshr_v64i8:
792; SSE41:       # %bb.0:
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
805; SSE41-NEXT:    retq
806;
807; AVX1-LABEL: uniform_lshr_v64i8:
808; AVX1:       # %bb.0:
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
818; AVX1-NEXT:    retq
819;
820; AVX2-LABEL: uniform_lshr_v64i8:
821; AVX2:       # %bb.0:
822; AVX2-NEXT:    vpmovsxbq {{.*#+}} ymm2 = [1,0,1,0]
823; AVX2-NEXT:    vpshufb %ymm0, %ymm2, %ymm0
824; AVX2-NEXT:    vpshufb %ymm1, %ymm2, %ymm1
825; AVX2-NEXT:    retq
826;
827; XOPAVX1-LABEL: uniform_lshr_v64i8:
828; XOPAVX1:       # %bb.0:
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
843; XOPAVX1-NEXT:    retq
844;
845; XOPAVX2-LABEL: uniform_lshr_v64i8:
846; XOPAVX2:       # %bb.0:
847; XOPAVX2-NEXT:    vpmovsxbq {{.*#+}} ymm2 = [1,0,1,0]
848; XOPAVX2-NEXT:    vpshufb %ymm0, %ymm2, %ymm0
849; XOPAVX2-NEXT:    vpshufb %ymm1, %ymm2, %ymm1
850; XOPAVX2-NEXT:    retq
851;
852; AVX512DQ-LABEL: uniform_lshr_v64i8:
853; AVX512DQ:       # %bb.0:
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
860;
861; AVX512BW-LABEL: uniform_lshr_v64i8:
862; AVX512BW:       # %bb.0:
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
867  ret <64 x i8> %shift
868}
869
870define <64 x i8> @uniform_ashr_v64i8(<64 x i8> %a) nounwind {
871; SSE2-LABEL: uniform_ashr_v64i8:
872; SSE2:       # %bb.0:
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
947; SSE2-NEXT:    retq
948;
949; SSE41-LABEL: uniform_ashr_v64i8:
950; SSE41:       # %bb.0:
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
963; SSE41-NEXT:    retq
964;
965; AVX1-LABEL: uniform_ashr_v64i8:
966; AVX1:       # %bb.0:
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
976; AVX1-NEXT:    retq
977;
978; AVX2-LABEL: uniform_ashr_v64i8:
979; AVX2:       # %bb.0:
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
983; AVX2-NEXT:    retq
984;
985; XOPAVX1-LABEL: uniform_ashr_v64i8:
986; XOPAVX1:       # %bb.0:
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
1002;
1003; XOPAVX2-LABEL: uniform_ashr_v64i8:
1004; XOPAVX2:       # %bb.0:
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
1009;
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
1018;
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
1026}
1027
1028; Test where each 128-bit lane has a different value
1029
1030define <32 x i8> @perlane_shl_v32i8(<32 x i8> %a) nounwind {
1031; SSE2-LABEL: perlane_shl_v32i8:
1032; SSE2:       # %bb.0:
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
1085; SSE2-NEXT:    retq
1086;
1087; SSE41-LABEL: perlane_shl_v32i8:
1088; SSE41:       # %bb.0:
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
1095; SSE41-NEXT:    retq
1096;
1097; AVX1-LABEL: perlane_shl_v32i8:
1098; AVX1:       # %bb.0:
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
1105; AVX1-NEXT:    retq
1106;
1107; AVX2-LABEL: perlane_shl_v32i8:
1108; AVX2:       # %bb.0:
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
1111; AVX2-NEXT:    retq
1112;
1113; XOPAVX1-LABEL: perlane_shl_v32i8:
1114; XOPAVX1:       # %bb.0:
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
1120;
1121; XOPAVX2-LABEL: perlane_shl_v32i8:
1122; XOPAVX2:       # %bb.0:
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
1126;
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
1132;
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
1140}
1141
1142define <32 x i8> @perlane_lshr_v32i8(<32 x i8> %a) nounwind {
1143; SSE2-LABEL: perlane_lshr_v32i8:
1144; SSE2:       # %bb.0:
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
1187; SSE2-NEXT:    retq
1188;
1189; SSE41-LABEL: perlane_lshr_v32i8:
1190; SSE41:       # %bb.0:
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
1197; SSE41-NEXT:    retq
1198;
1199; AVX1-LABEL: perlane_lshr_v32i8:
1200; AVX1:       # %bb.0:
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
1207; AVX1-NEXT:    retq
1208;
1209; AVX2-LABEL: perlane_lshr_v32i8:
1210; AVX2:       # %bb.0:
1211; AVX2-NEXT:    vpmovsxdq {{.*#+}} ymm1 = [259,0,66052,0]
1212; AVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm0
1213; AVX2-NEXT:    retq
1214;
1215; XOPAVX1-LABEL: perlane_lshr_v32i8:
1216; XOPAVX1:       # %bb.0:
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
1225;
1226; XOPAVX2-LABEL: perlane_lshr_v32i8:
1227; XOPAVX2:       # %bb.0:
1228; XOPAVX2-NEXT:    vpmovsxdq {{.*#+}} ymm1 = [259,0,66052,0]
1229; XOPAVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm0
1230; XOPAVX2-NEXT:    retq
1231;
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
1237;
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
1245}
1246
1247define <32 x i8> @perlane_ashr_v32i8(<32 x i8> %a) nounwind {
1248; SSE2-LABEL: perlane_ashr_v32i8:
1249; SSE2:       # %bb.0:
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
1298; SSE2-NEXT:    retq
1299;
1300; SSE41-LABEL: perlane_ashr_v32i8:
1301; SSE41:       # %bb.0:
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
1308; SSE41-NEXT:    retq
1309;
1310; AVX1-LABEL: perlane_ashr_v32i8:
1311; AVX1:       # %bb.0:
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
1318; AVX1-NEXT:    retq
1319;
1320; AVX2-LABEL: perlane_ashr_v32i8:
1321; AVX2:       # %bb.0:
1322; AVX2-NEXT:    vpmovsxdq {{.*#+}} ymm1 = [66053,0,66310,0]
1323; AVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm0
1324; AVX2-NEXT:    retq
1325;
1326; XOPAVX1-LABEL: perlane_ashr_v32i8:
1327; XOPAVX1:       # %bb.0:
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
1336;
1337; XOPAVX2-LABEL: perlane_ashr_v32i8:
1338; XOPAVX2:       # %bb.0:
1339; XOPAVX2-NEXT:    vpmovsxdq {{.*#+}} ymm1 = [66053,0,66310,0]
1340; XOPAVX2-NEXT:    vpshufb %ymm0, %ymm1, %ymm0
1341; XOPAVX2-NEXT:    retq
1342;
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
1348;
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
1356}
1357
1358define <64 x i8> @perlane_shl_v64i8(<64 x i8> %a) nounwind {
1359; SSE2-LABEL: perlane_shl_v64i8:
1360; SSE2:       # %bb.0:
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
1439; SSE2-NEXT:    retq
1440;
1441; SSE41-LABEL: perlane_shl_v64i8:
1442; SSE41:       # %bb.0:
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
1453; SSE41-NEXT:    retq
1454;
1455; AVX1-LABEL: perlane_shl_v64i8:
1456; AVX1:       # %bb.0:
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
1465; AVX1-NEXT:    retq
1466;
1467; AVX2-LABEL: perlane_shl_v64i8:
1468; AVX2:       # %bb.0:
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
1473; AVX2-NEXT:    retq
1474;
1475; XOPAVX1-LABEL: perlane_shl_v64i8:
1476; XOPAVX1:       # %bb.0:
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
1483;
1484; XOPAVX2-LABEL: perlane_shl_v64i8:
1485; XOPAVX2:       # %bb.0:
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
1491;
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
1501;
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
1509}
1510
1511define <64 x i8> @perlane_lshr_v64i8(<64 x i8> %a) nounwind {
1512; SSE2-LABEL: perlane_lshr_v64i8:
1513; SSE2:       # %bb.0:
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
1603; SSE2-NEXT:    retq
1604;
1605; SSE41-LABEL: perlane_lshr_v64i8:
1606; SSE41:       # %bb.0:
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
1619; SSE41-NEXT:    retq
1620;
1621; AVX1-LABEL: perlane_lshr_v64i8:
1622; AVX1:       # %bb.0:
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
1635; AVX1-NEXT:    retq
1636;
1637; AVX2-LABEL: perlane_lshr_v64i8:
1638; AVX2:       # %bb.0:
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
1643; AVX2-NEXT:    retq
1644;
1645; XOPAVX1-LABEL: perlane_lshr_v64i8:
1646; XOPAVX1:       # %bb.0:
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
1661;
1662; XOPAVX2-LABEL: perlane_lshr_v64i8:
1663; XOPAVX2:       # %bb.0:
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
1669;
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
1679;
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
1687}
1688
1689define <64 x i8> @perlane_ashr_v64i8(<64 x i8> %a) nounwind {
1690; SSE2-LABEL: perlane_ashr_v64i8:
1691; SSE2:       # %bb.0:
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
1748; SSE2-NEXT:    retq
1749;
1750; SSE41-LABEL: perlane_ashr_v64i8:
1751; SSE41:       # %bb.0:
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
1762; SSE41-NEXT:    retq
1763;
1764; AVX1-LABEL: perlane_ashr_v64i8:
1765; AVX1:       # %bb.0:
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
1777; AVX1-NEXT:    retq
1778;
1779; AVX2-LABEL: perlane_ashr_v64i8:
1780; AVX2:       # %bb.0:
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
1785; AVX2-NEXT:    retq
1786;
1787; XOPAVX1-LABEL: perlane_ashr_v64i8:
1788; XOPAVX1:       # %bb.0:
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
1802;
1803; XOPAVX2-LABEL: perlane_ashr_v64i8:
1804; XOPAVX2:       # %bb.0:
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
1810;
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
1820;
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
1828}
1829
1830;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
1831; SSE: {{.*}}
1832