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