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