Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / X86 / vector-reduce-fmax.ll
blobfe2c41f57cfab165c726b356c8e4444b09d5fe2d
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
10 ; vXf32
13 define float @test_v1f32(<1 x float> %a0) {
14 ; ALL-LABEL: test_v1f32:
15 ; ALL:       # %bb.0:
16 ; ALL-NEXT:    retq
17   %1 = call float @llvm.vector.reduce.fmax.v1f32(<1 x float> %a0)
18   ret float %1
21 define float @test_v2f32(<2 x float> %a0) {
22 ; SSE2-LABEL: test_v2f32:
23 ; SSE2:       # %bb.0:
24 ; SSE2-NEXT:    movaps %xmm0, %xmm2
25 ; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,1],xmm0[1,1]
26 ; SSE2-NEXT:    movaps %xmm0, %xmm1
27 ; SSE2-NEXT:    cmpunordss %xmm0, %xmm1
28 ; SSE2-NEXT:    movaps %xmm1, %xmm3
29 ; SSE2-NEXT:    andps %xmm2, %xmm3
30 ; SSE2-NEXT:    maxss %xmm0, %xmm2
31 ; SSE2-NEXT:    andnps %xmm2, %xmm1
32 ; SSE2-NEXT:    orps %xmm3, %xmm1
33 ; SSE2-NEXT:    movaps %xmm1, %xmm0
34 ; SSE2-NEXT:    retq
36 ; SSE41-LABEL: test_v2f32:
37 ; SSE41:       # %bb.0:
38 ; SSE41-NEXT:    movshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]
39 ; SSE41-NEXT:    movaps %xmm0, %xmm1
40 ; SSE41-NEXT:    cmpunordss %xmm0, %xmm1
41 ; SSE41-NEXT:    movaps %xmm1, %xmm3
42 ; SSE41-NEXT:    andps %xmm2, %xmm3
43 ; SSE41-NEXT:    maxss %xmm0, %xmm2
44 ; SSE41-NEXT:    andnps %xmm2, %xmm1
45 ; SSE41-NEXT:    orps %xmm3, %xmm1
46 ; SSE41-NEXT:    movaps %xmm1, %xmm0
47 ; SSE41-NEXT:    retq
49 ; AVX-LABEL: test_v2f32:
50 ; AVX:       # %bb.0:
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
55 ; AVX-NEXT:    retq
57 ; AVX512-LABEL: test_v2f32:
58 ; AVX512:       # %bb.0:
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
64 ; AVX512-NEXT:    retq
65   %1 = call float @llvm.vector.reduce.fmax.v2f32(<2 x float> %a0)
66   ret float %1
69 define float @test_v3f32(<3 x float> %a0) {
70 ; SSE2-LABEL: test_v3f32:
71 ; SSE2:       # %bb.0:
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
88 ; SSE2-NEXT:    retq
90 ; SSE41-LABEL: test_v3f32:
91 ; SSE41:       # %bb.0:
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
107 ; SSE41-NEXT:    retq
109 ; AVX-LABEL: test_v3f32:
110 ; AVX:       # %bb.0:
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
119 ; AVX-NEXT:    retq
121 ; AVX512-LABEL: test_v3f32:
122 ; AVX512:       # %bb.0:
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}
131 ; AVX512-NEXT:    retq
132   %1 = call float @llvm.vector.reduce.fmax.v3f32(<3 x float> %a0)
133   ret float %1
136 define float @test_v4f32(<4 x float> %a0) {
137 ; SSE2-LABEL: test_v4f32:
138 ; SSE2:       # %bb.0:
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
165 ; SSE2-NEXT:    retq
167 ; SSE41-LABEL: test_v4f32:
168 ; SSE41:       # %bb.0:
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
194 ; SSE41-NEXT:    retq
196 ; AVX-LABEL: test_v4f32:
197 ; AVX:       # %bb.0:
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
210 ; AVX-NEXT:    retq
212 ; AVX512-LABEL: test_v4f32:
213 ; AVX512:       # %bb.0:
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}
226 ; AVX512-NEXT:    retq
227   %1 = call float @llvm.vector.reduce.fmax.v4f32(<4 x float> %a0)
228   ret float %1
231 define float @test_v8f32(<8 x float> %a0) {
232 ; SSE2-LABEL: test_v8f32:
233 ; SSE2:       # %bb.0:
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
265 ; SSE2-NEXT:    retq
267 ; SSE41-LABEL: test_v8f32:
268 ; SSE41:       # %bb.0:
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
298 ; SSE41-NEXT:    retq
300 ; AVX-LABEL: test_v8f32:
301 ; AVX:       # %bb.0:
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
331 ; AVX-NEXT:    retq
333 ; AVX512BW-LABEL: test_v8f32:
334 ; AVX512BW:       # %bb.0:
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:
367 ; AVX512VL:       # %bb.0:
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)
399   ret float %1
402 define float @test_v16f32(<16 x float> %a0) {
403 ; SSE2-LABEL: test_v16f32:
404 ; SSE2:       # %bb.0:
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
448 ; SSE2-NEXT:    retq
450 ; SSE41-LABEL: test_v16f32:
451 ; SSE41:       # %bb.0:
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
491 ; SSE41-NEXT:    retq
493 ; AVX-LABEL: test_v16f32:
494 ; AVX:       # %bb.0:
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
527 ; AVX-NEXT:    retq
529 ; AVX512BW-LABEL: test_v16f32:
530 ; AVX512BW:       # %bb.0:
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:
595 ; AVX512VL:       # %bb.0:
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)
659   ret float %1
663 ; vXf64
666 define double @test_v2f64(<2 x double> %a0) {
667 ; SSE-LABEL: test_v2f64:
668 ; SSE:       # %bb.0:
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
679 ; SSE-NEXT:    retq
681 ; AVX-LABEL: test_v2f64:
682 ; AVX:       # %bb.0:
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
687 ; AVX-NEXT:    retq
689 ; AVX512-LABEL: test_v2f64:
690 ; AVX512:       # %bb.0:
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
696 ; AVX512-NEXT:    retq
697   %1 = call double @llvm.vector.reduce.fmax.v2f64(<2 x double> %a0)
698   ret double %1
701 define double @test_v4f64(<4 x double> %a0) {
702 ; SSE2-LABEL: test_v4f64:
703 ; SSE2:       # %bb.0:
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
719 ; SSE2-NEXT:    retq
721 ; SSE41-LABEL: test_v4f64:
722 ; SSE41:       # %bb.0:
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
736 ; SSE41-NEXT:    retq
738 ; AVX-LABEL: test_v4f64:
739 ; AVX:       # %bb.0:
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
753 ; AVX-NEXT:    retq
755 ; AVX512-LABEL: test_v4f64:
756 ; AVX512:       # %bb.0:
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
770 ; AVX512-NEXT:    retq
771   %1 = call double @llvm.vector.reduce.fmax.v4f64(<4 x double> %a0)
772   ret double %1
775 define double @test_v8f64(<8 x double> %a0) {
776 ; SSE2-LABEL: test_v8f64:
777 ; SSE2:       # %bb.0:
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
805 ; SSE2-NEXT:    retq
807 ; SSE41-LABEL: test_v8f64:
808 ; SSE41:       # %bb.0:
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
832 ; SSE41-NEXT:    retq
834 ; AVX-LABEL: test_v8f64:
835 ; AVX:       # %bb.0:
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
852 ; AVX-NEXT:    retq
854 ; AVX512BW-LABEL: test_v8f64:
855 ; AVX512BW:       # %bb.0:
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:
888 ; AVX512VL:       # %bb.0:
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)
920   ret double %1
923 define double @test_v16f64(<16 x double> %a0) {
924 ; SSE2-LABEL: test_v16f64:
925 ; SSE2:       # %bb.0:
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
977 ; SSE2-NEXT:    retq
979 ; SSE41-LABEL: test_v16f64:
980 ; SSE41:       # %bb.0:
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
1024 ; SSE41-NEXT:    retq
1026 ; AVX-LABEL: test_v16f64:
1027 ; AVX:       # %bb.0:
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
1050 ; AVX-NEXT:    retq
1052 ; AVX512-LABEL: test_v16f64:
1053 ; AVX512:       # %bb.0:
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
1086 ; AVX512-NEXT:    retq
1087   %1 = call double @llvm.vector.reduce.fmax.v16f64(<16 x double> %a0)
1088   ret double %1
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>)