• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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,SSE4,SSE41
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,SSE4,SSE42
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512BW
8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VL
9
10;
11; vXi64
12;
13
14define i64 @test_v2i64(<2 x i64> %a0) {
15; SSE2-LABEL: test_v2i64:
16; SSE2:       # %bb.0:
17; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
18; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
19; SSE2-NEXT:    movdqa %xmm0, %xmm3
20; SSE2-NEXT:    pxor %xmm2, %xmm3
21; SSE2-NEXT:    pxor %xmm1, %xmm2
22; SSE2-NEXT:    movdqa %xmm3, %xmm4
23; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
24; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
25; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
26; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
27; SSE2-NEXT:    pand %xmm5, %xmm2
28; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
29; SSE2-NEXT:    por %xmm2, %xmm3
30; SSE2-NEXT:    pand %xmm3, %xmm0
31; SSE2-NEXT:    pandn %xmm1, %xmm3
32; SSE2-NEXT:    por %xmm0, %xmm3
33; SSE2-NEXT:    movq %xmm3, %rax
34; SSE2-NEXT:    retq
35;
36; SSE41-LABEL: test_v2i64:
37; SSE41:       # %bb.0:
38; SSE41-NEXT:    movdqa %xmm0, %xmm1
39; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
40; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
41; SSE41-NEXT:    movdqa %xmm0, %xmm4
42; SSE41-NEXT:    pxor %xmm3, %xmm4
43; SSE41-NEXT:    pxor %xmm2, %xmm3
44; SSE41-NEXT:    movdqa %xmm4, %xmm0
45; SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
46; SSE41-NEXT:    pcmpgtd %xmm3, %xmm4
47; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[0,0,2,2]
48; SSE41-NEXT:    pand %xmm3, %xmm0
49; SSE41-NEXT:    por %xmm4, %xmm0
50; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
51; SSE41-NEXT:    movq %xmm2, %rax
52; SSE41-NEXT:    retq
53;
54; SSE42-LABEL: test_v2i64:
55; SSE42:       # %bb.0:
56; SSE42-NEXT:    movdqa %xmm0, %xmm1
57; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
58; SSE42-NEXT:    pcmpgtq %xmm2, %xmm0
59; SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
60; SSE42-NEXT:    movq %xmm2, %rax
61; SSE42-NEXT:    retq
62;
63; AVX-LABEL: test_v2i64:
64; AVX:       # %bb.0:
65; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
66; AVX-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
67; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
68; AVX-NEXT:    vmovq %xmm0, %rax
69; AVX-NEXT:    retq
70;
71; AVX512BW-LABEL: test_v2i64:
72; AVX512BW:       # %bb.0:
73; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
74; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
75; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
76; AVX512BW-NEXT:    vmovq %xmm0, %rax
77; AVX512BW-NEXT:    vzeroupper
78; AVX512BW-NEXT:    retq
79;
80; AVX512VL-LABEL: test_v2i64:
81; AVX512VL:       # %bb.0:
82; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
83; AVX512VL-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
84; AVX512VL-NEXT:    vmovq %xmm0, %rax
85; AVX512VL-NEXT:    retq
86  %1 = call i64 @llvm.vector.reduce.smax.v2i64(<2 x i64> %a0)
87  ret i64 %1
88}
89
90define i64 @test_v4i64(<4 x i64> %a0) {
91; SSE2-LABEL: test_v4i64:
92; SSE2:       # %bb.0:
93; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
94; SSE2-NEXT:    movdqa %xmm1, %xmm3
95; SSE2-NEXT:    pxor %xmm2, %xmm3
96; SSE2-NEXT:    movdqa %xmm0, %xmm4
97; SSE2-NEXT:    pxor %xmm2, %xmm4
98; SSE2-NEXT:    movdqa %xmm4, %xmm5
99; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
100; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
101; SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
102; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
103; SSE2-NEXT:    pand %xmm6, %xmm3
104; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
105; SSE2-NEXT:    por %xmm3, %xmm4
106; SSE2-NEXT:    pand %xmm4, %xmm0
107; SSE2-NEXT:    pandn %xmm1, %xmm4
108; SSE2-NEXT:    por %xmm0, %xmm4
109; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]
110; SSE2-NEXT:    movdqa %xmm4, %xmm1
111; SSE2-NEXT:    pxor %xmm2, %xmm1
112; SSE2-NEXT:    pxor %xmm0, %xmm2
113; SSE2-NEXT:    movdqa %xmm1, %xmm3
114; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
115; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
116; SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
117; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
118; SSE2-NEXT:    pand %xmm5, %xmm1
119; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
120; SSE2-NEXT:    por %xmm1, %xmm2
121; SSE2-NEXT:    pand %xmm2, %xmm4
122; SSE2-NEXT:    pandn %xmm0, %xmm2
123; SSE2-NEXT:    por %xmm4, %xmm2
124; SSE2-NEXT:    movq %xmm2, %rax
125; SSE2-NEXT:    retq
126;
127; SSE41-LABEL: test_v4i64:
128; SSE41:       # %bb.0:
129; SSE41-NEXT:    movdqa %xmm0, %xmm2
130; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
131; SSE41-NEXT:    movdqa %xmm1, %xmm4
132; SSE41-NEXT:    pxor %xmm3, %xmm4
133; SSE41-NEXT:    movdqa %xmm0, %xmm5
134; SSE41-NEXT:    pxor %xmm3, %xmm5
135; SSE41-NEXT:    movdqa %xmm5, %xmm0
136; SSE41-NEXT:    pcmpeqd %xmm4, %xmm0
137; SSE41-NEXT:    pcmpgtd %xmm4, %xmm5
138; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[0,0,2,2]
139; SSE41-NEXT:    pand %xmm4, %xmm0
140; SSE41-NEXT:    por %xmm5, %xmm0
141; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
142; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
143; SSE41-NEXT:    movdqa %xmm1, %xmm4
144; SSE41-NEXT:    pxor %xmm3, %xmm4
145; SSE41-NEXT:    pxor %xmm2, %xmm3
146; SSE41-NEXT:    movdqa %xmm4, %xmm5
147; SSE41-NEXT:    pcmpeqd %xmm3, %xmm5
148; SSE41-NEXT:    pcmpgtd %xmm3, %xmm4
149; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
150; SSE41-NEXT:    pand %xmm5, %xmm0
151; SSE41-NEXT:    por %xmm4, %xmm0
152; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
153; SSE41-NEXT:    movq %xmm2, %rax
154; SSE41-NEXT:    retq
155;
156; SSE42-LABEL: test_v4i64:
157; SSE42:       # %bb.0:
158; SSE42-NEXT:    movdqa %xmm0, %xmm2
159; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
160; SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
161; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
162; SSE42-NEXT:    movdqa %xmm1, %xmm0
163; SSE42-NEXT:    pcmpgtq %xmm2, %xmm0
164; SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
165; SSE42-NEXT:    movq %xmm2, %rax
166; SSE42-NEXT:    retq
167;
168; AVX1-LABEL: test_v4i64:
169; AVX1:       # %bb.0:
170; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
171; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
172; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
173; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,2,3]
174; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
175; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
176; AVX1-NEXT:    vmovq %xmm0, %rax
177; AVX1-NEXT:    vzeroupper
178; AVX1-NEXT:    retq
179;
180; AVX2-LABEL: test_v4i64:
181; AVX2:       # %bb.0:
182; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
183; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
184; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
185; AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,2,3]
186; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
187; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
188; AVX2-NEXT:    vmovq %xmm0, %rax
189; AVX2-NEXT:    vzeroupper
190; AVX2-NEXT:    retq
191;
192; AVX512BW-LABEL: test_v4i64:
193; AVX512BW:       # %bb.0:
194; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
195; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
196; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
197; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
198; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
199; AVX512BW-NEXT:    vmovq %xmm0, %rax
200; AVX512BW-NEXT:    vzeroupper
201; AVX512BW-NEXT:    retq
202;
203; AVX512VL-LABEL: test_v4i64:
204; AVX512VL:       # %bb.0:
205; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
206; AVX512VL-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
207; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
208; AVX512VL-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
209; AVX512VL-NEXT:    vmovq %xmm0, %rax
210; AVX512VL-NEXT:    vzeroupper
211; AVX512VL-NEXT:    retq
212  %1 = call i64 @llvm.vector.reduce.smax.v4i64(<4 x i64> %a0)
213  ret i64 %1
214}
215
216define i64 @test_v8i64(<8 x i64> %a0) {
217; SSE2-LABEL: test_v8i64:
218; SSE2:       # %bb.0:
219; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
220; SSE2-NEXT:    movdqa %xmm2, %xmm5
221; SSE2-NEXT:    pxor %xmm4, %xmm5
222; SSE2-NEXT:    movdqa %xmm0, %xmm6
223; SSE2-NEXT:    pxor %xmm4, %xmm6
224; SSE2-NEXT:    movdqa %xmm6, %xmm7
225; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
226; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
227; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
228; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
229; SSE2-NEXT:    pand %xmm8, %xmm6
230; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
231; SSE2-NEXT:    por %xmm6, %xmm5
232; SSE2-NEXT:    pand %xmm5, %xmm0
233; SSE2-NEXT:    pandn %xmm2, %xmm5
234; SSE2-NEXT:    por %xmm0, %xmm5
235; SSE2-NEXT:    movdqa %xmm3, %xmm0
236; SSE2-NEXT:    pxor %xmm4, %xmm0
237; SSE2-NEXT:    movdqa %xmm1, %xmm2
238; SSE2-NEXT:    pxor %xmm4, %xmm2
239; SSE2-NEXT:    movdqa %xmm2, %xmm6
240; SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
241; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
242; SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
243; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
244; SSE2-NEXT:    pand %xmm7, %xmm0
245; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
246; SSE2-NEXT:    por %xmm0, %xmm2
247; SSE2-NEXT:    pand %xmm2, %xmm1
248; SSE2-NEXT:    pandn %xmm3, %xmm2
249; SSE2-NEXT:    por %xmm1, %xmm2
250; SSE2-NEXT:    movdqa %xmm2, %xmm0
251; SSE2-NEXT:    pxor %xmm4, %xmm0
252; SSE2-NEXT:    movdqa %xmm5, %xmm1
253; SSE2-NEXT:    pxor %xmm4, %xmm1
254; SSE2-NEXT:    movdqa %xmm1, %xmm3
255; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
256; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
257; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
258; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
259; SSE2-NEXT:    pand %xmm6, %xmm0
260; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
261; SSE2-NEXT:    por %xmm0, %xmm1
262; SSE2-NEXT:    pand %xmm1, %xmm5
263; SSE2-NEXT:    pandn %xmm2, %xmm1
264; SSE2-NEXT:    por %xmm5, %xmm1
265; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
266; SSE2-NEXT:    movdqa %xmm1, %xmm2
267; SSE2-NEXT:    pxor %xmm4, %xmm2
268; SSE2-NEXT:    pxor %xmm0, %xmm4
269; SSE2-NEXT:    movdqa %xmm2, %xmm3
270; SSE2-NEXT:    pcmpgtd %xmm4, %xmm3
271; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
272; SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
273; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
274; SSE2-NEXT:    pand %xmm5, %xmm2
275; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
276; SSE2-NEXT:    por %xmm2, %xmm3
277; SSE2-NEXT:    pand %xmm3, %xmm1
278; SSE2-NEXT:    pandn %xmm0, %xmm3
279; SSE2-NEXT:    por %xmm1, %xmm3
280; SSE2-NEXT:    movq %xmm3, %rax
281; SSE2-NEXT:    retq
282;
283; SSE41-LABEL: test_v8i64:
284; SSE41:       # %bb.0:
285; SSE41-NEXT:    movdqa %xmm0, %xmm4
286; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648]
287; SSE41-NEXT:    movdqa %xmm2, %xmm6
288; SSE41-NEXT:    pxor %xmm5, %xmm6
289; SSE41-NEXT:    movdqa %xmm0, %xmm7
290; SSE41-NEXT:    pxor %xmm5, %xmm7
291; SSE41-NEXT:    movdqa %xmm7, %xmm0
292; SSE41-NEXT:    pcmpeqd %xmm6, %xmm0
293; SSE41-NEXT:    pcmpgtd %xmm6, %xmm7
294; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[0,0,2,2]
295; SSE41-NEXT:    pand %xmm6, %xmm0
296; SSE41-NEXT:    por %xmm7, %xmm0
297; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
298; SSE41-NEXT:    movdqa %xmm3, %xmm0
299; SSE41-NEXT:    pxor %xmm5, %xmm0
300; SSE41-NEXT:    movdqa %xmm1, %xmm4
301; SSE41-NEXT:    pxor %xmm5, %xmm4
302; SSE41-NEXT:    movdqa %xmm4, %xmm6
303; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
304; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
305; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
306; SSE41-NEXT:    pand %xmm6, %xmm0
307; SSE41-NEXT:    por %xmm4, %xmm0
308; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
309; SSE41-NEXT:    movapd %xmm3, %xmm0
310; SSE41-NEXT:    xorpd %xmm5, %xmm0
311; SSE41-NEXT:    movapd %xmm2, %xmm1
312; SSE41-NEXT:    xorpd %xmm5, %xmm1
313; SSE41-NEXT:    movapd %xmm1, %xmm4
314; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
315; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
316; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
317; SSE41-NEXT:    pand %xmm4, %xmm0
318; SSE41-NEXT:    por %xmm1, %xmm0
319; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
320; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]
321; SSE41-NEXT:    movdqa %xmm3, %xmm2
322; SSE41-NEXT:    pxor %xmm5, %xmm2
323; SSE41-NEXT:    pxor %xmm1, %xmm5
324; SSE41-NEXT:    movdqa %xmm2, %xmm4
325; SSE41-NEXT:    pcmpeqd %xmm5, %xmm4
326; SSE41-NEXT:    pcmpgtd %xmm5, %xmm2
327; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
328; SSE41-NEXT:    pand %xmm4, %xmm0
329; SSE41-NEXT:    por %xmm2, %xmm0
330; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
331; SSE41-NEXT:    movq %xmm1, %rax
332; SSE41-NEXT:    retq
333;
334; SSE42-LABEL: test_v8i64:
335; SSE42:       # %bb.0:
336; SSE42-NEXT:    movdqa %xmm0, %xmm4
337; SSE42-NEXT:    movdqa %xmm1, %xmm0
338; SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
339; SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
340; SSE42-NEXT:    movdqa %xmm4, %xmm0
341; SSE42-NEXT:    pcmpgtq %xmm2, %xmm0
342; SSE42-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
343; SSE42-NEXT:    movapd %xmm2, %xmm0
344; SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
345; SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
346; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]
347; SSE42-NEXT:    movdqa %xmm3, %xmm0
348; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
349; SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
350; SSE42-NEXT:    movq %xmm1, %rax
351; SSE42-NEXT:    retq
352;
353; AVX1-LABEL: test_v8i64:
354; AVX1:       # %bb.0:
355; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
356; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
357; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
358; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm5
359; AVX1-NEXT:    vblendvpd %xmm5, %xmm4, %xmm3, %xmm3
360; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
361; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm0, %xmm1
362; AVX1-NEXT:    vblendvpd %xmm1, %xmm0, %xmm3, %xmm0
363; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,2,3]
364; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
365; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
366; AVX1-NEXT:    vmovq %xmm0, %rax
367; AVX1-NEXT:    vzeroupper
368; AVX1-NEXT:    retq
369;
370; AVX2-LABEL: test_v8i64:
371; AVX2:       # %bb.0:
372; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
373; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
374; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
375; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
376; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
377; AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,2,3]
378; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
379; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
380; AVX2-NEXT:    vmovq %xmm0, %rax
381; AVX2-NEXT:    vzeroupper
382; AVX2-NEXT:    retq
383;
384; AVX512BW-LABEL: test_v8i64:
385; AVX512BW:       # %bb.0:
386; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
387; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
388; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
389; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
390; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
391; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
392; AVX512BW-NEXT:    vmovq %xmm0, %rax
393; AVX512BW-NEXT:    vzeroupper
394; AVX512BW-NEXT:    retq
395;
396; AVX512VL-LABEL: test_v8i64:
397; AVX512VL:       # %bb.0:
398; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
399; AVX512VL-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
400; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
401; AVX512VL-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
402; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
403; AVX512VL-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
404; AVX512VL-NEXT:    vmovq %xmm0, %rax
405; AVX512VL-NEXT:    vzeroupper
406; AVX512VL-NEXT:    retq
407  %1 = call i64 @llvm.vector.reduce.smax.v8i64(<8 x i64> %a0)
408  ret i64 %1
409}
410
411define i64 @test_v16i64(<16 x i64> %a0) {
412; SSE2-LABEL: test_v16i64:
413; SSE2:       # %bb.0:
414; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648]
415; SSE2-NEXT:    movdqa %xmm5, %xmm9
416; SSE2-NEXT:    pxor %xmm8, %xmm9
417; SSE2-NEXT:    movdqa %xmm1, %xmm10
418; SSE2-NEXT:    pxor %xmm8, %xmm10
419; SSE2-NEXT:    movdqa %xmm10, %xmm11
420; SSE2-NEXT:    pcmpgtd %xmm9, %xmm11
421; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
422; SSE2-NEXT:    pcmpeqd %xmm9, %xmm10
423; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
424; SSE2-NEXT:    pand %xmm12, %xmm10
425; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm11[1,1,3,3]
426; SSE2-NEXT:    por %xmm10, %xmm9
427; SSE2-NEXT:    pand %xmm9, %xmm1
428; SSE2-NEXT:    pandn %xmm5, %xmm9
429; SSE2-NEXT:    por %xmm1, %xmm9
430; SSE2-NEXT:    movdqa %xmm7, %xmm1
431; SSE2-NEXT:    pxor %xmm8, %xmm1
432; SSE2-NEXT:    movdqa %xmm3, %xmm5
433; SSE2-NEXT:    pxor %xmm8, %xmm5
434; SSE2-NEXT:    movdqa %xmm5, %xmm10
435; SSE2-NEXT:    pcmpgtd %xmm1, %xmm10
436; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
437; SSE2-NEXT:    pcmpeqd %xmm1, %xmm5
438; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
439; SSE2-NEXT:    pand %xmm11, %xmm5
440; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm10[1,1,3,3]
441; SSE2-NEXT:    por %xmm5, %xmm1
442; SSE2-NEXT:    pand %xmm1, %xmm3
443; SSE2-NEXT:    pandn %xmm7, %xmm1
444; SSE2-NEXT:    por %xmm3, %xmm1
445; SSE2-NEXT:    movdqa %xmm4, %xmm3
446; SSE2-NEXT:    pxor %xmm8, %xmm3
447; SSE2-NEXT:    movdqa %xmm0, %xmm5
448; SSE2-NEXT:    pxor %xmm8, %xmm5
449; SSE2-NEXT:    movdqa %xmm5, %xmm7
450; SSE2-NEXT:    pcmpgtd %xmm3, %xmm7
451; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
452; SSE2-NEXT:    pcmpeqd %xmm3, %xmm5
453; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
454; SSE2-NEXT:    pand %xmm10, %xmm5
455; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm7[1,1,3,3]
456; SSE2-NEXT:    por %xmm5, %xmm3
457; SSE2-NEXT:    pand %xmm3, %xmm0
458; SSE2-NEXT:    pandn %xmm4, %xmm3
459; SSE2-NEXT:    por %xmm0, %xmm3
460; SSE2-NEXT:    movdqa %xmm6, %xmm0
461; SSE2-NEXT:    pxor %xmm8, %xmm0
462; SSE2-NEXT:    movdqa %xmm2, %xmm4
463; SSE2-NEXT:    pxor %xmm8, %xmm4
464; SSE2-NEXT:    movdqa %xmm4, %xmm5
465; SSE2-NEXT:    pcmpgtd %xmm0, %xmm5
466; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
467; SSE2-NEXT:    pcmpeqd %xmm0, %xmm4
468; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
469; SSE2-NEXT:    pand %xmm7, %xmm0
470; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
471; SSE2-NEXT:    por %xmm0, %xmm4
472; SSE2-NEXT:    pand %xmm4, %xmm2
473; SSE2-NEXT:    pandn %xmm6, %xmm4
474; SSE2-NEXT:    por %xmm2, %xmm4
475; SSE2-NEXT:    movdqa %xmm4, %xmm0
476; SSE2-NEXT:    pxor %xmm8, %xmm0
477; SSE2-NEXT:    movdqa %xmm3, %xmm2
478; SSE2-NEXT:    pxor %xmm8, %xmm2
479; SSE2-NEXT:    movdqa %xmm2, %xmm5
480; SSE2-NEXT:    pcmpgtd %xmm0, %xmm5
481; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
482; SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
483; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
484; SSE2-NEXT:    pand %xmm6, %xmm2
485; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
486; SSE2-NEXT:    por %xmm2, %xmm0
487; SSE2-NEXT:    pand %xmm0, %xmm3
488; SSE2-NEXT:    pandn %xmm4, %xmm0
489; SSE2-NEXT:    por %xmm3, %xmm0
490; SSE2-NEXT:    movdqa %xmm1, %xmm2
491; SSE2-NEXT:    pxor %xmm8, %xmm2
492; SSE2-NEXT:    movdqa %xmm9, %xmm3
493; SSE2-NEXT:    pxor %xmm8, %xmm3
494; SSE2-NEXT:    movdqa %xmm3, %xmm4
495; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
496; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
497; SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
498; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
499; SSE2-NEXT:    pand %xmm5, %xmm2
500; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
501; SSE2-NEXT:    por %xmm2, %xmm3
502; SSE2-NEXT:    pand %xmm3, %xmm9
503; SSE2-NEXT:    pandn %xmm1, %xmm3
504; SSE2-NEXT:    por %xmm9, %xmm3
505; SSE2-NEXT:    movdqa %xmm3, %xmm1
506; SSE2-NEXT:    pxor %xmm8, %xmm1
507; SSE2-NEXT:    movdqa %xmm0, %xmm2
508; SSE2-NEXT:    pxor %xmm8, %xmm2
509; SSE2-NEXT:    movdqa %xmm2, %xmm4
510; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
511; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
512; SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
513; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
514; SSE2-NEXT:    pand %xmm5, %xmm1
515; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
516; SSE2-NEXT:    por %xmm1, %xmm2
517; SSE2-NEXT:    pand %xmm2, %xmm0
518; SSE2-NEXT:    pandn %xmm3, %xmm2
519; SSE2-NEXT:    por %xmm0, %xmm2
520; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
521; SSE2-NEXT:    movdqa %xmm2, %xmm1
522; SSE2-NEXT:    pxor %xmm8, %xmm1
523; SSE2-NEXT:    pxor %xmm0, %xmm8
524; SSE2-NEXT:    movdqa %xmm1, %xmm3
525; SSE2-NEXT:    pcmpgtd %xmm8, %xmm3
526; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
527; SSE2-NEXT:    pcmpeqd %xmm1, %xmm8
528; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm8[1,1,3,3]
529; SSE2-NEXT:    pand %xmm4, %xmm1
530; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
531; SSE2-NEXT:    por %xmm1, %xmm3
532; SSE2-NEXT:    pand %xmm3, %xmm2
533; SSE2-NEXT:    pandn %xmm0, %xmm3
534; SSE2-NEXT:    por %xmm2, %xmm3
535; SSE2-NEXT:    movq %xmm3, %rax
536; SSE2-NEXT:    retq
537;
538; SSE41-LABEL: test_v16i64:
539; SSE41:       # %bb.0:
540; SSE41-NEXT:    movdqa %xmm0, %xmm8
541; SSE41-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648]
542; SSE41-NEXT:    movdqa %xmm5, %xmm0
543; SSE41-NEXT:    pxor %xmm9, %xmm0
544; SSE41-NEXT:    movdqa %xmm1, %xmm10
545; SSE41-NEXT:    pxor %xmm9, %xmm10
546; SSE41-NEXT:    movdqa %xmm10, %xmm11
547; SSE41-NEXT:    pcmpeqd %xmm0, %xmm11
548; SSE41-NEXT:    pcmpgtd %xmm0, %xmm10
549; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm10[0,0,2,2]
550; SSE41-NEXT:    pand %xmm11, %xmm0
551; SSE41-NEXT:    por %xmm10, %xmm0
552; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
553; SSE41-NEXT:    movdqa %xmm7, %xmm0
554; SSE41-NEXT:    pxor %xmm9, %xmm0
555; SSE41-NEXT:    movdqa %xmm3, %xmm1
556; SSE41-NEXT:    pxor %xmm9, %xmm1
557; SSE41-NEXT:    movdqa %xmm1, %xmm10
558; SSE41-NEXT:    pcmpeqd %xmm0, %xmm10
559; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
560; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
561; SSE41-NEXT:    pand %xmm10, %xmm0
562; SSE41-NEXT:    por %xmm1, %xmm0
563; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm7
564; SSE41-NEXT:    movdqa %xmm4, %xmm1
565; SSE41-NEXT:    pxor %xmm9, %xmm1
566; SSE41-NEXT:    movdqa %xmm8, %xmm3
567; SSE41-NEXT:    pxor %xmm9, %xmm3
568; SSE41-NEXT:    movdqa %xmm3, %xmm0
569; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
570; SSE41-NEXT:    pcmpgtd %xmm1, %xmm3
571; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[0,0,2,2]
572; SSE41-NEXT:    pand %xmm1, %xmm0
573; SSE41-NEXT:    por %xmm3, %xmm0
574; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm4
575; SSE41-NEXT:    movdqa %xmm6, %xmm0
576; SSE41-NEXT:    pxor %xmm9, %xmm0
577; SSE41-NEXT:    movdqa %xmm2, %xmm1
578; SSE41-NEXT:    pxor %xmm9, %xmm1
579; SSE41-NEXT:    movdqa %xmm1, %xmm3
580; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
581; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
582; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
583; SSE41-NEXT:    pand %xmm3, %xmm0
584; SSE41-NEXT:    por %xmm1, %xmm0
585; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm6
586; SSE41-NEXT:    movapd %xmm6, %xmm0
587; SSE41-NEXT:    xorpd %xmm9, %xmm0
588; SSE41-NEXT:    movapd %xmm4, %xmm1
589; SSE41-NEXT:    xorpd %xmm9, %xmm1
590; SSE41-NEXT:    movapd %xmm1, %xmm2
591; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
592; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
593; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
594; SSE41-NEXT:    pand %xmm2, %xmm0
595; SSE41-NEXT:    por %xmm1, %xmm0
596; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm6
597; SSE41-NEXT:    movapd %xmm7, %xmm0
598; SSE41-NEXT:    xorpd %xmm9, %xmm0
599; SSE41-NEXT:    movapd %xmm5, %xmm1
600; SSE41-NEXT:    xorpd %xmm9, %xmm1
601; SSE41-NEXT:    movapd %xmm1, %xmm2
602; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
603; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
604; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
605; SSE41-NEXT:    pand %xmm2, %xmm0
606; SSE41-NEXT:    por %xmm1, %xmm0
607; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm7
608; SSE41-NEXT:    movapd %xmm7, %xmm0
609; SSE41-NEXT:    xorpd %xmm9, %xmm0
610; SSE41-NEXT:    movapd %xmm6, %xmm1
611; SSE41-NEXT:    xorpd %xmm9, %xmm1
612; SSE41-NEXT:    movapd %xmm1, %xmm2
613; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
614; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
615; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
616; SSE41-NEXT:    pand %xmm2, %xmm0
617; SSE41-NEXT:    por %xmm1, %xmm0
618; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm7
619; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm7[2,3,2,3]
620; SSE41-NEXT:    movdqa %xmm7, %xmm2
621; SSE41-NEXT:    pxor %xmm9, %xmm2
622; SSE41-NEXT:    pxor %xmm1, %xmm9
623; SSE41-NEXT:    movdqa %xmm2, %xmm3
624; SSE41-NEXT:    pcmpeqd %xmm9, %xmm3
625; SSE41-NEXT:    pcmpgtd %xmm9, %xmm2
626; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
627; SSE41-NEXT:    pand %xmm3, %xmm0
628; SSE41-NEXT:    por %xmm2, %xmm0
629; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
630; SSE41-NEXT:    movq %xmm1, %rax
631; SSE41-NEXT:    retq
632;
633; SSE42-LABEL: test_v16i64:
634; SSE42:       # %bb.0:
635; SSE42-NEXT:    movdqa %xmm0, %xmm8
636; SSE42-NEXT:    movdqa %xmm2, %xmm0
637; SSE42-NEXT:    pcmpgtq %xmm6, %xmm0
638; SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm6
639; SSE42-NEXT:    movdqa %xmm8, %xmm0
640; SSE42-NEXT:    pcmpgtq %xmm4, %xmm0
641; SSE42-NEXT:    blendvpd %xmm0, %xmm8, %xmm4
642; SSE42-NEXT:    movdqa %xmm3, %xmm0
643; SSE42-NEXT:    pcmpgtq %xmm7, %xmm0
644; SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm7
645; SSE42-NEXT:    movdqa %xmm1, %xmm0
646; SSE42-NEXT:    pcmpgtq %xmm5, %xmm0
647; SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
648; SSE42-NEXT:    movapd %xmm5, %xmm0
649; SSE42-NEXT:    pcmpgtq %xmm7, %xmm0
650; SSE42-NEXT:    blendvpd %xmm0, %xmm5, %xmm7
651; SSE42-NEXT:    movapd %xmm4, %xmm0
652; SSE42-NEXT:    pcmpgtq %xmm6, %xmm0
653; SSE42-NEXT:    blendvpd %xmm0, %xmm4, %xmm6
654; SSE42-NEXT:    movapd %xmm6, %xmm0
655; SSE42-NEXT:    pcmpgtq %xmm7, %xmm0
656; SSE42-NEXT:    blendvpd %xmm0, %xmm6, %xmm7
657; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm7[2,3,2,3]
658; SSE42-NEXT:    movdqa %xmm7, %xmm0
659; SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
660; SSE42-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
661; SSE42-NEXT:    movq %xmm1, %rax
662; SSE42-NEXT:    retq
663;
664; AVX1-LABEL: test_v16i64:
665; AVX1:       # %bb.0:
666; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm11
667; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
668; AVX1-NEXT:    vpcmpgtq %xmm11, %xmm5, %xmm8
669; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm7
670; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm6
671; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm6, %xmm9
672; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm10
673; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm1, %xmm4
674; AVX1-NEXT:    vblendvpd %xmm4, %xmm1, %xmm3, %xmm1
675; AVX1-NEXT:    vblendvpd %xmm10, %xmm0, %xmm2, %xmm0
676; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
677; AVX1-NEXT:    vblendvpd %xmm9, %xmm6, %xmm7, %xmm3
678; AVX1-NEXT:    vblendvpd %xmm8, %xmm5, %xmm11, %xmm4
679; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm5
680; AVX1-NEXT:    vblendvpd %xmm5, %xmm4, %xmm3, %xmm3
681; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
682; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm0, %xmm1
683; AVX1-NEXT:    vblendvpd %xmm1, %xmm0, %xmm3, %xmm0
684; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,2,3]
685; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
686; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
687; AVX1-NEXT:    vmovq %xmm0, %rax
688; AVX1-NEXT:    vzeroupper
689; AVX1-NEXT:    retq
690;
691; AVX2-LABEL: test_v16i64:
692; AVX2:       # %bb.0:
693; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm1, %ymm4
694; AVX2-NEXT:    vblendvpd %ymm4, %ymm1, %ymm3, %ymm1
695; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm3
696; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
697; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
698; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
699; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
700; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
701; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
702; AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,2,3]
703; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
704; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
705; AVX2-NEXT:    vmovq %xmm0, %rax
706; AVX2-NEXT:    vzeroupper
707; AVX2-NEXT:    retq
708;
709; AVX512BW-LABEL: test_v16i64:
710; AVX512BW:       # %bb.0:
711; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
712; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
713; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
714; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
715; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
716; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
717; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
718; AVX512BW-NEXT:    vmovq %xmm0, %rax
719; AVX512BW-NEXT:    vzeroupper
720; AVX512BW-NEXT:    retq
721;
722; AVX512VL-LABEL: test_v16i64:
723; AVX512VL:       # %bb.0:
724; AVX512VL-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
725; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
726; AVX512VL-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
727; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
728; AVX512VL-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
729; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
730; AVX512VL-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
731; AVX512VL-NEXT:    vmovq %xmm0, %rax
732; AVX512VL-NEXT:    vzeroupper
733; AVX512VL-NEXT:    retq
734  %1 = call i64 @llvm.vector.reduce.smax.v16i64(<16 x i64> %a0)
735  ret i64 %1
736}
737
738;
739; vXi32
740;
741
742define i32 @test_v2i32(<2 x i32> %a0) {
743; SSE2-LABEL: test_v2i32:
744; SSE2:       # %bb.0:
745; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
746; SSE2-NEXT:    movdqa %xmm0, %xmm2
747; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
748; SSE2-NEXT:    pand %xmm2, %xmm0
749; SSE2-NEXT:    pandn %xmm1, %xmm2
750; SSE2-NEXT:    por %xmm0, %xmm2
751; SSE2-NEXT:    movd %xmm2, %eax
752; SSE2-NEXT:    retq
753;
754; SSE4-LABEL: test_v2i32:
755; SSE4:       # %bb.0:
756; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
757; SSE4-NEXT:    pmaxsd %xmm0, %xmm1
758; SSE4-NEXT:    movd %xmm1, %eax
759; SSE4-NEXT:    retq
760;
761; AVX-LABEL: test_v2i32:
762; AVX:       # %bb.0:
763; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
764; AVX-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
765; AVX-NEXT:    vmovd %xmm0, %eax
766; AVX-NEXT:    retq
767;
768; AVX512-LABEL: test_v2i32:
769; AVX512:       # %bb.0:
770; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
771; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
772; AVX512-NEXT:    vmovd %xmm0, %eax
773; AVX512-NEXT:    retq
774  %1 = call i32 @llvm.vector.reduce.smax.v2i32(<2 x i32> %a0)
775  ret i32 %1
776}
777
778define i32 @test_v4i32(<4 x i32> %a0) {
779; SSE2-LABEL: test_v4i32:
780; SSE2:       # %bb.0:
781; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
782; SSE2-NEXT:    movdqa %xmm0, %xmm2
783; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
784; SSE2-NEXT:    pand %xmm2, %xmm0
785; SSE2-NEXT:    pandn %xmm1, %xmm2
786; SSE2-NEXT:    por %xmm0, %xmm2
787; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
788; SSE2-NEXT:    movdqa %xmm2, %xmm1
789; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
790; SSE2-NEXT:    pand %xmm1, %xmm2
791; SSE2-NEXT:    pandn %xmm0, %xmm1
792; SSE2-NEXT:    por %xmm2, %xmm1
793; SSE2-NEXT:    movd %xmm1, %eax
794; SSE2-NEXT:    retq
795;
796; SSE4-LABEL: test_v4i32:
797; SSE4:       # %bb.0:
798; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
799; SSE4-NEXT:    pmaxsd %xmm0, %xmm1
800; SSE4-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
801; SSE4-NEXT:    pmaxsd %xmm1, %xmm0
802; SSE4-NEXT:    movd %xmm0, %eax
803; SSE4-NEXT:    retq
804;
805; AVX-LABEL: test_v4i32:
806; AVX:       # %bb.0:
807; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
808; AVX-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
809; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
810; AVX-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
811; AVX-NEXT:    vmovd %xmm0, %eax
812; AVX-NEXT:    retq
813;
814; AVX512-LABEL: test_v4i32:
815; AVX512:       # %bb.0:
816; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
817; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
818; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
819; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
820; AVX512-NEXT:    vmovd %xmm0, %eax
821; AVX512-NEXT:    retq
822  %1 = call i32 @llvm.vector.reduce.smax.v4i32(<4 x i32> %a0)
823  ret i32 %1
824}
825
826define i32 @test_v8i32(<8 x i32> %a0) {
827; SSE2-LABEL: test_v8i32:
828; SSE2:       # %bb.0:
829; SSE2-NEXT:    movdqa %xmm0, %xmm2
830; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
831; SSE2-NEXT:    pand %xmm2, %xmm0
832; SSE2-NEXT:    pandn %xmm1, %xmm2
833; SSE2-NEXT:    por %xmm0, %xmm2
834; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
835; SSE2-NEXT:    movdqa %xmm2, %xmm1
836; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
837; SSE2-NEXT:    pand %xmm1, %xmm2
838; SSE2-NEXT:    pandn %xmm0, %xmm1
839; SSE2-NEXT:    por %xmm2, %xmm1
840; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
841; SSE2-NEXT:    movdqa %xmm1, %xmm2
842; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
843; SSE2-NEXT:    pand %xmm2, %xmm1
844; SSE2-NEXT:    pandn %xmm0, %xmm2
845; SSE2-NEXT:    por %xmm1, %xmm2
846; SSE2-NEXT:    movd %xmm2, %eax
847; SSE2-NEXT:    retq
848;
849; SSE4-LABEL: test_v8i32:
850; SSE4:       # %bb.0:
851; SSE4-NEXT:    pmaxsd %xmm1, %xmm0
852; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
853; SSE4-NEXT:    pmaxsd %xmm0, %xmm1
854; SSE4-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
855; SSE4-NEXT:    pmaxsd %xmm1, %xmm0
856; SSE4-NEXT:    movd %xmm0, %eax
857; SSE4-NEXT:    retq
858;
859; AVX1-LABEL: test_v8i32:
860; AVX1:       # %bb.0:
861; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
862; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
863; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
864; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
865; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
866; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
867; AVX1-NEXT:    vmovd %xmm0, %eax
868; AVX1-NEXT:    vzeroupper
869; AVX1-NEXT:    retq
870;
871; AVX2-LABEL: test_v8i32:
872; AVX2:       # %bb.0:
873; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
874; AVX2-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
875; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
876; AVX2-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
877; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
878; AVX2-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
879; AVX2-NEXT:    vmovd %xmm0, %eax
880; AVX2-NEXT:    vzeroupper
881; AVX2-NEXT:    retq
882;
883; AVX512-LABEL: test_v8i32:
884; AVX512:       # %bb.0:
885; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
886; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
887; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
888; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
889; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
890; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
891; AVX512-NEXT:    vmovd %xmm0, %eax
892; AVX512-NEXT:    vzeroupper
893; AVX512-NEXT:    retq
894  %1 = call i32 @llvm.vector.reduce.smax.v8i32(<8 x i32> %a0)
895  ret i32 %1
896}
897
898define i32 @test_v16i32(<16 x i32> %a0) {
899; SSE2-LABEL: test_v16i32:
900; SSE2:       # %bb.0:
901; SSE2-NEXT:    movdqa %xmm1, %xmm4
902; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
903; SSE2-NEXT:    pand %xmm4, %xmm1
904; SSE2-NEXT:    pandn %xmm3, %xmm4
905; SSE2-NEXT:    por %xmm1, %xmm4
906; SSE2-NEXT:    movdqa %xmm0, %xmm1
907; SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
908; SSE2-NEXT:    pand %xmm1, %xmm0
909; SSE2-NEXT:    pandn %xmm2, %xmm1
910; SSE2-NEXT:    por %xmm0, %xmm1
911; SSE2-NEXT:    movdqa %xmm1, %xmm0
912; SSE2-NEXT:    pcmpgtd %xmm4, %xmm0
913; SSE2-NEXT:    pand %xmm0, %xmm1
914; SSE2-NEXT:    pandn %xmm4, %xmm0
915; SSE2-NEXT:    por %xmm1, %xmm0
916; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
917; SSE2-NEXT:    movdqa %xmm0, %xmm2
918; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
919; SSE2-NEXT:    pand %xmm2, %xmm0
920; SSE2-NEXT:    pandn %xmm1, %xmm2
921; SSE2-NEXT:    por %xmm0, %xmm2
922; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
923; SSE2-NEXT:    movdqa %xmm2, %xmm1
924; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
925; SSE2-NEXT:    pand %xmm1, %xmm2
926; SSE2-NEXT:    pandn %xmm0, %xmm1
927; SSE2-NEXT:    por %xmm2, %xmm1
928; SSE2-NEXT:    movd %xmm1, %eax
929; SSE2-NEXT:    retq
930;
931; SSE4-LABEL: test_v16i32:
932; SSE4:       # %bb.0:
933; SSE4-NEXT:    pmaxsd %xmm3, %xmm1
934; SSE4-NEXT:    pmaxsd %xmm2, %xmm1
935; SSE4-NEXT:    pmaxsd %xmm0, %xmm1
936; SSE4-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
937; SSE4-NEXT:    pmaxsd %xmm1, %xmm0
938; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
939; SSE4-NEXT:    pmaxsd %xmm0, %xmm1
940; SSE4-NEXT:    movd %xmm1, %eax
941; SSE4-NEXT:    retq
942;
943; AVX1-LABEL: test_v16i32:
944; AVX1:       # %bb.0:
945; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
946; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
947; AVX1-NEXT:    vpmaxsd %xmm2, %xmm3, %xmm2
948; AVX1-NEXT:    vpmaxsd %xmm2, %xmm1, %xmm1
949; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
950; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
951; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
952; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
953; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
954; AVX1-NEXT:    vmovd %xmm0, %eax
955; AVX1-NEXT:    vzeroupper
956; AVX1-NEXT:    retq
957;
958; AVX2-LABEL: test_v16i32:
959; AVX2:       # %bb.0:
960; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
961; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
962; AVX2-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
963; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
964; AVX2-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
965; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
966; AVX2-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
967; AVX2-NEXT:    vmovd %xmm0, %eax
968; AVX2-NEXT:    vzeroupper
969; AVX2-NEXT:    retq
970;
971; AVX512-LABEL: test_v16i32:
972; AVX512:       # %bb.0:
973; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
974; AVX512-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
975; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
976; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
977; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
978; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
979; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
980; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
981; AVX512-NEXT:    vmovd %xmm0, %eax
982; AVX512-NEXT:    vzeroupper
983; AVX512-NEXT:    retq
984  %1 = call i32 @llvm.vector.reduce.smax.v16i32(<16 x i32> %a0)
985  ret i32 %1
986}
987
988define i32 @test_v32i32(<32 x i32> %a0) {
989; SSE2-LABEL: test_v32i32:
990; SSE2:       # %bb.0:
991; SSE2-NEXT:    movdqa %xmm2, %xmm8
992; SSE2-NEXT:    pcmpgtd %xmm6, %xmm8
993; SSE2-NEXT:    pand %xmm8, %xmm2
994; SSE2-NEXT:    pandn %xmm6, %xmm8
995; SSE2-NEXT:    por %xmm2, %xmm8
996; SSE2-NEXT:    movdqa %xmm0, %xmm2
997; SSE2-NEXT:    pcmpgtd %xmm4, %xmm2
998; SSE2-NEXT:    pand %xmm2, %xmm0
999; SSE2-NEXT:    pandn %xmm4, %xmm2
1000; SSE2-NEXT:    por %xmm0, %xmm2
1001; SSE2-NEXT:    movdqa %xmm3, %xmm0
1002; SSE2-NEXT:    pcmpgtd %xmm7, %xmm0
1003; SSE2-NEXT:    pand %xmm0, %xmm3
1004; SSE2-NEXT:    pandn %xmm7, %xmm0
1005; SSE2-NEXT:    por %xmm3, %xmm0
1006; SSE2-NEXT:    movdqa %xmm1, %xmm3
1007; SSE2-NEXT:    pcmpgtd %xmm5, %xmm3
1008; SSE2-NEXT:    pand %xmm3, %xmm1
1009; SSE2-NEXT:    pandn %xmm5, %xmm3
1010; SSE2-NEXT:    por %xmm1, %xmm3
1011; SSE2-NEXT:    movdqa %xmm3, %xmm1
1012; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1013; SSE2-NEXT:    pand %xmm1, %xmm3
1014; SSE2-NEXT:    pandn %xmm0, %xmm1
1015; SSE2-NEXT:    por %xmm3, %xmm1
1016; SSE2-NEXT:    movdqa %xmm2, %xmm0
1017; SSE2-NEXT:    pcmpgtd %xmm8, %xmm0
1018; SSE2-NEXT:    pand %xmm0, %xmm2
1019; SSE2-NEXT:    pandn %xmm8, %xmm0
1020; SSE2-NEXT:    por %xmm2, %xmm0
1021; SSE2-NEXT:    movdqa %xmm0, %xmm2
1022; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1023; SSE2-NEXT:    pand %xmm2, %xmm0
1024; SSE2-NEXT:    pandn %xmm1, %xmm2
1025; SSE2-NEXT:    por %xmm0, %xmm2
1026; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
1027; SSE2-NEXT:    movdqa %xmm2, %xmm1
1028; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1029; SSE2-NEXT:    pand %xmm1, %xmm2
1030; SSE2-NEXT:    pandn %xmm0, %xmm1
1031; SSE2-NEXT:    por %xmm2, %xmm1
1032; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
1033; SSE2-NEXT:    movdqa %xmm1, %xmm2
1034; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
1035; SSE2-NEXT:    pand %xmm2, %xmm1
1036; SSE2-NEXT:    pandn %xmm0, %xmm2
1037; SSE2-NEXT:    por %xmm1, %xmm2
1038; SSE2-NEXT:    movd %xmm2, %eax
1039; SSE2-NEXT:    retq
1040;
1041; SSE4-LABEL: test_v32i32:
1042; SSE4:       # %bb.0:
1043; SSE4-NEXT:    pmaxsd %xmm6, %xmm2
1044; SSE4-NEXT:    pmaxsd %xmm7, %xmm3
1045; SSE4-NEXT:    pmaxsd %xmm5, %xmm3
1046; SSE4-NEXT:    pmaxsd %xmm1, %xmm3
1047; SSE4-NEXT:    pmaxsd %xmm4, %xmm2
1048; SSE4-NEXT:    pmaxsd %xmm3, %xmm2
1049; SSE4-NEXT:    pmaxsd %xmm0, %xmm2
1050; SSE4-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
1051; SSE4-NEXT:    pmaxsd %xmm2, %xmm0
1052; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1053; SSE4-NEXT:    pmaxsd %xmm0, %xmm1
1054; SSE4-NEXT:    movd %xmm1, %eax
1055; SSE4-NEXT:    retq
1056;
1057; AVX1-LABEL: test_v32i32:
1058; AVX1:       # %bb.0:
1059; AVX1-NEXT:    vpmaxsd %xmm3, %xmm1, %xmm4
1060; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
1061; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1062; AVX1-NEXT:    vpmaxsd %xmm3, %xmm1, %xmm1
1063; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
1064; AVX1-NEXT:    vpmaxsd %xmm1, %xmm3, %xmm1
1065; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1066; AVX1-NEXT:    vpmaxsd %xmm1, %xmm3, %xmm1
1067; AVX1-NEXT:    vpmaxsd %xmm4, %xmm2, %xmm2
1068; AVX1-NEXT:    vpmaxsd %xmm1, %xmm2, %xmm1
1069; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
1070; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1071; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
1072; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1073; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
1074; AVX1-NEXT:    vmovd %xmm0, %eax
1075; AVX1-NEXT:    vzeroupper
1076; AVX1-NEXT:    retq
1077;
1078; AVX2-LABEL: test_v32i32:
1079; AVX2:       # %bb.0:
1080; AVX2-NEXT:    vpmaxsd %ymm3, %ymm1, %ymm1
1081; AVX2-NEXT:    vpmaxsd %ymm1, %ymm2, %ymm1
1082; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
1083; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1084; AVX2-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
1085; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1086; AVX2-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
1087; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1088; AVX2-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
1089; AVX2-NEXT:    vmovd %xmm0, %eax
1090; AVX2-NEXT:    vzeroupper
1091; AVX2-NEXT:    retq
1092;
1093; AVX512-LABEL: test_v32i32:
1094; AVX512:       # %bb.0:
1095; AVX512-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
1096; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1097; AVX512-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
1098; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1099; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
1100; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1101; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
1102; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1103; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
1104; AVX512-NEXT:    vmovd %xmm0, %eax
1105; AVX512-NEXT:    vzeroupper
1106; AVX512-NEXT:    retq
1107  %1 = call i32 @llvm.vector.reduce.smax.v32i32(<32 x i32> %a0)
1108  ret i32 %1
1109}
1110
1111;
1112; vXi16
1113;
1114
1115define i16 @test_v2i16(<2 x i16> %a0) {
1116; SSE-LABEL: test_v2i16:
1117; SSE:       # %bb.0:
1118; SSE-NEXT:    movdqa %xmm0, %xmm1
1119; SSE-NEXT:    psrld $16, %xmm1
1120; SSE-NEXT:    pmaxsw %xmm0, %xmm1
1121; SSE-NEXT:    movd %xmm1, %eax
1122; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
1123; SSE-NEXT:    retq
1124;
1125; AVX-LABEL: test_v2i16:
1126; AVX:       # %bb.0:
1127; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
1128; AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1129; AVX-NEXT:    vmovd %xmm0, %eax
1130; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
1131; AVX-NEXT:    retq
1132;
1133; AVX512-LABEL: test_v2i16:
1134; AVX512:       # %bb.0:
1135; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1136; AVX512-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1137; AVX512-NEXT:    vmovd %xmm0, %eax
1138; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1139; AVX512-NEXT:    retq
1140  %1 = call i16 @llvm.vector.reduce.smax.v2i16(<2 x i16> %a0)
1141  ret i16 %1
1142}
1143
1144define i16 @test_v4i16(<4 x i16> %a0) {
1145; SSE-LABEL: test_v4i16:
1146; SSE:       # %bb.0:
1147; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1148; SSE-NEXT:    pmaxsw %xmm0, %xmm1
1149; SSE-NEXT:    movdqa %xmm1, %xmm0
1150; SSE-NEXT:    psrld $16, %xmm0
1151; SSE-NEXT:    pmaxsw %xmm1, %xmm0
1152; SSE-NEXT:    movd %xmm0, %eax
1153; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
1154; SSE-NEXT:    retq
1155;
1156; AVX-LABEL: test_v4i16:
1157; AVX:       # %bb.0:
1158; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1159; AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1160; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
1161; AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1162; AVX-NEXT:    vmovd %xmm0, %eax
1163; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
1164; AVX-NEXT:    retq
1165;
1166; AVX512-LABEL: test_v4i16:
1167; AVX512:       # %bb.0:
1168; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1169; AVX512-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1170; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1171; AVX512-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1172; AVX512-NEXT:    vmovd %xmm0, %eax
1173; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1174; AVX512-NEXT:    retq
1175  %1 = call i16 @llvm.vector.reduce.smax.v4i16(<4 x i16> %a0)
1176  ret i16 %1
1177}
1178
1179define i16 @test_v8i16(<8 x i16> %a0) {
1180; SSE2-LABEL: test_v8i16:
1181; SSE2:       # %bb.0:
1182; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1183; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
1184; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
1185; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
1186; SSE2-NEXT:    movdqa %xmm0, %xmm1
1187; SSE2-NEXT:    psrld $16, %xmm1
1188; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
1189; SSE2-NEXT:    movd %xmm1, %eax
1190; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1191; SSE2-NEXT:    retq
1192;
1193; SSE4-LABEL: test_v8i16:
1194; SSE4:       # %bb.0:
1195; SSE4-NEXT:    pxor {{.*}}(%rip), %xmm0
1196; SSE4-NEXT:    phminposuw %xmm0, %xmm0
1197; SSE4-NEXT:    movd %xmm0, %eax
1198; SSE4-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1199; SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
1200; SSE4-NEXT:    retq
1201;
1202; AVX-LABEL: test_v8i16:
1203; AVX:       # %bb.0:
1204; AVX-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1205; AVX-NEXT:    vphminposuw %xmm0, %xmm0
1206; AVX-NEXT:    vmovd %xmm0, %eax
1207; AVX-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1208; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
1209; AVX-NEXT:    retq
1210;
1211; AVX512-LABEL: test_v8i16:
1212; AVX512:       # %bb.0:
1213; AVX512-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1214; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1215; AVX512-NEXT:    vmovd %xmm0, %eax
1216; AVX512-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1217; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1218; AVX512-NEXT:    retq
1219  %1 = call i16 @llvm.vector.reduce.smax.v8i16(<8 x i16> %a0)
1220  ret i16 %1
1221}
1222
1223define i16 @test_v16i16(<16 x i16> %a0) {
1224; SSE2-LABEL: test_v16i16:
1225; SSE2:       # %bb.0:
1226; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
1227; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1228; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
1229; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
1230; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
1231; SSE2-NEXT:    movdqa %xmm0, %xmm1
1232; SSE2-NEXT:    psrld $16, %xmm1
1233; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
1234; SSE2-NEXT:    movd %xmm1, %eax
1235; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1236; SSE2-NEXT:    retq
1237;
1238; SSE4-LABEL: test_v16i16:
1239; SSE4:       # %bb.0:
1240; SSE4-NEXT:    pmaxsw %xmm1, %xmm0
1241; SSE4-NEXT:    pxor {{.*}}(%rip), %xmm0
1242; SSE4-NEXT:    phminposuw %xmm0, %xmm0
1243; SSE4-NEXT:    movd %xmm0, %eax
1244; SSE4-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1245; SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
1246; SSE4-NEXT:    retq
1247;
1248; AVX1-LABEL: test_v16i16:
1249; AVX1:       # %bb.0:
1250; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1251; AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1252; AVX1-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1253; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1254; AVX1-NEXT:    vmovd %xmm0, %eax
1255; AVX1-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1256; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
1257; AVX1-NEXT:    vzeroupper
1258; AVX1-NEXT:    retq
1259;
1260; AVX2-LABEL: test_v16i16:
1261; AVX2:       # %bb.0:
1262; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1263; AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1264; AVX2-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1265; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1266; AVX2-NEXT:    vmovd %xmm0, %eax
1267; AVX2-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1268; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
1269; AVX2-NEXT:    vzeroupper
1270; AVX2-NEXT:    retq
1271;
1272; AVX512-LABEL: test_v16i16:
1273; AVX512:       # %bb.0:
1274; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1275; AVX512-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1276; AVX512-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1277; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1278; AVX512-NEXT:    vmovd %xmm0, %eax
1279; AVX512-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1280; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1281; AVX512-NEXT:    vzeroupper
1282; AVX512-NEXT:    retq
1283  %1 = call i16 @llvm.vector.reduce.smax.v16i16(<16 x i16> %a0)
1284  ret i16 %1
1285}
1286
1287define i16 @test_v32i16(<32 x i16> %a0) {
1288; SSE2-LABEL: test_v32i16:
1289; SSE2:       # %bb.0:
1290; SSE2-NEXT:    pmaxsw %xmm3, %xmm1
1291; SSE2-NEXT:    pmaxsw %xmm2, %xmm1
1292; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
1293; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
1294; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
1295; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1296; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
1297; SSE2-NEXT:    movdqa %xmm1, %xmm0
1298; SSE2-NEXT:    psrld $16, %xmm0
1299; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
1300; SSE2-NEXT:    movd %xmm0, %eax
1301; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1302; SSE2-NEXT:    retq
1303;
1304; SSE4-LABEL: test_v32i16:
1305; SSE4:       # %bb.0:
1306; SSE4-NEXT:    pmaxsw %xmm3, %xmm1
1307; SSE4-NEXT:    pmaxsw %xmm2, %xmm1
1308; SSE4-NEXT:    pmaxsw %xmm0, %xmm1
1309; SSE4-NEXT:    pxor {{.*}}(%rip), %xmm1
1310; SSE4-NEXT:    phminposuw %xmm1, %xmm0
1311; SSE4-NEXT:    movd %xmm0, %eax
1312; SSE4-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1313; SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
1314; SSE4-NEXT:    retq
1315;
1316; AVX1-LABEL: test_v32i16:
1317; AVX1:       # %bb.0:
1318; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1319; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1320; AVX1-NEXT:    vpmaxsw %xmm2, %xmm3, %xmm2
1321; AVX1-NEXT:    vpmaxsw %xmm2, %xmm1, %xmm1
1322; AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1323; AVX1-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1324; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1325; AVX1-NEXT:    vmovd %xmm0, %eax
1326; AVX1-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1327; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
1328; AVX1-NEXT:    vzeroupper
1329; AVX1-NEXT:    retq
1330;
1331; AVX2-LABEL: test_v32i16:
1332; AVX2:       # %bb.0:
1333; AVX2-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
1334; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1335; AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1336; AVX2-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1337; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1338; AVX2-NEXT:    vmovd %xmm0, %eax
1339; AVX2-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1340; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
1341; AVX2-NEXT:    vzeroupper
1342; AVX2-NEXT:    retq
1343;
1344; AVX512-LABEL: test_v32i16:
1345; AVX512:       # %bb.0:
1346; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1347; AVX512-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
1348; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1349; AVX512-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1350; AVX512-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1351; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1352; AVX512-NEXT:    vmovd %xmm0, %eax
1353; AVX512-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1354; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1355; AVX512-NEXT:    vzeroupper
1356; AVX512-NEXT:    retq
1357  %1 = call i16 @llvm.vector.reduce.smax.v32i16(<32 x i16> %a0)
1358  ret i16 %1
1359}
1360
1361define i16 @test_v64i16(<64 x i16> %a0) {
1362; SSE2-LABEL: test_v64i16:
1363; SSE2:       # %bb.0:
1364; SSE2-NEXT:    pmaxsw %xmm6, %xmm2
1365; SSE2-NEXT:    pmaxsw %xmm7, %xmm3
1366; SSE2-NEXT:    pmaxsw %xmm5, %xmm3
1367; SSE2-NEXT:    pmaxsw %xmm1, %xmm3
1368; SSE2-NEXT:    pmaxsw %xmm4, %xmm2
1369; SSE2-NEXT:    pmaxsw %xmm3, %xmm2
1370; SSE2-NEXT:    pmaxsw %xmm0, %xmm2
1371; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
1372; SSE2-NEXT:    pmaxsw %xmm2, %xmm0
1373; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1374; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
1375; SSE2-NEXT:    movdqa %xmm1, %xmm0
1376; SSE2-NEXT:    psrld $16, %xmm0
1377; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
1378; SSE2-NEXT:    movd %xmm0, %eax
1379; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
1380; SSE2-NEXT:    retq
1381;
1382; SSE4-LABEL: test_v64i16:
1383; SSE4:       # %bb.0:
1384; SSE4-NEXT:    pmaxsw %xmm7, %xmm3
1385; SSE4-NEXT:    pmaxsw %xmm5, %xmm3
1386; SSE4-NEXT:    pmaxsw %xmm1, %xmm3
1387; SSE4-NEXT:    pmaxsw %xmm6, %xmm2
1388; SSE4-NEXT:    pmaxsw %xmm4, %xmm2
1389; SSE4-NEXT:    pmaxsw %xmm3, %xmm2
1390; SSE4-NEXT:    pmaxsw %xmm0, %xmm2
1391; SSE4-NEXT:    pxor {{.*}}(%rip), %xmm2
1392; SSE4-NEXT:    phminposuw %xmm2, %xmm0
1393; SSE4-NEXT:    movd %xmm0, %eax
1394; SSE4-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1395; SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
1396; SSE4-NEXT:    retq
1397;
1398; AVX1-LABEL: test_v64i16:
1399; AVX1:       # %bb.0:
1400; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
1401; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
1402; AVX1-NEXT:    vpmaxsw %xmm4, %xmm5, %xmm4
1403; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
1404; AVX1-NEXT:    vpmaxsw %xmm4, %xmm5, %xmm4
1405; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
1406; AVX1-NEXT:    vpmaxsw %xmm4, %xmm5, %xmm4
1407; AVX1-NEXT:    vpmaxsw %xmm3, %xmm1, %xmm1
1408; AVX1-NEXT:    vpmaxsw %xmm1, %xmm2, %xmm1
1409; AVX1-NEXT:    vpmaxsw %xmm4, %xmm1, %xmm1
1410; AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1411; AVX1-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1412; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1413; AVX1-NEXT:    vmovd %xmm0, %eax
1414; AVX1-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1415; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
1416; AVX1-NEXT:    vzeroupper
1417; AVX1-NEXT:    retq
1418;
1419; AVX2-LABEL: test_v64i16:
1420; AVX2:       # %bb.0:
1421; AVX2-NEXT:    vpmaxsw %ymm3, %ymm1, %ymm1
1422; AVX2-NEXT:    vpmaxsw %ymm1, %ymm2, %ymm1
1423; AVX2-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
1424; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1425; AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1426; AVX2-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1427; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1428; AVX2-NEXT:    vmovd %xmm0, %eax
1429; AVX2-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1430; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
1431; AVX2-NEXT:    vzeroupper
1432; AVX2-NEXT:    retq
1433;
1434; AVX512-LABEL: test_v64i16:
1435; AVX512:       # %bb.0:
1436; AVX512-NEXT:    vpmaxsw %zmm1, %zmm0, %zmm0
1437; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1438; AVX512-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
1439; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1440; AVX512-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
1441; AVX512-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1442; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1443; AVX512-NEXT:    vmovd %xmm0, %eax
1444; AVX512-NEXT:    xorl $32767, %eax # imm = 0x7FFF
1445; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
1446; AVX512-NEXT:    vzeroupper
1447; AVX512-NEXT:    retq
1448  %1 = call i16 @llvm.vector.reduce.smax.v64i16(<64 x i16> %a0)
1449  ret i16 %1
1450}
1451
1452;
1453; vXi8
1454;
1455
1456define i8 @test_v2i8(<2 x i8> %a0) {
1457; SSE2-LABEL: test_v2i8:
1458; SSE2:       # %bb.0:
1459; SSE2-NEXT:    movdqa %xmm0, %xmm1
1460; SSE2-NEXT:    psrlw $8, %xmm1
1461; SSE2-NEXT:    movdqa %xmm0, %xmm2
1462; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
1463; SSE2-NEXT:    pand %xmm2, %xmm0
1464; SSE2-NEXT:    pandn %xmm1, %xmm2
1465; SSE2-NEXT:    por %xmm0, %xmm2
1466; SSE2-NEXT:    movd %xmm2, %eax
1467; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1468; SSE2-NEXT:    retq
1469;
1470; SSE4-LABEL: test_v2i8:
1471; SSE4:       # %bb.0:
1472; SSE4-NEXT:    movdqa %xmm0, %xmm1
1473; SSE4-NEXT:    psrlw $8, %xmm1
1474; SSE4-NEXT:    pmaxsb %xmm0, %xmm1
1475; SSE4-NEXT:    movd %xmm1, %eax
1476; SSE4-NEXT:    # kill: def $al killed $al killed $eax
1477; SSE4-NEXT:    retq
1478;
1479; AVX-LABEL: test_v2i8:
1480; AVX:       # %bb.0:
1481; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
1482; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1483; AVX-NEXT:    vmovd %xmm0, %eax
1484; AVX-NEXT:    # kill: def $al killed $al killed $eax
1485; AVX-NEXT:    retq
1486;
1487; AVX512-LABEL: test_v2i8:
1488; AVX512:       # %bb.0:
1489; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1490; AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1491; AVX512-NEXT:    vmovd %xmm0, %eax
1492; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1493; AVX512-NEXT:    retq
1494  %1 = call i8 @llvm.vector.reduce.smax.v2i8(<2 x i8> %a0)
1495  ret i8 %1
1496}
1497
1498define i8 @test_v4i8(<4 x i8> %a0) {
1499; SSE2-LABEL: test_v4i8:
1500; SSE2:       # %bb.0:
1501; SSE2-NEXT:    movdqa %xmm0, %xmm1
1502; SSE2-NEXT:    psrld $16, %xmm1
1503; SSE2-NEXT:    movdqa %xmm0, %xmm2
1504; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
1505; SSE2-NEXT:    pand %xmm2, %xmm0
1506; SSE2-NEXT:    pandn %xmm1, %xmm2
1507; SSE2-NEXT:    por %xmm0, %xmm2
1508; SSE2-NEXT:    movdqa %xmm2, %xmm0
1509; SSE2-NEXT:    psrlw $8, %xmm0
1510; SSE2-NEXT:    movdqa %xmm2, %xmm1
1511; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
1512; SSE2-NEXT:    pand %xmm1, %xmm2
1513; SSE2-NEXT:    pandn %xmm0, %xmm1
1514; SSE2-NEXT:    por %xmm2, %xmm1
1515; SSE2-NEXT:    movd %xmm1, %eax
1516; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1517; SSE2-NEXT:    retq
1518;
1519; SSE4-LABEL: test_v4i8:
1520; SSE4:       # %bb.0:
1521; SSE4-NEXT:    movdqa %xmm0, %xmm1
1522; SSE4-NEXT:    psrld $16, %xmm1
1523; SSE4-NEXT:    pmaxsb %xmm0, %xmm1
1524; SSE4-NEXT:    movdqa %xmm1, %xmm0
1525; SSE4-NEXT:    psrlw $8, %xmm0
1526; SSE4-NEXT:    pmaxsb %xmm1, %xmm0
1527; SSE4-NEXT:    movd %xmm0, %eax
1528; SSE4-NEXT:    # kill: def $al killed $al killed $eax
1529; SSE4-NEXT:    retq
1530;
1531; AVX-LABEL: test_v4i8:
1532; AVX:       # %bb.0:
1533; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
1534; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1535; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
1536; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1537; AVX-NEXT:    vmovd %xmm0, %eax
1538; AVX-NEXT:    # kill: def $al killed $al killed $eax
1539; AVX-NEXT:    retq
1540;
1541; AVX512-LABEL: test_v4i8:
1542; AVX512:       # %bb.0:
1543; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1544; AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1545; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1546; AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1547; AVX512-NEXT:    vmovd %xmm0, %eax
1548; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1549; AVX512-NEXT:    retq
1550  %1 = call i8 @llvm.vector.reduce.smax.v4i8(<4 x i8> %a0)
1551  ret i8 %1
1552}
1553
1554define i8 @test_v8i8(<8 x i8> %a0) {
1555; SSE2-LABEL: test_v8i8:
1556; SSE2:       # %bb.0:
1557; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1558; SSE2-NEXT:    movdqa %xmm0, %xmm2
1559; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
1560; SSE2-NEXT:    pand %xmm2, %xmm0
1561; SSE2-NEXT:    pandn %xmm1, %xmm2
1562; SSE2-NEXT:    por %xmm0, %xmm2
1563; SSE2-NEXT:    movdqa %xmm2, %xmm0
1564; SSE2-NEXT:    psrld $16, %xmm0
1565; SSE2-NEXT:    movdqa %xmm2, %xmm1
1566; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
1567; SSE2-NEXT:    pand %xmm1, %xmm2
1568; SSE2-NEXT:    pandn %xmm0, %xmm1
1569; SSE2-NEXT:    por %xmm2, %xmm1
1570; SSE2-NEXT:    movdqa %xmm1, %xmm0
1571; SSE2-NEXT:    psrlw $8, %xmm0
1572; SSE2-NEXT:    movdqa %xmm1, %xmm2
1573; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
1574; SSE2-NEXT:    pand %xmm2, %xmm1
1575; SSE2-NEXT:    pandn %xmm0, %xmm2
1576; SSE2-NEXT:    por %xmm1, %xmm2
1577; SSE2-NEXT:    movd %xmm2, %eax
1578; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1579; SSE2-NEXT:    retq
1580;
1581; SSE4-LABEL: test_v8i8:
1582; SSE4:       # %bb.0:
1583; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1584; SSE4-NEXT:    pmaxsb %xmm0, %xmm1
1585; SSE4-NEXT:    movdqa %xmm1, %xmm0
1586; SSE4-NEXT:    psrld $16, %xmm0
1587; SSE4-NEXT:    pmaxsb %xmm1, %xmm0
1588; SSE4-NEXT:    movdqa %xmm0, %xmm1
1589; SSE4-NEXT:    psrlw $8, %xmm1
1590; SSE4-NEXT:    pmaxsb %xmm0, %xmm1
1591; SSE4-NEXT:    movd %xmm1, %eax
1592; SSE4-NEXT:    # kill: def $al killed $al killed $eax
1593; SSE4-NEXT:    retq
1594;
1595; AVX-LABEL: test_v8i8:
1596; AVX:       # %bb.0:
1597; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1598; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1599; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
1600; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1601; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
1602; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1603; AVX-NEXT:    vmovd %xmm0, %eax
1604; AVX-NEXT:    # kill: def $al killed $al killed $eax
1605; AVX-NEXT:    retq
1606;
1607; AVX512-LABEL: test_v8i8:
1608; AVX512:       # %bb.0:
1609; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1610; AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1611; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1612; AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1613; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1614; AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1615; AVX512-NEXT:    vmovd %xmm0, %eax
1616; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1617; AVX512-NEXT:    retq
1618  %1 = call i8 @llvm.vector.reduce.smax.v8i8(<8 x i8> %a0)
1619  ret i8 %1
1620}
1621
1622define i8 @test_v16i8(<16 x i8> %a0) {
1623; SSE2-LABEL: test_v16i8:
1624; SSE2:       # %bb.0:
1625; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1626; SSE2-NEXT:    movdqa %xmm0, %xmm2
1627; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
1628; SSE2-NEXT:    pand %xmm2, %xmm0
1629; SSE2-NEXT:    pandn %xmm1, %xmm2
1630; SSE2-NEXT:    por %xmm0, %xmm2
1631; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
1632; SSE2-NEXT:    movdqa %xmm2, %xmm1
1633; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
1634; SSE2-NEXT:    pand %xmm1, %xmm2
1635; SSE2-NEXT:    pandn %xmm0, %xmm1
1636; SSE2-NEXT:    por %xmm2, %xmm1
1637; SSE2-NEXT:    movdqa %xmm1, %xmm0
1638; SSE2-NEXT:    psrld $16, %xmm0
1639; SSE2-NEXT:    movdqa %xmm1, %xmm2
1640; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
1641; SSE2-NEXT:    pand %xmm2, %xmm1
1642; SSE2-NEXT:    pandn %xmm0, %xmm2
1643; SSE2-NEXT:    por %xmm1, %xmm2
1644; SSE2-NEXT:    movdqa %xmm2, %xmm0
1645; SSE2-NEXT:    psrlw $8, %xmm0
1646; SSE2-NEXT:    movdqa %xmm2, %xmm1
1647; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
1648; SSE2-NEXT:    pand %xmm1, %xmm2
1649; SSE2-NEXT:    pandn %xmm0, %xmm1
1650; SSE2-NEXT:    por %xmm2, %xmm1
1651; SSE2-NEXT:    movd %xmm1, %eax
1652; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1653; SSE2-NEXT:    retq
1654;
1655; SSE4-LABEL: test_v16i8:
1656; SSE4:       # %bb.0:
1657; SSE4-NEXT:    pxor {{.*}}(%rip), %xmm0
1658; SSE4-NEXT:    movdqa %xmm0, %xmm1
1659; SSE4-NEXT:    psrlw $8, %xmm1
1660; SSE4-NEXT:    pminub %xmm0, %xmm1
1661; SSE4-NEXT:    phminposuw %xmm1, %xmm0
1662; SSE4-NEXT:    movd %xmm0, %eax
1663; SSE4-NEXT:    xorb $127, %al
1664; SSE4-NEXT:    # kill: def $al killed $al killed $eax
1665; SSE4-NEXT:    retq
1666;
1667; AVX-LABEL: test_v16i8:
1668; AVX:       # %bb.0:
1669; AVX-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1670; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
1671; AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1672; AVX-NEXT:    vphminposuw %xmm0, %xmm0
1673; AVX-NEXT:    vmovd %xmm0, %eax
1674; AVX-NEXT:    xorb $127, %al
1675; AVX-NEXT:    # kill: def $al killed $al killed $eax
1676; AVX-NEXT:    retq
1677;
1678; AVX512-LABEL: test_v16i8:
1679; AVX512:       # %bb.0:
1680; AVX512-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1681; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1682; AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1683; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1684; AVX512-NEXT:    vmovd %xmm0, %eax
1685; AVX512-NEXT:    xorb $127, %al
1686; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1687; AVX512-NEXT:    retq
1688  %1 = call i8 @llvm.vector.reduce.smax.v16i8(<16 x i8> %a0)
1689  ret i8 %1
1690}
1691
1692define i8 @test_v32i8(<32 x i8> %a0) {
1693; SSE2-LABEL: test_v32i8:
1694; SSE2:       # %bb.0:
1695; SSE2-NEXT:    movdqa %xmm0, %xmm2
1696; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
1697; SSE2-NEXT:    pand %xmm2, %xmm0
1698; SSE2-NEXT:    pandn %xmm1, %xmm2
1699; SSE2-NEXT:    por %xmm0, %xmm2
1700; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
1701; SSE2-NEXT:    movdqa %xmm2, %xmm1
1702; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
1703; SSE2-NEXT:    pand %xmm1, %xmm2
1704; SSE2-NEXT:    pandn %xmm0, %xmm1
1705; SSE2-NEXT:    por %xmm2, %xmm1
1706; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
1707; SSE2-NEXT:    movdqa %xmm1, %xmm2
1708; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
1709; SSE2-NEXT:    pand %xmm2, %xmm1
1710; SSE2-NEXT:    pandn %xmm0, %xmm2
1711; SSE2-NEXT:    por %xmm1, %xmm2
1712; SSE2-NEXT:    movdqa %xmm2, %xmm0
1713; SSE2-NEXT:    psrld $16, %xmm0
1714; SSE2-NEXT:    movdqa %xmm2, %xmm1
1715; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
1716; SSE2-NEXT:    pand %xmm1, %xmm2
1717; SSE2-NEXT:    pandn %xmm0, %xmm1
1718; SSE2-NEXT:    por %xmm2, %xmm1
1719; SSE2-NEXT:    movdqa %xmm1, %xmm0
1720; SSE2-NEXT:    psrlw $8, %xmm0
1721; SSE2-NEXT:    movdqa %xmm1, %xmm2
1722; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
1723; SSE2-NEXT:    pand %xmm2, %xmm1
1724; SSE2-NEXT:    pandn %xmm0, %xmm2
1725; SSE2-NEXT:    por %xmm1, %xmm2
1726; SSE2-NEXT:    movd %xmm2, %eax
1727; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1728; SSE2-NEXT:    retq
1729;
1730; SSE4-LABEL: test_v32i8:
1731; SSE4:       # %bb.0:
1732; SSE4-NEXT:    pmaxsb %xmm1, %xmm0
1733; SSE4-NEXT:    pxor {{.*}}(%rip), %xmm0
1734; SSE4-NEXT:    movdqa %xmm0, %xmm1
1735; SSE4-NEXT:    psrlw $8, %xmm1
1736; SSE4-NEXT:    pminub %xmm0, %xmm1
1737; SSE4-NEXT:    phminposuw %xmm1, %xmm0
1738; SSE4-NEXT:    movd %xmm0, %eax
1739; SSE4-NEXT:    xorb $127, %al
1740; SSE4-NEXT:    # kill: def $al killed $al killed $eax
1741; SSE4-NEXT:    retq
1742;
1743; AVX1-LABEL: test_v32i8:
1744; AVX1:       # %bb.0:
1745; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1746; AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1747; AVX1-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1748; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
1749; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1750; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1751; AVX1-NEXT:    vmovd %xmm0, %eax
1752; AVX1-NEXT:    xorb $127, %al
1753; AVX1-NEXT:    # kill: def $al killed $al killed $eax
1754; AVX1-NEXT:    vzeroupper
1755; AVX1-NEXT:    retq
1756;
1757; AVX2-LABEL: test_v32i8:
1758; AVX2:       # %bb.0:
1759; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1760; AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1761; AVX2-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1762; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
1763; AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1764; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1765; AVX2-NEXT:    vmovd %xmm0, %eax
1766; AVX2-NEXT:    xorb $127, %al
1767; AVX2-NEXT:    # kill: def $al killed $al killed $eax
1768; AVX2-NEXT:    vzeroupper
1769; AVX2-NEXT:    retq
1770;
1771; AVX512-LABEL: test_v32i8:
1772; AVX512:       # %bb.0:
1773; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1774; AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1775; AVX512-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1776; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1777; AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1778; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1779; AVX512-NEXT:    vmovd %xmm0, %eax
1780; AVX512-NEXT:    xorb $127, %al
1781; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1782; AVX512-NEXT:    vzeroupper
1783; AVX512-NEXT:    retq
1784  %1 = call i8 @llvm.vector.reduce.smax.v32i8(<32 x i8> %a0)
1785  ret i8 %1
1786}
1787
1788define i8 @test_v64i8(<64 x i8> %a0) {
1789; SSE2-LABEL: test_v64i8:
1790; SSE2:       # %bb.0:
1791; SSE2-NEXT:    movdqa %xmm1, %xmm4
1792; SSE2-NEXT:    pcmpgtb %xmm3, %xmm4
1793; SSE2-NEXT:    pand %xmm4, %xmm1
1794; SSE2-NEXT:    pandn %xmm3, %xmm4
1795; SSE2-NEXT:    por %xmm1, %xmm4
1796; SSE2-NEXT:    movdqa %xmm0, %xmm1
1797; SSE2-NEXT:    pcmpgtb %xmm2, %xmm1
1798; SSE2-NEXT:    pand %xmm1, %xmm0
1799; SSE2-NEXT:    pandn %xmm2, %xmm1
1800; SSE2-NEXT:    por %xmm0, %xmm1
1801; SSE2-NEXT:    movdqa %xmm1, %xmm0
1802; SSE2-NEXT:    pcmpgtb %xmm4, %xmm0
1803; SSE2-NEXT:    pand %xmm0, %xmm1
1804; SSE2-NEXT:    pandn %xmm4, %xmm0
1805; SSE2-NEXT:    por %xmm1, %xmm0
1806; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1807; SSE2-NEXT:    movdqa %xmm0, %xmm2
1808; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
1809; SSE2-NEXT:    pand %xmm2, %xmm0
1810; SSE2-NEXT:    pandn %xmm1, %xmm2
1811; SSE2-NEXT:    por %xmm0, %xmm2
1812; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
1813; SSE2-NEXT:    movdqa %xmm2, %xmm1
1814; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
1815; SSE2-NEXT:    pand %xmm1, %xmm2
1816; SSE2-NEXT:    pandn %xmm0, %xmm1
1817; SSE2-NEXT:    por %xmm2, %xmm1
1818; SSE2-NEXT:    movdqa %xmm1, %xmm0
1819; SSE2-NEXT:    psrld $16, %xmm0
1820; SSE2-NEXT:    movdqa %xmm1, %xmm2
1821; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
1822; SSE2-NEXT:    pand %xmm2, %xmm1
1823; SSE2-NEXT:    pandn %xmm0, %xmm2
1824; SSE2-NEXT:    por %xmm1, %xmm2
1825; SSE2-NEXT:    movdqa %xmm2, %xmm0
1826; SSE2-NEXT:    psrlw $8, %xmm0
1827; SSE2-NEXT:    movdqa %xmm2, %xmm1
1828; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
1829; SSE2-NEXT:    pand %xmm1, %xmm2
1830; SSE2-NEXT:    pandn %xmm0, %xmm1
1831; SSE2-NEXT:    por %xmm2, %xmm1
1832; SSE2-NEXT:    movd %xmm1, %eax
1833; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1834; SSE2-NEXT:    retq
1835;
1836; SSE4-LABEL: test_v64i8:
1837; SSE4:       # %bb.0:
1838; SSE4-NEXT:    pmaxsb %xmm3, %xmm1
1839; SSE4-NEXT:    pmaxsb %xmm2, %xmm1
1840; SSE4-NEXT:    pmaxsb %xmm0, %xmm1
1841; SSE4-NEXT:    pxor {{.*}}(%rip), %xmm1
1842; SSE4-NEXT:    movdqa %xmm1, %xmm0
1843; SSE4-NEXT:    psrlw $8, %xmm0
1844; SSE4-NEXT:    pminub %xmm1, %xmm0
1845; SSE4-NEXT:    phminposuw %xmm0, %xmm0
1846; SSE4-NEXT:    movd %xmm0, %eax
1847; SSE4-NEXT:    xorb $127, %al
1848; SSE4-NEXT:    # kill: def $al killed $al killed $eax
1849; SSE4-NEXT:    retq
1850;
1851; AVX1-LABEL: test_v64i8:
1852; AVX1:       # %bb.0:
1853; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1854; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1855; AVX1-NEXT:    vpmaxsb %xmm2, %xmm3, %xmm2
1856; AVX1-NEXT:    vpmaxsb %xmm2, %xmm1, %xmm1
1857; AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1858; AVX1-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1859; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
1860; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1861; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
1862; AVX1-NEXT:    vmovd %xmm0, %eax
1863; AVX1-NEXT:    xorb $127, %al
1864; AVX1-NEXT:    # kill: def $al killed $al killed $eax
1865; AVX1-NEXT:    vzeroupper
1866; AVX1-NEXT:    retq
1867;
1868; AVX2-LABEL: test_v64i8:
1869; AVX2:       # %bb.0:
1870; AVX2-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
1871; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1872; AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1873; AVX2-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1874; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
1875; AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1876; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
1877; AVX2-NEXT:    vmovd %xmm0, %eax
1878; AVX2-NEXT:    xorb $127, %al
1879; AVX2-NEXT:    # kill: def $al killed $al killed $eax
1880; AVX2-NEXT:    vzeroupper
1881; AVX2-NEXT:    retq
1882;
1883; AVX512-LABEL: test_v64i8:
1884; AVX512:       # %bb.0:
1885; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1886; AVX512-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
1887; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1888; AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
1889; AVX512-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
1890; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1891; AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
1892; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
1893; AVX512-NEXT:    vmovd %xmm0, %eax
1894; AVX512-NEXT:    xorb $127, %al
1895; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1896; AVX512-NEXT:    vzeroupper
1897; AVX512-NEXT:    retq
1898  %1 = call i8 @llvm.vector.reduce.smax.v64i8(<64 x i8> %a0)
1899  ret i8 %1
1900}
1901
1902define i8 @test_v128i8(<128 x i8> %a0) {
1903; SSE2-LABEL: test_v128i8:
1904; SSE2:       # %bb.0:
1905; SSE2-NEXT:    movdqa %xmm2, %xmm8
1906; SSE2-NEXT:    pcmpgtb %xmm6, %xmm8
1907; SSE2-NEXT:    pand %xmm8, %xmm2
1908; SSE2-NEXT:    pandn %xmm6, %xmm8
1909; SSE2-NEXT:    por %xmm2, %xmm8
1910; SSE2-NEXT:    movdqa %xmm0, %xmm2
1911; SSE2-NEXT:    pcmpgtb %xmm4, %xmm2
1912; SSE2-NEXT:    pand %xmm2, %xmm0
1913; SSE2-NEXT:    pandn %xmm4, %xmm2
1914; SSE2-NEXT:    por %xmm0, %xmm2
1915; SSE2-NEXT:    movdqa %xmm3, %xmm0
1916; SSE2-NEXT:    pcmpgtb %xmm7, %xmm0
1917; SSE2-NEXT:    pand %xmm0, %xmm3
1918; SSE2-NEXT:    pandn %xmm7, %xmm0
1919; SSE2-NEXT:    por %xmm3, %xmm0
1920; SSE2-NEXT:    movdqa %xmm1, %xmm3
1921; SSE2-NEXT:    pcmpgtb %xmm5, %xmm3
1922; SSE2-NEXT:    pand %xmm3, %xmm1
1923; SSE2-NEXT:    pandn %xmm5, %xmm3
1924; SSE2-NEXT:    por %xmm1, %xmm3
1925; SSE2-NEXT:    movdqa %xmm3, %xmm1
1926; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
1927; SSE2-NEXT:    pand %xmm1, %xmm3
1928; SSE2-NEXT:    pandn %xmm0, %xmm1
1929; SSE2-NEXT:    por %xmm3, %xmm1
1930; SSE2-NEXT:    movdqa %xmm2, %xmm0
1931; SSE2-NEXT:    pcmpgtb %xmm8, %xmm0
1932; SSE2-NEXT:    pand %xmm0, %xmm2
1933; SSE2-NEXT:    pandn %xmm8, %xmm0
1934; SSE2-NEXT:    por %xmm2, %xmm0
1935; SSE2-NEXT:    movdqa %xmm0, %xmm2
1936; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
1937; SSE2-NEXT:    pand %xmm2, %xmm0
1938; SSE2-NEXT:    pandn %xmm1, %xmm2
1939; SSE2-NEXT:    por %xmm0, %xmm2
1940; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
1941; SSE2-NEXT:    movdqa %xmm2, %xmm1
1942; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
1943; SSE2-NEXT:    pand %xmm1, %xmm2
1944; SSE2-NEXT:    pandn %xmm0, %xmm1
1945; SSE2-NEXT:    por %xmm2, %xmm1
1946; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
1947; SSE2-NEXT:    movdqa %xmm1, %xmm2
1948; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
1949; SSE2-NEXT:    pand %xmm2, %xmm1
1950; SSE2-NEXT:    pandn %xmm0, %xmm2
1951; SSE2-NEXT:    por %xmm1, %xmm2
1952; SSE2-NEXT:    movdqa %xmm2, %xmm0
1953; SSE2-NEXT:    psrld $16, %xmm0
1954; SSE2-NEXT:    movdqa %xmm2, %xmm1
1955; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
1956; SSE2-NEXT:    pand %xmm1, %xmm2
1957; SSE2-NEXT:    pandn %xmm0, %xmm1
1958; SSE2-NEXT:    por %xmm2, %xmm1
1959; SSE2-NEXT:    movdqa %xmm1, %xmm0
1960; SSE2-NEXT:    psrlw $8, %xmm0
1961; SSE2-NEXT:    movdqa %xmm1, %xmm2
1962; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
1963; SSE2-NEXT:    pand %xmm2, %xmm1
1964; SSE2-NEXT:    pandn %xmm0, %xmm2
1965; SSE2-NEXT:    por %xmm1, %xmm2
1966; SSE2-NEXT:    movd %xmm2, %eax
1967; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1968; SSE2-NEXT:    retq
1969;
1970; SSE4-LABEL: test_v128i8:
1971; SSE4:       # %bb.0:
1972; SSE4-NEXT:    pmaxsb %xmm7, %xmm3
1973; SSE4-NEXT:    pmaxsb %xmm5, %xmm3
1974; SSE4-NEXT:    pmaxsb %xmm1, %xmm3
1975; SSE4-NEXT:    pmaxsb %xmm6, %xmm2
1976; SSE4-NEXT:    pmaxsb %xmm4, %xmm2
1977; SSE4-NEXT:    pmaxsb %xmm3, %xmm2
1978; SSE4-NEXT:    pmaxsb %xmm0, %xmm2
1979; SSE4-NEXT:    pxor {{.*}}(%rip), %xmm2
1980; SSE4-NEXT:    movdqa %xmm2, %xmm0
1981; SSE4-NEXT:    psrlw $8, %xmm0
1982; SSE4-NEXT:    pminub %xmm2, %xmm0
1983; SSE4-NEXT:    phminposuw %xmm0, %xmm0
1984; SSE4-NEXT:    movd %xmm0, %eax
1985; SSE4-NEXT:    xorb $127, %al
1986; SSE4-NEXT:    # kill: def $al killed $al killed $eax
1987; SSE4-NEXT:    retq
1988;
1989; AVX1-LABEL: test_v128i8:
1990; AVX1:       # %bb.0:
1991; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
1992; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
1993; AVX1-NEXT:    vpmaxsb %xmm4, %xmm5, %xmm4
1994; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
1995; AVX1-NEXT:    vpmaxsb %xmm4, %xmm5, %xmm4
1996; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
1997; AVX1-NEXT:    vpmaxsb %xmm4, %xmm5, %xmm4
1998; AVX1-NEXT:    vpmaxsb %xmm3, %xmm1, %xmm1
1999; AVX1-NEXT:    vpmaxsb %xmm1, %xmm2, %xmm1
2000; AVX1-NEXT:    vpmaxsb %xmm4, %xmm1, %xmm1
2001; AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
2002; AVX1-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
2003; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
2004; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2005; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
2006; AVX1-NEXT:    vmovd %xmm0, %eax
2007; AVX1-NEXT:    xorb $127, %al
2008; AVX1-NEXT:    # kill: def $al killed $al killed $eax
2009; AVX1-NEXT:    vzeroupper
2010; AVX1-NEXT:    retq
2011;
2012; AVX2-LABEL: test_v128i8:
2013; AVX2:       # %bb.0:
2014; AVX2-NEXT:    vpmaxsb %ymm3, %ymm1, %ymm1
2015; AVX2-NEXT:    vpmaxsb %ymm1, %ymm2, %ymm1
2016; AVX2-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
2017; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2018; AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
2019; AVX2-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
2020; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
2021; AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2022; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
2023; AVX2-NEXT:    vmovd %xmm0, %eax
2024; AVX2-NEXT:    xorb $127, %al
2025; AVX2-NEXT:    # kill: def $al killed $al killed $eax
2026; AVX2-NEXT:    vzeroupper
2027; AVX2-NEXT:    retq
2028;
2029; AVX512-LABEL: test_v128i8:
2030; AVX512:       # %bb.0:
2031; AVX512-NEXT:    vpmaxsb %zmm1, %zmm0, %zmm0
2032; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2033; AVX512-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
2034; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
2035; AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
2036; AVX512-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
2037; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
2038; AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
2039; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
2040; AVX512-NEXT:    vmovd %xmm0, %eax
2041; AVX512-NEXT:    xorb $127, %al
2042; AVX512-NEXT:    # kill: def $al killed $al killed $eax
2043; AVX512-NEXT:    vzeroupper
2044; AVX512-NEXT:    retq
2045  %1 = call i8 @llvm.vector.reduce.smax.v128i8(<128 x i8> %a0)
2046  ret i8 %1
2047}
2048
2049declare i64 @llvm.vector.reduce.smax.v2i64(<2 x i64>)
2050declare i64 @llvm.vector.reduce.smax.v4i64(<4 x i64>)
2051declare i64 @llvm.vector.reduce.smax.v8i64(<8 x i64>)
2052declare i64 @llvm.vector.reduce.smax.v16i64(<16 x i64>)
2053
2054declare i32 @llvm.vector.reduce.smax.v2i32(<2 x i32>)
2055declare i32 @llvm.vector.reduce.smax.v4i32(<4 x i32>)
2056declare i32 @llvm.vector.reduce.smax.v8i32(<8 x i32>)
2057declare i32 @llvm.vector.reduce.smax.v16i32(<16 x i32>)
2058declare i32 @llvm.vector.reduce.smax.v32i32(<32 x i32>)
2059
2060declare i16 @llvm.vector.reduce.smax.v2i16(<2 x i16>)
2061declare i16 @llvm.vector.reduce.smax.v4i16(<4 x i16>)
2062declare i16 @llvm.vector.reduce.smax.v8i16(<8 x i16>)
2063declare i16 @llvm.vector.reduce.smax.v16i16(<16 x i16>)
2064declare i16 @llvm.vector.reduce.smax.v32i16(<32 x i16>)
2065declare i16 @llvm.vector.reduce.smax.v64i16(<64 x i16>)
2066
2067declare i8 @llvm.vector.reduce.smax.v2i8(<2 x i8>)
2068declare i8 @llvm.vector.reduce.smax.v4i8(<4 x i8>)
2069declare i8 @llvm.vector.reduce.smax.v8i8(<8 x i8>)
2070declare i8 @llvm.vector.reduce.smax.v16i8(<16 x i8>)
2071declare i8 @llvm.vector.reduce.smax.v32i8(<32 x i8>)
2072declare i8 @llvm.vector.reduce.smax.v64i8(<64 x i8>)
2073declare i8 @llvm.vector.reduce.smax.v128i8(<128 x i8>)
2074