[C++20][Modules][Serialization] Add an additional test case for #120277. (#126349)
[llvm-project.git] / llvm / test / CodeGen / AArch64 / aarch64-neon-faminmax.ll
blob04270a502ec19881b7c14a4029a4dcbb9e495ca9
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2 ; RUN: llc -mattr=+faminmax -verify-machineinstrs %s -o - | FileCheck %s
3 ; RUN: llc -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK-NO-FAMINMAX
5 target triple = "aarch64-unknown-linux-gnu"
7 ; Replace min(abs(a), abs(b)) with famin(a, b)
8 ; Replace max(abs(a), abs(b)) with famax(a, b)
10 ; When the fastmath flag 'nnan' (no nan) is enabled, we may also replace:
11 ; minnm(abs(a), abs(b)) with famin(a, b)
12 ; maxnm(abs(a), abs(b)) with famax(a, b)
14 define <4 x half> @test_max_v4f16(<4 x half> %a, <4 x half> %b) #0 {
15 ; CHECK-LABEL: test_max_v4f16:
16 ; CHECK:       // %bb.0:
17 ; CHECK-NEXT:    famax v0.4h, v0.4h, v1.4h
18 ; CHECK-NEXT:    ret
20 ; CHECK-NO-FAMINMAX-LABEL: test_max_v4f16:
21 ; CHECK-NO-FAMINMAX:       // %bb.0:
22 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.4h, v0.4h
23 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.4h, v1.4h
24 ; CHECK-NO-FAMINMAX-NEXT:    fmax v0.4h, v0.4h, v1.4h
25 ; CHECK-NO-FAMINMAX-NEXT:    ret
26   %aa = call <4 x half> @llvm.fabs.v4f16(<4 x half> %a)
27   %ab = call <4 x half> @llvm.fabs.v4f16(<4 x half> %b)
28   %r = call <4 x half> @llvm.maximum.v4f16(<4 x half> %aa, <4 x half> %ab)
29   ret <4 x half> %r
32 define <4 x half> @test_maxnm_nnan_v4f16(<4 x half> %a, <4 x half> %b) #0 {
33 ; CHECK-LABEL: test_maxnm_nnan_v4f16:
34 ; CHECK:       // %bb.0:
35 ; CHECK-NEXT:    famax v0.4h, v0.4h, v1.4h
36 ; CHECK-NEXT:    ret
38 ; CHECK-NO-FAMINMAX-LABEL: test_maxnm_nnan_v4f16:
39 ; CHECK-NO-FAMINMAX:       // %bb.0:
40 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.4h, v0.4h
41 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.4h, v1.4h
42 ; CHECK-NO-FAMINMAX-NEXT:    fmaxnm v0.4h, v0.4h, v1.4h
43 ; CHECK-NO-FAMINMAX-NEXT:    ret
44   %aa = call <4 x half> @llvm.fabs.v4f16(<4 x half> %a)
45   %ab = call <4 x half> @llvm.fabs.v4f16(<4 x half> %b)
46   %r = call nnan <4 x half> @llvm.maxnum.v4f16(<4 x half> %aa,  <4 x half> %ab)
47   ret <4 x half> %r
50 define <4 x half> @test_maxnm_noflag_v4f16(<4 x half> %a, <4 x half> %b) #0 {
51 ; CHECK-LABEL: test_maxnm_noflag_v4f16:
52 ; CHECK:       // %bb.0:
53 ; CHECK-NEXT:    fabs v0.4h, v0.4h
54 ; CHECK-NEXT:    fabs v1.4h, v1.4h
55 ; CHECK-NEXT:    fmaxnm v0.4h, v0.4h, v1.4h
56 ; CHECK-NEXT:    ret
58 ; CHECK-NO-FAMINMAX-LABEL: test_maxnm_noflag_v4f16:
59 ; CHECK-NO-FAMINMAX:       // %bb.0:
60 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.4h, v0.4h
61 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.4h, v1.4h
62 ; CHECK-NO-FAMINMAX-NEXT:    fmaxnm v0.4h, v0.4h, v1.4h
63 ; CHECK-NO-FAMINMAX-NEXT:    ret
64   %aa = call <4 x half> @llvm.fabs.v4f16(<4 x half> %a)
65   %ab = call <4 x half> @llvm.fabs.v4f16(<4 x half> %b)
66   %r = call <4 x half> @llvm.maxnum.v4f16(<4 x half> %aa, <4 x half> %ab)
67   ret <4 x half> %r
70 define <4 x half> @test_min_v4f16(<4 x half> %a, <4 x half> %b) #0 {
71 ; CHECK-LABEL: test_min_v4f16:
72 ; CHECK:       // %bb.0:
73 ; CHECK-NEXT:    famin v0.4h, v0.4h, v1.4h
74 ; CHECK-NEXT:    ret
76 ; CHECK-NO-FAMINMAX-LABEL: test_min_v4f16:
77 ; CHECK-NO-FAMINMAX:       // %bb.0:
78 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.4h, v0.4h
79 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.4h, v1.4h
80 ; CHECK-NO-FAMINMAX-NEXT:    fmin v0.4h, v0.4h, v1.4h
81 ; CHECK-NO-FAMINMAX-NEXT:    ret
82   %aa = call <4 x half> @llvm.fabs.v4f16(<4 x half> %a)
83   %ab = call <4 x half> @llvm.fabs.v4f16(<4 x half> %b)
84   %r = call <4 x half> @llvm.minimum.v4f16(<4 x half> %aa, <4 x half> %ab)
85   ret <4 x half> %r
88 define <4 x half> @test_minnm_nnan_v4f16(<4 x half> %a, <4 x half> %b) #0 {
89 ; CHECK-LABEL: test_minnm_nnan_v4f16:
90 ; CHECK:       // %bb.0:
91 ; CHECK-NEXT:    famin v0.4h, v0.4h, v1.4h
92 ; CHECK-NEXT:    ret
94 ; CHECK-NO-FAMINMAX-LABEL: test_minnm_nnan_v4f16:
95 ; CHECK-NO-FAMINMAX:       // %bb.0:
96 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.4h, v0.4h
97 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.4h, v1.4h
98 ; CHECK-NO-FAMINMAX-NEXT:    fminnm v0.4h, v0.4h, v1.4h
99 ; CHECK-NO-FAMINMAX-NEXT:    ret
100   %aa = call <4 x half> @llvm.fabs.v4f16(<4 x half> %a)
101   %ab = call <4 x half> @llvm.fabs.v4f16(<4 x half> %b)
102   %r = call nnan <4 x half> @llvm.minnum.v4f16(<4 x half> %aa, <4 x half> %ab)
103   ret <4 x half> %r
106 define <4 x half> @test_minnm_noflag_v4f16(<4 x half> %a, <4 x half> %b) #0 {
107 ; CHECK-LABEL: test_minnm_noflag_v4f16:
108 ; CHECK:       // %bb.0:
109 ; CHECK-NEXT:    fabs v0.4h, v0.4h
110 ; CHECK-NEXT:    fabs v1.4h, v1.4h
111 ; CHECK-NEXT:    fminnm v0.4h, v0.4h, v1.4h
112 ; CHECK-NEXT:    ret
114 ; CHECK-NO-FAMINMAX-LABEL: test_minnm_noflag_v4f16:
115 ; CHECK-NO-FAMINMAX:       // %bb.0:
116 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.4h, v0.4h
117 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.4h, v1.4h
118 ; CHECK-NO-FAMINMAX-NEXT:    fminnm v0.4h, v0.4h, v1.4h
119 ; CHECK-NO-FAMINMAX-NEXT:    ret
120   %aa = call <4 x half> @llvm.fabs.v4f16(<4 x half> %a)
121   %ab = call <4 x half> @llvm.fabs.v4f16(<4 x half> %b)
122   %r = call <4 x half> @llvm.minnum.v4f16(<4 x half> %aa, <4 x half> %ab)
123   ret <4 x half> %r
126 define <8 x half> @test_max_v8f16(<8 x half> %a, <8 x half> %b) #0 {
127 ; CHECK-LABEL: test_max_v8f16:
128 ; CHECK:       // %bb.0:
129 ; CHECK-NEXT:    famax v0.8h, v0.8h, v1.8h
130 ; CHECK-NEXT:    ret
132 ; CHECK-NO-FAMINMAX-LABEL: test_max_v8f16:
133 ; CHECK-NO-FAMINMAX:       // %bb.0:
134 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.8h, v0.8h
135 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.8h, v1.8h
136 ; CHECK-NO-FAMINMAX-NEXT:    fmax v0.8h, v0.8h, v1.8h
137 ; CHECK-NO-FAMINMAX-NEXT:    ret
138   %aa = call <8 x half> @llvm.fabs.v8f16(<8 x half> %a)
139   %ab = call <8 x half> @llvm.fabs.v8f16(<8 x half> %b)
140   %r = call <8 x half> @llvm.maximum.v8f16(<8 x half> %aa, <8 x half> %ab)
141   ret <8 x half> %r
144 define <8 x half> @test_maxnm_nnan_v8f16(<8 x half> %a, <8 x half> %b) #0 {
145 ; CHECK-LABEL: test_maxnm_nnan_v8f16:
146 ; CHECK:       // %bb.0:
147 ; CHECK-NEXT:    famax v0.8h, v0.8h, v1.8h
148 ; CHECK-NEXT:    ret
150 ; CHECK-NO-FAMINMAX-LABEL: test_maxnm_nnan_v8f16:
151 ; CHECK-NO-FAMINMAX:       // %bb.0:
152 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.8h, v0.8h
153 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.8h, v1.8h
154 ; CHECK-NO-FAMINMAX-NEXT:    fmaxnm v0.8h, v0.8h, v1.8h
155 ; CHECK-NO-FAMINMAX-NEXT:    ret
156   %aa = call <8 x half> @llvm.fabs.v8f16(<8 x half> %a)
157   %ab = call <8 x half> @llvm.fabs.v8f16(<8 x half> %b)
158   %r = call nnan <8 x half> @llvm.maxnum.v8f16(<8 x half> %aa, <8 x half> %ab)
159   ret <8 x half> %r
162 define <8 x half> @test_maxnm_noflag_v8f16(<8 x half> %a, <8 x half> %b) #0 {
163 ; CHECK-LABEL: test_maxnm_noflag_v8f16:
164 ; CHECK:       // %bb.0:
165 ; CHECK-NEXT:    fabs v0.8h, v0.8h
166 ; CHECK-NEXT:    fabs v1.8h, v1.8h
167 ; CHECK-NEXT:    fmaxnm v0.8h, v0.8h, v1.8h
168 ; CHECK-NEXT:    ret
170 ; CHECK-NO-FAMINMAX-LABEL: test_maxnm_noflag_v8f16:
171 ; CHECK-NO-FAMINMAX:       // %bb.0:
172 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.8h, v0.8h
173 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.8h, v1.8h
174 ; CHECK-NO-FAMINMAX-NEXT:    fmaxnm v0.8h, v0.8h, v1.8h
175 ; CHECK-NO-FAMINMAX-NEXT:    ret
176   %aa = call <8 x half> @llvm.fabs.v8f16(<8 x half> %a)
177   %ab = call <8 x half> @llvm.fabs.v8f16(<8 x half> %b)
178   %r = call <8 x half> @llvm.maxnum.v8f16(<8 x half> %aa, <8 x half> %ab)
179   ret <8 x half> %r
182 define <8 x half> @test_min_v8f16(<8 x half> %a, <8 x half> %b) #0 {
183 ; CHECK-LABEL: test_min_v8f16:
184 ; CHECK:       // %bb.0:
185 ; CHECK-NEXT:    famin v0.8h, v0.8h, v1.8h
186 ; CHECK-NEXT:    ret
188 ; CHECK-NO-FAMINMAX-LABEL: test_min_v8f16:
189 ; CHECK-NO-FAMINMAX:       // %bb.0:
190 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.8h, v0.8h
191 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.8h, v1.8h
192 ; CHECK-NO-FAMINMAX-NEXT:    fmin v0.8h, v0.8h, v1.8h
193 ; CHECK-NO-FAMINMAX-NEXT:    ret
194   %aa = call <8 x half> @llvm.fabs.v8f16(<8 x half> %a)
195   %ab = call <8 x half> @llvm.fabs.v8f16(<8 x half> %b)
196   %r = call <8 x half> @llvm.minimum.v8f16(<8 x half> %aa, <8 x half> %ab)
197   ret <8 x half> %r
200 define <8 x half> @test_minnm_nnan_v8f16(<8 x half> %a, <8 x half> %b) #0 {
201 ; CHECK-LABEL: test_minnm_nnan_v8f16:
202 ; CHECK:       // %bb.0:
203 ; CHECK-NEXT:    famin v0.8h, v0.8h, v1.8h
204 ; CHECK-NEXT:    ret
206 ; CHECK-NO-FAMINMAX-LABEL: test_minnm_nnan_v8f16:
207 ; CHECK-NO-FAMINMAX:       // %bb.0:
208 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.8h, v0.8h
209 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.8h, v1.8h
210 ; CHECK-NO-FAMINMAX-NEXT:    fminnm v0.8h, v0.8h, v1.8h
211 ; CHECK-NO-FAMINMAX-NEXT:    ret
212   %aa = call <8 x half> @llvm.fabs.v8f16(<8 x half> %a)
213   %ab = call <8 x half> @llvm.fabs.v8f16(<8 x half> %b)
214   %r = call nnan <8 x half> @llvm.minnum.v8f16(<8 x half> %aa, <8 x half> %ab)
215   ret <8 x half> %r
218 define <8 x half> @test_minnm_noflag_v8f16(<8 x half> %a, <8 x half> %b) #0 {
219 ; CHECK-LABEL: test_minnm_noflag_v8f16:
220 ; CHECK:       // %bb.0:
221 ; CHECK-NEXT:    fabs v0.8h, v0.8h
222 ; CHECK-NEXT:    fabs v1.8h, v1.8h
223 ; CHECK-NEXT:    fminnm v0.8h, v0.8h, v1.8h
224 ; CHECK-NEXT:    ret
226 ; CHECK-NO-FAMINMAX-LABEL: test_minnm_noflag_v8f16:
227 ; CHECK-NO-FAMINMAX:       // %bb.0:
228 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.8h, v0.8h
229 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.8h, v1.8h
230 ; CHECK-NO-FAMINMAX-NEXT:    fminnm v0.8h, v0.8h, v1.8h
231 ; CHECK-NO-FAMINMAX-NEXT:    ret
232   %aa = call <8 x half> @llvm.fabs.v8f16(<8 x half> %a)
233   %ab = call <8 x half> @llvm.fabs.v8f16(<8 x half> %b)
234   %r = call <8 x half> @llvm.minnum.v8f16(<8 x half> %aa, <8 x half> %ab)
235   ret <8 x half> %r
238 define <2 x float> @test_max_v2f32(<2 x float> %a, <2 x float> %b) {
239 ; CHECK-LABEL: test_max_v2f32:
240 ; CHECK:       // %bb.0:
241 ; CHECK-NEXT:    famax v0.2s, v0.2s, v1.2s
242 ; CHECK-NEXT:    ret
244 ; CHECK-NO-FAMINMAX-LABEL: test_max_v2f32:
245 ; CHECK-NO-FAMINMAX:       // %bb.0:
246 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.2s, v0.2s
247 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.2s, v1.2s
248 ; CHECK-NO-FAMINMAX-NEXT:    fmax v0.2s, v0.2s, v1.2s
249 ; CHECK-NO-FAMINMAX-NEXT:    ret
250   %aa = call <2 x float> @llvm.fabs.v2f32(<2 x float> %a)
251   %ab = call <2 x float> @llvm.fabs.v2f32(<2 x float> %b)
252   %r = call <2 x float> @llvm.maximum.v2f32(<2 x float> %aa, <2 x float> %ab)
253   ret <2 x float> %r
256 define <2 x float> @test_maxnm_nnan_v2f32(<2 x float> %a, <2 x float> %b) {
257 ; CHECK-LABEL: test_maxnm_nnan_v2f32:
258 ; CHECK:       // %bb.0:
259 ; CHECK-NEXT:    famax v0.2s, v0.2s, v1.2s
260 ; CHECK-NEXT:    ret
262 ; CHECK-NO-FAMINMAX-LABEL: test_maxnm_nnan_v2f32:
263 ; CHECK-NO-FAMINMAX:       // %bb.0:
264 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.2s, v0.2s
265 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.2s, v1.2s
266 ; CHECK-NO-FAMINMAX-NEXT:    fmaxnm v0.2s, v0.2s, v1.2s
267 ; CHECK-NO-FAMINMAX-NEXT:    ret
268   %aa = call <2 x float> @llvm.fabs.v2f32(<2 x float> %a)
269   %ab = call <2 x float> @llvm.fabs.v2f32(<2 x float> %b)
270   %r = call nnan <2 x float> @llvm.maxnum.v2f32(<2 x float> %aa, <2 x float> %ab)
271   ret <2 x float> %r
274 define <2 x float> @test_maxnm_noflag_v2f32(<2 x float> %a, <2 x float> %b) {
275 ; CHECK-LABEL: test_maxnm_noflag_v2f32:
276 ; CHECK:       // %bb.0:
277 ; CHECK-NEXT:    fabs v0.2s, v0.2s
278 ; CHECK-NEXT:    fabs v1.2s, v1.2s
279 ; CHECK-NEXT:    fmaxnm v0.2s, v0.2s, v1.2s
280 ; CHECK-NEXT:    ret
282 ; CHECK-NO-FAMINMAX-LABEL: test_maxnm_noflag_v2f32:
283 ; CHECK-NO-FAMINMAX:       // %bb.0:
284 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.2s, v0.2s
285 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.2s, v1.2s
286 ; CHECK-NO-FAMINMAX-NEXT:    fmaxnm v0.2s, v0.2s, v1.2s
287 ; CHECK-NO-FAMINMAX-NEXT:    ret
288   %aa = call <2 x float> @llvm.fabs.v2f32(<2 x float> %a)
289   %ab = call <2 x float> @llvm.fabs.v2f32(<2 x float> %b)
290   %r = call <2 x float> @llvm.maxnum.v2f32(<2 x float> %aa, <2 x float> %ab)
291   ret <2 x float> %r
294 define <2 x float> @test_min_v2f32(<2 x float> %a, <2 x float> %b) {
295 ; CHECK-LABEL: test_min_v2f32:
296 ; CHECK:       // %bb.0:
297 ; CHECK-NEXT:    famin v0.2s, v0.2s, v1.2s
298 ; CHECK-NEXT:    ret
300 ; CHECK-NO-FAMINMAX-LABEL: test_min_v2f32:
301 ; CHECK-NO-FAMINMAX:       // %bb.0:
302 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.2s, v0.2s
303 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.2s, v1.2s
304 ; CHECK-NO-FAMINMAX-NEXT:    fmin v0.2s, v0.2s, v1.2s
305 ; CHECK-NO-FAMINMAX-NEXT:    ret
306   %aa = call <2 x float> @llvm.fabs.v2f32(<2 x float> %a)
307   %ab = call <2 x float> @llvm.fabs.v2f32(<2 x float> %b)
308   %r = call <2 x float> @llvm.minimum.v2f32(<2 x float> %aa, <2 x float> %ab)
309   ret <2 x float> %r
312 define <2 x float> @test_minnm_nnan_v2f32(<2 x float> %a, <2 x float> %b) {
313 ; CHECK-LABEL: test_minnm_nnan_v2f32:
314 ; CHECK:       // %bb.0:
315 ; CHECK-NEXT:    famin v0.2s, v0.2s, v1.2s
316 ; CHECK-NEXT:    ret
318 ; CHECK-NO-FAMINMAX-LABEL: test_minnm_nnan_v2f32:
319 ; CHECK-NO-FAMINMAX:       // %bb.0:
320 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.2s, v0.2s
321 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.2s, v1.2s
322 ; CHECK-NO-FAMINMAX-NEXT:    fminnm v0.2s, v0.2s, v1.2s
323 ; CHECK-NO-FAMINMAX-NEXT:    ret
324   %aa = call <2 x float> @llvm.fabs.v2f32(<2 x float> %a)
325   %ab = call <2 x float> @llvm.fabs.v2f32(<2 x float> %b)
326   %r = call nnan <2 x float> @llvm.minnum.v2f32(<2 x float> %aa, <2 x float> %ab)
327   ret <2 x float> %r
330 define <2 x float> @test_minnm_noflag_v2f32(<2 x float> %a, <2 x float> %b) {
331 ; CHECK-LABEL: test_minnm_noflag_v2f32:
332 ; CHECK:       // %bb.0:
333 ; CHECK-NEXT:    fabs v0.2s, v0.2s
334 ; CHECK-NEXT:    fabs v1.2s, v1.2s
335 ; CHECK-NEXT:    fminnm v0.2s, v0.2s, v1.2s
336 ; CHECK-NEXT:    ret
338 ; CHECK-NO-FAMINMAX-LABEL: test_minnm_noflag_v2f32:
339 ; CHECK-NO-FAMINMAX:       // %bb.0:
340 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.2s, v0.2s
341 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.2s, v1.2s
342 ; CHECK-NO-FAMINMAX-NEXT:    fminnm v0.2s, v0.2s, v1.2s
343 ; CHECK-NO-FAMINMAX-NEXT:    ret
344   %aa = call <2 x float> @llvm.fabs.v2f32(<2 x float> %a)
345   %ab = call <2 x float> @llvm.fabs.v2f32(<2 x float> %b)
346   %r = call <2 x float> @llvm.minnum.v2f32(<2 x float> %aa, <2 x float> %ab)
347   ret <2 x float> %r
350 define <4 x float> @test_max_v4f32(<4 x float> %a, <4 x float> %b) {
351 ; CHECK-LABEL: test_max_v4f32:
352 ; CHECK:       // %bb.0:
353 ; CHECK-NEXT:    famax v0.4s, v0.4s, v1.4s
354 ; CHECK-NEXT:    ret
356 ; CHECK-NO-FAMINMAX-LABEL: test_max_v4f32:
357 ; CHECK-NO-FAMINMAX:       // %bb.0:
358 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.4s, v0.4s
359 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.4s, v1.4s
360 ; CHECK-NO-FAMINMAX-NEXT:    fmax v0.4s, v0.4s, v1.4s
361 ; CHECK-NO-FAMINMAX-NEXT:    ret
362   %aa = call <4 x float> @llvm.fabs.v4f32(<4 x float> %a)
363   %ab = call <4 x float> @llvm.fabs.v4f32(<4 x float> %b)
364   %r = call <4 x float> @llvm.maximum.v4f32(<4 x float> %aa, <4 x float> %ab)
365   ret <4 x float> %r
368 define <4 x float> @test_maxnm_nnan_v4f32(<4 x float> %a, <4 x float> %b) {
369 ; CHECK-LABEL: test_maxnm_nnan_v4f32:
370 ; CHECK:       // %bb.0:
371 ; CHECK-NEXT:    famax v0.4s, v0.4s, v1.4s
372 ; CHECK-NEXT:    ret
374 ; CHECK-NO-FAMINMAX-LABEL: test_maxnm_nnan_v4f32:
375 ; CHECK-NO-FAMINMAX:       // %bb.0:
376 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.4s, v0.4s
377 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.4s, v1.4s
378 ; CHECK-NO-FAMINMAX-NEXT:    fmaxnm v0.4s, v0.4s, v1.4s
379 ; CHECK-NO-FAMINMAX-NEXT:    ret
380   %aa = call <4 x float> @llvm.fabs.v4f32(<4 x float> %a)
381   %ab = call <4 x float> @llvm.fabs.v4f32(<4 x float> %b)
382   %r = call nnan <4 x float> @llvm.maxnum.v4f32(<4 x float> %aa, <4 x float> %ab)
383   ret <4 x float> %r
386 define <4 x float> @test_maxnm_noflag_v4f32(<4 x float> %a, <4 x float> %b) {
387 ; CHECK-LABEL: test_maxnm_noflag_v4f32:
388 ; CHECK:       // %bb.0:
389 ; CHECK-NEXT:    fabs v0.4s, v0.4s
390 ; CHECK-NEXT:    fabs v1.4s, v1.4s
391 ; CHECK-NEXT:    fmaxnm v0.4s, v0.4s, v1.4s
392 ; CHECK-NEXT:    ret
394 ; CHECK-NO-FAMINMAX-LABEL: test_maxnm_noflag_v4f32:
395 ; CHECK-NO-FAMINMAX:       // %bb.0:
396 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.4s, v0.4s
397 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.4s, v1.4s
398 ; CHECK-NO-FAMINMAX-NEXT:    fmaxnm v0.4s, v0.4s, v1.4s
399 ; CHECK-NO-FAMINMAX-NEXT:    ret
400   %aa = call <4 x float> @llvm.fabs.v4f32(<4 x float> %a)
401   %ab = call <4 x float> @llvm.fabs.v4f32(<4 x float> %b)
402   %r = call <4 x float> @llvm.maxnum.v4f32(<4 x float> %aa, <4 x float> %ab)
403   ret <4 x float> %r
406 define <4 x float> @test_min_v4f32(<4 x float> %a, <4 x float> %b) {
407 ; CHECK-LABEL: test_min_v4f32:
408 ; CHECK:       // %bb.0:
409 ; CHECK-NEXT:    famin v0.4s, v0.4s, v1.4s
410 ; CHECK-NEXT:    ret
412 ; CHECK-NO-FAMINMAX-LABEL: test_min_v4f32:
413 ; CHECK-NO-FAMINMAX:       // %bb.0:
414 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.4s, v0.4s
415 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.4s, v1.4s
416 ; CHECK-NO-FAMINMAX-NEXT:    fmin v0.4s, v0.4s, v1.4s
417 ; CHECK-NO-FAMINMAX-NEXT:    ret
418   %aa = call <4 x float> @llvm.fabs.v4f32(<4 x float> %a)
419   %ab = call <4 x float> @llvm.fabs.v4f32(<4 x float> %b)
420   %r = call <4 x float> @llvm.minimum.v4f32(<4 x float> %aa, <4 x float> %ab)
421   ret <4 x float> %r
424 define <4 x float> @test_minnm_nnan_v4f32(<4 x float> %a, <4 x float> %b) {
425 ; CHECK-LABEL: test_minnm_nnan_v4f32:
426 ; CHECK:       // %bb.0:
427 ; CHECK-NEXT:    famin v0.4s, v0.4s, v1.4s
428 ; CHECK-NEXT:    ret
430 ; CHECK-NO-FAMINMAX-LABEL: test_minnm_nnan_v4f32:
431 ; CHECK-NO-FAMINMAX:       // %bb.0:
432 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.4s, v0.4s
433 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.4s, v1.4s
434 ; CHECK-NO-FAMINMAX-NEXT:    fminnm v0.4s, v0.4s, v1.4s
435 ; CHECK-NO-FAMINMAX-NEXT:    ret
436   %aa = call <4 x float> @llvm.fabs.v4f32(<4 x float> %a)
437   %ab = call <4 x float> @llvm.fabs.v4f32(<4 x float> %b)
438   %r = call nnan <4 x float> @llvm.minnum.v4f32(<4 x float> %aa, <4 x float> %ab)
439   ret <4 x float> %r
442 define <4 x float> @test_minnm_noflag_v4f32(<4 x float> %a, <4 x float> %b) {
443 ; CHECK-LABEL: test_minnm_noflag_v4f32:
444 ; CHECK:       // %bb.0:
445 ; CHECK-NEXT:    fabs v0.4s, v0.4s
446 ; CHECK-NEXT:    fabs v1.4s, v1.4s
447 ; CHECK-NEXT:    fminnm v0.4s, v0.4s, v1.4s
448 ; CHECK-NEXT:    ret
450 ; CHECK-NO-FAMINMAX-LABEL: test_minnm_noflag_v4f32:
451 ; CHECK-NO-FAMINMAX:       // %bb.0:
452 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.4s, v0.4s
453 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.4s, v1.4s
454 ; CHECK-NO-FAMINMAX-NEXT:    fminnm v0.4s, v0.4s, v1.4s
455 ; CHECK-NO-FAMINMAX-NEXT:    ret
456   %aa = call <4 x float> @llvm.fabs.v4f32(<4 x float> %a)
457   %ab = call <4 x float> @llvm.fabs.v4f32(<4 x float> %b)
458   %r = call <4 x float> @llvm.minnum.v4f32(<4 x float> %aa, <4 x float> %ab)
459   ret <4 x float> %r
462 define <2 x double> @test_max_v2f64(<2 x double> %a, <2 x double> %b) {
463 ; CHECK-LABEL: test_max_v2f64:
464 ; CHECK:       // %bb.0:
465 ; CHECK-NEXT:    famax v0.2d, v0.2d, v1.2d
466 ; CHECK-NEXT:    ret
468 ; CHECK-NO-FAMINMAX-LABEL: test_max_v2f64:
469 ; CHECK-NO-FAMINMAX:       // %bb.0:
470 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.2d, v0.2d
471 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.2d, v1.2d
472 ; CHECK-NO-FAMINMAX-NEXT:    fmax v0.2d, v0.2d, v1.2d
473 ; CHECK-NO-FAMINMAX-NEXT:    ret
474   %aa = call <2 x double> @llvm.fabs.v2f64(<2 x double> %a)
475   %ab = call <2 x double> @llvm.fabs.v2f64(<2 x double> %b)
476   %r = call <2 x double> @llvm.maximum.v2f64(<2 x double> %aa, <2 x double> %ab)
477   ret <2 x double> %r
480 define <2 x double> @test_maxnm_nnan_v2f64(<2 x double> %a, <2 x double> %b) {
481 ; CHECK-LABEL: test_maxnm_nnan_v2f64:
482 ; CHECK:       // %bb.0:
483 ; CHECK-NEXT:    famax v0.2d, v0.2d, v1.2d
484 ; CHECK-NEXT:    ret
486 ; CHECK-NO-FAMINMAX-LABEL: test_maxnm_nnan_v2f64:
487 ; CHECK-NO-FAMINMAX:       // %bb.0:
488 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.2d, v0.2d
489 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.2d, v1.2d
490 ; CHECK-NO-FAMINMAX-NEXT:    fmaxnm v0.2d, v0.2d, v1.2d
491 ; CHECK-NO-FAMINMAX-NEXT:    ret
492   %aa = call <2 x double> @llvm.fabs.v2f64(<2 x double> %a)
493   %ab = call <2 x double> @llvm.fabs.v2f64(<2 x double> %b)
494   %r = call nnan <2 x double> @llvm.maxnum.v2f64(<2 x double> %aa, <2 x double> %ab)
495   ret <2 x double> %r
498 define <2 x double> @test_maxnm_noflag_v2f64(<2 x double> %a, <2 x double> %b) {
499 ; CHECK-LABEL: test_maxnm_noflag_v2f64:
500 ; CHECK:       // %bb.0:
501 ; CHECK-NEXT:    fabs v0.2d, v0.2d
502 ; CHECK-NEXT:    fabs v1.2d, v1.2d
503 ; CHECK-NEXT:    fmaxnm v0.2d, v0.2d, v1.2d
504 ; CHECK-NEXT:    ret
506 ; CHECK-NO-FAMINMAX-LABEL: test_maxnm_noflag_v2f64:
507 ; CHECK-NO-FAMINMAX:       // %bb.0:
508 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.2d, v0.2d
509 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.2d, v1.2d
510 ; CHECK-NO-FAMINMAX-NEXT:    fmaxnm v0.2d, v0.2d, v1.2d
511 ; CHECK-NO-FAMINMAX-NEXT:    ret
512   %aa = call <2 x double> @llvm.fabs.v2f64(<2 x double> %a)
513   %ab = call <2 x double> @llvm.fabs.v2f64(<2 x double> %b)
514   %r = call <2 x double> @llvm.maxnum.v2f64(<2 x double> %aa, <2 x double> %ab)
515   ret <2 x double> %r
518 define <2 x double> @test_min_v2f64(<2 x double> %a, <2 x double> %b) {
519 ; CHECK-LABEL: test_min_v2f64:
520 ; CHECK:       // %bb.0:
521 ; CHECK-NEXT:    famin v0.2d, v0.2d, v1.2d
522 ; CHECK-NEXT:    ret
524 ; CHECK-NO-FAMINMAX-LABEL: test_min_v2f64:
525 ; CHECK-NO-FAMINMAX:       // %bb.0:
526 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.2d, v0.2d
527 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.2d, v1.2d
528 ; CHECK-NO-FAMINMAX-NEXT:    fmin v0.2d, v0.2d, v1.2d
529 ; CHECK-NO-FAMINMAX-NEXT:    ret
530   %aa = call <2 x double> @llvm.fabs.v2f64(<2 x double> %a)
531   %ab = call <2 x double> @llvm.fabs.v2f64(<2 x double> %b)
532   %r = call <2 x double> @llvm.minimum.v2f64(<2 x double> %aa, <2 x double> %ab)
533   ret <2 x double> %r
536 define <2 x double> @test_minnm_nnan_v2f64(<2 x double> %a, <2 x double> %b) {
537 ; CHECK-LABEL: test_minnm_nnan_v2f64:
538 ; CHECK:       // %bb.0:
539 ; CHECK-NEXT:    famin v0.2d, v0.2d, v1.2d
540 ; CHECK-NEXT:    ret
542 ; CHECK-NO-FAMINMAX-LABEL: test_minnm_nnan_v2f64:
543 ; CHECK-NO-FAMINMAX:       // %bb.0:
544 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.2d, v0.2d
545 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.2d, v1.2d
546 ; CHECK-NO-FAMINMAX-NEXT:    fminnm v0.2d, v0.2d, v1.2d
547 ; CHECK-NO-FAMINMAX-NEXT:    ret
548   %aa = call <2 x double> @llvm.fabs.v2f64(<2 x double> %a)
549   %ab = call <2 x double> @llvm.fabs.v2f64(<2 x double> %b)
550   %r = call nnan <2 x double> @llvm.minnum.v2f64(<2 x double> %aa, <2 x double> %ab)
551   ret <2 x double> %r
554 define <2 x double> @test_min_noflag_v2f64(<2 x double> %a, <2 x double> %b) {
555 ; CHECK-LABEL: test_min_noflag_v2f64:
556 ; CHECK:       // %bb.0:
557 ; CHECK-NEXT:    fabs v0.2d, v0.2d
558 ; CHECK-NEXT:    fabs v1.2d, v1.2d
559 ; CHECK-NEXT:    fminnm v0.2d, v0.2d, v1.2d
560 ; CHECK-NEXT:    ret
562 ; CHECK-NO-FAMINMAX-LABEL: test_min_noflag_v2f64:
563 ; CHECK-NO-FAMINMAX:       // %bb.0:
564 ; CHECK-NO-FAMINMAX-NEXT:    fabs v0.2d, v0.2d
565 ; CHECK-NO-FAMINMAX-NEXT:    fabs v1.2d, v1.2d
566 ; CHECK-NO-FAMINMAX-NEXT:    fminnm v0.2d, v0.2d, v1.2d
567 ; CHECK-NO-FAMINMAX-NEXT:    ret
568   %aa = call <2 x double> @llvm.fabs.v2f64(<2 x double> %a)
569   %ab = call <2 x double> @llvm.fabs.v2f64(<2 x double> %b)
570   %r = call <2 x double> @llvm.minnum.v2f64(<2 x double> %aa, <2 x double> %ab)
571   ret <2 x double> %r
574 declare <8 x half> @llvm.fabs.v8f16(<8 x half>)
575 declare <4 x half> @llvm.fabs.v4f16(<4 x half>)
576 declare <4 x float> @llvm.fabs.v4f32(<4 x float>)
577 declare <2 x float> @llvm.fabs.v2f32(<2 x float>)
578 declare <2 x double> @llvm.fabs.v2f64(<2 x double>)
580 declare <8 x half> @llvm.minimum.v8f16(<8 x half>, <8 x half>)
581 declare <4 x half> @llvm.minimum.v4f16(<4 x half>, <4 x half>)
582 declare <4 x float> @llvm.minimum.v4f32(<4 x float>, <4 x float>)
583 declare <2 x float> @llvm.minimum.v2f32(<2 x float>, <2 x float>)
584 declare <2 x double> @llvm.minimum.v2f64(<2 x double>, <2 x double>)
586 declare <4 x half> @llvm.minnum.v4f16(<4 x half>, <4 x half>)
587 declare <8 x half> @llvm.minnum.v8f16(<8 x half>, <8 x half>)
588 declare <2 x float> @llvm.minnum.v2f32(<2 x float>, <2 x float>)
589 declare <4 x float> @llvm.minnum.v4f32(<4 x float>, <4 x float>)
590 declare <2 x double> @llvm.minnum.v2f64(<2 x double>, <2 x double>)
592 declare <8 x half> @llvm.maximum.v8f16(<8 x half>, <8 x half>)
593 declare <4 x half> @llvm.maximum.v4f16(<4 x half>, <4 x half>)
594 declare <4 x float> @llvm.maximum.v4f32(<4 x float>, <4 x float>)
595 declare <2 x float> @llvm.maximum.v2f32(<2 x float>, <2 x float>)
596 declare <2 x double> @llvm.maximum.v2f64(<2 x double>, <2 x double>)
598 declare <4 x half> @llvm.maxnum.v4f16(<4 x half>,  <4 x half>)
599 declare <8 x half> @llvm.maxnum.v8f16(<8 x half>, <8 x half>)
600 declare <2 x float> @llvm.maxnum.v2f32(<2 x float>, <2 x float>)
601 declare <4 x float> @llvm.maxnum.v4f32(<4 x float>, <4 x float>)
602 declare <2 x double> @llvm.maxnum.v2f64(<2 x double>, <2 x double>)
604 attributes #0 = { nounwind "target-features"="+fullfp16" }