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