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