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