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:
17 ; CHECK-NEXT: famax v0.4h, v0.4h, v1.4h
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)
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:
35 ; CHECK-NEXT: famax v0.4h, v0.4h, v1.4h
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)
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:
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
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)
70 define <4 x half> @test_min_v4f16(<4 x half> %a, <4 x half> %b) #0 {
71 ; CHECK-LABEL: test_min_v4f16:
73 ; CHECK-NEXT: famin v0.4h, v0.4h, v1.4h
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)
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:
91 ; CHECK-NEXT: famin v0.4h, v0.4h, v1.4h
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)
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:
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
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)
126 define <8 x half> @test_max_v8f16(<8 x half> %a, <8 x half> %b) #0 {
127 ; CHECK-LABEL: test_max_v8f16:
129 ; CHECK-NEXT: famax v0.8h, v0.8h, v1.8h
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)
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:
147 ; CHECK-NEXT: famax v0.8h, v0.8h, v1.8h
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)
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:
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
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)
182 define <8 x half> @test_min_v8f16(<8 x half> %a, <8 x half> %b) #0 {
183 ; CHECK-LABEL: test_min_v8f16:
185 ; CHECK-NEXT: famin v0.8h, v0.8h, v1.8h
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)
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:
203 ; CHECK-NEXT: famin v0.8h, v0.8h, v1.8h
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)
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:
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
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)
238 define <2 x float> @test_max_v2f32(<2 x float> %a, <2 x float> %b) {
239 ; CHECK-LABEL: test_max_v2f32:
241 ; CHECK-NEXT: famax v0.2s, v0.2s, v1.2s
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)
256 define <2 x float> @test_maxnm_nnan_v2f32(<2 x float> %a, <2 x float> %b) {
257 ; CHECK-LABEL: test_maxnm_nnan_v2f32:
259 ; CHECK-NEXT: famax v0.2s, v0.2s, v1.2s
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)
274 define <2 x float> @test_maxnm_noflag_v2f32(<2 x float> %a, <2 x float> %b) {
275 ; CHECK-LABEL: test_maxnm_noflag_v2f32:
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
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)
294 define <2 x float> @test_min_v2f32(<2 x float> %a, <2 x float> %b) {
295 ; CHECK-LABEL: test_min_v2f32:
297 ; CHECK-NEXT: famin v0.2s, v0.2s, v1.2s
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)
312 define <2 x float> @test_minnm_nnan_v2f32(<2 x float> %a, <2 x float> %b) {
313 ; CHECK-LABEL: test_minnm_nnan_v2f32:
315 ; CHECK-NEXT: famin v0.2s, v0.2s, v1.2s
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)
330 define <2 x float> @test_minnm_noflag_v2f32(<2 x float> %a, <2 x float> %b) {
331 ; CHECK-LABEL: test_minnm_noflag_v2f32:
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
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)
350 define <4 x float> @test_max_v4f32(<4 x float> %a, <4 x float> %b) {
351 ; CHECK-LABEL: test_max_v4f32:
353 ; CHECK-NEXT: famax v0.4s, v0.4s, v1.4s
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)
368 define <4 x float> @test_maxnm_nnan_v4f32(<4 x float> %a, <4 x float> %b) {
369 ; CHECK-LABEL: test_maxnm_nnan_v4f32:
371 ; CHECK-NEXT: famax v0.4s, v0.4s, v1.4s
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)
386 define <4 x float> @test_maxnm_noflag_v4f32(<4 x float> %a, <4 x float> %b) {
387 ; CHECK-LABEL: test_maxnm_noflag_v4f32:
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
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)
406 define <4 x float> @test_min_v4f32(<4 x float> %a, <4 x float> %b) {
407 ; CHECK-LABEL: test_min_v4f32:
409 ; CHECK-NEXT: famin v0.4s, v0.4s, v1.4s
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)
424 define <4 x float> @test_minnm_nnan_v4f32(<4 x float> %a, <4 x float> %b) {
425 ; CHECK-LABEL: test_minnm_nnan_v4f32:
427 ; CHECK-NEXT: famin v0.4s, v0.4s, v1.4s
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)
442 define <4 x float> @test_minnm_noflag_v4f32(<4 x float> %a, <4 x float> %b) {
443 ; CHECK-LABEL: test_minnm_noflag_v4f32:
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
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)
462 define <2 x double> @test_max_v2f64(<2 x double> %a, <2 x double> %b) {
463 ; CHECK-LABEL: test_max_v2f64:
465 ; CHECK-NEXT: famax v0.2d, v0.2d, v1.2d
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)
480 define <2 x double> @test_maxnm_nnan_v2f64(<2 x double> %a, <2 x double> %b) {
481 ; CHECK-LABEL: test_maxnm_nnan_v2f64:
483 ; CHECK-NEXT: famax v0.2d, v0.2d, v1.2d
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)
498 define <2 x double> @test_maxnm_noflag_v2f64(<2 x double> %a, <2 x double> %b) {
499 ; CHECK-LABEL: test_maxnm_noflag_v2f64:
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
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)
518 define <2 x double> @test_min_v2f64(<2 x double> %a, <2 x double> %b) {
519 ; CHECK-LABEL: test_min_v2f64:
521 ; CHECK-NEXT: famin v0.2d, v0.2d, v1.2d
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)
536 define <2 x double> @test_minnm_nnan_v2f64(<2 x double> %a, <2 x double> %b) {
537 ; CHECK-LABEL: test_minnm_nnan_v2f64:
539 ; CHECK-NEXT: famin v0.2d, v0.2d, v1.2d
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)
554 define <2 x double> @test_min_noflag_v2f64(<2 x double> %a, <2 x double> %b) {
555 ; CHECK-LABEL: test_min_noflag_v2f64:
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
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)
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" }