xref: /llvm-project/llvm/test/CodeGen/X86/vector-reduce-fmaximum.ll (revision 7b3bbd83c0c24087072ec5b22a76799ab31f87d5)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
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.fmaximum.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:    movd %xmm0, %eax
27; SSE2-NEXT:    testl %eax, %eax
28; SSE2-NEXT:    movaps %xmm0, %xmm3
29; SSE2-NEXT:    js .LBB1_2
30; SSE2-NEXT:  # %bb.1:
31; SSE2-NEXT:    movaps %xmm2, %xmm3
32; SSE2-NEXT:  .LBB1_2:
33; SSE2-NEXT:    movaps %xmm3, %xmm1
34; SSE2-NEXT:    cmpunordss %xmm3, %xmm1
35; SSE2-NEXT:    movaps %xmm1, %xmm4
36; SSE2-NEXT:    andps %xmm3, %xmm4
37; SSE2-NEXT:    js .LBB1_4
38; SSE2-NEXT:  # %bb.3:
39; SSE2-NEXT:    movaps %xmm0, %xmm2
40; SSE2-NEXT:  .LBB1_4:
41; SSE2-NEXT:    maxss %xmm2, %xmm3
42; SSE2-NEXT:    andnps %xmm3, %xmm1
43; SSE2-NEXT:    orps %xmm4, %xmm1
44; SSE2-NEXT:    movaps %xmm1, %xmm0
45; SSE2-NEXT:    retq
46;
47; SSE41-LABEL: test_v2f32:
48; SSE41:       # %bb.0:
49; SSE41-NEXT:    movshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]
50; SSE41-NEXT:    movd %xmm0, %eax
51; SSE41-NEXT:    testl %eax, %eax
52; SSE41-NEXT:    movaps %xmm0, %xmm3
53; SSE41-NEXT:    js .LBB1_2
54; SSE41-NEXT:  # %bb.1:
55; SSE41-NEXT:    movaps %xmm2, %xmm3
56; SSE41-NEXT:  .LBB1_2:
57; SSE41-NEXT:    movaps %xmm3, %xmm1
58; SSE41-NEXT:    cmpunordss %xmm3, %xmm1
59; SSE41-NEXT:    movaps %xmm1, %xmm4
60; SSE41-NEXT:    andps %xmm3, %xmm4
61; SSE41-NEXT:    js .LBB1_4
62; SSE41-NEXT:  # %bb.3:
63; SSE41-NEXT:    movaps %xmm0, %xmm2
64; SSE41-NEXT:  .LBB1_4:
65; SSE41-NEXT:    maxss %xmm2, %xmm3
66; SSE41-NEXT:    andnps %xmm3, %xmm1
67; SSE41-NEXT:    orps %xmm4, %xmm1
68; SSE41-NEXT:    movaps %xmm1, %xmm0
69; SSE41-NEXT:    retq
70;
71; AVX-LABEL: test_v2f32:
72; AVX:       # %bb.0:
73; AVX-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
74; AVX-NEXT:    vmovd %xmm0, %eax
75; AVX-NEXT:    testl %eax, %eax
76; AVX-NEXT:    js .LBB1_1
77; AVX-NEXT:  # %bb.2:
78; AVX-NEXT:    vmovaps %xmm0, %xmm2
79; AVX-NEXT:    jmp .LBB1_3
80; AVX-NEXT:  .LBB1_1:
81; AVX-NEXT:    vmovaps %xmm1, %xmm2
82; AVX-NEXT:    vmovaps %xmm0, %xmm1
83; AVX-NEXT:  .LBB1_3:
84; AVX-NEXT:    vmaxss %xmm2, %xmm1, %xmm0
85; AVX-NEXT:    vcmpunordss %xmm1, %xmm1, %xmm2
86; AVX-NEXT:    vblendvps %xmm2, %xmm1, %xmm0, %xmm0
87; AVX-NEXT:    retq
88;
89; AVX512-LABEL: test_v2f32:
90; AVX512:       # %bb.0:
91; AVX512-NEXT:    vmovd %xmm0, %eax
92; AVX512-NEXT:    testl %eax, %eax
93; AVX512-NEXT:    sets %al
94; AVX512-NEXT:    kmovd %eax, %k1
95; AVX512-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
96; AVX512-NEXT:    vmovaps %xmm0, %xmm2
97; AVX512-NEXT:    vmovss %xmm1, %xmm2, %xmm2 {%k1}
98; AVX512-NEXT:    vmovss %xmm0, %xmm1, %xmm1 {%k1}
99; AVX512-NEXT:    vmaxss %xmm2, %xmm1, %xmm0
100; AVX512-NEXT:    vcmpunordss %xmm1, %xmm1, %k1
101; AVX512-NEXT:    vmovss %xmm1, %xmm0, %xmm0 {%k1}
102; AVX512-NEXT:    retq
103  %1 = call float @llvm.vector.reduce.fmaximum.v2f32(<2 x float> %a0)
104  ret float %1
105}
106
107define float @test_v4f32(<4 x float> %a0) {
108; SSE2-LABEL: test_v4f32:
109; SSE2:       # %bb.0:
110; SSE2-NEXT:    movaps %xmm0, %xmm3
111; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,1],xmm0[1,1]
112; SSE2-NEXT:    movd %xmm0, %eax
113; SSE2-NEXT:    testl %eax, %eax
114; SSE2-NEXT:    movaps %xmm0, %xmm4
115; SSE2-NEXT:    js .LBB2_2
116; SSE2-NEXT:  # %bb.1:
117; SSE2-NEXT:    movaps %xmm3, %xmm4
118; SSE2-NEXT:  .LBB2_2:
119; SSE2-NEXT:    movaps %xmm0, %xmm1
120; SSE2-NEXT:    unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]
121; SSE2-NEXT:    movaps %xmm4, %xmm2
122; SSE2-NEXT:    cmpunordss %xmm4, %xmm2
123; SSE2-NEXT:    movaps %xmm2, %xmm5
124; SSE2-NEXT:    andps %xmm4, %xmm5
125; SSE2-NEXT:    js .LBB2_4
126; SSE2-NEXT:  # %bb.3:
127; SSE2-NEXT:    movaps %xmm0, %xmm3
128; SSE2-NEXT:  .LBB2_4:
129; SSE2-NEXT:    maxss %xmm3, %xmm4
130; SSE2-NEXT:    andnps %xmm4, %xmm2
131; SSE2-NEXT:    orps %xmm5, %xmm2
132; SSE2-NEXT:    movd %xmm2, %eax
133; SSE2-NEXT:    testl %eax, %eax
134; SSE2-NEXT:    movaps %xmm2, %xmm4
135; SSE2-NEXT:    js .LBB2_6
136; SSE2-NEXT:  # %bb.5:
137; SSE2-NEXT:    movaps %xmm1, %xmm4
138; SSE2-NEXT:  .LBB2_6:
139; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
140; SSE2-NEXT:    movaps %xmm4, %xmm3
141; SSE2-NEXT:    cmpunordss %xmm4, %xmm3
142; SSE2-NEXT:    movaps %xmm3, %xmm5
143; SSE2-NEXT:    andps %xmm4, %xmm5
144; SSE2-NEXT:    js .LBB2_8
145; SSE2-NEXT:  # %bb.7:
146; SSE2-NEXT:    movaps %xmm2, %xmm1
147; SSE2-NEXT:  .LBB2_8:
148; SSE2-NEXT:    maxss %xmm1, %xmm4
149; SSE2-NEXT:    andnps %xmm4, %xmm3
150; SSE2-NEXT:    orps %xmm5, %xmm3
151; SSE2-NEXT:    movd %xmm3, %eax
152; SSE2-NEXT:    testl %eax, %eax
153; SSE2-NEXT:    movaps %xmm3, %xmm2
154; SSE2-NEXT:    js .LBB2_10
155; SSE2-NEXT:  # %bb.9:
156; SSE2-NEXT:    movaps %xmm0, %xmm2
157; SSE2-NEXT:  .LBB2_10:
158; SSE2-NEXT:    movaps %xmm2, %xmm1
159; SSE2-NEXT:    cmpunordss %xmm2, %xmm1
160; SSE2-NEXT:    movaps %xmm1, %xmm4
161; SSE2-NEXT:    andps %xmm2, %xmm4
162; SSE2-NEXT:    js .LBB2_12
163; SSE2-NEXT:  # %bb.11:
164; SSE2-NEXT:    movaps %xmm3, %xmm0
165; SSE2-NEXT:  .LBB2_12:
166; SSE2-NEXT:    maxss %xmm0, %xmm2
167; SSE2-NEXT:    andnps %xmm2, %xmm1
168; SSE2-NEXT:    orps %xmm4, %xmm1
169; SSE2-NEXT:    movaps %xmm1, %xmm0
170; SSE2-NEXT:    retq
171;
172; SSE41-LABEL: test_v4f32:
173; SSE41:       # %bb.0:
174; SSE41-NEXT:    movshdup {{.*#+}} xmm3 = xmm0[1,1,3,3]
175; SSE41-NEXT:    movd %xmm0, %eax
176; SSE41-NEXT:    testl %eax, %eax
177; SSE41-NEXT:    movaps %xmm0, %xmm4
178; SSE41-NEXT:    js .LBB2_2
179; SSE41-NEXT:  # %bb.1:
180; SSE41-NEXT:    movaps %xmm3, %xmm4
181; SSE41-NEXT:  .LBB2_2:
182; SSE41-NEXT:    movaps %xmm0, %xmm1
183; SSE41-NEXT:    unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]
184; SSE41-NEXT:    movaps %xmm4, %xmm2
185; SSE41-NEXT:    cmpunordss %xmm4, %xmm2
186; SSE41-NEXT:    movaps %xmm2, %xmm5
187; SSE41-NEXT:    andps %xmm4, %xmm5
188; SSE41-NEXT:    js .LBB2_4
189; SSE41-NEXT:  # %bb.3:
190; SSE41-NEXT:    movaps %xmm0, %xmm3
191; SSE41-NEXT:  .LBB2_4:
192; SSE41-NEXT:    maxss %xmm3, %xmm4
193; SSE41-NEXT:    andnps %xmm4, %xmm2
194; SSE41-NEXT:    orps %xmm5, %xmm2
195; SSE41-NEXT:    movd %xmm2, %eax
196; SSE41-NEXT:    testl %eax, %eax
197; SSE41-NEXT:    movaps %xmm2, %xmm4
198; SSE41-NEXT:    js .LBB2_6
199; SSE41-NEXT:  # %bb.5:
200; SSE41-NEXT:    movaps %xmm1, %xmm4
201; SSE41-NEXT:  .LBB2_6:
202; SSE41-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
203; SSE41-NEXT:    movaps %xmm4, %xmm3
204; SSE41-NEXT:    cmpunordss %xmm4, %xmm3
205; SSE41-NEXT:    movaps %xmm3, %xmm5
206; SSE41-NEXT:    andps %xmm4, %xmm5
207; SSE41-NEXT:    js .LBB2_8
208; SSE41-NEXT:  # %bb.7:
209; SSE41-NEXT:    movaps %xmm2, %xmm1
210; SSE41-NEXT:  .LBB2_8:
211; SSE41-NEXT:    maxss %xmm1, %xmm4
212; SSE41-NEXT:    andnps %xmm4, %xmm3
213; SSE41-NEXT:    orps %xmm5, %xmm3
214; SSE41-NEXT:    movd %xmm3, %eax
215; SSE41-NEXT:    testl %eax, %eax
216; SSE41-NEXT:    movaps %xmm3, %xmm2
217; SSE41-NEXT:    js .LBB2_10
218; SSE41-NEXT:  # %bb.9:
219; SSE41-NEXT:    movaps %xmm0, %xmm2
220; SSE41-NEXT:  .LBB2_10:
221; SSE41-NEXT:    movaps %xmm2, %xmm1
222; SSE41-NEXT:    cmpunordss %xmm2, %xmm1
223; SSE41-NEXT:    movaps %xmm1, %xmm4
224; SSE41-NEXT:    andps %xmm2, %xmm4
225; SSE41-NEXT:    js .LBB2_12
226; SSE41-NEXT:  # %bb.11:
227; SSE41-NEXT:    movaps %xmm3, %xmm0
228; SSE41-NEXT:  .LBB2_12:
229; SSE41-NEXT:    maxss %xmm0, %xmm2
230; SSE41-NEXT:    andnps %xmm2, %xmm1
231; SSE41-NEXT:    orps %xmm4, %xmm1
232; SSE41-NEXT:    movaps %xmm1, %xmm0
233; SSE41-NEXT:    retq
234;
235; AVX-LABEL: test_v4f32:
236; AVX:       # %bb.0:
237; AVX-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]
238; AVX-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]
239; AVX-NEXT:    vmovd %xmm0, %eax
240; AVX-NEXT:    testl %eax, %eax
241; AVX-NEXT:    js .LBB2_1
242; AVX-NEXT:  # %bb.2:
243; AVX-NEXT:    vmovaps %xmm0, %xmm3
244; AVX-NEXT:    jmp .LBB2_3
245; AVX-NEXT:  .LBB2_1:
246; AVX-NEXT:    vmovaps %xmm2, %xmm3
247; AVX-NEXT:    vmovaps %xmm0, %xmm2
248; AVX-NEXT:  .LBB2_3:
249; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
250; AVX-NEXT:    vmaxss %xmm3, %xmm2, %xmm3
251; AVX-NEXT:    vcmpunordss %xmm2, %xmm2, %xmm4
252; AVX-NEXT:    vblendvps %xmm4, %xmm2, %xmm3, %xmm3
253; AVX-NEXT:    vmovd %xmm3, %eax
254; AVX-NEXT:    testl %eax, %eax
255; AVX-NEXT:    js .LBB2_4
256; AVX-NEXT:  # %bb.5:
257; AVX-NEXT:    vmovaps %xmm3, %xmm2
258; AVX-NEXT:    jmp .LBB2_6
259; AVX-NEXT:  .LBB2_4:
260; AVX-NEXT:    vmovapd %xmm1, %xmm2
261; AVX-NEXT:    vmovaps %xmm3, %xmm1
262; AVX-NEXT:  .LBB2_6:
263; AVX-NEXT:    vmaxss %xmm2, %xmm1, %xmm2
264; AVX-NEXT:    vcmpunordss %xmm1, %xmm1, %xmm3
265; AVX-NEXT:    vblendvps %xmm3, %xmm1, %xmm2, %xmm1
266; AVX-NEXT:    vmovd %xmm1, %eax
267; AVX-NEXT:    testl %eax, %eax
268; AVX-NEXT:    js .LBB2_7
269; AVX-NEXT:  # %bb.8:
270; AVX-NEXT:    vmovaps %xmm1, %xmm2
271; AVX-NEXT:    jmp .LBB2_9
272; AVX-NEXT:  .LBB2_7:
273; AVX-NEXT:    vmovaps %xmm0, %xmm2
274; AVX-NEXT:    vmovaps %xmm1, %xmm0
275; AVX-NEXT:  .LBB2_9:
276; AVX-NEXT:    vmaxss %xmm2, %xmm0, %xmm1
277; AVX-NEXT:    vcmpunordss %xmm0, %xmm0, %xmm2
278; AVX-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
279; AVX-NEXT:    retq
280;
281; AVX512-LABEL: test_v4f32:
282; AVX512:       # %bb.0:
283; AVX512-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]
284; AVX512-NEXT:    vshufpd {{.*#+}} xmm2 = xmm0[1,0]
285; AVX512-NEXT:    vmovshdup {{.*#+}} xmm3 = xmm0[1,1,3,3]
286; AVX512-NEXT:    vmovd %xmm0, %eax
287; AVX512-NEXT:    testl %eax, %eax
288; AVX512-NEXT:    sets %al
289; AVX512-NEXT:    kmovd %eax, %k1
290; AVX512-NEXT:    vmovaps %xmm0, %xmm4
291; AVX512-NEXT:    vmovss %xmm3, %xmm4, %xmm4 {%k1}
292; AVX512-NEXT:    vmovss %xmm0, %xmm3, %xmm3 {%k1}
293; AVX512-NEXT:    vmaxss %xmm4, %xmm3, %xmm0
294; AVX512-NEXT:    vcmpunordss %xmm3, %xmm3, %k1
295; AVX512-NEXT:    vmovss %xmm3, %xmm0, %xmm0 {%k1}
296; AVX512-NEXT:    vmovd %xmm0, %eax
297; AVX512-NEXT:    testl %eax, %eax
298; AVX512-NEXT:    sets %al
299; AVX512-NEXT:    kmovd %eax, %k1
300; AVX512-NEXT:    vmovaps %xmm0, %xmm3
301; AVX512-NEXT:    vmovss %xmm2, %xmm3, %xmm3 {%k1}
302; AVX512-NEXT:    vmovss %xmm0, %xmm2, %xmm2 {%k1}
303; AVX512-NEXT:    vmaxss %xmm3, %xmm2, %xmm0
304; AVX512-NEXT:    vcmpunordss %xmm2, %xmm2, %k1
305; AVX512-NEXT:    vmovss %xmm2, %xmm0, %xmm0 {%k1}
306; AVX512-NEXT:    vmovd %xmm0, %eax
307; AVX512-NEXT:    testl %eax, %eax
308; AVX512-NEXT:    sets %al
309; AVX512-NEXT:    kmovd %eax, %k1
310; AVX512-NEXT:    vmovaps %xmm0, %xmm2
311; AVX512-NEXT:    vmovss %xmm1, %xmm2, %xmm2 {%k1}
312; AVX512-NEXT:    vmovss %xmm0, %xmm1, %xmm1 {%k1}
313; AVX512-NEXT:    vmaxss %xmm2, %xmm1, %xmm0
314; AVX512-NEXT:    vcmpunordss %xmm1, %xmm1, %k1
315; AVX512-NEXT:    vmovss %xmm1, %xmm0, %xmm0 {%k1}
316; AVX512-NEXT:    retq
317  %1 = call float @llvm.vector.reduce.fmaximum.v4f32(<4 x float> %a0)
318  ret float %1
319}
320
321define float @test_v8f32(<8 x float> %a0) {
322; SSE2-LABEL: test_v8f32:
323; SSE2:       # %bb.0:
324; SSE2-NEXT:    pxor %xmm2, %xmm2
325; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
326; SSE2-NEXT:    movdqa %xmm2, %xmm3
327; SSE2-NEXT:    pandn %xmm0, %xmm3
328; SSE2-NEXT:    movdqa %xmm2, %xmm4
329; SSE2-NEXT:    pandn %xmm1, %xmm4
330; SSE2-NEXT:    pand %xmm2, %xmm1
331; SSE2-NEXT:    por %xmm3, %xmm1
332; SSE2-NEXT:    pand %xmm0, %xmm2
333; SSE2-NEXT:    por %xmm4, %xmm2
334; SSE2-NEXT:    movdqa %xmm2, %xmm3
335; SSE2-NEXT:    maxps %xmm1, %xmm3
336; SSE2-NEXT:    movdqa %xmm2, %xmm0
337; SSE2-NEXT:    cmpunordps %xmm2, %xmm0
338; SSE2-NEXT:    andps %xmm0, %xmm2
339; SSE2-NEXT:    andnps %xmm3, %xmm0
340; SSE2-NEXT:    orps %xmm2, %xmm0
341; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]
342; SSE2-NEXT:    movd %xmm0, %eax
343; SSE2-NEXT:    testl %eax, %eax
344; SSE2-NEXT:    movdqa %xmm0, %xmm3
345; SSE2-NEXT:    js .LBB3_2
346; SSE2-NEXT:  # %bb.1:
347; SSE2-NEXT:    movdqa %xmm2, %xmm3
348; SSE2-NEXT:  .LBB3_2:
349; SSE2-NEXT:    movdqa %xmm3, %xmm1
350; SSE2-NEXT:    cmpunordss %xmm3, %xmm1
351; SSE2-NEXT:    movaps %xmm1, %xmm4
352; SSE2-NEXT:    andps %xmm3, %xmm4
353; SSE2-NEXT:    js .LBB3_4
354; SSE2-NEXT:  # %bb.3:
355; SSE2-NEXT:    movdqa %xmm0, %xmm2
356; SSE2-NEXT:  .LBB3_4:
357; SSE2-NEXT:    maxss %xmm2, %xmm3
358; SSE2-NEXT:    andnps %xmm3, %xmm1
359; SSE2-NEXT:    orps %xmm4, %xmm1
360; SSE2-NEXT:    movd %xmm1, %eax
361; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]
362; SSE2-NEXT:    testl %eax, %eax
363; SSE2-NEXT:    movdqa %xmm1, %xmm4
364; SSE2-NEXT:    js .LBB3_6
365; SSE2-NEXT:  # %bb.5:
366; SSE2-NEXT:    movdqa %xmm3, %xmm4
367; SSE2-NEXT:  .LBB3_6:
368; SSE2-NEXT:    movdqa %xmm4, %xmm2
369; SSE2-NEXT:    cmpunordss %xmm4, %xmm2
370; SSE2-NEXT:    movaps %xmm2, %xmm5
371; SSE2-NEXT:    andps %xmm4, %xmm5
372; SSE2-NEXT:    js .LBB3_8
373; SSE2-NEXT:  # %bb.7:
374; SSE2-NEXT:    movdqa %xmm1, %xmm3
375; SSE2-NEXT:  .LBB3_8:
376; SSE2-NEXT:    maxss %xmm3, %xmm4
377; SSE2-NEXT:    andnps %xmm4, %xmm2
378; SSE2-NEXT:    orps %xmm5, %xmm2
379; SSE2-NEXT:    movd %xmm2, %eax
380; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,3,3,3]
381; SSE2-NEXT:    testl %eax, %eax
382; SSE2-NEXT:    movdqa %xmm2, %xmm3
383; SSE2-NEXT:    js .LBB3_10
384; SSE2-NEXT:  # %bb.9:
385; SSE2-NEXT:    movdqa %xmm1, %xmm3
386; SSE2-NEXT:  .LBB3_10:
387; SSE2-NEXT:    movdqa %xmm3, %xmm0
388; SSE2-NEXT:    cmpunordss %xmm3, %xmm0
389; SSE2-NEXT:    movaps %xmm0, %xmm4
390; SSE2-NEXT:    andps %xmm3, %xmm4
391; SSE2-NEXT:    js .LBB3_12
392; SSE2-NEXT:  # %bb.11:
393; SSE2-NEXT:    movdqa %xmm2, %xmm1
394; SSE2-NEXT:  .LBB3_12:
395; SSE2-NEXT:    maxss %xmm1, %xmm3
396; SSE2-NEXT:    andnps %xmm3, %xmm0
397; SSE2-NEXT:    orps %xmm4, %xmm0
398; SSE2-NEXT:    retq
399;
400; SSE41-LABEL: test_v8f32:
401; SSE41:       # %bb.0:
402; SSE41-NEXT:    movaps %xmm0, %xmm3
403; SSE41-NEXT:    blendvps %xmm0, %xmm1, %xmm3
404; SSE41-NEXT:    blendvps %xmm0, %xmm0, %xmm1
405; SSE41-NEXT:    movaps %xmm1, %xmm2
406; SSE41-NEXT:    maxps %xmm3, %xmm2
407; SSE41-NEXT:    movaps %xmm1, %xmm0
408; SSE41-NEXT:    cmpunordps %xmm1, %xmm0
409; SSE41-NEXT:    blendvps %xmm0, %xmm1, %xmm2
410; SSE41-NEXT:    movshdup {{.*#+}} xmm1 = xmm2[1,1,3,3]
411; SSE41-NEXT:    movd %xmm2, %eax
412; SSE41-NEXT:    testl %eax, %eax
413; SSE41-NEXT:    movaps %xmm2, %xmm3
414; SSE41-NEXT:    js .LBB3_2
415; SSE41-NEXT:  # %bb.1:
416; SSE41-NEXT:    movaps %xmm1, %xmm3
417; SSE41-NEXT:  .LBB3_2:
418; SSE41-NEXT:    movaps %xmm3, %xmm0
419; SSE41-NEXT:    cmpunordss %xmm3, %xmm0
420; SSE41-NEXT:    movaps %xmm0, %xmm4
421; SSE41-NEXT:    andps %xmm3, %xmm4
422; SSE41-NEXT:    js .LBB3_4
423; SSE41-NEXT:  # %bb.3:
424; SSE41-NEXT:    movaps %xmm2, %xmm1
425; SSE41-NEXT:  .LBB3_4:
426; SSE41-NEXT:    maxss %xmm1, %xmm3
427; SSE41-NEXT:    andnps %xmm3, %xmm0
428; SSE41-NEXT:    orps %xmm4, %xmm0
429; SSE41-NEXT:    movd %xmm0, %eax
430; SSE41-NEXT:    movaps %xmm2, %xmm3
431; SSE41-NEXT:    unpckhpd {{.*#+}} xmm3 = xmm3[1],xmm2[1]
432; SSE41-NEXT:    testl %eax, %eax
433; SSE41-NEXT:    movaps %xmm0, %xmm4
434; SSE41-NEXT:    js .LBB3_6
435; SSE41-NEXT:  # %bb.5:
436; SSE41-NEXT:    movaps %xmm3, %xmm4
437; SSE41-NEXT:  .LBB3_6:
438; SSE41-NEXT:    movaps %xmm4, %xmm1
439; SSE41-NEXT:    cmpunordss %xmm4, %xmm1
440; SSE41-NEXT:    movaps %xmm1, %xmm5
441; SSE41-NEXT:    andps %xmm4, %xmm5
442; SSE41-NEXT:    js .LBB3_8
443; SSE41-NEXT:  # %bb.7:
444; SSE41-NEXT:    movaps %xmm0, %xmm3
445; SSE41-NEXT:  .LBB3_8:
446; SSE41-NEXT:    maxss %xmm3, %xmm4
447; SSE41-NEXT:    andnps %xmm4, %xmm1
448; SSE41-NEXT:    orps %xmm5, %xmm1
449; SSE41-NEXT:    movd %xmm1, %eax
450; SSE41-NEXT:    shufps {{.*#+}} xmm2 = xmm2[3,3,3,3]
451; SSE41-NEXT:    testl %eax, %eax
452; SSE41-NEXT:    movaps %xmm1, %xmm3
453; SSE41-NEXT:    js .LBB3_10
454; SSE41-NEXT:  # %bb.9:
455; SSE41-NEXT:    movaps %xmm2, %xmm3
456; SSE41-NEXT:  .LBB3_10:
457; SSE41-NEXT:    movaps %xmm3, %xmm0
458; SSE41-NEXT:    cmpunordss %xmm3, %xmm0
459; SSE41-NEXT:    movaps %xmm0, %xmm4
460; SSE41-NEXT:    andps %xmm3, %xmm4
461; SSE41-NEXT:    js .LBB3_12
462; SSE41-NEXT:  # %bb.11:
463; SSE41-NEXT:    movaps %xmm1, %xmm2
464; SSE41-NEXT:  .LBB3_12:
465; SSE41-NEXT:    maxss %xmm2, %xmm3
466; SSE41-NEXT:    andnps %xmm3, %xmm0
467; SSE41-NEXT:    orps %xmm4, %xmm0
468; SSE41-NEXT:    retq
469;
470; AVX-LABEL: test_v8f32:
471; AVX:       # %bb.0:
472; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
473; AVX-NEXT:    vblendvps %xmm0, %xmm1, %xmm0, %xmm2
474; AVX-NEXT:    vblendvps %xmm0, %xmm0, %xmm1, %xmm0
475; AVX-NEXT:    vmaxps %xmm2, %xmm0, %xmm1
476; AVX-NEXT:    vcmpunordps %xmm0, %xmm0, %xmm2
477; AVX-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
478; AVX-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
479; AVX-NEXT:    vmovd %xmm0, %eax
480; AVX-NEXT:    testl %eax, %eax
481; AVX-NEXT:    js .LBB3_1
482; AVX-NEXT:  # %bb.2:
483; AVX-NEXT:    vmovaps %xmm0, %xmm2
484; AVX-NEXT:    jmp .LBB3_3
485; AVX-NEXT:  .LBB3_1:
486; AVX-NEXT:    vmovaps %xmm1, %xmm2
487; AVX-NEXT:    vmovaps %xmm0, %xmm1
488; AVX-NEXT:  .LBB3_3:
489; AVX-NEXT:    vmaxss %xmm2, %xmm1, %xmm2
490; AVX-NEXT:    vcmpunordss %xmm1, %xmm1, %xmm3
491; AVX-NEXT:    vblendvps %xmm3, %xmm1, %xmm2, %xmm2
492; AVX-NEXT:    vmovd %xmm2, %eax
493; AVX-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]
494; AVX-NEXT:    testl %eax, %eax
495; AVX-NEXT:    js .LBB3_4
496; AVX-NEXT:  # %bb.5:
497; AVX-NEXT:    vmovaps %xmm2, %xmm3
498; AVX-NEXT:    jmp .LBB3_6
499; AVX-NEXT:  .LBB3_4:
500; AVX-NEXT:    vmovapd %xmm1, %xmm3
501; AVX-NEXT:    vmovaps %xmm2, %xmm1
502; AVX-NEXT:  .LBB3_6:
503; AVX-NEXT:    vmaxss %xmm3, %xmm1, %xmm2
504; AVX-NEXT:    vcmpunordss %xmm1, %xmm1, %xmm3
505; AVX-NEXT:    vblendvps %xmm3, %xmm1, %xmm2, %xmm1
506; AVX-NEXT:    vmovd %xmm1, %eax
507; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
508; AVX-NEXT:    testl %eax, %eax
509; AVX-NEXT:    js .LBB3_7
510; AVX-NEXT:  # %bb.8:
511; AVX-NEXT:    vmovaps %xmm1, %xmm2
512; AVX-NEXT:    jmp .LBB3_9
513; AVX-NEXT:  .LBB3_7:
514; AVX-NEXT:    vmovaps %xmm0, %xmm2
515; AVX-NEXT:    vmovaps %xmm1, %xmm0
516; AVX-NEXT:  .LBB3_9:
517; AVX-NEXT:    vmaxss %xmm2, %xmm0, %xmm1
518; AVX-NEXT:    vcmpunordss %xmm0, %xmm0, %xmm2
519; AVX-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
520; AVX-NEXT:    vzeroupper
521; AVX-NEXT:    retq
522;
523; AVX512BW-LABEL: test_v8f32:
524; AVX512BW:       # %bb.0:
525; AVX512BW-NEXT:    vextractf128 $1, %ymm0, %xmm1
526; AVX512BW-NEXT:    vblendvps %xmm0, %xmm1, %xmm0, %xmm2
527; AVX512BW-NEXT:    vblendvps %xmm0, %xmm0, %xmm1, %xmm0
528; AVX512BW-NEXT:    vmaxps %xmm2, %xmm0, %xmm1
529; AVX512BW-NEXT:    vcmpunordps %xmm0, %xmm0, %xmm2
530; AVX512BW-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
531; AVX512BW-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
532; AVX512BW-NEXT:    vmovd %xmm0, %eax
533; AVX512BW-NEXT:    testl %eax, %eax
534; AVX512BW-NEXT:    sets %al
535; AVX512BW-NEXT:    kmovd %eax, %k1
536; AVX512BW-NEXT:    vmovaps %xmm0, %xmm2
537; AVX512BW-NEXT:    vmovss %xmm1, %xmm2, %xmm2 {%k1}
538; AVX512BW-NEXT:    vmovss %xmm0, %xmm1, %xmm1 {%k1}
539; AVX512BW-NEXT:    vmaxss %xmm2, %xmm1, %xmm2
540; AVX512BW-NEXT:    vcmpunordss %xmm1, %xmm1, %k1
541; AVX512BW-NEXT:    vmovss %xmm1, %xmm2, %xmm2 {%k1}
542; AVX512BW-NEXT:    vmovd %xmm2, %eax
543; AVX512BW-NEXT:    testl %eax, %eax
544; AVX512BW-NEXT:    sets %al
545; AVX512BW-NEXT:    kmovd %eax, %k1
546; AVX512BW-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]
547; AVX512BW-NEXT:    vmovaps %xmm2, %xmm3
548; AVX512BW-NEXT:    vmovss %xmm1, %xmm3, %xmm3 {%k1}
549; AVX512BW-NEXT:    vmovss %xmm2, %xmm1, %xmm1 {%k1}
550; AVX512BW-NEXT:    vmaxss %xmm3, %xmm1, %xmm2
551; AVX512BW-NEXT:    vcmpunordss %xmm1, %xmm1, %k1
552; AVX512BW-NEXT:    vmovss %xmm1, %xmm2, %xmm2 {%k1}
553; AVX512BW-NEXT:    vmovd %xmm2, %eax
554; AVX512BW-NEXT:    testl %eax, %eax
555; AVX512BW-NEXT:    sets %al
556; AVX512BW-NEXT:    kmovd %eax, %k1
557; AVX512BW-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]
558; AVX512BW-NEXT:    vmovaps %xmm2, %xmm0
559; AVX512BW-NEXT:    vmovss %xmm1, %xmm0, %xmm0 {%k1}
560; AVX512BW-NEXT:    vmovss %xmm2, %xmm1, %xmm1 {%k1}
561; AVX512BW-NEXT:    vmaxss %xmm0, %xmm1, %xmm0
562; AVX512BW-NEXT:    vcmpunordss %xmm1, %xmm1, %k1
563; AVX512BW-NEXT:    vmovss %xmm1, %xmm0, %xmm0 {%k1}
564; AVX512BW-NEXT:    vzeroupper
565; AVX512BW-NEXT:    retq
566;
567; AVX512VL-LABEL: test_v8f32:
568; AVX512VL:       # %bb.0:
569; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
570; AVX512VL-NEXT:    vpcmpgtd %xmm0, %xmm1, %k1
571; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
572; AVX512VL-NEXT:    vblendmps %xmm1, %xmm0, %xmm2 {%k1}
573; AVX512VL-NEXT:    vmovaps %xmm0, %xmm1 {%k1}
574; AVX512VL-NEXT:    vmaxps %xmm2, %xmm1, %xmm0
575; AVX512VL-NEXT:    vcmpunordps %xmm1, %xmm1, %k1
576; AVX512VL-NEXT:    vmovaps %xmm1, %xmm0 {%k1}
577; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
578; AVX512VL-NEXT:    vmovd %xmm0, %eax
579; AVX512VL-NEXT:    testl %eax, %eax
580; AVX512VL-NEXT:    sets %al
581; AVX512VL-NEXT:    kmovd %eax, %k1
582; AVX512VL-NEXT:    vmovaps %xmm0, %xmm2
583; AVX512VL-NEXT:    vmovss %xmm1, %xmm2, %xmm2 {%k1}
584; AVX512VL-NEXT:    vmovss %xmm0, %xmm1, %xmm1 {%k1}
585; AVX512VL-NEXT:    vmaxss %xmm2, %xmm1, %xmm2
586; AVX512VL-NEXT:    vcmpunordss %xmm1, %xmm1, %k1
587; AVX512VL-NEXT:    vmovss %xmm1, %xmm2, %xmm2 {%k1}
588; AVX512VL-NEXT:    vmovd %xmm2, %eax
589; AVX512VL-NEXT:    testl %eax, %eax
590; AVX512VL-NEXT:    sets %al
591; AVX512VL-NEXT:    kmovd %eax, %k1
592; AVX512VL-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]
593; AVX512VL-NEXT:    vmovaps %xmm2, %xmm3
594; AVX512VL-NEXT:    vmovss %xmm1, %xmm3, %xmm3 {%k1}
595; AVX512VL-NEXT:    vmovss %xmm2, %xmm1, %xmm1 {%k1}
596; AVX512VL-NEXT:    vmaxss %xmm3, %xmm1, %xmm2
597; AVX512VL-NEXT:    vcmpunordss %xmm1, %xmm1, %k1
598; AVX512VL-NEXT:    vmovss %xmm1, %xmm2, %xmm2 {%k1}
599; AVX512VL-NEXT:    vmovd %xmm2, %eax
600; AVX512VL-NEXT:    testl %eax, %eax
601; AVX512VL-NEXT:    sets %al
602; AVX512VL-NEXT:    kmovd %eax, %k1
603; AVX512VL-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]
604; AVX512VL-NEXT:    vmovaps %xmm2, %xmm0
605; AVX512VL-NEXT:    vmovss %xmm1, %xmm0, %xmm0 {%k1}
606; AVX512VL-NEXT:    vmovss %xmm2, %xmm1, %xmm1 {%k1}
607; AVX512VL-NEXT:    vmaxss %xmm0, %xmm1, %xmm0
608; AVX512VL-NEXT:    vcmpunordss %xmm1, %xmm1, %k1
609; AVX512VL-NEXT:    vmovss %xmm1, %xmm0, %xmm0 {%k1}
610; AVX512VL-NEXT:    vzeroupper
611; AVX512VL-NEXT:    retq
612  %1 = call float @llvm.vector.reduce.fmaximum.v8f32(<8 x float> %a0)
613  ret float %1
614}
615
616define float @test_v16f32(<16 x float> %a0) {
617; SSE2-LABEL: test_v16f32:
618; SSE2:       # %bb.0:
619; SSE2-NEXT:    pxor %xmm4, %xmm4
620; SSE2-NEXT:    pxor %xmm5, %xmm5
621; SSE2-NEXT:    pcmpgtd %xmm0, %xmm5
622; SSE2-NEXT:    movdqa %xmm5, %xmm6
623; SSE2-NEXT:    pandn %xmm0, %xmm6
624; SSE2-NEXT:    movdqa %xmm5, %xmm7
625; SSE2-NEXT:    pandn %xmm2, %xmm7
626; SSE2-NEXT:    pand %xmm5, %xmm2
627; SSE2-NEXT:    por %xmm6, %xmm2
628; SSE2-NEXT:    pand %xmm0, %xmm5
629; SSE2-NEXT:    por %xmm7, %xmm5
630; SSE2-NEXT:    movdqa %xmm5, %xmm6
631; SSE2-NEXT:    maxps %xmm2, %xmm6
632; SSE2-NEXT:    movdqa %xmm5, %xmm0
633; SSE2-NEXT:    cmpunordps %xmm5, %xmm0
634; SSE2-NEXT:    andps %xmm0, %xmm5
635; SSE2-NEXT:    andnps %xmm6, %xmm0
636; SSE2-NEXT:    orps %xmm5, %xmm0
637; SSE2-NEXT:    pxor %xmm2, %xmm2
638; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
639; SSE2-NEXT:    movdqa %xmm2, %xmm5
640; SSE2-NEXT:    pandn %xmm0, %xmm5
641; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
642; SSE2-NEXT:    movdqa %xmm4, %xmm6
643; SSE2-NEXT:    pandn %xmm1, %xmm6
644; SSE2-NEXT:    movdqa %xmm4, %xmm7
645; SSE2-NEXT:    pandn %xmm3, %xmm7
646; SSE2-NEXT:    pand %xmm4, %xmm3
647; SSE2-NEXT:    por %xmm6, %xmm3
648; SSE2-NEXT:    pand %xmm1, %xmm4
649; SSE2-NEXT:    por %xmm7, %xmm4
650; SSE2-NEXT:    movdqa %xmm4, %xmm1
651; SSE2-NEXT:    maxps %xmm3, %xmm1
652; SSE2-NEXT:    movdqa %xmm4, %xmm3
653; SSE2-NEXT:    cmpunordps %xmm4, %xmm3
654; SSE2-NEXT:    andps %xmm3, %xmm4
655; SSE2-NEXT:    andnps %xmm1, %xmm3
656; SSE2-NEXT:    orps %xmm4, %xmm3
657; SSE2-NEXT:    movdqa %xmm2, %xmm1
658; SSE2-NEXT:    pandn %xmm3, %xmm1
659; SSE2-NEXT:    pand %xmm2, %xmm3
660; SSE2-NEXT:    por %xmm5, %xmm3
661; SSE2-NEXT:    pand %xmm0, %xmm2
662; SSE2-NEXT:    por %xmm1, %xmm2
663; SSE2-NEXT:    movdqa %xmm2, %xmm1
664; SSE2-NEXT:    maxps %xmm3, %xmm1
665; SSE2-NEXT:    movdqa %xmm2, %xmm0
666; SSE2-NEXT:    cmpunordps %xmm2, %xmm0
667; SSE2-NEXT:    andps %xmm0, %xmm2
668; SSE2-NEXT:    andnps %xmm1, %xmm0
669; SSE2-NEXT:    orps %xmm2, %xmm0
670; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]
671; SSE2-NEXT:    movd %xmm0, %eax
672; SSE2-NEXT:    testl %eax, %eax
673; SSE2-NEXT:    movdqa %xmm0, %xmm3
674; SSE2-NEXT:    js .LBB4_2
675; SSE2-NEXT:  # %bb.1:
676; SSE2-NEXT:    movdqa %xmm2, %xmm3
677; SSE2-NEXT:  .LBB4_2:
678; SSE2-NEXT:    movdqa %xmm3, %xmm1
679; SSE2-NEXT:    cmpunordss %xmm3, %xmm1
680; SSE2-NEXT:    movaps %xmm1, %xmm4
681; SSE2-NEXT:    andps %xmm3, %xmm4
682; SSE2-NEXT:    js .LBB4_4
683; SSE2-NEXT:  # %bb.3:
684; SSE2-NEXT:    movdqa %xmm0, %xmm2
685; SSE2-NEXT:  .LBB4_4:
686; SSE2-NEXT:    maxss %xmm2, %xmm3
687; SSE2-NEXT:    andnps %xmm3, %xmm1
688; SSE2-NEXT:    orps %xmm4, %xmm1
689; SSE2-NEXT:    movd %xmm1, %eax
690; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]
691; SSE2-NEXT:    testl %eax, %eax
692; SSE2-NEXT:    movdqa %xmm1, %xmm4
693; SSE2-NEXT:    js .LBB4_6
694; SSE2-NEXT:  # %bb.5:
695; SSE2-NEXT:    movdqa %xmm3, %xmm4
696; SSE2-NEXT:  .LBB4_6:
697; SSE2-NEXT:    movdqa %xmm4, %xmm2
698; SSE2-NEXT:    cmpunordss %xmm4, %xmm2
699; SSE2-NEXT:    movaps %xmm2, %xmm5
700; SSE2-NEXT:    andps %xmm4, %xmm5
701; SSE2-NEXT:    js .LBB4_8
702; SSE2-NEXT:  # %bb.7:
703; SSE2-NEXT:    movdqa %xmm1, %xmm3
704; SSE2-NEXT:  .LBB4_8:
705; SSE2-NEXT:    maxss %xmm3, %xmm4
706; SSE2-NEXT:    andnps %xmm4, %xmm2
707; SSE2-NEXT:    orps %xmm5, %xmm2
708; SSE2-NEXT:    movd %xmm2, %eax
709; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,3,3,3]
710; SSE2-NEXT:    testl %eax, %eax
711; SSE2-NEXT:    movdqa %xmm2, %xmm3
712; SSE2-NEXT:    js .LBB4_10
713; SSE2-NEXT:  # %bb.9:
714; SSE2-NEXT:    movdqa %xmm1, %xmm3
715; SSE2-NEXT:  .LBB4_10:
716; SSE2-NEXT:    movdqa %xmm3, %xmm0
717; SSE2-NEXT:    cmpunordss %xmm3, %xmm0
718; SSE2-NEXT:    movaps %xmm0, %xmm4
719; SSE2-NEXT:    andps %xmm3, %xmm4
720; SSE2-NEXT:    js .LBB4_12
721; SSE2-NEXT:  # %bb.11:
722; SSE2-NEXT:    movdqa %xmm2, %xmm1
723; SSE2-NEXT:  .LBB4_12:
724; SSE2-NEXT:    maxss %xmm1, %xmm3
725; SSE2-NEXT:    andnps %xmm3, %xmm0
726; SSE2-NEXT:    orps %xmm4, %xmm0
727; SSE2-NEXT:    retq
728;
729; SSE41-LABEL: test_v16f32:
730; SSE41:       # %bb.0:
731; SSE41-NEXT:    movaps %xmm0, %xmm4
732; SSE41-NEXT:    movaps %xmm1, %xmm6
733; SSE41-NEXT:    movaps %xmm1, %xmm0
734; SSE41-NEXT:    blendvps %xmm0, %xmm3, %xmm6
735; SSE41-NEXT:    blendvps %xmm0, %xmm1, %xmm3
736; SSE41-NEXT:    movaps %xmm3, %xmm5
737; SSE41-NEXT:    maxps %xmm6, %xmm5
738; SSE41-NEXT:    movaps %xmm3, %xmm0
739; SSE41-NEXT:    cmpunordps %xmm3, %xmm0
740; SSE41-NEXT:    blendvps %xmm0, %xmm3, %xmm5
741; SSE41-NEXT:    movaps %xmm4, %xmm3
742; SSE41-NEXT:    movaps %xmm4, %xmm0
743; SSE41-NEXT:    blendvps %xmm0, %xmm2, %xmm3
744; SSE41-NEXT:    blendvps %xmm0, %xmm4, %xmm2
745; SSE41-NEXT:    movaps %xmm2, %xmm1
746; SSE41-NEXT:    maxps %xmm3, %xmm1
747; SSE41-NEXT:    movaps %xmm2, %xmm0
748; SSE41-NEXT:    cmpunordps %xmm2, %xmm0
749; SSE41-NEXT:    blendvps %xmm0, %xmm2, %xmm1
750; SSE41-NEXT:    movaps %xmm1, %xmm2
751; SSE41-NEXT:    movaps %xmm1, %xmm0
752; SSE41-NEXT:    blendvps %xmm0, %xmm5, %xmm2
753; SSE41-NEXT:    blendvps %xmm0, %xmm1, %xmm5
754; SSE41-NEXT:    movaps %xmm5, %xmm1
755; SSE41-NEXT:    maxps %xmm2, %xmm1
756; SSE41-NEXT:    movaps %xmm5, %xmm0
757; SSE41-NEXT:    cmpunordps %xmm5, %xmm0
758; SSE41-NEXT:    blendvps %xmm0, %xmm5, %xmm1
759; SSE41-NEXT:    movshdup {{.*#+}} xmm2 = xmm1[1,1,3,3]
760; SSE41-NEXT:    movd %xmm1, %eax
761; SSE41-NEXT:    testl %eax, %eax
762; SSE41-NEXT:    movaps %xmm1, %xmm3
763; SSE41-NEXT:    js .LBB4_2
764; SSE41-NEXT:  # %bb.1:
765; SSE41-NEXT:    movaps %xmm2, %xmm3
766; SSE41-NEXT:  .LBB4_2:
767; SSE41-NEXT:    movaps %xmm3, %xmm0
768; SSE41-NEXT:    cmpunordss %xmm3, %xmm0
769; SSE41-NEXT:    movaps %xmm0, %xmm4
770; SSE41-NEXT:    andps %xmm3, %xmm4
771; SSE41-NEXT:    js .LBB4_4
772; SSE41-NEXT:  # %bb.3:
773; SSE41-NEXT:    movaps %xmm1, %xmm2
774; SSE41-NEXT:  .LBB4_4:
775; SSE41-NEXT:    maxss %xmm2, %xmm3
776; SSE41-NEXT:    andnps %xmm3, %xmm0
777; SSE41-NEXT:    orps %xmm4, %xmm0
778; SSE41-NEXT:    movd %xmm0, %eax
779; SSE41-NEXT:    movaps %xmm1, %xmm3
780; SSE41-NEXT:    unpckhpd {{.*#+}} xmm3 = xmm3[1],xmm1[1]
781; SSE41-NEXT:    testl %eax, %eax
782; SSE41-NEXT:    movaps %xmm0, %xmm4
783; SSE41-NEXT:    js .LBB4_6
784; SSE41-NEXT:  # %bb.5:
785; SSE41-NEXT:    movaps %xmm3, %xmm4
786; SSE41-NEXT:  .LBB4_6:
787; SSE41-NEXT:    movaps %xmm4, %xmm2
788; SSE41-NEXT:    cmpunordss %xmm4, %xmm2
789; SSE41-NEXT:    movaps %xmm2, %xmm5
790; SSE41-NEXT:    andps %xmm4, %xmm5
791; SSE41-NEXT:    js .LBB4_8
792; SSE41-NEXT:  # %bb.7:
793; SSE41-NEXT:    movaps %xmm0, %xmm3
794; SSE41-NEXT:  .LBB4_8:
795; SSE41-NEXT:    maxss %xmm3, %xmm4
796; SSE41-NEXT:    andnps %xmm4, %xmm2
797; SSE41-NEXT:    orps %xmm5, %xmm2
798; SSE41-NEXT:    movd %xmm2, %eax
799; SSE41-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,3,3,3]
800; SSE41-NEXT:    testl %eax, %eax
801; SSE41-NEXT:    movaps %xmm2, %xmm3
802; SSE41-NEXT:    js .LBB4_10
803; SSE41-NEXT:  # %bb.9:
804; SSE41-NEXT:    movaps %xmm1, %xmm3
805; SSE41-NEXT:  .LBB4_10:
806; SSE41-NEXT:    movaps %xmm3, %xmm0
807; SSE41-NEXT:    cmpunordss %xmm3, %xmm0
808; SSE41-NEXT:    movaps %xmm0, %xmm4
809; SSE41-NEXT:    andps %xmm3, %xmm4
810; SSE41-NEXT:    js .LBB4_12
811; SSE41-NEXT:  # %bb.11:
812; SSE41-NEXT:    movaps %xmm2, %xmm1
813; SSE41-NEXT:  .LBB4_12:
814; SSE41-NEXT:    maxss %xmm1, %xmm3
815; SSE41-NEXT:    andnps %xmm3, %xmm0
816; SSE41-NEXT:    orps %xmm4, %xmm0
817; SSE41-NEXT:    retq
818;
819; AVX-LABEL: test_v16f32:
820; AVX:       # %bb.0:
821; AVX-NEXT:    vblendvps %ymm0, %ymm1, %ymm0, %ymm2
822; AVX-NEXT:    vblendvps %ymm0, %ymm0, %ymm1, %ymm0
823; AVX-NEXT:    vmaxps %ymm2, %ymm0, %ymm1
824; AVX-NEXT:    vcmpunordps %ymm0, %ymm0, %ymm2
825; AVX-NEXT:    vblendvps %ymm2, %ymm0, %ymm1, %ymm0
826; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
827; AVX-NEXT:    vblendvps %xmm0, %xmm1, %xmm0, %xmm2
828; AVX-NEXT:    vblendvps %xmm0, %xmm0, %xmm1, %xmm0
829; AVX-NEXT:    vmaxps %xmm2, %xmm0, %xmm1
830; AVX-NEXT:    vcmpunordps %xmm0, %xmm0, %xmm2
831; AVX-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
832; AVX-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
833; AVX-NEXT:    vmovd %xmm0, %eax
834; AVX-NEXT:    testl %eax, %eax
835; AVX-NEXT:    js .LBB4_1
836; AVX-NEXT:  # %bb.2:
837; AVX-NEXT:    vmovaps %xmm0, %xmm2
838; AVX-NEXT:    jmp .LBB4_3
839; AVX-NEXT:  .LBB4_1:
840; AVX-NEXT:    vmovaps %xmm1, %xmm2
841; AVX-NEXT:    vmovaps %xmm0, %xmm1
842; AVX-NEXT:  .LBB4_3:
843; AVX-NEXT:    vmaxss %xmm2, %xmm1, %xmm2
844; AVX-NEXT:    vcmpunordss %xmm1, %xmm1, %xmm3
845; AVX-NEXT:    vblendvps %xmm3, %xmm1, %xmm2, %xmm2
846; AVX-NEXT:    vmovd %xmm2, %eax
847; AVX-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]
848; AVX-NEXT:    testl %eax, %eax
849; AVX-NEXT:    js .LBB4_4
850; AVX-NEXT:  # %bb.5:
851; AVX-NEXT:    vmovaps %xmm2, %xmm3
852; AVX-NEXT:    jmp .LBB4_6
853; AVX-NEXT:  .LBB4_4:
854; AVX-NEXT:    vmovapd %xmm1, %xmm3
855; AVX-NEXT:    vmovaps %xmm2, %xmm1
856; AVX-NEXT:  .LBB4_6:
857; AVX-NEXT:    vmaxss %xmm3, %xmm1, %xmm2
858; AVX-NEXT:    vcmpunordss %xmm1, %xmm1, %xmm3
859; AVX-NEXT:    vblendvps %xmm3, %xmm1, %xmm2, %xmm1
860; AVX-NEXT:    vmovd %xmm1, %eax
861; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
862; AVX-NEXT:    testl %eax, %eax
863; AVX-NEXT:    js .LBB4_7
864; AVX-NEXT:  # %bb.8:
865; AVX-NEXT:    vmovaps %xmm1, %xmm2
866; AVX-NEXT:    jmp .LBB4_9
867; AVX-NEXT:  .LBB4_7:
868; AVX-NEXT:    vmovaps %xmm0, %xmm2
869; AVX-NEXT:    vmovaps %xmm1, %xmm0
870; AVX-NEXT:  .LBB4_9:
871; AVX-NEXT:    vmaxss %xmm2, %xmm0, %xmm1
872; AVX-NEXT:    vcmpunordss %xmm0, %xmm0, %xmm2
873; AVX-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
874; AVX-NEXT:    vzeroupper
875; AVX-NEXT:    retq
876;
877; AVX512BW-LABEL: test_v16f32:
878; AVX512BW:       # %bb.0:
879; AVX512BW-NEXT:    vextractf64x4 $1, %zmm0, %ymm1
880; AVX512BW-NEXT:    vblendvps %ymm0, %ymm1, %ymm0, %ymm2
881; AVX512BW-NEXT:    vblendvps %ymm0, %ymm0, %ymm1, %ymm0
882; AVX512BW-NEXT:    vmaxps %ymm2, %ymm0, %ymm1
883; AVX512BW-NEXT:    vcmpunordps %ymm0, %ymm0, %ymm2
884; AVX512BW-NEXT:    vblendvps %ymm2, %ymm0, %ymm1, %ymm0
885; AVX512BW-NEXT:    vextractf128 $1, %ymm0, %xmm1
886; AVX512BW-NEXT:    vblendvps %xmm0, %xmm1, %xmm0, %xmm2
887; AVX512BW-NEXT:    vblendvps %xmm0, %xmm0, %xmm1, %xmm0
888; AVX512BW-NEXT:    vmaxps %xmm2, %xmm0, %xmm1
889; AVX512BW-NEXT:    vcmpunordps %xmm0, %xmm0, %xmm2
890; AVX512BW-NEXT:    vblendvps %xmm2, %xmm0, %xmm1, %xmm0
891; AVX512BW-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
892; AVX512BW-NEXT:    vmovd %xmm0, %eax
893; AVX512BW-NEXT:    testl %eax, %eax
894; AVX512BW-NEXT:    sets %al
895; AVX512BW-NEXT:    kmovd %eax, %k1
896; AVX512BW-NEXT:    vmovaps %xmm0, %xmm2
897; AVX512BW-NEXT:    vmovss %xmm1, %xmm2, %xmm2 {%k1}
898; AVX512BW-NEXT:    vmovss %xmm0, %xmm1, %xmm1 {%k1}
899; AVX512BW-NEXT:    vmaxss %xmm2, %xmm1, %xmm2
900; AVX512BW-NEXT:    vcmpunordss %xmm1, %xmm1, %k1
901; AVX512BW-NEXT:    vmovss %xmm1, %xmm2, %xmm2 {%k1}
902; AVX512BW-NEXT:    vmovd %xmm2, %eax
903; AVX512BW-NEXT:    testl %eax, %eax
904; AVX512BW-NEXT:    sets %al
905; AVX512BW-NEXT:    kmovd %eax, %k1
906; AVX512BW-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]
907; AVX512BW-NEXT:    vmovaps %xmm2, %xmm3
908; AVX512BW-NEXT:    vmovss %xmm1, %xmm3, %xmm3 {%k1}
909; AVX512BW-NEXT:    vmovss %xmm2, %xmm1, %xmm1 {%k1}
910; AVX512BW-NEXT:    vmaxss %xmm3, %xmm1, %xmm2
911; AVX512BW-NEXT:    vcmpunordss %xmm1, %xmm1, %k1
912; AVX512BW-NEXT:    vmovss %xmm1, %xmm2, %xmm2 {%k1}
913; AVX512BW-NEXT:    vmovd %xmm2, %eax
914; AVX512BW-NEXT:    testl %eax, %eax
915; AVX512BW-NEXT:    sets %al
916; AVX512BW-NEXT:    kmovd %eax, %k1
917; AVX512BW-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]
918; AVX512BW-NEXT:    vmovaps %xmm2, %xmm0
919; AVX512BW-NEXT:    vmovss %xmm1, %xmm0, %xmm0 {%k1}
920; AVX512BW-NEXT:    vmovss %xmm2, %xmm1, %xmm1 {%k1}
921; AVX512BW-NEXT:    vmaxss %xmm0, %xmm1, %xmm0
922; AVX512BW-NEXT:    vcmpunordss %xmm1, %xmm1, %k1
923; AVX512BW-NEXT:    vmovss %xmm1, %xmm0, %xmm0 {%k1}
924; AVX512BW-NEXT:    vzeroupper
925; AVX512BW-NEXT:    retq
926;
927; AVX512VL-LABEL: test_v16f32:
928; AVX512VL:       # %bb.0:
929; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
930; AVX512VL-NEXT:    vpcmpgtd %ymm0, %ymm1, %k1
931; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
932; AVX512VL-NEXT:    vblendmps %ymm1, %ymm0, %ymm2 {%k1}
933; AVX512VL-NEXT:    vmovaps %ymm0, %ymm1 {%k1}
934; AVX512VL-NEXT:    vmaxps %ymm2, %ymm1, %ymm0
935; AVX512VL-NEXT:    vcmpunordps %ymm1, %ymm1, %k1
936; AVX512VL-NEXT:    vmovaps %ymm1, %ymm0 {%k1}
937; AVX512VL-NEXT:    vxorps %xmm1, %xmm1, %xmm1
938; AVX512VL-NEXT:    vpcmpgtd %xmm0, %xmm1, %k1
939; AVX512VL-NEXT:    vextractf128 $1, %ymm0, %xmm1
940; AVX512VL-NEXT:    vblendmps %xmm1, %xmm0, %xmm2 {%k1}
941; AVX512VL-NEXT:    vmovaps %xmm0, %xmm1 {%k1}
942; AVX512VL-NEXT:    vmaxps %xmm2, %xmm1, %xmm0
943; AVX512VL-NEXT:    vcmpunordps %xmm1, %xmm1, %k1
944; AVX512VL-NEXT:    vmovaps %xmm1, %xmm0 {%k1}
945; AVX512VL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
946; AVX512VL-NEXT:    vmovd %xmm0, %eax
947; AVX512VL-NEXT:    testl %eax, %eax
948; AVX512VL-NEXT:    sets %al
949; AVX512VL-NEXT:    kmovd %eax, %k1
950; AVX512VL-NEXT:    vmovaps %xmm0, %xmm2
951; AVX512VL-NEXT:    vmovss %xmm1, %xmm2, %xmm2 {%k1}
952; AVX512VL-NEXT:    vmovss %xmm0, %xmm1, %xmm1 {%k1}
953; AVX512VL-NEXT:    vmaxss %xmm2, %xmm1, %xmm2
954; AVX512VL-NEXT:    vcmpunordss %xmm1, %xmm1, %k1
955; AVX512VL-NEXT:    vmovss %xmm1, %xmm2, %xmm2 {%k1}
956; AVX512VL-NEXT:    vmovd %xmm2, %eax
957; AVX512VL-NEXT:    testl %eax, %eax
958; AVX512VL-NEXT:    sets %al
959; AVX512VL-NEXT:    kmovd %eax, %k1
960; AVX512VL-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]
961; AVX512VL-NEXT:    vmovaps %xmm2, %xmm3
962; AVX512VL-NEXT:    vmovss %xmm1, %xmm3, %xmm3 {%k1}
963; AVX512VL-NEXT:    vmovss %xmm2, %xmm1, %xmm1 {%k1}
964; AVX512VL-NEXT:    vmaxss %xmm3, %xmm1, %xmm2
965; AVX512VL-NEXT:    vcmpunordss %xmm1, %xmm1, %k1
966; AVX512VL-NEXT:    vmovss %xmm1, %xmm2, %xmm2 {%k1}
967; AVX512VL-NEXT:    vmovd %xmm2, %eax
968; AVX512VL-NEXT:    testl %eax, %eax
969; AVX512VL-NEXT:    sets %al
970; AVX512VL-NEXT:    kmovd %eax, %k1
971; AVX512VL-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[3,3,3,3]
972; AVX512VL-NEXT:    vmovaps %xmm2, %xmm0
973; AVX512VL-NEXT:    vmovss %xmm1, %xmm0, %xmm0 {%k1}
974; AVX512VL-NEXT:    vmovss %xmm2, %xmm1, %xmm1 {%k1}
975; AVX512VL-NEXT:    vmaxss %xmm0, %xmm1, %xmm0
976; AVX512VL-NEXT:    vcmpunordss %xmm1, %xmm1, %k1
977; AVX512VL-NEXT:    vmovss %xmm1, %xmm0, %xmm0 {%k1}
978; AVX512VL-NEXT:    vzeroupper
979; AVX512VL-NEXT:    retq
980  %1 = call float @llvm.vector.reduce.fmaximum.v16f32(<16 x float> %a0)
981  ret float %1
982}
983
984;
985; vXf64
986;
987
988define double @test_v2f64(<2 x double> %a0) {
989; SSE-LABEL: test_v2f64:
990; SSE:       # %bb.0:
991; SSE-NEXT:    movdqa %xmm0, %xmm2
992; SSE-NEXT:    punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm0[1]
993; SSE-NEXT:    movq %xmm0, %rax
994; SSE-NEXT:    testq %rax, %rax
995; SSE-NEXT:    movdqa %xmm0, %xmm3
996; SSE-NEXT:    js .LBB5_2
997; SSE-NEXT:  # %bb.1:
998; SSE-NEXT:    movdqa %xmm2, %xmm3
999; SSE-NEXT:  .LBB5_2:
1000; SSE-NEXT:    movdqa %xmm3, %xmm1
1001; SSE-NEXT:    cmpunordsd %xmm3, %xmm1
1002; SSE-NEXT:    movapd %xmm1, %xmm4
1003; SSE-NEXT:    andpd %xmm3, %xmm4
1004; SSE-NEXT:    js .LBB5_4
1005; SSE-NEXT:  # %bb.3:
1006; SSE-NEXT:    movdqa %xmm0, %xmm2
1007; SSE-NEXT:  .LBB5_4:
1008; SSE-NEXT:    maxsd %xmm2, %xmm3
1009; SSE-NEXT:    andnpd %xmm3, %xmm1
1010; SSE-NEXT:    orpd %xmm4, %xmm1
1011; SSE-NEXT:    movapd %xmm1, %xmm0
1012; SSE-NEXT:    retq
1013;
1014; AVX-LABEL: test_v2f64:
1015; AVX:       # %bb.0:
1016; AVX-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]
1017; AVX-NEXT:    vmovq %xmm0, %rax
1018; AVX-NEXT:    testq %rax, %rax
1019; AVX-NEXT:    js .LBB5_1
1020; AVX-NEXT:  # %bb.2:
1021; AVX-NEXT:    vmovapd %xmm0, %xmm2
1022; AVX-NEXT:    jmp .LBB5_3
1023; AVX-NEXT:  .LBB5_1:
1024; AVX-NEXT:    vmovapd %xmm1, %xmm2
1025; AVX-NEXT:    vmovapd %xmm0, %xmm1
1026; AVX-NEXT:  .LBB5_3:
1027; AVX-NEXT:    vmaxsd %xmm2, %xmm1, %xmm0
1028; AVX-NEXT:    vcmpunordsd %xmm1, %xmm1, %xmm2
1029; AVX-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
1030; AVX-NEXT:    retq
1031;
1032; AVX512-LABEL: test_v2f64:
1033; AVX512:       # %bb.0:
1034; AVX512-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]
1035; AVX512-NEXT:    vmovq %xmm0, %rax
1036; AVX512-NEXT:    testq %rax, %rax
1037; AVX512-NEXT:    sets %al
1038; AVX512-NEXT:    kmovd %eax, %k1
1039; AVX512-NEXT:    vmovapd %xmm0, %xmm2
1040; AVX512-NEXT:    vmovsd %xmm1, %xmm2, %xmm2 {%k1}
1041; AVX512-NEXT:    vmovsd %xmm0, %xmm1, %xmm1 {%k1}
1042; AVX512-NEXT:    vmaxsd %xmm2, %xmm1, %xmm0
1043; AVX512-NEXT:    vcmpunordsd %xmm1, %xmm1, %k1
1044; AVX512-NEXT:    vmovsd %xmm1, %xmm0, %xmm0 {%k1}
1045; AVX512-NEXT:    retq
1046  %1 = call double @llvm.vector.reduce.fmaximum.v2f64(<2 x double> %a0)
1047  ret double %1
1048}
1049
1050define double @test_v4f64(<4 x double> %a0) {
1051; SSE2-LABEL: test_v4f64:
1052; SSE2:       # %bb.0:
1053; SSE2-NEXT:    movaps %xmm0, %xmm2
1054; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,1],xmm0[3,3]
1055; SSE2-NEXT:    pxor %xmm3, %xmm3
1056; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
1057; SSE2-NEXT:    movdqa %xmm3, %xmm2
1058; SSE2-NEXT:    pandn %xmm0, %xmm2
1059; SSE2-NEXT:    movdqa %xmm3, %xmm4
1060; SSE2-NEXT:    pandn %xmm1, %xmm4
1061; SSE2-NEXT:    pand %xmm3, %xmm1
1062; SSE2-NEXT:    por %xmm2, %xmm1
1063; SSE2-NEXT:    pand %xmm0, %xmm3
1064; SSE2-NEXT:    por %xmm4, %xmm3
1065; SSE2-NEXT:    movdqa %xmm3, %xmm0
1066; SSE2-NEXT:    maxpd %xmm1, %xmm0
1067; SSE2-NEXT:    movdqa %xmm3, %xmm1
1068; SSE2-NEXT:    cmpunordpd %xmm3, %xmm1
1069; SSE2-NEXT:    andpd %xmm1, %xmm3
1070; SSE2-NEXT:    andnpd %xmm0, %xmm1
1071; SSE2-NEXT:    orpd %xmm3, %xmm1
1072; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
1073; SSE2-NEXT:    movq %xmm1, %rax
1074; SSE2-NEXT:    testq %rax, %rax
1075; SSE2-NEXT:    movdqa %xmm1, %xmm3
1076; SSE2-NEXT:    js .LBB6_2
1077; SSE2-NEXT:  # %bb.1:
1078; SSE2-NEXT:    movdqa %xmm2, %xmm3
1079; SSE2-NEXT:  .LBB6_2:
1080; SSE2-NEXT:    movdqa %xmm3, %xmm0
1081; SSE2-NEXT:    cmpunordsd %xmm3, %xmm0
1082; SSE2-NEXT:    movapd %xmm0, %xmm4
1083; SSE2-NEXT:    andpd %xmm3, %xmm4
1084; SSE2-NEXT:    js .LBB6_4
1085; SSE2-NEXT:  # %bb.3:
1086; SSE2-NEXT:    movdqa %xmm1, %xmm2
1087; SSE2-NEXT:  .LBB6_4:
1088; SSE2-NEXT:    maxsd %xmm2, %xmm3
1089; SSE2-NEXT:    andnpd %xmm3, %xmm0
1090; SSE2-NEXT:    orpd %xmm4, %xmm0
1091; SSE2-NEXT:    retq
1092;
1093; SSE41-LABEL: test_v4f64:
1094; SSE41:       # %bb.0:
1095; SSE41-NEXT:    movapd %xmm0, %xmm3
1096; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
1097; SSE41-NEXT:    blendvpd %xmm0, %xmm0, %xmm1
1098; SSE41-NEXT:    movapd %xmm1, %xmm2
1099; SSE41-NEXT:    maxpd %xmm3, %xmm2
1100; SSE41-NEXT:    movapd %xmm1, %xmm0
1101; SSE41-NEXT:    cmpunordpd %xmm1, %xmm0
1102; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
1103; SSE41-NEXT:    movapd %xmm2, %xmm1
1104; SSE41-NEXT:    unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm2[1]
1105; SSE41-NEXT:    movq %xmm2, %rax
1106; SSE41-NEXT:    testq %rax, %rax
1107; SSE41-NEXT:    movapd %xmm2, %xmm3
1108; SSE41-NEXT:    js .LBB6_2
1109; SSE41-NEXT:  # %bb.1:
1110; SSE41-NEXT:    movapd %xmm1, %xmm3
1111; SSE41-NEXT:  .LBB6_2:
1112; SSE41-NEXT:    movapd %xmm3, %xmm0
1113; SSE41-NEXT:    cmpunordsd %xmm3, %xmm0
1114; SSE41-NEXT:    movapd %xmm0, %xmm4
1115; SSE41-NEXT:    andpd %xmm3, %xmm4
1116; SSE41-NEXT:    js .LBB6_4
1117; SSE41-NEXT:  # %bb.3:
1118; SSE41-NEXT:    movapd %xmm2, %xmm1
1119; SSE41-NEXT:  .LBB6_4:
1120; SSE41-NEXT:    maxsd %xmm1, %xmm3
1121; SSE41-NEXT:    andnpd %xmm3, %xmm0
1122; SSE41-NEXT:    orpd %xmm4, %xmm0
1123; SSE41-NEXT:    retq
1124;
1125; AVX-LABEL: test_v4f64:
1126; AVX:       # %bb.0:
1127; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
1128; AVX-NEXT:    vblendvpd %xmm0, %xmm1, %xmm0, %xmm2
1129; AVX-NEXT:    vblendvpd %xmm0, %xmm0, %xmm1, %xmm0
1130; AVX-NEXT:    vmaxpd %xmm2, %xmm0, %xmm1
1131; AVX-NEXT:    vcmpunordpd %xmm0, %xmm0, %xmm2
1132; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm1
1133; AVX-NEXT:    vshufpd {{.*#+}} xmm0 = xmm1[1,0]
1134; AVX-NEXT:    vmovq %xmm1, %rax
1135; AVX-NEXT:    testq %rax, %rax
1136; AVX-NEXT:    js .LBB6_1
1137; AVX-NEXT:  # %bb.2:
1138; AVX-NEXT:    vmovapd %xmm1, %xmm2
1139; AVX-NEXT:    jmp .LBB6_3
1140; AVX-NEXT:  .LBB6_1:
1141; AVX-NEXT:    vmovapd %xmm0, %xmm2
1142; AVX-NEXT:    vmovapd %xmm1, %xmm0
1143; AVX-NEXT:  .LBB6_3:
1144; AVX-NEXT:    vmaxsd %xmm2, %xmm0, %xmm1
1145; AVX-NEXT:    vcmpunordsd %xmm0, %xmm0, %xmm2
1146; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1147; AVX-NEXT:    vzeroupper
1148; AVX-NEXT:    retq
1149;
1150; AVX512BW-LABEL: test_v4f64:
1151; AVX512BW:       # %bb.0:
1152; AVX512BW-NEXT:    vextractf128 $1, %ymm0, %xmm1
1153; AVX512BW-NEXT:    vblendvpd %xmm0, %xmm1, %xmm0, %xmm2
1154; AVX512BW-NEXT:    vblendvpd %xmm0, %xmm0, %xmm1, %xmm0
1155; AVX512BW-NEXT:    vmaxpd %xmm2, %xmm0, %xmm1
1156; AVX512BW-NEXT:    vcmpunordpd %xmm0, %xmm0, %xmm2
1157; AVX512BW-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1158; AVX512BW-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]
1159; AVX512BW-NEXT:    vmovq %xmm0, %rax
1160; AVX512BW-NEXT:    testq %rax, %rax
1161; AVX512BW-NEXT:    sets %al
1162; AVX512BW-NEXT:    kmovd %eax, %k1
1163; AVX512BW-NEXT:    vmovapd %xmm0, %xmm2
1164; AVX512BW-NEXT:    vmovsd %xmm1, %xmm2, %xmm2 {%k1}
1165; AVX512BW-NEXT:    vmovsd %xmm0, %xmm1, %xmm1 {%k1}
1166; AVX512BW-NEXT:    vmaxsd %xmm2, %xmm1, %xmm0
1167; AVX512BW-NEXT:    vcmpunordsd %xmm1, %xmm1, %k1
1168; AVX512BW-NEXT:    vmovsd %xmm1, %xmm0, %xmm0 {%k1}
1169; AVX512BW-NEXT:    vzeroupper
1170; AVX512BW-NEXT:    retq
1171;
1172; AVX512VL-LABEL: test_v4f64:
1173; AVX512VL:       # %bb.0:
1174; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1175; AVX512VL-NEXT:    vpcmpgtq %xmm0, %xmm1, %k1
1176; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
1177; AVX512VL-NEXT:    vblendmpd %xmm1, %xmm0, %xmm2 {%k1}
1178; AVX512VL-NEXT:    vmovapd %xmm0, %xmm1 {%k1}
1179; AVX512VL-NEXT:    vmaxpd %xmm2, %xmm1, %xmm0
1180; AVX512VL-NEXT:    vcmpunordpd %xmm1, %xmm1, %k1
1181; AVX512VL-NEXT:    vmovapd %xmm1, %xmm0 {%k1}
1182; AVX512VL-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]
1183; AVX512VL-NEXT:    vmovq %xmm0, %rax
1184; AVX512VL-NEXT:    testq %rax, %rax
1185; AVX512VL-NEXT:    sets %al
1186; AVX512VL-NEXT:    kmovd %eax, %k1
1187; AVX512VL-NEXT:    vmovapd %xmm0, %xmm2
1188; AVX512VL-NEXT:    vmovsd %xmm1, %xmm2, %xmm2 {%k1}
1189; AVX512VL-NEXT:    vmovsd %xmm0, %xmm1, %xmm1 {%k1}
1190; AVX512VL-NEXT:    vmaxsd %xmm2, %xmm1, %xmm0
1191; AVX512VL-NEXT:    vcmpunordsd %xmm1, %xmm1, %k1
1192; AVX512VL-NEXT:    vmovsd %xmm1, %xmm0, %xmm0 {%k1}
1193; AVX512VL-NEXT:    vzeroupper
1194; AVX512VL-NEXT:    retq
1195  %1 = call double @llvm.vector.reduce.fmaximum.v4f64(<4 x double> %a0)
1196  ret double %1
1197}
1198
1199define double @test_v8f64(<8 x double> %a0) {
1200; SSE2-LABEL: test_v8f64:
1201; SSE2:       # %bb.0:
1202; SSE2-NEXT:    movaps %xmm0, %xmm5
1203; SSE2-NEXT:    shufps {{.*#+}} xmm5 = xmm5[1,1],xmm0[3,3]
1204; SSE2-NEXT:    pxor %xmm4, %xmm4
1205; SSE2-NEXT:    pxor %xmm6, %xmm6
1206; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
1207; SSE2-NEXT:    movdqa %xmm6, %xmm5
1208; SSE2-NEXT:    pandn %xmm0, %xmm5
1209; SSE2-NEXT:    movdqa %xmm6, %xmm7
1210; SSE2-NEXT:    pandn %xmm2, %xmm7
1211; SSE2-NEXT:    pand %xmm6, %xmm2
1212; SSE2-NEXT:    por %xmm5, %xmm2
1213; SSE2-NEXT:    pand %xmm0, %xmm6
1214; SSE2-NEXT:    por %xmm7, %xmm6
1215; SSE2-NEXT:    movdqa %xmm6, %xmm0
1216; SSE2-NEXT:    maxpd %xmm2, %xmm0
1217; SSE2-NEXT:    movdqa %xmm6, %xmm2
1218; SSE2-NEXT:    cmpunordpd %xmm6, %xmm2
1219; SSE2-NEXT:    andpd %xmm2, %xmm6
1220; SSE2-NEXT:    andnpd %xmm0, %xmm2
1221; SSE2-NEXT:    orpd %xmm6, %xmm2
1222; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3]
1223; SSE2-NEXT:    xorpd %xmm0, %xmm0
1224; SSE2-NEXT:    pcmpgtd %xmm5, %xmm0
1225; SSE2-NEXT:    movdqa %xmm0, %xmm5
1226; SSE2-NEXT:    pandn %xmm2, %xmm5
1227; SSE2-NEXT:    movaps %xmm1, %xmm6
1228; SSE2-NEXT:    shufps {{.*#+}} xmm6 = xmm6[1,1],xmm1[3,3]
1229; SSE2-NEXT:    pcmpgtd %xmm6, %xmm4
1230; SSE2-NEXT:    movdqa %xmm4, %xmm6
1231; SSE2-NEXT:    pandn %xmm1, %xmm6
1232; SSE2-NEXT:    movdqa %xmm4, %xmm7
1233; SSE2-NEXT:    pandn %xmm3, %xmm7
1234; SSE2-NEXT:    pand %xmm4, %xmm3
1235; SSE2-NEXT:    por %xmm6, %xmm3
1236; SSE2-NEXT:    pand %xmm1, %xmm4
1237; SSE2-NEXT:    por %xmm7, %xmm4
1238; SSE2-NEXT:    movdqa %xmm4, %xmm1
1239; SSE2-NEXT:    maxpd %xmm3, %xmm1
1240; SSE2-NEXT:    movdqa %xmm4, %xmm3
1241; SSE2-NEXT:    cmpunordpd %xmm4, %xmm3
1242; SSE2-NEXT:    andpd %xmm3, %xmm4
1243; SSE2-NEXT:    andnpd %xmm1, %xmm3
1244; SSE2-NEXT:    orpd %xmm4, %xmm3
1245; SSE2-NEXT:    movdqa %xmm0, %xmm1
1246; SSE2-NEXT:    pandn %xmm3, %xmm1
1247; SSE2-NEXT:    pand %xmm0, %xmm3
1248; SSE2-NEXT:    por %xmm5, %xmm3
1249; SSE2-NEXT:    pand %xmm2, %xmm0
1250; SSE2-NEXT:    por %xmm1, %xmm0
1251; SSE2-NEXT:    movdqa %xmm0, %xmm2
1252; SSE2-NEXT:    maxpd %xmm3, %xmm2
1253; SSE2-NEXT:    movdqa %xmm0, %xmm1
1254; SSE2-NEXT:    cmpunordpd %xmm0, %xmm1
1255; SSE2-NEXT:    andpd %xmm1, %xmm0
1256; SSE2-NEXT:    andnpd %xmm2, %xmm1
1257; SSE2-NEXT:    orpd %xmm0, %xmm1
1258; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
1259; SSE2-NEXT:    movq %xmm1, %rax
1260; SSE2-NEXT:    testq %rax, %rax
1261; SSE2-NEXT:    movdqa %xmm1, %xmm3
1262; SSE2-NEXT:    js .LBB7_2
1263; SSE2-NEXT:  # %bb.1:
1264; SSE2-NEXT:    movdqa %xmm2, %xmm3
1265; SSE2-NEXT:  .LBB7_2:
1266; SSE2-NEXT:    movdqa %xmm3, %xmm0
1267; SSE2-NEXT:    cmpunordsd %xmm3, %xmm0
1268; SSE2-NEXT:    movapd %xmm0, %xmm4
1269; SSE2-NEXT:    andpd %xmm3, %xmm4
1270; SSE2-NEXT:    js .LBB7_4
1271; SSE2-NEXT:  # %bb.3:
1272; SSE2-NEXT:    movdqa %xmm1, %xmm2
1273; SSE2-NEXT:  .LBB7_4:
1274; SSE2-NEXT:    maxsd %xmm2, %xmm3
1275; SSE2-NEXT:    andnpd %xmm3, %xmm0
1276; SSE2-NEXT:    orpd %xmm4, %xmm0
1277; SSE2-NEXT:    retq
1278;
1279; SSE41-LABEL: test_v8f64:
1280; SSE41:       # %bb.0:
1281; SSE41-NEXT:    movapd %xmm0, %xmm4
1282; SSE41-NEXT:    movapd %xmm1, %xmm6
1283; SSE41-NEXT:    movapd %xmm1, %xmm0
1284; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm6
1285; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
1286; SSE41-NEXT:    movapd %xmm3, %xmm5
1287; SSE41-NEXT:    maxpd %xmm6, %xmm5
1288; SSE41-NEXT:    movapd %xmm3, %xmm0
1289; SSE41-NEXT:    cmpunordpd %xmm3, %xmm0
1290; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm5
1291; SSE41-NEXT:    movapd %xmm4, %xmm3
1292; SSE41-NEXT:    movapd %xmm4, %xmm0
1293; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
1294; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
1295; SSE41-NEXT:    movapd %xmm2, %xmm1
1296; SSE41-NEXT:    maxpd %xmm3, %xmm1
1297; SSE41-NEXT:    movapd %xmm2, %xmm0
1298; SSE41-NEXT:    cmpunordpd %xmm2, %xmm0
1299; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
1300; SSE41-NEXT:    movapd %xmm1, %xmm2
1301; SSE41-NEXT:    movapd %xmm1, %xmm0
1302; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm2
1303; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
1304; SSE41-NEXT:    movapd %xmm5, %xmm1
1305; SSE41-NEXT:    maxpd %xmm2, %xmm1
1306; SSE41-NEXT:    movapd %xmm5, %xmm0
1307; SSE41-NEXT:    cmpunordpd %xmm5, %xmm0
1308; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
1309; SSE41-NEXT:    movapd %xmm1, %xmm2
1310; SSE41-NEXT:    unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm1[1]
1311; SSE41-NEXT:    movq %xmm1, %rax
1312; SSE41-NEXT:    testq %rax, %rax
1313; SSE41-NEXT:    movapd %xmm1, %xmm3
1314; SSE41-NEXT:    js .LBB7_2
1315; SSE41-NEXT:  # %bb.1:
1316; SSE41-NEXT:    movapd %xmm2, %xmm3
1317; SSE41-NEXT:  .LBB7_2:
1318; SSE41-NEXT:    movapd %xmm3, %xmm0
1319; SSE41-NEXT:    cmpunordsd %xmm3, %xmm0
1320; SSE41-NEXT:    movapd %xmm0, %xmm4
1321; SSE41-NEXT:    andpd %xmm3, %xmm4
1322; SSE41-NEXT:    js .LBB7_4
1323; SSE41-NEXT:  # %bb.3:
1324; SSE41-NEXT:    movapd %xmm1, %xmm2
1325; SSE41-NEXT:  .LBB7_4:
1326; SSE41-NEXT:    maxsd %xmm2, %xmm3
1327; SSE41-NEXT:    andnpd %xmm3, %xmm0
1328; SSE41-NEXT:    orpd %xmm4, %xmm0
1329; SSE41-NEXT:    retq
1330;
1331; AVX-LABEL: test_v8f64:
1332; AVX:       # %bb.0:
1333; AVX-NEXT:    vblendvpd %ymm0, %ymm1, %ymm0, %ymm2
1334; AVX-NEXT:    vblendvpd %ymm0, %ymm0, %ymm1, %ymm0
1335; AVX-NEXT:    vmaxpd %ymm2, %ymm0, %ymm1
1336; AVX-NEXT:    vcmpunordpd %ymm0, %ymm0, %ymm2
1337; AVX-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1338; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
1339; AVX-NEXT:    vblendvpd %xmm0, %xmm1, %xmm0, %xmm2
1340; AVX-NEXT:    vblendvpd %xmm0, %xmm0, %xmm1, %xmm0
1341; AVX-NEXT:    vmaxpd %xmm2, %xmm0, %xmm1
1342; AVX-NEXT:    vcmpunordpd %xmm0, %xmm0, %xmm2
1343; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm1
1344; AVX-NEXT:    vshufpd {{.*#+}} xmm0 = xmm1[1,0]
1345; AVX-NEXT:    vmovq %xmm1, %rax
1346; AVX-NEXT:    testq %rax, %rax
1347; AVX-NEXT:    js .LBB7_1
1348; AVX-NEXT:  # %bb.2:
1349; AVX-NEXT:    vmovapd %xmm1, %xmm2
1350; AVX-NEXT:    jmp .LBB7_3
1351; AVX-NEXT:  .LBB7_1:
1352; AVX-NEXT:    vmovapd %xmm0, %xmm2
1353; AVX-NEXT:    vmovapd %xmm1, %xmm0
1354; AVX-NEXT:  .LBB7_3:
1355; AVX-NEXT:    vmaxsd %xmm2, %xmm0, %xmm1
1356; AVX-NEXT:    vcmpunordsd %xmm0, %xmm0, %xmm2
1357; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1358; AVX-NEXT:    vzeroupper
1359; AVX-NEXT:    retq
1360;
1361; AVX512BW-LABEL: test_v8f64:
1362; AVX512BW:       # %bb.0:
1363; AVX512BW-NEXT:    vextractf64x4 $1, %zmm0, %ymm1
1364; AVX512BW-NEXT:    vblendvpd %ymm0, %ymm1, %ymm0, %ymm2
1365; AVX512BW-NEXT:    vblendvpd %ymm0, %ymm0, %ymm1, %ymm0
1366; AVX512BW-NEXT:    vmaxpd %ymm2, %ymm0, %ymm1
1367; AVX512BW-NEXT:    vcmpunordpd %ymm0, %ymm0, %ymm2
1368; AVX512BW-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1369; AVX512BW-NEXT:    vextractf128 $1, %ymm0, %xmm1
1370; AVX512BW-NEXT:    vblendvpd %xmm0, %xmm1, %xmm0, %xmm2
1371; AVX512BW-NEXT:    vblendvpd %xmm0, %xmm0, %xmm1, %xmm0
1372; AVX512BW-NEXT:    vmaxpd %xmm2, %xmm0, %xmm1
1373; AVX512BW-NEXT:    vcmpunordpd %xmm0, %xmm0, %xmm2
1374; AVX512BW-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1375; AVX512BW-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]
1376; AVX512BW-NEXT:    vmovq %xmm0, %rax
1377; AVX512BW-NEXT:    testq %rax, %rax
1378; AVX512BW-NEXT:    sets %al
1379; AVX512BW-NEXT:    kmovd %eax, %k1
1380; AVX512BW-NEXT:    vmovapd %xmm0, %xmm2
1381; AVX512BW-NEXT:    vmovsd %xmm1, %xmm2, %xmm2 {%k1}
1382; AVX512BW-NEXT:    vmovsd %xmm0, %xmm1, %xmm1 {%k1}
1383; AVX512BW-NEXT:    vmaxsd %xmm2, %xmm1, %xmm0
1384; AVX512BW-NEXT:    vcmpunordsd %xmm1, %xmm1, %k1
1385; AVX512BW-NEXT:    vmovsd %xmm1, %xmm0, %xmm0 {%k1}
1386; AVX512BW-NEXT:    vzeroupper
1387; AVX512BW-NEXT:    retq
1388;
1389; AVX512VL-LABEL: test_v8f64:
1390; AVX512VL:       # %bb.0:
1391; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1392; AVX512VL-NEXT:    vpcmpgtq %ymm0, %ymm1, %k1
1393; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1394; AVX512VL-NEXT:    vblendmpd %ymm1, %ymm0, %ymm2 {%k1}
1395; AVX512VL-NEXT:    vmovapd %ymm0, %ymm1 {%k1}
1396; AVX512VL-NEXT:    vmaxpd %ymm2, %ymm1, %ymm0
1397; AVX512VL-NEXT:    vcmpunordpd %ymm1, %ymm1, %k1
1398; AVX512VL-NEXT:    vmovapd %ymm1, %ymm0 {%k1}
1399; AVX512VL-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
1400; AVX512VL-NEXT:    vpcmpgtq %xmm0, %xmm1, %k1
1401; AVX512VL-NEXT:    vextractf128 $1, %ymm0, %xmm1
1402; AVX512VL-NEXT:    vblendmpd %xmm1, %xmm0, %xmm2 {%k1}
1403; AVX512VL-NEXT:    vmovapd %xmm0, %xmm1 {%k1}
1404; AVX512VL-NEXT:    vmaxpd %xmm2, %xmm1, %xmm0
1405; AVX512VL-NEXT:    vcmpunordpd %xmm1, %xmm1, %k1
1406; AVX512VL-NEXT:    vmovapd %xmm1, %xmm0 {%k1}
1407; AVX512VL-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]
1408; AVX512VL-NEXT:    vmovq %xmm0, %rax
1409; AVX512VL-NEXT:    testq %rax, %rax
1410; AVX512VL-NEXT:    sets %al
1411; AVX512VL-NEXT:    kmovd %eax, %k1
1412; AVX512VL-NEXT:    vmovapd %xmm0, %xmm2
1413; AVX512VL-NEXT:    vmovsd %xmm1, %xmm2, %xmm2 {%k1}
1414; AVX512VL-NEXT:    vmovsd %xmm0, %xmm1, %xmm1 {%k1}
1415; AVX512VL-NEXT:    vmaxsd %xmm2, %xmm1, %xmm0
1416; AVX512VL-NEXT:    vcmpunordsd %xmm1, %xmm1, %k1
1417; AVX512VL-NEXT:    vmovsd %xmm1, %xmm0, %xmm0 {%k1}
1418; AVX512VL-NEXT:    vzeroupper
1419; AVX512VL-NEXT:    retq
1420  %1 = call double @llvm.vector.reduce.fmaximum.v8f64(<8 x double> %a0)
1421  ret double %1
1422}
1423
1424define double @test_v16f64(<16 x double> %a0) {
1425; SSE2-LABEL: test_v16f64:
1426; SSE2:       # %bb.0:
1427; SSE2-NEXT:    movaps %xmm0, %xmm9
1428; SSE2-NEXT:    shufps {{.*#+}} xmm9 = xmm9[1,1],xmm0[3,3]
1429; SSE2-NEXT:    pxor %xmm8, %xmm8
1430; SSE2-NEXT:    pxor %xmm10, %xmm10
1431; SSE2-NEXT:    pcmpgtd %xmm9, %xmm10
1432; SSE2-NEXT:    movdqa %xmm10, %xmm9
1433; SSE2-NEXT:    pandn %xmm0, %xmm9
1434; SSE2-NEXT:    movdqa %xmm10, %xmm11
1435; SSE2-NEXT:    pandn %xmm4, %xmm11
1436; SSE2-NEXT:    pand %xmm10, %xmm4
1437; SSE2-NEXT:    por %xmm9, %xmm4
1438; SSE2-NEXT:    pand %xmm0, %xmm10
1439; SSE2-NEXT:    por %xmm11, %xmm10
1440; SSE2-NEXT:    movdqa %xmm10, %xmm0
1441; SSE2-NEXT:    maxpd %xmm4, %xmm0
1442; SSE2-NEXT:    movdqa %xmm10, %xmm4
1443; SSE2-NEXT:    cmpunordpd %xmm10, %xmm4
1444; SSE2-NEXT:    andpd %xmm4, %xmm10
1445; SSE2-NEXT:    andnpd %xmm0, %xmm4
1446; SSE2-NEXT:    orpd %xmm10, %xmm4
1447; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm4[1,1,3,3]
1448; SSE2-NEXT:    xorpd %xmm0, %xmm0
1449; SSE2-NEXT:    pcmpgtd %xmm9, %xmm0
1450; SSE2-NEXT:    movdqa %xmm0, %xmm9
1451; SSE2-NEXT:    pandn %xmm4, %xmm9
1452; SSE2-NEXT:    movaps %xmm2, %xmm10
1453; SSE2-NEXT:    shufps {{.*#+}} xmm10 = xmm10[1,1],xmm2[3,3]
1454; SSE2-NEXT:    pxor %xmm11, %xmm11
1455; SSE2-NEXT:    pcmpgtd %xmm10, %xmm11
1456; SSE2-NEXT:    movdqa %xmm11, %xmm10
1457; SSE2-NEXT:    pandn %xmm2, %xmm10
1458; SSE2-NEXT:    movdqa %xmm11, %xmm12
1459; SSE2-NEXT:    pandn %xmm6, %xmm12
1460; SSE2-NEXT:    pand %xmm11, %xmm6
1461; SSE2-NEXT:    por %xmm10, %xmm6
1462; SSE2-NEXT:    pand %xmm2, %xmm11
1463; SSE2-NEXT:    por %xmm12, %xmm11
1464; SSE2-NEXT:    movdqa %xmm11, %xmm2
1465; SSE2-NEXT:    maxpd %xmm6, %xmm2
1466; SSE2-NEXT:    movdqa %xmm11, %xmm6
1467; SSE2-NEXT:    cmpunordpd %xmm11, %xmm6
1468; SSE2-NEXT:    andpd %xmm6, %xmm11
1469; SSE2-NEXT:    andnpd %xmm2, %xmm6
1470; SSE2-NEXT:    orpd %xmm11, %xmm6
1471; SSE2-NEXT:    movdqa %xmm0, %xmm2
1472; SSE2-NEXT:    pandn %xmm6, %xmm2
1473; SSE2-NEXT:    pand %xmm0, %xmm6
1474; SSE2-NEXT:    por %xmm9, %xmm6
1475; SSE2-NEXT:    pand %xmm4, %xmm0
1476; SSE2-NEXT:    por %xmm2, %xmm0
1477; SSE2-NEXT:    movdqa %xmm0, %xmm4
1478; SSE2-NEXT:    maxpd %xmm6, %xmm4
1479; SSE2-NEXT:    movdqa %xmm0, %xmm2
1480; SSE2-NEXT:    cmpunordpd %xmm0, %xmm2
1481; SSE2-NEXT:    andpd %xmm2, %xmm0
1482; SSE2-NEXT:    andnpd %xmm4, %xmm2
1483; SSE2-NEXT:    orpd %xmm0, %xmm2
1484; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
1485; SSE2-NEXT:    xorpd %xmm0, %xmm0
1486; SSE2-NEXT:    pcmpgtd %xmm4, %xmm0
1487; SSE2-NEXT:    movdqa %xmm0, %xmm4
1488; SSE2-NEXT:    pandn %xmm2, %xmm4
1489; SSE2-NEXT:    movaps %xmm1, %xmm6
1490; SSE2-NEXT:    shufps {{.*#+}} xmm6 = xmm6[1,1],xmm1[3,3]
1491; SSE2-NEXT:    pxor %xmm9, %xmm9
1492; SSE2-NEXT:    pcmpgtd %xmm6, %xmm9
1493; SSE2-NEXT:    movdqa %xmm9, %xmm6
1494; SSE2-NEXT:    pandn %xmm1, %xmm6
1495; SSE2-NEXT:    movdqa %xmm9, %xmm10
1496; SSE2-NEXT:    pandn %xmm5, %xmm10
1497; SSE2-NEXT:    pand %xmm9, %xmm5
1498; SSE2-NEXT:    por %xmm6, %xmm5
1499; SSE2-NEXT:    pand %xmm1, %xmm9
1500; SSE2-NEXT:    por %xmm10, %xmm9
1501; SSE2-NEXT:    movdqa %xmm9, %xmm1
1502; SSE2-NEXT:    maxpd %xmm5, %xmm1
1503; SSE2-NEXT:    movdqa %xmm9, %xmm5
1504; SSE2-NEXT:    cmpunordpd %xmm9, %xmm5
1505; SSE2-NEXT:    andpd %xmm5, %xmm9
1506; SSE2-NEXT:    andnpd %xmm1, %xmm5
1507; SSE2-NEXT:    orpd %xmm9, %xmm5
1508; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
1509; SSE2-NEXT:    xorpd %xmm1, %xmm1
1510; SSE2-NEXT:    pcmpgtd %xmm6, %xmm1
1511; SSE2-NEXT:    movdqa %xmm1, %xmm6
1512; SSE2-NEXT:    pandn %xmm5, %xmm6
1513; SSE2-NEXT:    movaps %xmm3, %xmm9
1514; SSE2-NEXT:    shufps {{.*#+}} xmm9 = xmm9[1,1],xmm3[3,3]
1515; SSE2-NEXT:    pcmpgtd %xmm9, %xmm8
1516; SSE2-NEXT:    movdqa %xmm8, %xmm9
1517; SSE2-NEXT:    pandn %xmm3, %xmm9
1518; SSE2-NEXT:    movdqa %xmm8, %xmm10
1519; SSE2-NEXT:    pandn %xmm7, %xmm10
1520; SSE2-NEXT:    pand %xmm8, %xmm7
1521; SSE2-NEXT:    por %xmm9, %xmm7
1522; SSE2-NEXT:    pand %xmm3, %xmm8
1523; SSE2-NEXT:    por %xmm10, %xmm8
1524; SSE2-NEXT:    movdqa %xmm8, %xmm3
1525; SSE2-NEXT:    maxpd %xmm7, %xmm3
1526; SSE2-NEXT:    movdqa %xmm8, %xmm7
1527; SSE2-NEXT:    cmpunordpd %xmm8, %xmm7
1528; SSE2-NEXT:    andpd %xmm7, %xmm8
1529; SSE2-NEXT:    andnpd %xmm3, %xmm7
1530; SSE2-NEXT:    orpd %xmm8, %xmm7
1531; SSE2-NEXT:    movdqa %xmm1, %xmm3
1532; SSE2-NEXT:    pandn %xmm7, %xmm3
1533; SSE2-NEXT:    pand %xmm1, %xmm7
1534; SSE2-NEXT:    por %xmm6, %xmm7
1535; SSE2-NEXT:    pand %xmm5, %xmm1
1536; SSE2-NEXT:    por %xmm3, %xmm1
1537; SSE2-NEXT:    movdqa %xmm1, %xmm3
1538; SSE2-NEXT:    maxpd %xmm7, %xmm3
1539; SSE2-NEXT:    movdqa %xmm1, %xmm5
1540; SSE2-NEXT:    cmpunordpd %xmm1, %xmm5
1541; SSE2-NEXT:    andpd %xmm5, %xmm1
1542; SSE2-NEXT:    andnpd %xmm3, %xmm5
1543; SSE2-NEXT:    orpd %xmm1, %xmm5
1544; SSE2-NEXT:    movdqa %xmm0, %xmm1
1545; SSE2-NEXT:    pandn %xmm5, %xmm1
1546; SSE2-NEXT:    pand %xmm0, %xmm5
1547; SSE2-NEXT:    por %xmm4, %xmm5
1548; SSE2-NEXT:    pand %xmm2, %xmm0
1549; SSE2-NEXT:    por %xmm1, %xmm0
1550; SSE2-NEXT:    movdqa %xmm0, %xmm2
1551; SSE2-NEXT:    maxpd %xmm5, %xmm2
1552; SSE2-NEXT:    movdqa %xmm0, %xmm1
1553; SSE2-NEXT:    cmpunordpd %xmm0, %xmm1
1554; SSE2-NEXT:    andpd %xmm1, %xmm0
1555; SSE2-NEXT:    andnpd %xmm2, %xmm1
1556; SSE2-NEXT:    orpd %xmm0, %xmm1
1557; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
1558; SSE2-NEXT:    movq %xmm1, %rax
1559; SSE2-NEXT:    testq %rax, %rax
1560; SSE2-NEXT:    movdqa %xmm1, %xmm3
1561; SSE2-NEXT:    js .LBB8_2
1562; SSE2-NEXT:  # %bb.1:
1563; SSE2-NEXT:    movdqa %xmm2, %xmm3
1564; SSE2-NEXT:  .LBB8_2:
1565; SSE2-NEXT:    movdqa %xmm3, %xmm0
1566; SSE2-NEXT:    cmpunordsd %xmm3, %xmm0
1567; SSE2-NEXT:    movapd %xmm0, %xmm4
1568; SSE2-NEXT:    andpd %xmm3, %xmm4
1569; SSE2-NEXT:    js .LBB8_4
1570; SSE2-NEXT:  # %bb.3:
1571; SSE2-NEXT:    movdqa %xmm1, %xmm2
1572; SSE2-NEXT:  .LBB8_4:
1573; SSE2-NEXT:    maxsd %xmm2, %xmm3
1574; SSE2-NEXT:    andnpd %xmm3, %xmm0
1575; SSE2-NEXT:    orpd %xmm4, %xmm0
1576; SSE2-NEXT:    retq
1577;
1578; SSE41-LABEL: test_v16f64:
1579; SSE41:       # %bb.0:
1580; SSE41-NEXT:    movapd %xmm1, %xmm8
1581; SSE41-NEXT:    movapd %xmm0, %xmm1
1582; SSE41-NEXT:    movapd %xmm3, %xmm10
1583; SSE41-NEXT:    movapd %xmm3, %xmm0
1584; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm10
1585; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm7
1586; SSE41-NEXT:    movapd %xmm7, %xmm9
1587; SSE41-NEXT:    maxpd %xmm10, %xmm9
1588; SSE41-NEXT:    movapd %xmm7, %xmm0
1589; SSE41-NEXT:    cmpunordpd %xmm7, %xmm0
1590; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm9
1591; SSE41-NEXT:    movapd %xmm8, %xmm7
1592; SSE41-NEXT:    movapd %xmm8, %xmm0
1593; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm7
1594; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm5
1595; SSE41-NEXT:    movapd %xmm5, %xmm3
1596; SSE41-NEXT:    maxpd %xmm7, %xmm3
1597; SSE41-NEXT:    movapd %xmm5, %xmm0
1598; SSE41-NEXT:    cmpunordpd %xmm5, %xmm0
1599; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm3
1600; SSE41-NEXT:    movapd %xmm3, %xmm5
1601; SSE41-NEXT:    movapd %xmm3, %xmm0
1602; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm5
1603; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm9
1604; SSE41-NEXT:    movapd %xmm9, %xmm3
1605; SSE41-NEXT:    maxpd %xmm5, %xmm3
1606; SSE41-NEXT:    movapd %xmm9, %xmm0
1607; SSE41-NEXT:    cmpunordpd %xmm9, %xmm0
1608; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm3
1609; SSE41-NEXT:    movapd %xmm2, %xmm5
1610; SSE41-NEXT:    movapd %xmm2, %xmm0
1611; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm5
1612; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm6
1613; SSE41-NEXT:    movapd %xmm6, %xmm2
1614; SSE41-NEXT:    maxpd %xmm5, %xmm2
1615; SSE41-NEXT:    movapd %xmm6, %xmm0
1616; SSE41-NEXT:    cmpunordpd %xmm6, %xmm0
1617; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm2
1618; SSE41-NEXT:    movapd %xmm1, %xmm5
1619; SSE41-NEXT:    movapd %xmm1, %xmm0
1620; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm5
1621; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
1622; SSE41-NEXT:    movapd %xmm4, %xmm1
1623; SSE41-NEXT:    maxpd %xmm5, %xmm1
1624; SSE41-NEXT:    movapd %xmm4, %xmm0
1625; SSE41-NEXT:    cmpunordpd %xmm4, %xmm0
1626; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm1
1627; SSE41-NEXT:    movapd %xmm1, %xmm4
1628; SSE41-NEXT:    movapd %xmm1, %xmm0
1629; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
1630; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
1631; SSE41-NEXT:    movapd %xmm2, %xmm1
1632; SSE41-NEXT:    maxpd %xmm4, %xmm1
1633; SSE41-NEXT:    movapd %xmm2, %xmm0
1634; SSE41-NEXT:    cmpunordpd %xmm2, %xmm0
1635; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
1636; SSE41-NEXT:    movapd %xmm1, %xmm2
1637; SSE41-NEXT:    movapd %xmm1, %xmm0
1638; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
1639; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
1640; SSE41-NEXT:    movapd %xmm3, %xmm1
1641; SSE41-NEXT:    maxpd %xmm2, %xmm1
1642; SSE41-NEXT:    movapd %xmm3, %xmm0
1643; SSE41-NEXT:    cmpunordpd %xmm3, %xmm0
1644; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
1645; SSE41-NEXT:    movapd %xmm1, %xmm2
1646; SSE41-NEXT:    unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm1[1]
1647; SSE41-NEXT:    movq %xmm1, %rax
1648; SSE41-NEXT:    testq %rax, %rax
1649; SSE41-NEXT:    movapd %xmm1, %xmm3
1650; SSE41-NEXT:    js .LBB8_2
1651; SSE41-NEXT:  # %bb.1:
1652; SSE41-NEXT:    movapd %xmm2, %xmm3
1653; SSE41-NEXT:  .LBB8_2:
1654; SSE41-NEXT:    movapd %xmm3, %xmm0
1655; SSE41-NEXT:    cmpunordsd %xmm3, %xmm0
1656; SSE41-NEXT:    movapd %xmm0, %xmm4
1657; SSE41-NEXT:    andpd %xmm3, %xmm4
1658; SSE41-NEXT:    js .LBB8_4
1659; SSE41-NEXT:  # %bb.3:
1660; SSE41-NEXT:    movapd %xmm1, %xmm2
1661; SSE41-NEXT:  .LBB8_4:
1662; SSE41-NEXT:    maxsd %xmm2, %xmm3
1663; SSE41-NEXT:    andnpd %xmm3, %xmm0
1664; SSE41-NEXT:    orpd %xmm4, %xmm0
1665; SSE41-NEXT:    retq
1666;
1667; AVX-LABEL: test_v16f64:
1668; AVX:       # %bb.0:
1669; AVX-NEXT:    vblendvpd %ymm1, %ymm3, %ymm1, %ymm4
1670; AVX-NEXT:    vblendvpd %ymm1, %ymm1, %ymm3, %ymm1
1671; AVX-NEXT:    vmaxpd %ymm4, %ymm1, %ymm3
1672; AVX-NEXT:    vcmpunordpd %ymm1, %ymm1, %ymm4
1673; AVX-NEXT:    vblendvpd %ymm4, %ymm1, %ymm3, %ymm1
1674; AVX-NEXT:    vblendvpd %ymm0, %ymm2, %ymm0, %ymm3
1675; AVX-NEXT:    vblendvpd %ymm0, %ymm0, %ymm2, %ymm0
1676; AVX-NEXT:    vmaxpd %ymm3, %ymm0, %ymm2
1677; AVX-NEXT:    vcmpunordpd %ymm0, %ymm0, %ymm3
1678; AVX-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
1679; AVX-NEXT:    vblendvpd %ymm0, %ymm1, %ymm0, %ymm2
1680; AVX-NEXT:    vblendvpd %ymm0, %ymm0, %ymm1, %ymm0
1681; AVX-NEXT:    vmaxpd %ymm2, %ymm0, %ymm1
1682; AVX-NEXT:    vcmpunordpd %ymm0, %ymm0, %ymm2
1683; AVX-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1684; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
1685; AVX-NEXT:    vblendvpd %xmm0, %xmm1, %xmm0, %xmm2
1686; AVX-NEXT:    vblendvpd %xmm0, %xmm0, %xmm1, %xmm0
1687; AVX-NEXT:    vmaxpd %xmm2, %xmm0, %xmm1
1688; AVX-NEXT:    vcmpunordpd %xmm0, %xmm0, %xmm2
1689; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm1
1690; AVX-NEXT:    vshufpd {{.*#+}} xmm0 = xmm1[1,0]
1691; AVX-NEXT:    vmovq %xmm1, %rax
1692; AVX-NEXT:    testq %rax, %rax
1693; AVX-NEXT:    js .LBB8_1
1694; AVX-NEXT:  # %bb.2:
1695; AVX-NEXT:    vmovapd %xmm1, %xmm2
1696; AVX-NEXT:    jmp .LBB8_3
1697; AVX-NEXT:  .LBB8_1:
1698; AVX-NEXT:    vmovapd %xmm0, %xmm2
1699; AVX-NEXT:    vmovapd %xmm1, %xmm0
1700; AVX-NEXT:  .LBB8_3:
1701; AVX-NEXT:    vmaxsd %xmm2, %xmm0, %xmm1
1702; AVX-NEXT:    vcmpunordsd %xmm0, %xmm0, %xmm2
1703; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1704; AVX-NEXT:    vzeroupper
1705; AVX-NEXT:    retq
1706;
1707; AVX512BW-LABEL: test_v16f64:
1708; AVX512BW:       # %bb.0:
1709; AVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1710; AVX512BW-NEXT:    vpcmpgtq %zmm0, %zmm2, %k1
1711; AVX512BW-NEXT:    vblendmpd %zmm1, %zmm0, %zmm2 {%k1}
1712; AVX512BW-NEXT:    vmovapd %zmm0, %zmm1 {%k1}
1713; AVX512BW-NEXT:    vmaxpd %zmm2, %zmm1, %zmm0
1714; AVX512BW-NEXT:    vcmpunordpd %zmm1, %zmm1, %k1
1715; AVX512BW-NEXT:    vmovapd %zmm1, %zmm0 {%k1}
1716; AVX512BW-NEXT:    vextractf64x4 $1, %zmm0, %ymm1
1717; AVX512BW-NEXT:    vblendvpd %ymm0, %ymm1, %ymm0, %ymm2
1718; AVX512BW-NEXT:    vblendvpd %ymm0, %ymm0, %ymm1, %ymm0
1719; AVX512BW-NEXT:    vmaxpd %ymm2, %ymm0, %ymm1
1720; AVX512BW-NEXT:    vcmpunordpd %ymm0, %ymm0, %ymm2
1721; AVX512BW-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1722; AVX512BW-NEXT:    vextractf128 $1, %ymm0, %xmm1
1723; AVX512BW-NEXT:    vblendvpd %xmm0, %xmm1, %xmm0, %xmm2
1724; AVX512BW-NEXT:    vblendvpd %xmm0, %xmm0, %xmm1, %xmm0
1725; AVX512BW-NEXT:    vmaxpd %xmm2, %xmm0, %xmm1
1726; AVX512BW-NEXT:    vcmpunordpd %xmm0, %xmm0, %xmm2
1727; AVX512BW-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1728; AVX512BW-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]
1729; AVX512BW-NEXT:    vmovq %xmm0, %rax
1730; AVX512BW-NEXT:    testq %rax, %rax
1731; AVX512BW-NEXT:    sets %al
1732; AVX512BW-NEXT:    kmovd %eax, %k1
1733; AVX512BW-NEXT:    vmovapd %xmm0, %xmm2
1734; AVX512BW-NEXT:    vmovsd %xmm1, %xmm2, %xmm2 {%k1}
1735; AVX512BW-NEXT:    vmovsd %xmm0, %xmm1, %xmm1 {%k1}
1736; AVX512BW-NEXT:    vmaxsd %xmm2, %xmm1, %xmm0
1737; AVX512BW-NEXT:    vcmpunordsd %xmm1, %xmm1, %k1
1738; AVX512BW-NEXT:    vmovsd %xmm1, %xmm0, %xmm0 {%k1}
1739; AVX512BW-NEXT:    vzeroupper
1740; AVX512BW-NEXT:    retq
1741;
1742; AVX512VL-LABEL: test_v16f64:
1743; AVX512VL:       # %bb.0:
1744; AVX512VL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1745; AVX512VL-NEXT:    vpcmpgtq %zmm0, %zmm2, %k1
1746; AVX512VL-NEXT:    vblendmpd %zmm1, %zmm0, %zmm2 {%k1}
1747; AVX512VL-NEXT:    vmovapd %zmm0, %zmm1 {%k1}
1748; AVX512VL-NEXT:    vmaxpd %zmm2, %zmm1, %zmm0
1749; AVX512VL-NEXT:    vcmpunordpd %zmm1, %zmm1, %k1
1750; AVX512VL-NEXT:    vmovapd %zmm1, %zmm0 {%k1}
1751; AVX512VL-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
1752; AVX512VL-NEXT:    vpcmpgtq %ymm0, %ymm1, %k1
1753; AVX512VL-NEXT:    vextractf64x4 $1, %zmm0, %ymm1
1754; AVX512VL-NEXT:    vblendmpd %ymm1, %ymm0, %ymm2 {%k1}
1755; AVX512VL-NEXT:    vmovapd %ymm0, %ymm1 {%k1}
1756; AVX512VL-NEXT:    vmaxpd %ymm2, %ymm1, %ymm0
1757; AVX512VL-NEXT:    vcmpunordpd %ymm1, %ymm1, %k1
1758; AVX512VL-NEXT:    vmovapd %ymm1, %ymm0 {%k1}
1759; AVX512VL-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
1760; AVX512VL-NEXT:    vpcmpgtq %xmm0, %xmm1, %k1
1761; AVX512VL-NEXT:    vextractf128 $1, %ymm0, %xmm1
1762; AVX512VL-NEXT:    vblendmpd %xmm1, %xmm0, %xmm2 {%k1}
1763; AVX512VL-NEXT:    vmovapd %xmm0, %xmm1 {%k1}
1764; AVX512VL-NEXT:    vmaxpd %xmm2, %xmm1, %xmm0
1765; AVX512VL-NEXT:    vcmpunordpd %xmm1, %xmm1, %k1
1766; AVX512VL-NEXT:    vmovapd %xmm1, %xmm0 {%k1}
1767; AVX512VL-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]
1768; AVX512VL-NEXT:    vmovq %xmm0, %rax
1769; AVX512VL-NEXT:    testq %rax, %rax
1770; AVX512VL-NEXT:    sets %al
1771; AVX512VL-NEXT:    kmovd %eax, %k1
1772; AVX512VL-NEXT:    vmovapd %xmm0, %xmm2
1773; AVX512VL-NEXT:    vmovsd %xmm1, %xmm2, %xmm2 {%k1}
1774; AVX512VL-NEXT:    vmovsd %xmm0, %xmm1, %xmm1 {%k1}
1775; AVX512VL-NEXT:    vmaxsd %xmm2, %xmm1, %xmm0
1776; AVX512VL-NEXT:    vcmpunordsd %xmm1, %xmm1, %k1
1777; AVX512VL-NEXT:    vmovsd %xmm1, %xmm0, %xmm0 {%k1}
1778; AVX512VL-NEXT:    vzeroupper
1779; AVX512VL-NEXT:    retq
1780  %1 = call double @llvm.vector.reduce.fmaximum.v16f64(<16 x double> %a0)
1781  ret double %1
1782}
1783
1784declare float @llvm.vector.reduce.fmaximum.v1f32(<1 x float>)
1785declare float @llvm.vector.reduce.fmaximum.v2f32(<2 x float>)
1786declare float @llvm.vector.reduce.fmaximum.v3f32(<3 x float>)
1787declare float @llvm.vector.reduce.fmaximum.v4f32(<4 x float>)
1788declare float @llvm.vector.reduce.fmaximum.v8f32(<8 x float>)
1789declare float @llvm.vector.reduce.fmaximum.v16f32(<16 x float>)
1790
1791declare double @llvm.vector.reduce.fmaximum.v2f64(<2 x double>)
1792declare double @llvm.vector.reduce.fmaximum.v4f64(<4 x double>)
1793declare double @llvm.vector.reduce.fmaximum.v8f64(<8 x double>)
1794declare double @llvm.vector.reduce.fmaximum.v16f64(<16 x double>)
1795