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