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
13 define float @test_v1f32(<1 x float> %a0) {
14 ; ALL-LABEL: test_v1f32:
17 %1 = call float @llvm.vector.reduce.fmin.v1f32(<1 x float> %a0)
21 define float @test_v2f32(<2 x float> %a0) {
22 ; SSE2-LABEL: test_v2f32:
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
36 ; SSE41-LABEL: test_v2f32:
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
49 ; AVX-LABEL: test_v2f32:
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
57 ; AVX512-LABEL: test_v2f32:
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
65 %1 = call float @llvm.vector.reduce.fmin.v2f32(<2 x float> %a0)
69 define float @test_v4f32(<4 x float> %a0) {
70 ; SSE2-LABEL: test_v4f32:
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
100 ; SSE41-LABEL: test_v4f32:
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
129 ; AVX-LABEL: test_v4f32:
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
145 ; AVX512-LABEL: test_v4f32:
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}
160 %1 = call float @llvm.vector.reduce.fmin.v4f32(<4 x float> %a0)
164 define float @test_v8f32(<8 x float> %a0) {
165 ; SSE2-LABEL: test_v8f32:
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
200 ; SSE41-LABEL: test_v8f32:
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
233 ; AVX-LABEL: test_v8f32:
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
266 ; AVX512BW-LABEL: test_v8f32:
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
299 ; AVX512VL-LABEL: test_v8f32:
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)
335 define float @test_v16f32(<16 x float> %a0) {
336 ; SSE2-LABEL: test_v16f32:
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
383 ; SSE41-LABEL: test_v16f32:
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
426 ; AVX-LABEL: test_v16f32:
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
462 ; AVX512BW-LABEL: test_v16f32:
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
527 ; AVX512VL-LABEL: test_v16f32:
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)
599 define double @test_v2f64(<2 x double> %a0) {
600 ; SSE-LABEL: test_v2f64:
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
614 ; AVX-LABEL: test_v2f64:
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
622 ; AVX512-LABEL: test_v2f64:
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
630 %1 = call double @llvm.vector.reduce.fmin.v2f64(<2 x double> %a0)
634 define double @test_v3f64(<3 x double> %a0) {
635 ; SSE2-LABEL: test_v3f64:
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
656 ; SSE41-LABEL: test_v3f64:
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
675 ; AVX-LABEL: test_v3f64:
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
688 ; AVX512-LABEL: test_v3f64:
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
700 %1 = call double @llvm.vector.reduce.fmin.v3f64(<3 x double> %a0)
704 define double @test_v4f64(<4 x double> %a0) {
705 ; SSE2-LABEL: test_v4f64:
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
724 ; SSE41-LABEL: test_v4f64:
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
741 ; AVX-LABEL: test_v4f64:
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
758 ; AVX512-LABEL: test_v4f64:
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
774 %1 = call double @llvm.vector.reduce.fmin.v4f64(<4 x double> %a0)
778 define double @test_v8f64(<8 x double> %a0) {
779 ; SSE2-LABEL: test_v8f64:
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
810 ; SSE41-LABEL: test_v8f64:
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
837 ; AVX-LABEL: test_v8f64:
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
857 ; AVX512BW-LABEL: test_v8f64:
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
890 ; AVX512VL-LABEL: test_v8f64:
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)
926 define double @test_v16f64(<16 x double> %a0) {
927 ; SSE2-LABEL: test_v16f64:
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
982 ; SSE41-LABEL: test_v16f64:
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
1029 ; AVX-LABEL: test_v16f64:
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
1055 ; AVX512-LABEL: test_v16f64:
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
1090 %1 = call double @llvm.vector.reduce.fmin.v16f64(<16 x double> %a0)
1094 declare float @llvm.vector.reduce.fmin.v1f32(<1 x float>)
1095 declare float @llvm.vector.reduce.fmin.v2f32(<2 x float>)
1096 declare float @llvm.vector.reduce.fmin.v4f32(<4 x float>)
1097 declare float @llvm.vector.reduce.fmin.v8f32(<8 x float>)
1098 declare float @llvm.vector.reduce.fmin.v16f32(<16 x float>)
1100 declare double @llvm.vector.reduce.fmin.v2f64(<2 x double>)
1101 declare double @llvm.vector.reduce.fmin.v3f64(<3 x double>)
1102 declare double @llvm.vector.reduce.fmin.v4f64(<4 x double>)
1103 declare double @llvm.vector.reduce.fmin.v8f64(<8 x double>)
1104 declare double @llvm.vector.reduce.fmin.v16f64(<16 x double>)