xref: /llvm-project/llvm/test/CodeGen/X86/vector-reduce-fmax.ll (revision 7b3bbd83c0c24087072ec5b22a76799ab31f87d5)
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=ALL,SSE,SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=ALL,SSE,SSE41
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=ALL,AVX
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=ALL,AVX
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=ALL,AVX512,AVX512BW
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=ALL,AVX512,AVX512VL
8
9;
10; vXf32
11;
12
13define float @test_v1f32(<1 x float> %a0) {
14; ALL-LABEL: test_v1f32:
15; ALL:       # %bb.0:
16; ALL-NEXT:    retq
17  %1 = call float @llvm.vector.reduce.fmax.v1f32(<1 x float> %a0)
18  ret float %1
19}
20
21define float @test_v2f32(<2 x float> %a0) {
22; SSE2-LABEL: test_v2f32:
23; SSE2:       # %bb.0:
24; SSE2-NEXT:    movaps %xmm0, %xmm2
25; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,1],xmm0[1,1]
26; SSE2-NEXT:    movaps %xmm0, %xmm1
27; SSE2-NEXT:    cmpunordss %xmm0, %xmm1
28; SSE2-NEXT:    movaps %xmm1, %xmm3
29; SSE2-NEXT:    andps %xmm2, %xmm3
30; SSE2-NEXT:    maxss %xmm0, %xmm2
31; SSE2-NEXT:    andnps %xmm2, %xmm1
32; SSE2-NEXT:    orps %xmm3, %xmm1
33; SSE2-NEXT:    movaps %xmm1, %xmm0
34; SSE2-NEXT:    retq
35;
36; SSE41-LABEL: test_v2f32:
37; SSE41:       # %bb.0:
38; SSE41-NEXT:    movshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]
39; SSE41-NEXT:    movaps %xmm0, %xmm1
40; SSE41-NEXT:    cmpunordss %xmm0, %xmm1
41; SSE41-NEXT:    movaps %xmm1, %xmm3
42; SSE41-NEXT:    andps %xmm2, %xmm3
43; SSE41-NEXT:    maxss %xmm0, %xmm2
44; SSE41-NEXT:    andnps %xmm2, %xmm1
45; SSE41-NEXT:    orps %xmm3, %xmm1
46; SSE41-NEXT:    movaps %xmm1, %xmm0
47; SSE41-NEXT:    retq
48;
49; AVX-LABEL: test_v2f32:
50; AVX:       # %bb.0:
51; AVX-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
52; AVX-NEXT:    vmaxss %xmm0, %xmm1, %xmm2
53; AVX-NEXT:    vcmpunordss %xmm0, %xmm0, %xmm0
54; AVX-NEXT:    vblendvps %xmm0, %xmm1, %xmm2, %xmm0
55; AVX-NEXT:    retq
56;
57; AVX512-LABEL: test_v2f32:
58; AVX512:       # %bb.0:
59; AVX512-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]
60; AVX512-NEXT:    vmaxss %xmm0, %xmm2, %xmm1
61; AVX512-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
62; AVX512-NEXT:    vmovss %xmm2, %xmm1, %xmm1 {%k1}
63; AVX512-NEXT:    vmovaps %xmm1, %xmm0
64; AVX512-NEXT:    retq
65  %1 = call float @llvm.vector.reduce.fmax.v2f32(<2 x float> %a0)
66  ret float %1
67}
68
69define float @test_v3f32(<3 x float> %a0) {
70; SSE2-LABEL: test_v3f32:
71; SSE2:       # %bb.0:
72; SSE2-NEXT:    movaps %xmm0, %xmm1
73; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[1,1]
74; SSE2-NEXT:    movaps %xmm0, %xmm2
75; SSE2-NEXT:    cmpunordss %xmm0, %xmm2
76; SSE2-NEXT:    movaps %xmm2, %xmm3
77; SSE2-NEXT:    andps %xmm1, %xmm3
78; SSE2-NEXT:    maxss %xmm0, %xmm1
79; SSE2-NEXT:    andnps %xmm1, %xmm2
80; SSE2-NEXT:    orps %xmm3, %xmm2
81; SSE2-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
82; SSE2-NEXT:    movaps %xmm0, %xmm1
83; SSE2-NEXT:    maxss %xmm2, %xmm1
84; SSE2-NEXT:    cmpunordss %xmm2, %xmm2
85; SSE2-NEXT:    andps %xmm2, %xmm0
86; SSE2-NEXT:    andnps %xmm1, %xmm2
87; SSE2-NEXT:    orps %xmm2, %xmm0
88; SSE2-NEXT:    retq
89;
90; SSE41-LABEL: test_v3f32:
91; SSE41:       # %bb.0:
92; SSE41-NEXT:    movshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
93; SSE41-NEXT:    movaps %xmm0, %xmm2
94; SSE41-NEXT:    cmpunordss %xmm0, %xmm2
95; SSE41-NEXT:    movaps %xmm2, %xmm3
96; SSE41-NEXT:    andps %xmm1, %xmm3
97; SSE41-NEXT:    maxss %xmm0, %xmm1
98; SSE41-NEXT:    andnps %xmm1, %xmm2
99; SSE41-NEXT:    orps %xmm3, %xmm2
100; SSE41-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
101; SSE41-NEXT:    movaps %xmm0, %xmm1
102; SSE41-NEXT:    maxss %xmm2, %xmm1
103; SSE41-NEXT:    cmpunordss %xmm2, %xmm2
104; SSE41-NEXT:    andps %xmm2, %xmm0
105; SSE41-NEXT:    andnps %xmm1, %xmm2
106; SSE41-NEXT:    orps %xmm2, %xmm0
107; SSE41-NEXT:    retq
108;
109; AVX-LABEL: test_v3f32:
110; AVX:       # %bb.0:
111; AVX-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
112; AVX-NEXT:    vmaxss %xmm0, %xmm1, %xmm2
113; AVX-NEXT:    vcmpunordss %xmm0, %xmm0, %xmm3
114; AVX-NEXT:    vblendvps %xmm3, %xmm1, %xmm2, %xmm1
115; AVX-NEXT:    vcmpunordss %xmm1, %xmm1, %xmm2
116; AVX-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
117; AVX-NEXT:    vmaxss %xmm1, %xmm0, %xmm1
118; AVX-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
119; AVX-NEXT:    retq
120;
121; AVX512-LABEL: test_v3f32:
122; AVX512:       # %bb.0:
123; AVX512-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
124; AVX512-NEXT:    vmaxss %xmm0, %xmm1, %xmm2
125; AVX512-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
126; AVX512-NEXT:    vmovss %xmm1, %xmm2, %xmm2 {%k1}
127; AVX512-NEXT:    vcmpunordss %xmm2, %xmm2, %k1
128; AVX512-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]
129; AVX512-NEXT:    vmaxss %xmm2, %xmm1, %xmm0
130; AVX512-NEXT:    vmovss %xmm1, %xmm0, %xmm0 {%k1}
131; AVX512-NEXT:    retq
132  %1 = call float @llvm.vector.reduce.fmax.v3f32(<3 x float> %a0)
133  ret float %1
134}
135
136define float @test_v4f32(<4 x float> %a0) {
137; SSE2-LABEL: test_v4f32:
138; SSE2:       # %bb.0:
139; SSE2-NEXT:    movaps %xmm0, %xmm1
140; SSE2-NEXT:    movaps %xmm0, %xmm2
141; SSE2-NEXT:    movaps %xmm0, %xmm3
142; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,1],xmm0[1,1]
143; SSE2-NEXT:    cmpunordss %xmm0, %xmm0
144; SSE2-NEXT:    movaps %xmm0, %xmm4
145; SSE2-NEXT:    andps %xmm3, %xmm4
146; SSE2-NEXT:    maxss %xmm1, %xmm3
147; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,3,3,3]
148; SSE2-NEXT:    movhlps {{.*#+}} xmm2 = xmm2[1,1]
149; SSE2-NEXT:    andnps %xmm3, %xmm0
150; SSE2-NEXT:    orps %xmm4, %xmm0
151; SSE2-NEXT:    movaps %xmm2, %xmm3
152; SSE2-NEXT:    maxss %xmm0, %xmm3
153; SSE2-NEXT:    cmpunordss %xmm0, %xmm0
154; SSE2-NEXT:    movaps %xmm0, %xmm4
155; SSE2-NEXT:    andnps %xmm3, %xmm4
156; SSE2-NEXT:    andps %xmm2, %xmm0
157; SSE2-NEXT:    orps %xmm4, %xmm0
158; SSE2-NEXT:    movaps %xmm1, %xmm2
159; SSE2-NEXT:    maxss %xmm0, %xmm2
160; SSE2-NEXT:    cmpunordss %xmm0, %xmm0
161; SSE2-NEXT:    movaps %xmm0, %xmm3
162; SSE2-NEXT:    andnps %xmm2, %xmm3
163; SSE2-NEXT:    andps %xmm1, %xmm0
164; SSE2-NEXT:    orps %xmm3, %xmm0
165; SSE2-NEXT:    retq
166;
167; SSE41-LABEL: test_v4f32:
168; SSE41:       # %bb.0:
169; SSE41-NEXT:    movaps %xmm0, %xmm1
170; SSE41-NEXT:    movaps %xmm0, %xmm2
171; SSE41-NEXT:    movshdup {{.*#+}} xmm3 = xmm0[1,1,3,3]
172; SSE41-NEXT:    cmpunordss %xmm0, %xmm0
173; SSE41-NEXT:    movaps %xmm0, %xmm4
174; SSE41-NEXT:    andps %xmm3, %xmm4
175; SSE41-NEXT:    maxss %xmm1, %xmm3
176; SSE41-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,3,3,3]
177; SSE41-NEXT:    movhlps {{.*#+}} xmm2 = xmm2[1,1]
178; SSE41-NEXT:    andnps %xmm3, %xmm0
179; SSE41-NEXT:    orps %xmm4, %xmm0
180; SSE41-NEXT:    movaps %xmm2, %xmm3
181; SSE41-NEXT:    maxss %xmm0, %xmm3
182; SSE41-NEXT:    cmpunordss %xmm0, %xmm0
183; SSE41-NEXT:    movaps %xmm0, %xmm4
184; SSE41-NEXT:    andnps %xmm3, %xmm4
185; SSE41-NEXT:    andps %xmm2, %xmm0
186; SSE41-NEXT:    orps %xmm4, %xmm0
187; SSE41-NEXT:    movaps %xmm1, %xmm2
188; SSE41-NEXT:    maxss %xmm0, %xmm2
189; SSE41-NEXT:    cmpunordss %xmm0, %xmm0
190; SSE41-NEXT:    movaps %xmm0, %xmm3
191; SSE41-NEXT:    andnps %xmm2, %xmm3
192; SSE41-NEXT:    andps %xmm1, %xmm0
193; SSE41-NEXT:    orps %xmm3, %xmm0
194; SSE41-NEXT:    retq
195;
196; AVX-LABEL: test_v4f32:
197; AVX:       # %bb.0:
198; AVX-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]
199; AVX-NEXT:    vshufpd {{.*#+}} xmm2 = xmm0[1,0]
200; AVX-NEXT:    vmovshdup {{.*#+}} xmm3 = xmm0[1,1,3,3]
201; AVX-NEXT:    vmaxss %xmm0, %xmm3, %xmm4
202; AVX-NEXT:    vcmpunordss %xmm0, %xmm0, %xmm0
203; AVX-NEXT:    vblendvps %xmm0, %xmm3, %xmm4, %xmm0
204; AVX-NEXT:    vcmpunordss %xmm0, %xmm0, %xmm3
205; AVX-NEXT:    vmaxss %xmm0, %xmm2, %xmm0
206; AVX-NEXT:    vblendvps %xmm3, %xmm2, %xmm0, %xmm0
207; AVX-NEXT:    vcmpunordss %xmm0, %xmm0, %xmm2
208; AVX-NEXT:    vmaxss %xmm0, %xmm1, %xmm0
209; AVX-NEXT:    vblendvps %xmm2, %xmm1, %xmm0, %xmm0
210; AVX-NEXT:    retq
211;
212; AVX512-LABEL: test_v4f32:
213; AVX512:       # %bb.0:
214; AVX512-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]
215; AVX512-NEXT:    vshufpd {{.*#+}} xmm2 = xmm0[1,0]
216; AVX512-NEXT:    vmovshdup {{.*#+}} xmm3 = xmm0[1,1,3,3]
217; AVX512-NEXT:    vmaxss %xmm0, %xmm3, %xmm4
218; AVX512-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
219; AVX512-NEXT:    vmovss %xmm3, %xmm4, %xmm4 {%k1}
220; AVX512-NEXT:    vcmpunordss %xmm4, %xmm4, %k1
221; AVX512-NEXT:    vmaxss %xmm4, %xmm2, %xmm0
222; AVX512-NEXT:    vmovss %xmm2, %xmm0, %xmm0 {%k1}
223; AVX512-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
224; AVX512-NEXT:    vmaxss %xmm0, %xmm1, %xmm0
225; AVX512-NEXT:    vmovss %xmm1, %xmm0, %xmm0 {%k1}
226; AVX512-NEXT:    retq
227  %1 = call float @llvm.vector.reduce.fmax.v4f32(<4 x float> %a0)
228  ret float %1
229}
230
231define float @test_v8f32(<8 x float> %a0) {
232; SSE2-LABEL: test_v8f32:
233; SSE2:       # %bb.0:
234; SSE2-NEXT:    movaps %xmm1, %xmm2
235; SSE2-NEXT:    maxps %xmm0, %xmm2
236; SSE2-NEXT:    cmpunordps %xmm0, %xmm0
237; SSE2-NEXT:    andps %xmm0, %xmm1
238; SSE2-NEXT:    andnps %xmm2, %xmm0
239; SSE2-NEXT:    orps %xmm1, %xmm0
240; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]
241; SSE2-NEXT:    movaps %xmm0, %xmm1
242; SSE2-NEXT:    cmpunordss %xmm0, %xmm1
243; SSE2-NEXT:    movaps %xmm1, %xmm3
244; SSE2-NEXT:    andps %xmm2, %xmm3
245; SSE2-NEXT:    maxss %xmm0, %xmm2
246; SSE2-NEXT:    andnps %xmm2, %xmm1
247; SSE2-NEXT:    orps %xmm3, %xmm1
248; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
249; SSE2-NEXT:    movdqa %xmm2, %xmm3
250; SSE2-NEXT:    maxss %xmm1, %xmm3
251; SSE2-NEXT:    cmpunordss %xmm1, %xmm1
252; SSE2-NEXT:    movaps %xmm1, %xmm4
253; SSE2-NEXT:    andnps %xmm3, %xmm4
254; SSE2-NEXT:    andps %xmm2, %xmm1
255; SSE2-NEXT:    orps %xmm4, %xmm1
256; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
257; SSE2-NEXT:    movdqa %xmm0, %xmm2
258; SSE2-NEXT:    maxss %xmm1, %xmm2
259; SSE2-NEXT:    cmpunordss %xmm1, %xmm1
260; SSE2-NEXT:    movaps %xmm1, %xmm3
261; SSE2-NEXT:    andnps %xmm2, %xmm3
262; SSE2-NEXT:    andps %xmm0, %xmm1
263; SSE2-NEXT:    orps %xmm3, %xmm1
264; SSE2-NEXT:    movaps %xmm1, %xmm0
265; SSE2-NEXT:    retq
266;
267; SSE41-LABEL: test_v8f32:
268; SSE41:       # %bb.0:
269; SSE41-NEXT:    movaps %xmm1, %xmm2
270; SSE41-NEXT:    maxps %xmm0, %xmm2
271; SSE41-NEXT:    cmpunordps %xmm0, %xmm0
272; SSE41-NEXT:    blendvps %xmm0, %xmm1, %xmm2
273; SSE41-NEXT:    movshdup {{.*#+}} xmm1 = xmm2[1,1,3,3]
274; SSE41-NEXT:    movaps %xmm2, %xmm0
275; SSE41-NEXT:    cmpunordss %xmm2, %xmm0
276; SSE41-NEXT:    movaps %xmm0, %xmm3
277; SSE41-NEXT:    andps %xmm1, %xmm3
278; SSE41-NEXT:    maxss %xmm2, %xmm1
279; SSE41-NEXT:    andnps %xmm1, %xmm0
280; SSE41-NEXT:    orps %xmm3, %xmm0
281; SSE41-NEXT:    movaps %xmm2, %xmm1
282; SSE41-NEXT:    unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm2[1]
283; SSE41-NEXT:    movaps %xmm1, %xmm3
284; SSE41-NEXT:    maxss %xmm0, %xmm3
285; SSE41-NEXT:    cmpunordss %xmm0, %xmm0
286; SSE41-NEXT:    movaps %xmm0, %xmm4
287; SSE41-NEXT:    andnps %xmm3, %xmm4
288; SSE41-NEXT:    andps %xmm1, %xmm0
289; SSE41-NEXT:    orps %xmm4, %xmm0
290; SSE41-NEXT:    shufps {{.*#+}} xmm2 = xmm2[3,3,3,3]
291; SSE41-NEXT:    movaps %xmm2, %xmm1
292; SSE41-NEXT:    maxss %xmm0, %xmm1
293; SSE41-NEXT:    cmpunordss %xmm0, %xmm0
294; SSE41-NEXT:    movaps %xmm0, %xmm3
295; SSE41-NEXT:    andnps %xmm1, %xmm3
296; SSE41-NEXT:    andps %xmm2, %xmm0
297; SSE41-NEXT:    orps %xmm3, %xmm0
298; SSE41-NEXT:    retq
299;
300; AVX-LABEL: test_v8f32:
301; AVX:       # %bb.0:
302; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
303; AVX-NEXT:    vshufps {{.*#+}} xmm2 = xmm1[3,3,3,3]
304; AVX-NEXT:    vshufpd {{.*#+}} xmm3 = xmm1[1,0]
305; AVX-NEXT:    vmovshdup {{.*#+}} xmm4 = xmm1[1,1,3,3]
306; AVX-NEXT:    vshufps {{.*#+}} xmm5 = xmm0[3,3,3,3]
307; AVX-NEXT:    vshufpd {{.*#+}} xmm6 = xmm0[1,0]
308; AVX-NEXT:    vmovshdup {{.*#+}} xmm7 = xmm0[1,1,3,3]
309; AVX-NEXT:    vmaxss %xmm0, %xmm7, %xmm8
310; AVX-NEXT:    vcmpunordss %xmm0, %xmm0, %xmm0
311; AVX-NEXT:    vblendvps %xmm0, %xmm7, %xmm8, %xmm0
312; AVX-NEXT:    vcmpunordss %xmm0, %xmm0, %xmm7
313; AVX-NEXT:    vmaxss %xmm0, %xmm6, %xmm0
314; AVX-NEXT:    vblendvps %xmm7, %xmm6, %xmm0, %xmm0
315; AVX-NEXT:    vcmpunordss %xmm0, %xmm0, %xmm6
316; AVX-NEXT:    vmaxss %xmm0, %xmm5, %xmm0
317; AVX-NEXT:    vblendvps %xmm6, %xmm5, %xmm0, %xmm0
318; AVX-NEXT:    vcmpunordss %xmm0, %xmm0, %xmm5
319; AVX-NEXT:    vmaxss %xmm0, %xmm1, %xmm0
320; AVX-NEXT:    vblendvps %xmm5, %xmm1, %xmm0, %xmm0
321; AVX-NEXT:    vcmpunordss %xmm0, %xmm0, %xmm1
322; AVX-NEXT:    vmaxss %xmm0, %xmm4, %xmm0
323; AVX-NEXT:    vblendvps %xmm1, %xmm4, %xmm0, %xmm0
324; AVX-NEXT:    vcmpunordss %xmm0, %xmm0, %xmm1
325; AVX-NEXT:    vmaxss %xmm0, %xmm3, %xmm0
326; AVX-NEXT:    vblendvps %xmm1, %xmm3, %xmm0, %xmm0
327; AVX-NEXT:    vcmpunordss %xmm0, %xmm0, %xmm1
328; AVX-NEXT:    vmaxss %xmm0, %xmm2, %xmm0
329; AVX-NEXT:    vblendvps %xmm1, %xmm2, %xmm0, %xmm0
330; AVX-NEXT:    vzeroupper
331; AVX-NEXT:    retq
332;
333; AVX512BW-LABEL: test_v8f32:
334; AVX512BW:       # %bb.0:
335; AVX512BW-NEXT:    vextractf128 $1, %ymm0, %xmm3
336; AVX512BW-NEXT:    vshufps {{.*#+}} xmm1 = xmm3[3,3,3,3]
337; AVX512BW-NEXT:    vshufpd {{.*#+}} xmm2 = xmm3[1,0]
338; AVX512BW-NEXT:    vmovshdup {{.*#+}} xmm4 = xmm3[1,1,3,3]
339; AVX512BW-NEXT:    vshufps {{.*#+}} xmm5 = xmm0[3,3,3,3]
340; AVX512BW-NEXT:    vshufpd {{.*#+}} xmm6 = xmm0[1,0]
341; AVX512BW-NEXT:    vmovshdup {{.*#+}} xmm7 = xmm0[1,1,3,3]
342; AVX512BW-NEXT:    vmaxss %xmm0, %xmm7, %xmm8
343; AVX512BW-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
344; AVX512BW-NEXT:    vmovss %xmm7, %xmm8, %xmm8 {%k1}
345; AVX512BW-NEXT:    vcmpunordss %xmm8, %xmm8, %k1
346; AVX512BW-NEXT:    vmaxss %xmm8, %xmm6, %xmm0
347; AVX512BW-NEXT:    vmovss %xmm6, %xmm0, %xmm0 {%k1}
348; AVX512BW-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
349; AVX512BW-NEXT:    vmaxss %xmm0, %xmm5, %xmm0
350; AVX512BW-NEXT:    vmovss %xmm5, %xmm0, %xmm0 {%k1}
351; AVX512BW-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
352; AVX512BW-NEXT:    vmaxss %xmm0, %xmm3, %xmm0
353; AVX512BW-NEXT:    vmovss %xmm3, %xmm0, %xmm0 {%k1}
354; AVX512BW-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
355; AVX512BW-NEXT:    vmaxss %xmm0, %xmm4, %xmm0
356; AVX512BW-NEXT:    vmovss %xmm4, %xmm0, %xmm0 {%k1}
357; AVX512BW-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
358; AVX512BW-NEXT:    vmaxss %xmm0, %xmm2, %xmm0
359; AVX512BW-NEXT:    vmovss %xmm2, %xmm0, %xmm0 {%k1}
360; AVX512BW-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
361; AVX512BW-NEXT:    vmaxss %xmm0, %xmm1, %xmm0
362; AVX512BW-NEXT:    vmovss %xmm1, %xmm0, %xmm0 {%k1}
363; AVX512BW-NEXT:    vzeroupper
364; AVX512BW-NEXT:    retq
365;
366; AVX512VL-LABEL: test_v8f32:
367; AVX512VL:       # %bb.0:
368; AVX512VL-NEXT:    vextractf128 $1, %ymm0, %xmm1
369; AVX512VL-NEXT:    vshufps {{.*#+}} xmm2 = xmm1[3,3,3,3]
370; AVX512VL-NEXT:    vshufpd {{.*#+}} xmm3 = xmm1[1,0]
371; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm4 = xmm1[1,1,3,3]
372; AVX512VL-NEXT:    vshufps {{.*#+}} xmm5 = xmm0[3,3,3,3]
373; AVX512VL-NEXT:    vshufpd {{.*#+}} xmm6 = xmm0[1,0]
374; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm7 = xmm0[1,1,3,3]
375; AVX512VL-NEXT:    vmaxss %xmm0, %xmm7, %xmm8
376; AVX512VL-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
377; AVX512VL-NEXT:    vmovss %xmm7, %xmm8, %xmm8 {%k1}
378; AVX512VL-NEXT:    vcmpunordss %xmm8, %xmm8, %k1
379; AVX512VL-NEXT:    vmaxss %xmm8, %xmm6, %xmm0
380; AVX512VL-NEXT:    vmovss %xmm6, %xmm0, %xmm0 {%k1}
381; AVX512VL-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
382; AVX512VL-NEXT:    vmaxss %xmm0, %xmm5, %xmm0
383; AVX512VL-NEXT:    vmovss %xmm5, %xmm0, %xmm0 {%k1}
384; AVX512VL-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
385; AVX512VL-NEXT:    vmaxss %xmm0, %xmm1, %xmm0
386; AVX512VL-NEXT:    vmovss %xmm1, %xmm0, %xmm0 {%k1}
387; AVX512VL-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
388; AVX512VL-NEXT:    vmaxss %xmm0, %xmm4, %xmm0
389; AVX512VL-NEXT:    vmovss %xmm4, %xmm0, %xmm0 {%k1}
390; AVX512VL-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
391; AVX512VL-NEXT:    vmaxss %xmm0, %xmm3, %xmm0
392; AVX512VL-NEXT:    vmovss %xmm3, %xmm0, %xmm0 {%k1}
393; AVX512VL-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
394; AVX512VL-NEXT:    vmaxss %xmm0, %xmm2, %xmm0
395; AVX512VL-NEXT:    vmovss %xmm2, %xmm0, %xmm0 {%k1}
396; AVX512VL-NEXT:    vzeroupper
397; AVX512VL-NEXT:    retq
398  %1 = call float @llvm.vector.reduce.fmax.v8f32(<8 x float> %a0)
399  ret float %1
400}
401
402define float @test_v16f32(<16 x float> %a0) {
403; SSE2-LABEL: test_v16f32:
404; SSE2:       # %bb.0:
405; SSE2-NEXT:    movaps %xmm2, %xmm4
406; SSE2-NEXT:    maxps %xmm0, %xmm4
407; SSE2-NEXT:    cmpunordps %xmm0, %xmm0
408; SSE2-NEXT:    andps %xmm0, %xmm2
409; SSE2-NEXT:    andnps %xmm4, %xmm0
410; SSE2-NEXT:    orps %xmm2, %xmm0
411; SSE2-NEXT:    movaps %xmm3, %xmm2
412; SSE2-NEXT:    maxps %xmm1, %xmm2
413; SSE2-NEXT:    cmpunordps %xmm1, %xmm1
414; SSE2-NEXT:    andps %xmm1, %xmm3
415; SSE2-NEXT:    andnps %xmm2, %xmm1
416; SSE2-NEXT:    orps %xmm3, %xmm1
417; SSE2-NEXT:    movaps %xmm1, %xmm2
418; SSE2-NEXT:    maxps %xmm0, %xmm2
419; SSE2-NEXT:    cmpunordps %xmm0, %xmm0
420; SSE2-NEXT:    andps %xmm0, %xmm1
421; SSE2-NEXT:    andnps %xmm2, %xmm0
422; SSE2-NEXT:    orps %xmm1, %xmm0
423; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]
424; SSE2-NEXT:    movaps %xmm0, %xmm1
425; SSE2-NEXT:    cmpunordss %xmm0, %xmm1
426; SSE2-NEXT:    movaps %xmm1, %xmm3
427; SSE2-NEXT:    andps %xmm2, %xmm3
428; SSE2-NEXT:    maxss %xmm0, %xmm2
429; SSE2-NEXT:    andnps %xmm2, %xmm1
430; SSE2-NEXT:    orps %xmm3, %xmm1
431; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
432; SSE2-NEXT:    movdqa %xmm2, %xmm3
433; SSE2-NEXT:    maxss %xmm1, %xmm3
434; SSE2-NEXT:    cmpunordss %xmm1, %xmm1
435; SSE2-NEXT:    movaps %xmm1, %xmm4
436; SSE2-NEXT:    andnps %xmm3, %xmm4
437; SSE2-NEXT:    andps %xmm2, %xmm1
438; SSE2-NEXT:    orps %xmm4, %xmm1
439; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
440; SSE2-NEXT:    movdqa %xmm0, %xmm2
441; SSE2-NEXT:    maxss %xmm1, %xmm2
442; SSE2-NEXT:    cmpunordss %xmm1, %xmm1
443; SSE2-NEXT:    movaps %xmm1, %xmm3
444; SSE2-NEXT:    andnps %xmm2, %xmm3
445; SSE2-NEXT:    andps %xmm0, %xmm1
446; SSE2-NEXT:    orps %xmm3, %xmm1
447; SSE2-NEXT:    movaps %xmm1, %xmm0
448; SSE2-NEXT:    retq
449;
450; SSE41-LABEL: test_v16f32:
451; SSE41:       # %bb.0:
452; SSE41-NEXT:    movaps %xmm2, %xmm4
453; SSE41-NEXT:    maxps %xmm0, %xmm4
454; SSE41-NEXT:    cmpunordps %xmm0, %xmm0
455; SSE41-NEXT:    blendvps %xmm0, %xmm2, %xmm4
456; SSE41-NEXT:    movaps %xmm3, %xmm2
457; SSE41-NEXT:    maxps %xmm1, %xmm2
458; SSE41-NEXT:    cmpunordps %xmm1, %xmm1
459; SSE41-NEXT:    movaps %xmm1, %xmm0
460; SSE41-NEXT:    blendvps %xmm0, %xmm3, %xmm2
461; SSE41-NEXT:    movaps %xmm2, %xmm1
462; SSE41-NEXT:    maxps %xmm4, %xmm1
463; SSE41-NEXT:    cmpunordps %xmm4, %xmm4
464; SSE41-NEXT:    movaps %xmm4, %xmm0
465; SSE41-NEXT:    blendvps %xmm0, %xmm2, %xmm1
466; SSE41-NEXT:    movshdup {{.*#+}} xmm2 = xmm1[1,1,3,3]
467; SSE41-NEXT:    movaps %xmm1, %xmm0
468; SSE41-NEXT:    cmpunordss %xmm1, %xmm0
469; SSE41-NEXT:    movaps %xmm0, %xmm3
470; SSE41-NEXT:    andps %xmm2, %xmm3
471; SSE41-NEXT:    maxss %xmm1, %xmm2
472; SSE41-NEXT:    andnps %xmm2, %xmm0
473; SSE41-NEXT:    orps %xmm3, %xmm0
474; SSE41-NEXT:    movaps %xmm1, %xmm2
475; SSE41-NEXT:    unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm1[1]
476; SSE41-NEXT:    movaps %xmm2, %xmm3
477; SSE41-NEXT:    maxss %xmm0, %xmm3
478; SSE41-NEXT:    cmpunordss %xmm0, %xmm0
479; SSE41-NEXT:    movaps %xmm0, %xmm4
480; SSE41-NEXT:    andnps %xmm3, %xmm4
481; SSE41-NEXT:    andps %xmm2, %xmm0
482; SSE41-NEXT:    orps %xmm4, %xmm0
483; SSE41-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,3,3,3]
484; SSE41-NEXT:    movaps %xmm1, %xmm2
485; SSE41-NEXT:    maxss %xmm0, %xmm2
486; SSE41-NEXT:    cmpunordss %xmm0, %xmm0
487; SSE41-NEXT:    movaps %xmm0, %xmm3
488; SSE41-NEXT:    andnps %xmm2, %xmm3
489; SSE41-NEXT:    andps %xmm1, %xmm0
490; SSE41-NEXT:    orps %xmm3, %xmm0
491; SSE41-NEXT:    retq
492;
493; AVX-LABEL: test_v16f32:
494; AVX:       # %bb.0:
495; AVX-NEXT:    vmaxps %ymm0, %ymm1, %ymm2
496; AVX-NEXT:    vcmpunordps %ymm0, %ymm0, %ymm0
497; AVX-NEXT:    vblendvps %ymm0, %ymm1, %ymm2, %ymm0
498; AVX-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
499; AVX-NEXT:    vmaxss %xmm0, %xmm1, %xmm2
500; AVX-NEXT:    vcmpunordss %xmm0, %xmm0, %xmm3
501; AVX-NEXT:    vblendvps %xmm3, %xmm1, %xmm2, %xmm1
502; AVX-NEXT:    vcmpunordss %xmm1, %xmm1, %xmm2
503; AVX-NEXT:    vshufpd {{.*#+}} xmm3 = xmm0[1,0]
504; AVX-NEXT:    vmaxss %xmm1, %xmm3, %xmm1
505; AVX-NEXT:    vblendvps %xmm2, %xmm3, %xmm1, %xmm1
506; AVX-NEXT:    vcmpunordss %xmm1, %xmm1, %xmm2
507; AVX-NEXT:    vshufps {{.*#+}} xmm3 = xmm0[3,3,3,3]
508; AVX-NEXT:    vmaxss %xmm1, %xmm3, %xmm1
509; AVX-NEXT:    vblendvps %xmm2, %xmm3, %xmm1, %xmm1
510; AVX-NEXT:    vcmpunordss %xmm1, %xmm1, %xmm2
511; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm0
512; AVX-NEXT:    vmaxss %xmm1, %xmm0, %xmm1
513; AVX-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm1
514; AVX-NEXT:    vcmpunordss %xmm1, %xmm1, %xmm2
515; AVX-NEXT:    vmovshdup {{.*#+}} xmm3 = xmm0[1,1,3,3]
516; AVX-NEXT:    vmaxss %xmm1, %xmm3, %xmm1
517; AVX-NEXT:    vblendvps %xmm2, %xmm3, %xmm1, %xmm1
518; AVX-NEXT:    vcmpunordss %xmm1, %xmm1, %xmm2
519; AVX-NEXT:    vshufpd {{.*#+}} xmm3 = xmm0[1,0]
520; AVX-NEXT:    vmaxss %xmm1, %xmm3, %xmm1
521; AVX-NEXT:    vblendvps %xmm2, %xmm3, %xmm1, %xmm1
522; AVX-NEXT:    vcmpunordss %xmm1, %xmm1, %xmm2
523; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
524; AVX-NEXT:    vmaxss %xmm1, %xmm0, %xmm1
525; AVX-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
526; AVX-NEXT:    vzeroupper
527; AVX-NEXT:    retq
528;
529; AVX512BW-LABEL: test_v16f32:
530; AVX512BW:       # %bb.0:
531; AVX512BW-NEXT:    vextractf128 $1, %ymm0, %xmm1
532; AVX512BW-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]
533; AVX512BW-NEXT:    vmaxss %xmm0, %xmm2, %xmm3
534; AVX512BW-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
535; AVX512BW-NEXT:    vmovss %xmm2, %xmm3, %xmm3 {%k1}
536; AVX512BW-NEXT:    vshufpd {{.*#+}} xmm2 = xmm0[1,0]
537; AVX512BW-NEXT:    vcmpunordss %xmm3, %xmm3, %k1
538; AVX512BW-NEXT:    vmaxss %xmm3, %xmm2, %xmm3
539; AVX512BW-NEXT:    vmovss %xmm2, %xmm3, %xmm3 {%k1}
540; AVX512BW-NEXT:    vshufps {{.*#+}} xmm2 = xmm0[3,3,3,3]
541; AVX512BW-NEXT:    vcmpunordss %xmm3, %xmm3, %k1
542; AVX512BW-NEXT:    vmaxss %xmm3, %xmm2, %xmm3
543; AVX512BW-NEXT:    vmovss %xmm2, %xmm3, %xmm3 {%k1}
544; AVX512BW-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm1[1,1,3,3]
545; AVX512BW-NEXT:    vcmpunordss %xmm3, %xmm3, %k1
546; AVX512BW-NEXT:    vmaxss %xmm3, %xmm1, %xmm3
547; AVX512BW-NEXT:    vmovss %xmm1, %xmm3, %xmm3 {%k1}
548; AVX512BW-NEXT:    vcmpunordss %xmm3, %xmm3, %k1
549; AVX512BW-NEXT:    vmaxss %xmm3, %xmm2, %xmm3
550; AVX512BW-NEXT:    vmovss %xmm2, %xmm3, %xmm3 {%k1}
551; AVX512BW-NEXT:    vshufpd {{.*#+}} xmm2 = xmm1[1,0]
552; AVX512BW-NEXT:    vcmpunordss %xmm3, %xmm3, %k1
553; AVX512BW-NEXT:    vmaxss %xmm3, %xmm2, %xmm3
554; AVX512BW-NEXT:    vmovss %xmm2, %xmm3, %xmm3 {%k1}
555; AVX512BW-NEXT:    vextractf32x4 $2, %zmm0, %xmm2
556; AVX512BW-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[3,3,3,3]
557; AVX512BW-NEXT:    vcmpunordss %xmm3, %xmm3, %k1
558; AVX512BW-NEXT:    vmaxss %xmm3, %xmm1, %xmm3
559; AVX512BW-NEXT:    vmovss %xmm1, %xmm3, %xmm3 {%k1}
560; AVX512BW-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm2[1,1,3,3]
561; AVX512BW-NEXT:    vcmpunordss %xmm3, %xmm3, %k1
562; AVX512BW-NEXT:    vmaxss %xmm3, %xmm2, %xmm3
563; AVX512BW-NEXT:    vmovss %xmm2, %xmm3, %xmm3 {%k1}
564; AVX512BW-NEXT:    vcmpunordss %xmm3, %xmm3, %k1
565; AVX512BW-NEXT:    vmaxss %xmm3, %xmm1, %xmm3
566; AVX512BW-NEXT:    vmovss %xmm1, %xmm3, %xmm3 {%k1}
567; AVX512BW-NEXT:    vshufpd {{.*#+}} xmm1 = xmm2[1,0]
568; AVX512BW-NEXT:    vcmpunordss %xmm3, %xmm3, %k1
569; AVX512BW-NEXT:    vmaxss %xmm3, %xmm1, %xmm3
570; AVX512BW-NEXT:    vmovss %xmm1, %xmm3, %xmm3 {%k1}
571; AVX512BW-NEXT:    vextractf32x4 $3, %zmm0, %xmm0
572; AVX512BW-NEXT:    vshufps {{.*#+}} xmm1 = xmm2[3,3,3,3]
573; AVX512BW-NEXT:    vcmpunordss %xmm3, %xmm3, %k1
574; AVX512BW-NEXT:    vmaxss %xmm3, %xmm1, %xmm2
575; AVX512BW-NEXT:    vmovss %xmm1, %xmm2, %xmm2 {%k1}
576; AVX512BW-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
577; AVX512BW-NEXT:    vcmpunordss %xmm2, %xmm2, %k1
578; AVX512BW-NEXT:    vmaxss %xmm2, %xmm0, %xmm2
579; AVX512BW-NEXT:    vmovss %xmm0, %xmm2, %xmm2 {%k1}
580; AVX512BW-NEXT:    vcmpunordss %xmm2, %xmm2, %k1
581; AVX512BW-NEXT:    vmaxss %xmm2, %xmm1, %xmm2
582; AVX512BW-NEXT:    vmovss %xmm1, %xmm2, %xmm2 {%k1}
583; AVX512BW-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]
584; AVX512BW-NEXT:    vcmpunordss %xmm2, %xmm2, %k1
585; AVX512BW-NEXT:    vmaxss %xmm2, %xmm1, %xmm2
586; AVX512BW-NEXT:    vmovss %xmm1, %xmm2, %xmm2 {%k1}
587; AVX512BW-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]
588; AVX512BW-NEXT:    vcmpunordss %xmm2, %xmm2, %k1
589; AVX512BW-NEXT:    vmaxss %xmm2, %xmm1, %xmm0
590; AVX512BW-NEXT:    vmovss %xmm1, %xmm0, %xmm0 {%k1}
591; AVX512BW-NEXT:    vzeroupper
592; AVX512BW-NEXT:    retq
593;
594; AVX512VL-LABEL: test_v16f32:
595; AVX512VL:       # %bb.0:
596; AVX512VL-NEXT:    vextractf32x4 $3, %zmm0, %xmm3
597; AVX512VL-NEXT:    vshufps {{.*#+}} xmm1 = xmm3[3,3,3,3]
598; AVX512VL-NEXT:    vshufpd {{.*#+}} xmm2 = xmm3[1,0]
599; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm4 = xmm3[1,1,3,3]
600; AVX512VL-NEXT:    vextractf32x4 $2, %zmm0, %xmm6
601; AVX512VL-NEXT:    vshufps {{.*#+}} xmm5 = xmm6[3,3,3,3]
602; AVX512VL-NEXT:    vshufpd {{.*#+}} xmm7 = xmm6[1,0]
603; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm8 = xmm6[1,1,3,3]
604; AVX512VL-NEXT:    vextractf128 $1, %ymm0, %xmm9
605; AVX512VL-NEXT:    vshufps {{.*#+}} xmm10 = xmm9[3,3,3,3]
606; AVX512VL-NEXT:    vshufpd {{.*#+}} xmm11 = xmm9[1,0]
607; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm12 = xmm9[1,1,3,3]
608; AVX512VL-NEXT:    vshufps {{.*#+}} xmm13 = xmm0[3,3,3,3]
609; AVX512VL-NEXT:    vshufpd {{.*#+}} xmm14 = xmm0[1,0]
610; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm15 = xmm0[1,1,3,3]
611; AVX512VL-NEXT:    vmaxss %xmm0, %xmm15, %xmm16
612; AVX512VL-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
613; AVX512VL-NEXT:    vmovss %xmm15, %xmm16, %xmm16 {%k1}
614; AVX512VL-NEXT:    vcmpunordss %xmm16, %xmm16, %k1
615; AVX512VL-NEXT:    vmaxss %xmm16, %xmm14, %xmm0
616; AVX512VL-NEXT:    vmovss %xmm14, %xmm0, %xmm0 {%k1}
617; AVX512VL-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
618; AVX512VL-NEXT:    vmaxss %xmm0, %xmm13, %xmm0
619; AVX512VL-NEXT:    vmovss %xmm13, %xmm0, %xmm0 {%k1}
620; AVX512VL-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
621; AVX512VL-NEXT:    vmaxss %xmm0, %xmm9, %xmm0
622; AVX512VL-NEXT:    vmovss %xmm9, %xmm0, %xmm0 {%k1}
623; AVX512VL-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
624; AVX512VL-NEXT:    vmaxss %xmm0, %xmm12, %xmm0
625; AVX512VL-NEXT:    vmovss %xmm12, %xmm0, %xmm0 {%k1}
626; AVX512VL-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
627; AVX512VL-NEXT:    vmaxss %xmm0, %xmm11, %xmm0
628; AVX512VL-NEXT:    vmovss %xmm11, %xmm0, %xmm0 {%k1}
629; AVX512VL-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
630; AVX512VL-NEXT:    vmaxss %xmm0, %xmm10, %xmm0
631; AVX512VL-NEXT:    vmovss %xmm10, %xmm0, %xmm0 {%k1}
632; AVX512VL-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
633; AVX512VL-NEXT:    vmaxss %xmm0, %xmm6, %xmm0
634; AVX512VL-NEXT:    vmovss %xmm6, %xmm0, %xmm0 {%k1}
635; AVX512VL-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
636; AVX512VL-NEXT:    vmaxss %xmm0, %xmm8, %xmm0
637; AVX512VL-NEXT:    vmovss %xmm8, %xmm0, %xmm0 {%k1}
638; AVX512VL-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
639; AVX512VL-NEXT:    vmaxss %xmm0, %xmm7, %xmm0
640; AVX512VL-NEXT:    vmovss %xmm7, %xmm0, %xmm0 {%k1}
641; AVX512VL-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
642; AVX512VL-NEXT:    vmaxss %xmm0, %xmm5, %xmm0
643; AVX512VL-NEXT:    vmovss %xmm5, %xmm0, %xmm0 {%k1}
644; AVX512VL-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
645; AVX512VL-NEXT:    vmaxss %xmm0, %xmm3, %xmm0
646; AVX512VL-NEXT:    vmovss %xmm3, %xmm0, %xmm0 {%k1}
647; AVX512VL-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
648; AVX512VL-NEXT:    vmaxss %xmm0, %xmm4, %xmm0
649; AVX512VL-NEXT:    vmovss %xmm4, %xmm0, %xmm0 {%k1}
650; AVX512VL-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
651; AVX512VL-NEXT:    vmaxss %xmm0, %xmm2, %xmm0
652; AVX512VL-NEXT:    vmovss %xmm2, %xmm0, %xmm0 {%k1}
653; AVX512VL-NEXT:    vcmpunordss %xmm0, %xmm0, %k1
654; AVX512VL-NEXT:    vmaxss %xmm0, %xmm1, %xmm0
655; AVX512VL-NEXT:    vmovss %xmm1, %xmm0, %xmm0 {%k1}
656; AVX512VL-NEXT:    vzeroupper
657; AVX512VL-NEXT:    retq
658  %1 = call float @llvm.vector.reduce.fmax.v16f32(<16 x float> %a0)
659  ret float %1
660}
661
662;
663; vXf64
664;
665
666define double @test_v2f64(<2 x double> %a0) {
667; SSE-LABEL: test_v2f64:
668; SSE:       # %bb.0:
669; SSE-NEXT:    movapd %xmm0, %xmm2
670; SSE-NEXT:    unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm0[1]
671; SSE-NEXT:    movapd %xmm0, %xmm1
672; SSE-NEXT:    cmpunordsd %xmm0, %xmm1
673; SSE-NEXT:    movapd %xmm1, %xmm3
674; SSE-NEXT:    andpd %xmm2, %xmm3
675; SSE-NEXT:    maxsd %xmm0, %xmm2
676; SSE-NEXT:    andnpd %xmm2, %xmm1
677; SSE-NEXT:    orpd %xmm3, %xmm1
678; SSE-NEXT:    movapd %xmm1, %xmm0
679; SSE-NEXT:    retq
680;
681; AVX-LABEL: test_v2f64:
682; AVX:       # %bb.0:
683; AVX-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]
684; AVX-NEXT:    vmaxsd %xmm0, %xmm1, %xmm2
685; AVX-NEXT:    vcmpunordsd %xmm0, %xmm0, %xmm0
686; AVX-NEXT:    vblendvpd %xmm0, %xmm1, %xmm2, %xmm0
687; AVX-NEXT:    retq
688;
689; AVX512-LABEL: test_v2f64:
690; AVX512:       # %bb.0:
691; AVX512-NEXT:    vshufpd {{.*#+}} xmm2 = xmm0[1,0]
692; AVX512-NEXT:    vmaxsd %xmm0, %xmm2, %xmm1
693; AVX512-NEXT:    vcmpunordsd %xmm0, %xmm0, %k1
694; AVX512-NEXT:    vmovsd %xmm2, %xmm1, %xmm1 {%k1}
695; AVX512-NEXT:    vmovapd %xmm1, %xmm0
696; AVX512-NEXT:    retq
697  %1 = call double @llvm.vector.reduce.fmax.v2f64(<2 x double> %a0)
698  ret double %1
699}
700
701define double @test_v4f64(<4 x double> %a0) {
702; SSE2-LABEL: test_v4f64:
703; SSE2:       # %bb.0:
704; SSE2-NEXT:    movapd %xmm1, %xmm2
705; SSE2-NEXT:    maxpd %xmm0, %xmm2
706; SSE2-NEXT:    cmpunordpd %xmm0, %xmm0
707; SSE2-NEXT:    andpd %xmm0, %xmm1
708; SSE2-NEXT:    andnpd %xmm2, %xmm0
709; SSE2-NEXT:    orpd %xmm1, %xmm0
710; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
711; SSE2-NEXT:    movapd %xmm0, %xmm1
712; SSE2-NEXT:    cmpunordsd %xmm0, %xmm1
713; SSE2-NEXT:    movapd %xmm1, %xmm3
714; SSE2-NEXT:    andpd %xmm2, %xmm3
715; SSE2-NEXT:    maxsd %xmm0, %xmm2
716; SSE2-NEXT:    andnpd %xmm2, %xmm1
717; SSE2-NEXT:    orpd %xmm3, %xmm1
718; SSE2-NEXT:    movapd %xmm1, %xmm0
719; SSE2-NEXT:    retq
720;
721; SSE41-LABEL: test_v4f64:
722; SSE41:       # %bb.0:
723; SSE41-NEXT:    movapd %xmm1, %xmm2
724; SSE41-NEXT:    maxpd %xmm0, %xmm2
725; SSE41-NEXT:    cmpunordpd %xmm0, %xmm0
726; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
727; SSE41-NEXT:    movapd %xmm2, %xmm1
728; SSE41-NEXT:    unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm2[1]
729; SSE41-NEXT:    movapd %xmm2, %xmm0
730; SSE41-NEXT:    cmpunordsd %xmm2, %xmm0
731; SSE41-NEXT:    movapd %xmm0, %xmm3
732; SSE41-NEXT:    andpd %xmm1, %xmm3
733; SSE41-NEXT:    maxsd %xmm2, %xmm1
734; SSE41-NEXT:    andnpd %xmm1, %xmm0
735; SSE41-NEXT:    orpd %xmm3, %xmm0
736; SSE41-NEXT:    retq
737;
738; AVX-LABEL: test_v4f64:
739; AVX:       # %bb.0:
740; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
741; AVX-NEXT:    vshufpd {{.*#+}} xmm2 = xmm1[1,0]
742; AVX-NEXT:    vshufpd {{.*#+}} xmm3 = xmm0[1,0]
743; AVX-NEXT:    vmaxsd %xmm0, %xmm3, %xmm4
744; AVX-NEXT:    vcmpunordsd %xmm0, %xmm0, %xmm0
745; AVX-NEXT:    vblendvpd %xmm0, %xmm3, %xmm4, %xmm0
746; AVX-NEXT:    vcmpunordsd %xmm0, %xmm0, %xmm3
747; AVX-NEXT:    vmaxsd %xmm0, %xmm1, %xmm0
748; AVX-NEXT:    vblendvpd %xmm3, %xmm1, %xmm0, %xmm0
749; AVX-NEXT:    vcmpunordsd %xmm0, %xmm0, %xmm1
750; AVX-NEXT:    vmaxsd %xmm0, %xmm2, %xmm0
751; AVX-NEXT:    vblendvpd %xmm1, %xmm2, %xmm0, %xmm0
752; AVX-NEXT:    vzeroupper
753; AVX-NEXT:    retq
754;
755; AVX512-LABEL: test_v4f64:
756; AVX512:       # %bb.0:
757; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm1
758; AVX512-NEXT:    vshufpd {{.*#+}} xmm2 = xmm1[1,0]
759; AVX512-NEXT:    vshufpd {{.*#+}} xmm3 = xmm0[1,0]
760; AVX512-NEXT:    vmaxsd %xmm0, %xmm3, %xmm4
761; AVX512-NEXT:    vcmpunordsd %xmm0, %xmm0, %k1
762; AVX512-NEXT:    vmovsd %xmm3, %xmm4, %xmm4 {%k1}
763; AVX512-NEXT:    vcmpunordsd %xmm4, %xmm4, %k1
764; AVX512-NEXT:    vmaxsd %xmm4, %xmm1, %xmm0
765; AVX512-NEXT:    vmovsd %xmm1, %xmm0, %xmm0 {%k1}
766; AVX512-NEXT:    vcmpunordsd %xmm0, %xmm0, %k1
767; AVX512-NEXT:    vmaxsd %xmm0, %xmm2, %xmm0
768; AVX512-NEXT:    vmovsd %xmm2, %xmm0, %xmm0 {%k1}
769; AVX512-NEXT:    vzeroupper
770; AVX512-NEXT:    retq
771  %1 = call double @llvm.vector.reduce.fmax.v4f64(<4 x double> %a0)
772  ret double %1
773}
774
775define double @test_v8f64(<8 x double> %a0) {
776; SSE2-LABEL: test_v8f64:
777; SSE2:       # %bb.0:
778; SSE2-NEXT:    movapd %xmm2, %xmm4
779; SSE2-NEXT:    maxpd %xmm0, %xmm4
780; SSE2-NEXT:    cmpunordpd %xmm0, %xmm0
781; SSE2-NEXT:    andpd %xmm0, %xmm2
782; SSE2-NEXT:    andnpd %xmm4, %xmm0
783; SSE2-NEXT:    orpd %xmm2, %xmm0
784; SSE2-NEXT:    movapd %xmm3, %xmm2
785; SSE2-NEXT:    maxpd %xmm1, %xmm2
786; SSE2-NEXT:    cmpunordpd %xmm1, %xmm1
787; SSE2-NEXT:    andpd %xmm1, %xmm3
788; SSE2-NEXT:    andnpd %xmm2, %xmm1
789; SSE2-NEXT:    orpd %xmm3, %xmm1
790; SSE2-NEXT:    movapd %xmm1, %xmm2
791; SSE2-NEXT:    maxpd %xmm0, %xmm2
792; SSE2-NEXT:    cmpunordpd %xmm0, %xmm0
793; SSE2-NEXT:    andpd %xmm0, %xmm1
794; SSE2-NEXT:    andnpd %xmm2, %xmm0
795; SSE2-NEXT:    orpd %xmm1, %xmm0
796; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
797; SSE2-NEXT:    movapd %xmm0, %xmm1
798; SSE2-NEXT:    cmpunordsd %xmm0, %xmm1
799; SSE2-NEXT:    movapd %xmm1, %xmm3
800; SSE2-NEXT:    andpd %xmm2, %xmm3
801; SSE2-NEXT:    maxsd %xmm0, %xmm2
802; SSE2-NEXT:    andnpd %xmm2, %xmm1
803; SSE2-NEXT:    orpd %xmm3, %xmm1
804; SSE2-NEXT:    movapd %xmm1, %xmm0
805; SSE2-NEXT:    retq
806;
807; SSE41-LABEL: test_v8f64:
808; SSE41:       # %bb.0:
809; SSE41-NEXT:    movapd %xmm2, %xmm4
810; SSE41-NEXT:    maxpd %xmm0, %xmm4
811; SSE41-NEXT:    cmpunordpd %xmm0, %xmm0
812; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
813; SSE41-NEXT:    movapd %xmm3, %xmm2
814; SSE41-NEXT:    maxpd %xmm1, %xmm2
815; SSE41-NEXT:    cmpunordpd %xmm1, %xmm1
816; SSE41-NEXT:    movapd %xmm1, %xmm0
817; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
818; SSE41-NEXT:    movapd %xmm2, %xmm1
819; SSE41-NEXT:    maxpd %xmm4, %xmm1
820; SSE41-NEXT:    cmpunordpd %xmm4, %xmm4
821; SSE41-NEXT:    movapd %xmm4, %xmm0
822; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
823; SSE41-NEXT:    movapd %xmm1, %xmm2
824; SSE41-NEXT:    unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm1[1]
825; SSE41-NEXT:    movapd %xmm1, %xmm0
826; SSE41-NEXT:    cmpunordsd %xmm1, %xmm0
827; SSE41-NEXT:    movapd %xmm0, %xmm3
828; SSE41-NEXT:    andpd %xmm2, %xmm3
829; SSE41-NEXT:    maxsd %xmm1, %xmm2
830; SSE41-NEXT:    andnpd %xmm2, %xmm0
831; SSE41-NEXT:    orpd %xmm3, %xmm0
832; SSE41-NEXT:    retq
833;
834; AVX-LABEL: test_v8f64:
835; AVX:       # %bb.0:
836; AVX-NEXT:    vmaxpd %ymm0, %ymm1, %ymm2
837; AVX-NEXT:    vcmpunordpd %ymm0, %ymm0, %ymm0
838; AVX-NEXT:    vblendvpd %ymm0, %ymm1, %ymm2, %ymm0
839; AVX-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]
840; AVX-NEXT:    vmaxsd %xmm0, %xmm1, %xmm2
841; AVX-NEXT:    vcmpunordsd %xmm0, %xmm0, %xmm3
842; AVX-NEXT:    vblendvpd %xmm3, %xmm1, %xmm2, %xmm1
843; AVX-NEXT:    vcmpunordsd %xmm1, %xmm1, %xmm2
844; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm0
845; AVX-NEXT:    vmaxsd %xmm1, %xmm0, %xmm1
846; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm1
847; AVX-NEXT:    vcmpunordsd %xmm1, %xmm1, %xmm2
848; AVX-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
849; AVX-NEXT:    vmaxsd %xmm1, %xmm0, %xmm1
850; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
851; AVX-NEXT:    vzeroupper
852; AVX-NEXT:    retq
853;
854; AVX512BW-LABEL: test_v8f64:
855; AVX512BW:       # %bb.0:
856; AVX512BW-NEXT:    vextractf32x4 $3, %zmm0, %xmm2
857; AVX512BW-NEXT:    vshufpd {{.*#+}} xmm1 = xmm2[1,0]
858; AVX512BW-NEXT:    vextractf32x4 $2, %zmm0, %xmm3
859; AVX512BW-NEXT:    vshufpd {{.*#+}} xmm4 = xmm3[1,0]
860; AVX512BW-NEXT:    vextractf128 $1, %ymm0, %xmm5
861; AVX512BW-NEXT:    vshufpd {{.*#+}} xmm6 = xmm5[1,0]
862; AVX512BW-NEXT:    vshufpd {{.*#+}} xmm7 = xmm0[1,0]
863; AVX512BW-NEXT:    vmaxsd %xmm0, %xmm7, %xmm8
864; AVX512BW-NEXT:    vcmpunordsd %xmm0, %xmm0, %k1
865; AVX512BW-NEXT:    vmovsd %xmm7, %xmm8, %xmm8 {%k1}
866; AVX512BW-NEXT:    vcmpunordsd %xmm8, %xmm8, %k1
867; AVX512BW-NEXT:    vmaxsd %xmm8, %xmm5, %xmm0
868; AVX512BW-NEXT:    vmovsd %xmm5, %xmm0, %xmm0 {%k1}
869; AVX512BW-NEXT:    vcmpunordsd %xmm0, %xmm0, %k1
870; AVX512BW-NEXT:    vmaxsd %xmm0, %xmm6, %xmm0
871; AVX512BW-NEXT:    vmovsd %xmm6, %xmm0, %xmm0 {%k1}
872; AVX512BW-NEXT:    vcmpunordsd %xmm0, %xmm0, %k1
873; AVX512BW-NEXT:    vmaxsd %xmm0, %xmm3, %xmm0
874; AVX512BW-NEXT:    vmovsd %xmm3, %xmm0, %xmm0 {%k1}
875; AVX512BW-NEXT:    vcmpunordsd %xmm0, %xmm0, %k1
876; AVX512BW-NEXT:    vmaxsd %xmm0, %xmm4, %xmm0
877; AVX512BW-NEXT:    vmovsd %xmm4, %xmm0, %xmm0 {%k1}
878; AVX512BW-NEXT:    vcmpunordsd %xmm0, %xmm0, %k1
879; AVX512BW-NEXT:    vmaxsd %xmm0, %xmm2, %xmm0
880; AVX512BW-NEXT:    vmovsd %xmm2, %xmm0, %xmm0 {%k1}
881; AVX512BW-NEXT:    vcmpunordsd %xmm0, %xmm0, %k1
882; AVX512BW-NEXT:    vmaxsd %xmm0, %xmm1, %xmm0
883; AVX512BW-NEXT:    vmovsd %xmm1, %xmm0, %xmm0 {%k1}
884; AVX512BW-NEXT:    vzeroupper
885; AVX512BW-NEXT:    retq
886;
887; AVX512VL-LABEL: test_v8f64:
888; AVX512VL:       # %bb.0:
889; AVX512VL-NEXT:    vextractf32x4 $3, %zmm0, %xmm1
890; AVX512VL-NEXT:    vshufpd {{.*#+}} xmm2 = xmm1[1,0]
891; AVX512VL-NEXT:    vextractf32x4 $2, %zmm0, %xmm3
892; AVX512VL-NEXT:    vshufpd {{.*#+}} xmm4 = xmm3[1,0]
893; AVX512VL-NEXT:    vextractf128 $1, %ymm0, %xmm5
894; AVX512VL-NEXT:    vshufpd {{.*#+}} xmm6 = xmm5[1,0]
895; AVX512VL-NEXT:    vshufpd {{.*#+}} xmm7 = xmm0[1,0]
896; AVX512VL-NEXT:    vmaxsd %xmm0, %xmm7, %xmm8
897; AVX512VL-NEXT:    vcmpunordsd %xmm0, %xmm0, %k1
898; AVX512VL-NEXT:    vmovsd %xmm7, %xmm8, %xmm8 {%k1}
899; AVX512VL-NEXT:    vcmpunordsd %xmm8, %xmm8, %k1
900; AVX512VL-NEXT:    vmaxsd %xmm8, %xmm5, %xmm0
901; AVX512VL-NEXT:    vmovsd %xmm5, %xmm0, %xmm0 {%k1}
902; AVX512VL-NEXT:    vcmpunordsd %xmm0, %xmm0, %k1
903; AVX512VL-NEXT:    vmaxsd %xmm0, %xmm6, %xmm0
904; AVX512VL-NEXT:    vmovsd %xmm6, %xmm0, %xmm0 {%k1}
905; AVX512VL-NEXT:    vcmpunordsd %xmm0, %xmm0, %k1
906; AVX512VL-NEXT:    vmaxsd %xmm0, %xmm3, %xmm0
907; AVX512VL-NEXT:    vmovsd %xmm3, %xmm0, %xmm0 {%k1}
908; AVX512VL-NEXT:    vcmpunordsd %xmm0, %xmm0, %k1
909; AVX512VL-NEXT:    vmaxsd %xmm0, %xmm4, %xmm0
910; AVX512VL-NEXT:    vmovsd %xmm4, %xmm0, %xmm0 {%k1}
911; AVX512VL-NEXT:    vcmpunordsd %xmm0, %xmm0, %k1
912; AVX512VL-NEXT:    vmaxsd %xmm0, %xmm1, %xmm0
913; AVX512VL-NEXT:    vmovsd %xmm1, %xmm0, %xmm0 {%k1}
914; AVX512VL-NEXT:    vcmpunordsd %xmm0, %xmm0, %k1
915; AVX512VL-NEXT:    vmaxsd %xmm0, %xmm2, %xmm0
916; AVX512VL-NEXT:    vmovsd %xmm2, %xmm0, %xmm0 {%k1}
917; AVX512VL-NEXT:    vzeroupper
918; AVX512VL-NEXT:    retq
919  %1 = call double @llvm.vector.reduce.fmax.v8f64(<8 x double> %a0)
920  ret double %1
921}
922
923define double @test_v16f64(<16 x double> %a0) {
924; SSE2-LABEL: test_v16f64:
925; SSE2:       # %bb.0:
926; SSE2-NEXT:    movapd %xmm4, %xmm8
927; SSE2-NEXT:    maxpd %xmm0, %xmm8
928; SSE2-NEXT:    cmpunordpd %xmm0, %xmm0
929; SSE2-NEXT:    andpd %xmm0, %xmm4
930; SSE2-NEXT:    andnpd %xmm8, %xmm0
931; SSE2-NEXT:    orpd %xmm4, %xmm0
932; SSE2-NEXT:    movapd %xmm6, %xmm4
933; SSE2-NEXT:    maxpd %xmm2, %xmm4
934; SSE2-NEXT:    cmpunordpd %xmm2, %xmm2
935; SSE2-NEXT:    andpd %xmm2, %xmm6
936; SSE2-NEXT:    andnpd %xmm4, %xmm2
937; SSE2-NEXT:    orpd %xmm6, %xmm2
938; SSE2-NEXT:    movapd %xmm2, %xmm4
939; SSE2-NEXT:    maxpd %xmm0, %xmm4
940; SSE2-NEXT:    cmpunordpd %xmm0, %xmm0
941; SSE2-NEXT:    andpd %xmm0, %xmm2
942; SSE2-NEXT:    andnpd %xmm4, %xmm0
943; SSE2-NEXT:    orpd %xmm2, %xmm0
944; SSE2-NEXT:    movapd %xmm5, %xmm2
945; SSE2-NEXT:    maxpd %xmm1, %xmm2
946; SSE2-NEXT:    cmpunordpd %xmm1, %xmm1
947; SSE2-NEXT:    andpd %xmm1, %xmm5
948; SSE2-NEXT:    andnpd %xmm2, %xmm1
949; SSE2-NEXT:    orpd %xmm5, %xmm1
950; SSE2-NEXT:    movapd %xmm7, %xmm2
951; SSE2-NEXT:    maxpd %xmm3, %xmm2
952; SSE2-NEXT:    cmpunordpd %xmm3, %xmm3
953; SSE2-NEXT:    andpd %xmm3, %xmm7
954; SSE2-NEXT:    andnpd %xmm2, %xmm3
955; SSE2-NEXT:    orpd %xmm7, %xmm3
956; SSE2-NEXT:    movapd %xmm3, %xmm2
957; SSE2-NEXT:    maxpd %xmm1, %xmm2
958; SSE2-NEXT:    cmpunordpd %xmm1, %xmm1
959; SSE2-NEXT:    andpd %xmm1, %xmm3
960; SSE2-NEXT:    andnpd %xmm2, %xmm1
961; SSE2-NEXT:    orpd %xmm3, %xmm1
962; SSE2-NEXT:    movapd %xmm1, %xmm2
963; SSE2-NEXT:    maxpd %xmm0, %xmm2
964; SSE2-NEXT:    cmpunordpd %xmm0, %xmm0
965; SSE2-NEXT:    andpd %xmm0, %xmm1
966; SSE2-NEXT:    andnpd %xmm2, %xmm0
967; SSE2-NEXT:    orpd %xmm1, %xmm0
968; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
969; SSE2-NEXT:    movapd %xmm0, %xmm1
970; SSE2-NEXT:    cmpunordsd %xmm0, %xmm1
971; SSE2-NEXT:    movapd %xmm1, %xmm3
972; SSE2-NEXT:    andpd %xmm2, %xmm3
973; SSE2-NEXT:    maxsd %xmm0, %xmm2
974; SSE2-NEXT:    andnpd %xmm2, %xmm1
975; SSE2-NEXT:    orpd %xmm3, %xmm1
976; SSE2-NEXT:    movapd %xmm1, %xmm0
977; SSE2-NEXT:    retq
978;
979; SSE41-LABEL: test_v16f64:
980; SSE41:       # %bb.0:
981; SSE41-NEXT:    movapd %xmm4, %xmm8
982; SSE41-NEXT:    maxpd %xmm0, %xmm8
983; SSE41-NEXT:    cmpunordpd %xmm0, %xmm0
984; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm8
985; SSE41-NEXT:    movapd %xmm6, %xmm4
986; SSE41-NEXT:    maxpd %xmm2, %xmm4
987; SSE41-NEXT:    cmpunordpd %xmm2, %xmm2
988; SSE41-NEXT:    movapd %xmm2, %xmm0
989; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm4
990; SSE41-NEXT:    movapd %xmm4, %xmm2
991; SSE41-NEXT:    maxpd %xmm8, %xmm2
992; SSE41-NEXT:    cmpunordpd %xmm8, %xmm8
993; SSE41-NEXT:    movapd %xmm8, %xmm0
994; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
995; SSE41-NEXT:    movapd %xmm5, %xmm4
996; SSE41-NEXT:    maxpd %xmm1, %xmm4
997; SSE41-NEXT:    cmpunordpd %xmm1, %xmm1
998; SSE41-NEXT:    movapd %xmm1, %xmm0
999; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm4
1000; SSE41-NEXT:    movapd %xmm7, %xmm1
1001; SSE41-NEXT:    maxpd %xmm3, %xmm1
1002; SSE41-NEXT:    cmpunordpd %xmm3, %xmm3
1003; SSE41-NEXT:    movapd %xmm3, %xmm0
1004; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
1005; SSE41-NEXT:    movapd %xmm1, %xmm3
1006; SSE41-NEXT:    maxpd %xmm4, %xmm3
1007; SSE41-NEXT:    cmpunordpd %xmm4, %xmm4
1008; SSE41-NEXT:    movapd %xmm4, %xmm0
1009; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
1010; SSE41-NEXT:    movapd %xmm3, %xmm1
1011; SSE41-NEXT:    maxpd %xmm2, %xmm1
1012; SSE41-NEXT:    cmpunordpd %xmm2, %xmm2
1013; SSE41-NEXT:    movapd %xmm2, %xmm0
1014; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
1015; SSE41-NEXT:    movapd %xmm1, %xmm2
1016; SSE41-NEXT:    unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm1[1]
1017; SSE41-NEXT:    movapd %xmm1, %xmm0
1018; SSE41-NEXT:    cmpunordsd %xmm1, %xmm0
1019; SSE41-NEXT:    movapd %xmm0, %xmm3
1020; SSE41-NEXT:    andpd %xmm2, %xmm3
1021; SSE41-NEXT:    maxsd %xmm1, %xmm2
1022; SSE41-NEXT:    andnpd %xmm2, %xmm0
1023; SSE41-NEXT:    orpd %xmm3, %xmm0
1024; SSE41-NEXT:    retq
1025;
1026; AVX-LABEL: test_v16f64:
1027; AVX:       # %bb.0:
1028; AVX-NEXT:    vmaxpd %ymm0, %ymm2, %ymm4
1029; AVX-NEXT:    vcmpunordpd %ymm0, %ymm0, %ymm0
1030; AVX-NEXT:    vblendvpd %ymm0, %ymm2, %ymm4, %ymm0
1031; AVX-NEXT:    vmaxpd %ymm1, %ymm3, %ymm2
1032; AVX-NEXT:    vcmpunordpd %ymm1, %ymm1, %ymm1
1033; AVX-NEXT:    vblendvpd %ymm1, %ymm3, %ymm2, %ymm1
1034; AVX-NEXT:    vmaxpd %ymm0, %ymm1, %ymm2
1035; AVX-NEXT:    vcmpunordpd %ymm0, %ymm0, %ymm0
1036; AVX-NEXT:    vblendvpd %ymm0, %ymm1, %ymm2, %ymm0
1037; AVX-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]
1038; AVX-NEXT:    vmaxsd %xmm0, %xmm1, %xmm2
1039; AVX-NEXT:    vcmpunordsd %xmm0, %xmm0, %xmm3
1040; AVX-NEXT:    vblendvpd %xmm3, %xmm1, %xmm2, %xmm1
1041; AVX-NEXT:    vcmpunordsd %xmm1, %xmm1, %xmm2
1042; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm0
1043; AVX-NEXT:    vmaxsd %xmm1, %xmm0, %xmm1
1044; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm1
1045; AVX-NEXT:    vcmpunordsd %xmm1, %xmm1, %xmm2
1046; AVX-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
1047; AVX-NEXT:    vmaxsd %xmm1, %xmm0, %xmm1
1048; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1049; AVX-NEXT:    vzeroupper
1050; AVX-NEXT:    retq
1051;
1052; AVX512-LABEL: test_v16f64:
1053; AVX512:       # %bb.0:
1054; AVX512-NEXT:    vmaxpd %zmm0, %zmm1, %zmm2
1055; AVX512-NEXT:    vcmpunordpd %zmm0, %zmm0, %k1
1056; AVX512-NEXT:    vmovapd %zmm1, %zmm2 {%k1}
1057; AVX512-NEXT:    vshufpd {{.*#+}} xmm0 = xmm2[1,0]
1058; AVX512-NEXT:    vmaxsd %xmm2, %xmm0, %xmm1
1059; AVX512-NEXT:    vcmpunordsd %xmm2, %xmm2, %k1
1060; AVX512-NEXT:    vmovsd %xmm0, %xmm1, %xmm1 {%k1}
1061; AVX512-NEXT:    vcmpunordsd %xmm1, %xmm1, %k1
1062; AVX512-NEXT:    vextractf128 $1, %ymm2, %xmm0
1063; AVX512-NEXT:    vmaxsd %xmm1, %xmm0, %xmm1
1064; AVX512-NEXT:    vmovsd %xmm0, %xmm1, %xmm1 {%k1}
1065; AVX512-NEXT:    vcmpunordsd %xmm1, %xmm1, %k1
1066; AVX512-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
1067; AVX512-NEXT:    vmaxsd %xmm1, %xmm0, %xmm1
1068; AVX512-NEXT:    vmovsd %xmm0, %xmm1, %xmm1 {%k1}
1069; AVX512-NEXT:    vcmpunordsd %xmm1, %xmm1, %k1
1070; AVX512-NEXT:    vextractf32x4 $2, %zmm2, %xmm0
1071; AVX512-NEXT:    vmaxsd %xmm1, %xmm0, %xmm1
1072; AVX512-NEXT:    vmovsd %xmm0, %xmm1, %xmm1 {%k1}
1073; AVX512-NEXT:    vcmpunordsd %xmm1, %xmm1, %k1
1074; AVX512-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]
1075; AVX512-NEXT:    vmaxsd %xmm1, %xmm0, %xmm1
1076; AVX512-NEXT:    vmovsd %xmm0, %xmm1, %xmm1 {%k1}
1077; AVX512-NEXT:    vcmpunordsd %xmm1, %xmm1, %k1
1078; AVX512-NEXT:    vextractf32x4 $3, %zmm2, %xmm0
1079; AVX512-NEXT:    vmaxsd %xmm1, %xmm0, %xmm1
1080; AVX512-NEXT:    vmovsd %xmm0, %xmm1, %xmm1 {%k1}
1081; AVX512-NEXT:    vcmpunordsd %xmm1, %xmm1, %k1
1082; AVX512-NEXT:    vshufpd {{.*#+}} xmm2 = xmm0[1,0]
1083; AVX512-NEXT:    vmaxsd %xmm1, %xmm2, %xmm0
1084; AVX512-NEXT:    vmovsd %xmm2, %xmm0, %xmm0 {%k1}
1085; AVX512-NEXT:    vzeroupper
1086; AVX512-NEXT:    retq
1087  %1 = call double @llvm.vector.reduce.fmax.v16f64(<16 x double> %a0)
1088  ret double %1
1089}
1090
1091declare float @llvm.vector.reduce.fmax.v1f32(<1 x float>)
1092declare float @llvm.vector.reduce.fmax.v2f32(<2 x float>)
1093declare float @llvm.vector.reduce.fmax.v3f32(<3 x float>)
1094declare float @llvm.vector.reduce.fmax.v4f32(<4 x float>)
1095declare float @llvm.vector.reduce.fmax.v8f32(<8 x float>)
1096declare float @llvm.vector.reduce.fmax.v16f32(<16 x float>)
1097
1098declare double @llvm.vector.reduce.fmax.v2f64(<2 x double>)
1099declare double @llvm.vector.reduce.fmax.v4f64(<4 x double>)
1100declare double @llvm.vector.reduce.fmax.v8f64(<8 x double>)
1101declare double @llvm.vector.reduce.fmax.v16f64(<16 x double>)
1102