xref: /llvm-project/llvm/test/CodeGen/AArch64/fp-maximumnum-minimumnum.ll (revision 61510b51c33464a6bc15e4cf5b1ee07e2e0ec1c9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=aarch64 --mattr=+fullfp16 < %s | FileCheck %s --check-prefix=AARCH64
3
4;;;;;;;;;;;;;;;;  max_f64
5define double @max_nnan_f64(double %a, double %b) {
6; AARCH64-LABEL: max_nnan_f64:
7; AARCH64:       // %bb.0: // %entry
8; AARCH64-NEXT:    fmaxnm d0, d0, d1
9; AARCH64-NEXT:    ret
10entry:
11  %c = call nnan double @llvm.maximumnum.f64(double %a, double %b)
12  ret double %c
13}
14
15define <2 x double> @max_nnan_v2f64(<2 x double> %a, <2 x double> %b) {
16; AARCH64-LABEL: max_nnan_v2f64:
17; AARCH64:       // %bb.0: // %entry
18; AARCH64-NEXT:    fmaxnm v0.2d, v0.2d, v1.2d
19; AARCH64-NEXT:    ret
20entry:
21  %c = call nnan <2 x double> @llvm.maximumnum.v2f64(<2 x double> %a, <2 x double> %b)
22  ret <2 x double> %c
23}
24
25define <3 x double> @max_nnan_v3f64(<3 x double> %a, <3 x double> %b) {
26; AARCH64-LABEL: max_nnan_v3f64:
27; AARCH64:       // %bb.0: // %entry
28; AARCH64-NEXT:    // kill: def $d3 killed $d3 def $q3
29; AARCH64-NEXT:    // kill: def $d0 killed $d0 def $q0
30; AARCH64-NEXT:    // kill: def $d4 killed $d4 def $q4
31; AARCH64-NEXT:    // kill: def $d1 killed $d1 def $q1
32; AARCH64-NEXT:    // kill: def $d2 killed $d2 def $q2
33; AARCH64-NEXT:    // kill: def $d5 killed $d5 def $q5
34; AARCH64-NEXT:    mov v3.d[1], v4.d[0]
35; AARCH64-NEXT:    mov v0.d[1], v1.d[0]
36; AARCH64-NEXT:    fmaxnm v2.2d, v2.2d, v5.2d
37; AARCH64-NEXT:    // kill: def $d2 killed $d2 killed $q2
38; AARCH64-NEXT:    fmaxnm v0.2d, v0.2d, v3.2d
39; AARCH64-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
40; AARCH64-NEXT:    // kill: def $d0 killed $d0 killed $q0
41; AARCH64-NEXT:    // kill: def $d1 killed $d1 killed $q1
42; AARCH64-NEXT:    ret
43entry:
44  %c = call nnan <3 x double> @llvm.maximumnum.v3f64(<3 x double> %a, <3 x double> %b)
45  ret <3 x double> %c
46}
47
48define <4 x double> @max_nnan_v4f64(<4 x double> %a, <4 x double> %b) {
49; AARCH64-LABEL: max_nnan_v4f64:
50; AARCH64:       // %bb.0: // %entry
51; AARCH64-NEXT:    fmaxnm v1.2d, v1.2d, v3.2d
52; AARCH64-NEXT:    fmaxnm v0.2d, v0.2d, v2.2d
53; AARCH64-NEXT:    ret
54entry:
55  %c = call nnan <4 x double> @llvm.maximumnum.v4f64(<4 x double> %a, <4 x double> %b)
56  ret <4 x double> %c
57}
58
59;;;;;;;;;;;;;;;;;; max_f32
60define float @max_nnan_f32(float %a, float %b) {
61; AARCH64-LABEL: max_nnan_f32:
62; AARCH64:       // %bb.0: // %entry
63; AARCH64-NEXT:    fmaxnm s0, s0, s1
64; AARCH64-NEXT:    ret
65entry:
66  %c = call nnan float @llvm.maximumnum.f32(float %a, float %b)
67  ret float %c
68}
69
70define <2 x float> @max_nnan_v2f32(<2 x float> %a, <2 x float> %b) {
71; AARCH64-LABEL: max_nnan_v2f32:
72; AARCH64:       // %bb.0: // %entry
73; AARCH64-NEXT:    fmaxnm v0.2s, v0.2s, v1.2s
74; AARCH64-NEXT:    ret
75entry:
76  %c = call nnan <2 x float> @llvm.maximumnum.v2f32(<2 x float> %a, <2 x float> %b)
77  ret <2 x float> %c
78}
79
80define <3 x float> @max_nnan_v3f32(<3 x float> %a, <3 x float> %b) {
81; AARCH64-LABEL: max_nnan_v3f32:
82; AARCH64:       // %bb.0: // %entry
83; AARCH64-NEXT:    fmaxnm v0.4s, v0.4s, v1.4s
84; AARCH64-NEXT:    ret
85entry:
86  %c = call nnan <3 x float> @llvm.maximumnum.v3f32(<3 x float> %a, <3 x float> %b)
87  ret <3 x float> %c
88}
89
90define <4 x float> @max_nnan_v4f32(<4 x float> %a, <4 x float> %b) {
91; AARCH64-LABEL: max_nnan_v4f32:
92; AARCH64:       // %bb.0: // %entry
93; AARCH64-NEXT:    fmaxnm v0.4s, v0.4s, v1.4s
94; AARCH64-NEXT:    ret
95entry:
96  %c = call nnan <4 x float> @llvm.maximumnum.v4f32(<4 x float> %a, <4 x float> %b)
97  ret <4 x float> %c
98}
99
100define <5 x float> @max_nnan_v5f32(<5 x float> %a, <5 x float> %b) {
101; AARCH64-LABEL: max_nnan_v5f32:
102; AARCH64:       // %bb.0: // %entry
103; AARCH64-NEXT:    // kill: def $s0 killed $s0 def $q0
104; AARCH64-NEXT:    // kill: def $s5 killed $s5 def $q5
105; AARCH64-NEXT:    // kill: def $s1 killed $s1 def $q1
106; AARCH64-NEXT:    // kill: def $s6 killed $s6 def $q6
107; AARCH64-NEXT:    // kill: def $s2 killed $s2 def $q2
108; AARCH64-NEXT:    // kill: def $s7 killed $s7 def $q7
109; AARCH64-NEXT:    // kill: def $s3 killed $s3 def $q3
110; AARCH64-NEXT:    mov x8, sp
111; AARCH64-NEXT:    // kill: def $s4 killed $s4 def $q4
112; AARCH64-NEXT:    mov v0.s[1], v1.s[0]
113; AARCH64-NEXT:    mov v5.s[1], v6.s[0]
114; AARCH64-NEXT:    mov v0.s[2], v2.s[0]
115; AARCH64-NEXT:    mov v5.s[2], v7.s[0]
116; AARCH64-NEXT:    ldr s2, [sp, #8]
117; AARCH64-NEXT:    fmaxnm v4.4s, v4.4s, v2.4s
118; AARCH64-NEXT:    // kill: def $s4 killed $s4 killed $q4
119; AARCH64-NEXT:    mov v0.s[3], v3.s[0]
120; AARCH64-NEXT:    ld1 { v5.s }[3], [x8]
121; AARCH64-NEXT:    fmaxnm v0.4s, v0.4s, v5.4s
122; AARCH64-NEXT:    mov s1, v0.s[1]
123; AARCH64-NEXT:    mov s2, v0.s[2]
124; AARCH64-NEXT:    mov s3, v0.s[3]
125; AARCH64-NEXT:    // kill: def $s0 killed $s0 killed $q0
126; AARCH64-NEXT:    ret
127entry:
128  %c = call nnan <5 x float> @llvm.maximumnum.v5f32(<5 x float> %a, <5 x float> %b)
129  ret <5 x float> %c
130}
131
132define <8 x float> @max_nnan_v8f32(<8 x float> %a, <8 x float> %b) {
133; AARCH64-LABEL: max_nnan_v8f32:
134; AARCH64:       // %bb.0: // %entry
135; AARCH64-NEXT:    fmaxnm v1.4s, v1.4s, v3.4s
136; AARCH64-NEXT:    fmaxnm v0.4s, v0.4s, v2.4s
137; AARCH64-NEXT:    ret
138entry:
139  %c = call nnan <8 x float> @llvm.maximumnum.v8f32(<8 x float> %a, <8 x float> %b)
140  ret <8 x float> %c
141}
142
143;;;;;;;;;;;;;;;;;; max_f16
144define half @max_nnan_f16(half %a, half %b) {
145; AARCH64-LABEL: max_nnan_f16:
146; AARCH64:       // %bb.0: // %entry
147; AARCH64-NEXT:    fmaxnm h0, h0, h1
148; AARCH64-NEXT:    ret
149entry:
150  %c = call nnan half @llvm.maximumnum.f16(half %a, half %b)
151  ret half %c
152}
153
154define <2 x half> @max_nnan_v2f16(<2 x half> %a, <2 x half> %b) {
155; AARCH64-LABEL: max_nnan_v2f16:
156; AARCH64:       // %bb.0: // %entry
157; AARCH64-NEXT:    fmaxnm v0.4h, v0.4h, v1.4h
158; AARCH64-NEXT:    ret
159entry:
160  %c = call nnan <2 x half> @llvm.maximumnum.v2f16(<2 x half> %a, <2 x half> %b)
161  ret <2 x half> %c
162}
163
164define <4 x half> @max_nnan_v4f16(<4 x half> %a, <4 x half> %b) {
165; AARCH64-LABEL: max_nnan_v4f16:
166; AARCH64:       // %bb.0: // %entry
167; AARCH64-NEXT:    fmaxnm v0.4h, v0.4h, v1.4h
168; AARCH64-NEXT:    ret
169entry:
170  %c = call nnan <4 x half> @llvm.maximumnum.v4f16(<4 x half> %a, <4 x half> %b)
171  ret <4 x half> %c
172}
173
174define <8 x half> @max_nnan_v8f16(<8 x half> %a, <8 x half> %b) {
175; AARCH64-LABEL: max_nnan_v8f16:
176; AARCH64:       // %bb.0: // %entry
177; AARCH64-NEXT:    fmaxnm v0.8h, v0.8h, v1.8h
178; AARCH64-NEXT:    ret
179entry:
180  %c = call nnan <8 x half> @llvm.maximumnum.v8f16(<8 x half> %a, <8 x half> %b)
181  ret <8 x half> %c
182}
183
184define <9 x half> @max_nnan_v9f16(<9 x half> %a, <9 x half> %b) {
185; AARCH64-LABEL: max_nnan_v9f16:
186; AARCH64:       // %bb.0: // %entry
187; AARCH64-NEXT:    // kill: def $h0 killed $h0 def $q0
188; AARCH64-NEXT:    // kill: def $h1 killed $h1 def $q1
189; AARCH64-NEXT:    // kill: def $h2 killed $h2 def $q2
190; AARCH64-NEXT:    add x9, sp, #16
191; AARCH64-NEXT:    // kill: def $h3 killed $h3 def $q3
192; AARCH64-NEXT:    // kill: def $h4 killed $h4 def $q4
193; AARCH64-NEXT:    // kill: def $h5 killed $h5 def $q5
194; AARCH64-NEXT:    // kill: def $h6 killed $h6 def $q6
195; AARCH64-NEXT:    // kill: def $h7 killed $h7 def $q7
196; AARCH64-NEXT:    mov v0.h[1], v1.h[0]
197; AARCH64-NEXT:    ldr h1, [sp, #8]
198; AARCH64-NEXT:    ld1 { v1.h }[1], [x9]
199; AARCH64-NEXT:    add x9, sp, #24
200; AARCH64-NEXT:    mov v0.h[2], v2.h[0]
201; AARCH64-NEXT:    ldr h2, [sp, #72]
202; AARCH64-NEXT:    ld1 { v1.h }[2], [x9]
203; AARCH64-NEXT:    add x9, sp, #32
204; AARCH64-NEXT:    mov v0.h[3], v3.h[0]
205; AARCH64-NEXT:    ld1 { v1.h }[3], [x9]
206; AARCH64-NEXT:    add x9, sp, #40
207; AARCH64-NEXT:    ldr h3, [sp]
208; AARCH64-NEXT:    ld1 { v1.h }[4], [x9]
209; AARCH64-NEXT:    add x9, sp, #48
210; AARCH64-NEXT:    fmaxnm v2.8h, v3.8h, v2.8h
211; AARCH64-NEXT:    mov v0.h[4], v4.h[0]
212; AARCH64-NEXT:    ld1 { v1.h }[5], [x9]
213; AARCH64-NEXT:    add x9, sp, #56
214; AARCH64-NEXT:    str h2, [x8, #16]
215; AARCH64-NEXT:    mov v0.h[5], v5.h[0]
216; AARCH64-NEXT:    ld1 { v1.h }[6], [x9]
217; AARCH64-NEXT:    add x9, sp, #64
218; AARCH64-NEXT:    mov v0.h[6], v6.h[0]
219; AARCH64-NEXT:    ld1 { v1.h }[7], [x9]
220; AARCH64-NEXT:    mov v0.h[7], v7.h[0]
221; AARCH64-NEXT:    fmaxnm v0.8h, v0.8h, v1.8h
222; AARCH64-NEXT:    str q0, [x8]
223; AARCH64-NEXT:    ret
224entry:
225  %c = call nnan <9 x half> @llvm.maximumnum.v9f16(<9 x half> %a, <9 x half> %b)
226  ret <9 x half> %c
227}
228
229define <16 x half> @max_nnan_v16f16(<16 x half> %a, <16 x half> %b) {
230; AARCH64-LABEL: max_nnan_v16f16:
231; AARCH64:       // %bb.0: // %entry
232; AARCH64-NEXT:    fmaxnm v1.8h, v1.8h, v3.8h
233; AARCH64-NEXT:    fmaxnm v0.8h, v0.8h, v2.8h
234; AARCH64-NEXT:    ret
235entry:
236  %c = call nnan <16 x half> @llvm.maximumnum.v16f16(<16 x half> %a, <16 x half> %b)
237  ret <16 x half> %c
238}
239
240;;;;;;;;;;;;;;;;  min_f64
241define double @min_nnan_f64(double %a, double %b) {
242; AARCH64-LABEL: min_nnan_f64:
243; AARCH64:       // %bb.0: // %entry
244; AARCH64-NEXT:    fminnm d0, d0, d1
245; AARCH64-NEXT:    ret
246entry:
247  %c = call nnan double @llvm.minimumnum.f64(double %a, double %b)
248  ret double %c
249}
250
251define <2 x double> @min_nnan_v2f64(<2 x double> %a, <2 x double> %b) {
252; AARCH64-LABEL: min_nnan_v2f64:
253; AARCH64:       // %bb.0: // %entry
254; AARCH64-NEXT:    fminnm v0.2d, v0.2d, v1.2d
255; AARCH64-NEXT:    ret
256entry:
257  %c = call nnan <2 x double> @llvm.minimumnum.v2f64(<2 x double> %a, <2 x double> %b)
258  ret <2 x double> %c
259}
260
261define <3 x double> @min_nnan_v3f64(<3 x double> %a, <3 x double> %b) {
262; AARCH64-LABEL: min_nnan_v3f64:
263; AARCH64:       // %bb.0: // %entry
264; AARCH64-NEXT:    // kill: def $d3 killed $d3 def $q3
265; AARCH64-NEXT:    // kill: def $d0 killed $d0 def $q0
266; AARCH64-NEXT:    // kill: def $d4 killed $d4 def $q4
267; AARCH64-NEXT:    // kill: def $d1 killed $d1 def $q1
268; AARCH64-NEXT:    // kill: def $d2 killed $d2 def $q2
269; AARCH64-NEXT:    // kill: def $d5 killed $d5 def $q5
270; AARCH64-NEXT:    mov v3.d[1], v4.d[0]
271; AARCH64-NEXT:    mov v0.d[1], v1.d[0]
272; AARCH64-NEXT:    fminnm v2.2d, v2.2d, v5.2d
273; AARCH64-NEXT:    // kill: def $d2 killed $d2 killed $q2
274; AARCH64-NEXT:    fminnm v0.2d, v0.2d, v3.2d
275; AARCH64-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
276; AARCH64-NEXT:    // kill: def $d0 killed $d0 killed $q0
277; AARCH64-NEXT:    // kill: def $d1 killed $d1 killed $q1
278; AARCH64-NEXT:    ret
279entry:
280  %c = call nnan <3 x double> @llvm.minimumnum.v3f64(<3 x double> %a, <3 x double> %b)
281  ret <3 x double> %c
282}
283
284define <4 x double> @min_nnan_v4f64(<4 x double> %a, <4 x double> %b) {
285; AARCH64-LABEL: min_nnan_v4f64:
286; AARCH64:       // %bb.0: // %entry
287; AARCH64-NEXT:    fminnm v1.2d, v1.2d, v3.2d
288; AARCH64-NEXT:    fminnm v0.2d, v0.2d, v2.2d
289; AARCH64-NEXT:    ret
290entry:
291  %c = call nnan <4 x double> @llvm.minimumnum.v4f64(<4 x double> %a, <4 x double> %b)
292  ret <4 x double> %c
293}
294
295;;;;;;;;;;;;;;;;;; min_f32
296define float @min_nnan_f32(float %a, float %b) {
297; AARCH64-LABEL: min_nnan_f32:
298; AARCH64:       // %bb.0: // %entry
299; AARCH64-NEXT:    fminnm s0, s0, s1
300; AARCH64-NEXT:    ret
301entry:
302  %c = call nnan float @llvm.minimumnum.f32(float %a, float %b)
303  ret float %c
304}
305
306define <2 x float> @min_nnan_v2f32(<2 x float> %a, <2 x float> %b) {
307; AARCH64-LABEL: min_nnan_v2f32:
308; AARCH64:       // %bb.0: // %entry
309; AARCH64-NEXT:    fminnm v0.2s, v0.2s, v1.2s
310; AARCH64-NEXT:    ret
311entry:
312  %c = call nnan <2 x float> @llvm.minimumnum.v2f32(<2 x float> %a, <2 x float> %b)
313  ret <2 x float> %c
314}
315
316define <3 x float> @min_nnan_v3f32(<3 x float> %a, <3 x float> %b) {
317; AARCH64-LABEL: min_nnan_v3f32:
318; AARCH64:       // %bb.0: // %entry
319; AARCH64-NEXT:    fminnm v0.4s, v0.4s, v1.4s
320; AARCH64-NEXT:    ret
321entry:
322  %c = call nnan <3 x float> @llvm.minimumnum.v3f32(<3 x float> %a, <3 x float> %b)
323  ret <3 x float> %c
324}
325
326define <4 x float> @min_nnan_v4f32(<4 x float> %a, <4 x float> %b) {
327; AARCH64-LABEL: min_nnan_v4f32:
328; AARCH64:       // %bb.0: // %entry
329; AARCH64-NEXT:    fminnm v0.4s, v0.4s, v1.4s
330; AARCH64-NEXT:    ret
331entry:
332  %c = call nnan <4 x float> @llvm.minimumnum.v4f32(<4 x float> %a, <4 x float> %b)
333  ret <4 x float> %c
334}
335
336define <5 x float> @min_nnan_v5f32(<5 x float> %a, <5 x float> %b) {
337; AARCH64-LABEL: min_nnan_v5f32:
338; AARCH64:       // %bb.0: // %entry
339; AARCH64-NEXT:    // kill: def $s0 killed $s0 def $q0
340; AARCH64-NEXT:    // kill: def $s5 killed $s5 def $q5
341; AARCH64-NEXT:    // kill: def $s1 killed $s1 def $q1
342; AARCH64-NEXT:    // kill: def $s6 killed $s6 def $q6
343; AARCH64-NEXT:    // kill: def $s2 killed $s2 def $q2
344; AARCH64-NEXT:    // kill: def $s7 killed $s7 def $q7
345; AARCH64-NEXT:    // kill: def $s3 killed $s3 def $q3
346; AARCH64-NEXT:    mov x8, sp
347; AARCH64-NEXT:    // kill: def $s4 killed $s4 def $q4
348; AARCH64-NEXT:    mov v0.s[1], v1.s[0]
349; AARCH64-NEXT:    mov v5.s[1], v6.s[0]
350; AARCH64-NEXT:    mov v0.s[2], v2.s[0]
351; AARCH64-NEXT:    mov v5.s[2], v7.s[0]
352; AARCH64-NEXT:    ldr s2, [sp, #8]
353; AARCH64-NEXT:    fminnm v4.4s, v4.4s, v2.4s
354; AARCH64-NEXT:    // kill: def $s4 killed $s4 killed $q4
355; AARCH64-NEXT:    mov v0.s[3], v3.s[0]
356; AARCH64-NEXT:    ld1 { v5.s }[3], [x8]
357; AARCH64-NEXT:    fminnm v0.4s, v0.4s, v5.4s
358; AARCH64-NEXT:    mov s1, v0.s[1]
359; AARCH64-NEXT:    mov s2, v0.s[2]
360; AARCH64-NEXT:    mov s3, v0.s[3]
361; AARCH64-NEXT:    // kill: def $s0 killed $s0 killed $q0
362; AARCH64-NEXT:    ret
363entry:
364  %c = call nnan <5 x float> @llvm.minimumnum.v5f32(<5 x float> %a, <5 x float> %b)
365  ret <5 x float> %c
366}
367
368define <8 x float> @min_nnan_v8f32(<8 x float> %a, <8 x float> %b) {
369; AARCH64-LABEL: min_nnan_v8f32:
370; AARCH64:       // %bb.0: // %entry
371; AARCH64-NEXT:    fminnm v1.4s, v1.4s, v3.4s
372; AARCH64-NEXT:    fminnm v0.4s, v0.4s, v2.4s
373; AARCH64-NEXT:    ret
374entry:
375  %c = call nnan <8 x float> @llvm.minimumnum.v8f32(<8 x float> %a, <8 x float> %b)
376  ret <8 x float> %c
377}
378
379;;;;;;;;;;;;;;;;;; min_f16
380define half @min_nnan_f16(half %a, half %b) {
381; AARCH64-LABEL: min_nnan_f16:
382; AARCH64:       // %bb.0: // %entry
383; AARCH64-NEXT:    fminnm h0, h0, h1
384; AARCH64-NEXT:    ret
385entry:
386  %c = call nnan half @llvm.minimumnum.f16(half %a, half %b)
387  ret half %c
388}
389
390define <2 x half> @min_nnan_v2f16(<2 x half> %a, <2 x half> %b) {
391; AARCH64-LABEL: min_nnan_v2f16:
392; AARCH64:       // %bb.0: // %entry
393; AARCH64-NEXT:    fminnm v0.4h, v0.4h, v1.4h
394; AARCH64-NEXT:    ret
395entry:
396  %c = call nnan <2 x half> @llvm.minimumnum.v2f16(<2 x half> %a, <2 x half> %b)
397  ret <2 x half> %c
398}
399
400define <4 x half> @min_nnan_v4f16(<4 x half> %a, <4 x half> %b) {
401; AARCH64-LABEL: min_nnan_v4f16:
402; AARCH64:       // %bb.0: // %entry
403; AARCH64-NEXT:    fminnm v0.4h, v0.4h, v1.4h
404; AARCH64-NEXT:    ret
405entry:
406  %c = call nnan <4 x half> @llvm.minimumnum.v4f16(<4 x half> %a, <4 x half> %b)
407  ret <4 x half> %c
408}
409
410define <8 x half> @min_nnan_v8f16(<8 x half> %a, <8 x half> %b) {
411; AARCH64-LABEL: min_nnan_v8f16:
412; AARCH64:       // %bb.0: // %entry
413; AARCH64-NEXT:    fminnm v0.8h, v0.8h, v1.8h
414; AARCH64-NEXT:    ret
415entry:
416  %c = call nnan <8 x half> @llvm.minimumnum.v8f16(<8 x half> %a, <8 x half> %b)
417  ret <8 x half> %c
418}
419
420define <9 x half> @min_nnan_v9f16(<9 x half> %a, <9 x half> %b) {
421; AARCH64-LABEL: min_nnan_v9f16:
422; AARCH64:       // %bb.0: // %entry
423; AARCH64-NEXT:    // kill: def $h0 killed $h0 def $q0
424; AARCH64-NEXT:    // kill: def $h1 killed $h1 def $q1
425; AARCH64-NEXT:    // kill: def $h2 killed $h2 def $q2
426; AARCH64-NEXT:    add x9, sp, #16
427; AARCH64-NEXT:    // kill: def $h3 killed $h3 def $q3
428; AARCH64-NEXT:    // kill: def $h4 killed $h4 def $q4
429; AARCH64-NEXT:    // kill: def $h5 killed $h5 def $q5
430; AARCH64-NEXT:    // kill: def $h6 killed $h6 def $q6
431; AARCH64-NEXT:    // kill: def $h7 killed $h7 def $q7
432; AARCH64-NEXT:    mov v0.h[1], v1.h[0]
433; AARCH64-NEXT:    ldr h1, [sp, #8]
434; AARCH64-NEXT:    ld1 { v1.h }[1], [x9]
435; AARCH64-NEXT:    add x9, sp, #24
436; AARCH64-NEXT:    mov v0.h[2], v2.h[0]
437; AARCH64-NEXT:    ldr h2, [sp, #72]
438; AARCH64-NEXT:    ld1 { v1.h }[2], [x9]
439; AARCH64-NEXT:    add x9, sp, #32
440; AARCH64-NEXT:    mov v0.h[3], v3.h[0]
441; AARCH64-NEXT:    ld1 { v1.h }[3], [x9]
442; AARCH64-NEXT:    add x9, sp, #40
443; AARCH64-NEXT:    ldr h3, [sp]
444; AARCH64-NEXT:    ld1 { v1.h }[4], [x9]
445; AARCH64-NEXT:    add x9, sp, #48
446; AARCH64-NEXT:    fminnm v2.8h, v3.8h, v2.8h
447; AARCH64-NEXT:    mov v0.h[4], v4.h[0]
448; AARCH64-NEXT:    ld1 { v1.h }[5], [x9]
449; AARCH64-NEXT:    add x9, sp, #56
450; AARCH64-NEXT:    str h2, [x8, #16]
451; AARCH64-NEXT:    mov v0.h[5], v5.h[0]
452; AARCH64-NEXT:    ld1 { v1.h }[6], [x9]
453; AARCH64-NEXT:    add x9, sp, #64
454; AARCH64-NEXT:    mov v0.h[6], v6.h[0]
455; AARCH64-NEXT:    ld1 { v1.h }[7], [x9]
456; AARCH64-NEXT:    mov v0.h[7], v7.h[0]
457; AARCH64-NEXT:    fminnm v0.8h, v0.8h, v1.8h
458; AARCH64-NEXT:    str q0, [x8]
459; AARCH64-NEXT:    ret
460entry:
461  %c = call nnan <9 x half> @llvm.minimumnum.v9f16(<9 x half> %a, <9 x half> %b)
462  ret <9 x half> %c
463}
464
465define <16 x half> @min_nnan_v16f16(<16 x half> %a, <16 x half> %b) {
466; AARCH64-LABEL: min_nnan_v16f16:
467; AARCH64:       // %bb.0: // %entry
468; AARCH64-NEXT:    fminnm v1.8h, v1.8h, v3.8h
469; AARCH64-NEXT:    fminnm v0.8h, v0.8h, v2.8h
470; AARCH64-NEXT:    ret
471entry:
472  %c = call nnan <16 x half> @llvm.minimumnum.v16f16(<16 x half> %a, <16 x half> %b)
473  ret <16 x half> %c
474}
475
476;;;;;;;;;;;;;;;;  max_f64
477define double @max_f64(double %a, double %b) {
478; AARCH64-LABEL: max_f64:
479; AARCH64:       // %bb.0: // %entry
480; AARCH64-NEXT:    fminnm d1, d1, d1
481; AARCH64-NEXT:    fminnm d0, d0, d0
482; AARCH64-NEXT:    fmaxnm d0, d0, d1
483; AARCH64-NEXT:    ret
484entry:
485  %c = call double @llvm.maximumnum.f64(double %a, double %b)
486  ret double %c
487}
488
489define <2 x double> @max_v2f64(<2 x double> %a, <2 x double> %b) {
490; AARCH64-LABEL: max_v2f64:
491; AARCH64:       // %bb.0: // %entry
492; AARCH64-NEXT:    fminnm v1.2d, v1.2d, v1.2d
493; AARCH64-NEXT:    fminnm v0.2d, v0.2d, v0.2d
494; AARCH64-NEXT:    fmaxnm v0.2d, v0.2d, v1.2d
495; AARCH64-NEXT:    ret
496entry:
497  %c = call <2 x double> @llvm.maximumnum.v2f64(<2 x double> %a, <2 x double> %b)
498  ret <2 x double> %c
499}
500
501define <3 x double> @max_v3f64(<3 x double> %a, <3 x double> %b) {
502; AARCH64-LABEL: max_v3f64:
503; AARCH64:       // %bb.0: // %entry
504; AARCH64-NEXT:    // kill: def $d3 killed $d3 def $q3
505; AARCH64-NEXT:    // kill: def $d0 killed $d0 def $q0
506; AARCH64-NEXT:    // kill: def $d4 killed $d4 def $q4
507; AARCH64-NEXT:    // kill: def $d1 killed $d1 def $q1
508; AARCH64-NEXT:    // kill: def $d2 killed $d2 def $q2
509; AARCH64-NEXT:    // kill: def $d5 killed $d5 def $q5
510; AARCH64-NEXT:    mov v0.d[1], v1.d[0]
511; AARCH64-NEXT:    mov v3.d[1], v4.d[0]
512; AARCH64-NEXT:    fminnm v2.2d, v2.2d, v2.2d
513; AARCH64-NEXT:    fminnm v1.2d, v3.2d, v3.2d
514; AARCH64-NEXT:    fminnm v0.2d, v0.2d, v0.2d
515; AARCH64-NEXT:    fmaxnm v0.2d, v0.2d, v1.2d
516; AARCH64-NEXT:    fminnm v1.2d, v5.2d, v5.2d
517; AARCH64-NEXT:    fmaxnm v2.2d, v2.2d, v1.2d
518; AARCH64-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
519; AARCH64-NEXT:    // kill: def $d0 killed $d0 killed $q0
520; AARCH64-NEXT:    // kill: def $d1 killed $d1 killed $q1
521; AARCH64-NEXT:    // kill: def $d2 killed $d2 killed $q2
522; AARCH64-NEXT:    ret
523entry:
524  %c = call <3 x double> @llvm.maximumnum.v3f64(<3 x double> %a, <3 x double> %b)
525  ret <3 x double> %c
526}
527
528define <4 x double> @max_v4f64(<4 x double> %a, <4 x double> %b) {
529; AARCH64-LABEL: max_v4f64:
530; AARCH64:       // %bb.0: // %entry
531; AARCH64-NEXT:    fminnm v2.2d, v2.2d, v2.2d
532; AARCH64-NEXT:    fminnm v0.2d, v0.2d, v0.2d
533; AARCH64-NEXT:    fminnm v3.2d, v3.2d, v3.2d
534; AARCH64-NEXT:    fminnm v1.2d, v1.2d, v1.2d
535; AARCH64-NEXT:    fmaxnm v0.2d, v0.2d, v2.2d
536; AARCH64-NEXT:    fmaxnm v1.2d, v1.2d, v3.2d
537; AARCH64-NEXT:    ret
538entry:
539  %c = call <4 x double> @llvm.maximumnum.v4f64(<4 x double> %a, <4 x double> %b)
540  ret <4 x double> %c
541}
542
543;;;;;;;;;;;;;;;;;; max_f32
544define float @max_f32(float %a, float %b) {
545; AARCH64-LABEL: max_f32:
546; AARCH64:       // %bb.0: // %entry
547; AARCH64-NEXT:    fminnm s1, s1, s1
548; AARCH64-NEXT:    fminnm s0, s0, s0
549; AARCH64-NEXT:    fmaxnm s0, s0, s1
550; AARCH64-NEXT:    ret
551entry:
552  %c = call float @llvm.maximumnum.f32(float %a, float %b)
553  ret float %c
554}
555
556define <2 x float> @max_v2f32(<2 x float> %a, <2 x float> %b) {
557; AARCH64-LABEL: max_v2f32:
558; AARCH64:       // %bb.0: // %entry
559; AARCH64-NEXT:    fminnm v1.2s, v1.2s, v1.2s
560; AARCH64-NEXT:    fminnm v0.2s, v0.2s, v0.2s
561; AARCH64-NEXT:    fmaxnm v0.2s, v0.2s, v1.2s
562; AARCH64-NEXT:    ret
563entry:
564  %c = call <2 x float> @llvm.maximumnum.v2f32(<2 x float> %a, <2 x float> %b)
565  ret <2 x float> %c
566}
567
568define <3 x float> @max_v3f32(<3 x float> %a, <3 x float> %b) {
569; AARCH64-LABEL: max_v3f32:
570; AARCH64:       // %bb.0: // %entry
571; AARCH64-NEXT:    fminnm v1.4s, v1.4s, v1.4s
572; AARCH64-NEXT:    fminnm v0.4s, v0.4s, v0.4s
573; AARCH64-NEXT:    fmaxnm v0.4s, v0.4s, v1.4s
574; AARCH64-NEXT:    ret
575entry:
576  %c = call <3 x float> @llvm.maximumnum.v3f32(<3 x float> %a, <3 x float> %b)
577  ret <3 x float> %c
578}
579
580define <4 x float> @max_v4f32(<4 x float> %a, <4 x float> %b) {
581; AARCH64-LABEL: max_v4f32:
582; AARCH64:       // %bb.0: // %entry
583; AARCH64-NEXT:    fminnm v1.4s, v1.4s, v1.4s
584; AARCH64-NEXT:    fminnm v0.4s, v0.4s, v0.4s
585; AARCH64-NEXT:    fmaxnm v0.4s, v0.4s, v1.4s
586; AARCH64-NEXT:    ret
587entry:
588  %c = call <4 x float> @llvm.maximumnum.v4f32(<4 x float> %a, <4 x float> %b)
589  ret <4 x float> %c
590}
591
592define <5 x float> @max_v5f32(<5 x float> %a, <5 x float> %b) {
593; AARCH64-LABEL: max_v5f32:
594; AARCH64:       // %bb.0: // %entry
595; AARCH64-NEXT:    // kill: def $s0 killed $s0 def $q0
596; AARCH64-NEXT:    // kill: def $s5 killed $s5 def $q5
597; AARCH64-NEXT:    // kill: def $s1 killed $s1 def $q1
598; AARCH64-NEXT:    // kill: def $s6 killed $s6 def $q6
599; AARCH64-NEXT:    // kill: def $s2 killed $s2 def $q2
600; AARCH64-NEXT:    // kill: def $s7 killed $s7 def $q7
601; AARCH64-NEXT:    // kill: def $s3 killed $s3 def $q3
602; AARCH64-NEXT:    mov x8, sp
603; AARCH64-NEXT:    // kill: def $s4 killed $s4 def $q4
604; AARCH64-NEXT:    mov v0.s[1], v1.s[0]
605; AARCH64-NEXT:    mov v5.s[1], v6.s[0]
606; AARCH64-NEXT:    mov v0.s[2], v2.s[0]
607; AARCH64-NEXT:    mov v5.s[2], v7.s[0]
608; AARCH64-NEXT:    ldr s2, [sp, #8]
609; AARCH64-NEXT:    fminnm v2.4s, v2.4s, v2.4s
610; AARCH64-NEXT:    mov v0.s[3], v3.s[0]
611; AARCH64-NEXT:    ld1 { v5.s }[3], [x8]
612; AARCH64-NEXT:    fminnm v3.4s, v4.4s, v4.4s
613; AARCH64-NEXT:    fminnm v1.4s, v5.4s, v5.4s
614; AARCH64-NEXT:    fminnm v0.4s, v0.4s, v0.4s
615; AARCH64-NEXT:    fmaxnm v4.4s, v3.4s, v2.4s
616; AARCH64-NEXT:    // kill: def $s4 killed $s4 killed $q4
617; AARCH64-NEXT:    fmaxnm v0.4s, v0.4s, v1.4s
618; AARCH64-NEXT:    mov s1, v0.s[1]
619; AARCH64-NEXT:    mov s2, v0.s[2]
620; AARCH64-NEXT:    mov s3, v0.s[3]
621; AARCH64-NEXT:    // kill: def $s0 killed $s0 killed $q0
622; AARCH64-NEXT:    ret
623entry:
624  %c = call <5 x float> @llvm.maximumnum.v5f32(<5 x float> %a, <5 x float> %b)
625  ret <5 x float> %c
626}
627
628define <8 x float> @max_v8f32(<8 x float> %a, <8 x float> %b) {
629; AARCH64-LABEL: max_v8f32:
630; AARCH64:       // %bb.0: // %entry
631; AARCH64-NEXT:    fminnm v2.4s, v2.4s, v2.4s
632; AARCH64-NEXT:    fminnm v0.4s, v0.4s, v0.4s
633; AARCH64-NEXT:    fminnm v3.4s, v3.4s, v3.4s
634; AARCH64-NEXT:    fminnm v1.4s, v1.4s, v1.4s
635; AARCH64-NEXT:    fmaxnm v0.4s, v0.4s, v2.4s
636; AARCH64-NEXT:    fmaxnm v1.4s, v1.4s, v3.4s
637; AARCH64-NEXT:    ret
638entry:
639  %c = call <8 x float> @llvm.maximumnum.v8f32(<8 x float> %a, <8 x float> %b)
640  ret <8 x float> %c
641}
642
643;;;;;;;;;;;;;;;;;; max_f16
644define half @max_f16(half %a, half %b) {
645; AARCH64-LABEL: max_f16:
646; AARCH64:       // %bb.0: // %entry
647; AARCH64-NEXT:    fminnm h1, h1, h1
648; AARCH64-NEXT:    fminnm h0, h0, h0
649; AARCH64-NEXT:    fmaxnm h0, h0, h1
650; AARCH64-NEXT:    ret
651entry:
652  %c = call half @llvm.maximumnum.f16(half %a, half %b)
653  ret half %c
654}
655
656define <2 x half> @max_v2f16(<2 x half> %a, <2 x half> %b) {
657; AARCH64-LABEL: max_v2f16:
658; AARCH64:       // %bb.0: // %entry
659; AARCH64-NEXT:    fminnm v1.4h, v1.4h, v1.4h
660; AARCH64-NEXT:    fminnm v0.4h, v0.4h, v0.4h
661; AARCH64-NEXT:    fmaxnm v0.4h, v0.4h, v1.4h
662; AARCH64-NEXT:    ret
663entry:
664  %c = call <2 x half> @llvm.maximumnum.v2f16(<2 x half> %a, <2 x half> %b)
665  ret <2 x half> %c
666}
667
668define <4 x half> @max_v4f16(<4 x half> %a, <4 x half> %b) {
669; AARCH64-LABEL: max_v4f16:
670; AARCH64:       // %bb.0: // %entry
671; AARCH64-NEXT:    fminnm v1.4h, v1.4h, v1.4h
672; AARCH64-NEXT:    fminnm v0.4h, v0.4h, v0.4h
673; AARCH64-NEXT:    fmaxnm v0.4h, v0.4h, v1.4h
674; AARCH64-NEXT:    ret
675entry:
676  %c = call <4 x half> @llvm.maximumnum.v4f16(<4 x half> %a, <4 x half> %b)
677  ret <4 x half> %c
678}
679
680define <8 x half> @max_v8f16(<8 x half> %a, <8 x half> %b) {
681; AARCH64-LABEL: max_v8f16:
682; AARCH64:       // %bb.0: // %entry
683; AARCH64-NEXT:    fminnm v1.8h, v1.8h, v1.8h
684; AARCH64-NEXT:    fminnm v0.8h, v0.8h, v0.8h
685; AARCH64-NEXT:    fmaxnm v0.8h, v0.8h, v1.8h
686; AARCH64-NEXT:    ret
687entry:
688  %c = call <8 x half> @llvm.maximumnum.v8f16(<8 x half> %a, <8 x half> %b)
689  ret <8 x half> %c
690}
691
692define <9 x half> @max_v9f16(<9 x half> %a, <9 x half> %b) {
693; AARCH64-LABEL: max_v9f16:
694; AARCH64:       // %bb.0: // %entry
695; AARCH64-NEXT:    // kill: def $h0 killed $h0 def $q0
696; AARCH64-NEXT:    // kill: def $h1 killed $h1 def $q1
697; AARCH64-NEXT:    // kill: def $h2 killed $h2 def $q2
698; AARCH64-NEXT:    add x9, sp, #16
699; AARCH64-NEXT:    // kill: def $h3 killed $h3 def $q3
700; AARCH64-NEXT:    // kill: def $h4 killed $h4 def $q4
701; AARCH64-NEXT:    // kill: def $h5 killed $h5 def $q5
702; AARCH64-NEXT:    // kill: def $h6 killed $h6 def $q6
703; AARCH64-NEXT:    // kill: def $h7 killed $h7 def $q7
704; AARCH64-NEXT:    mov v0.h[1], v1.h[0]
705; AARCH64-NEXT:    ldr h1, [sp, #8]
706; AARCH64-NEXT:    ld1 { v1.h }[1], [x9]
707; AARCH64-NEXT:    add x9, sp, #24
708; AARCH64-NEXT:    mov v0.h[2], v2.h[0]
709; AARCH64-NEXT:    ldr h2, [sp]
710; AARCH64-NEXT:    ld1 { v1.h }[2], [x9]
711; AARCH64-NEXT:    add x9, sp, #32
712; AARCH64-NEXT:    fminnm v2.8h, v2.8h, v2.8h
713; AARCH64-NEXT:    mov v0.h[3], v3.h[0]
714; AARCH64-NEXT:    ld1 { v1.h }[3], [x9]
715; AARCH64-NEXT:    add x9, sp, #40
716; AARCH64-NEXT:    ldr h3, [sp, #72]
717; AARCH64-NEXT:    ld1 { v1.h }[4], [x9]
718; AARCH64-NEXT:    add x9, sp, #48
719; AARCH64-NEXT:    fminnm v3.8h, v3.8h, v3.8h
720; AARCH64-NEXT:    mov v0.h[4], v4.h[0]
721; AARCH64-NEXT:    ld1 { v1.h }[5], [x9]
722; AARCH64-NEXT:    add x9, sp, #56
723; AARCH64-NEXT:    fmaxnm v2.8h, v2.8h, v3.8h
724; AARCH64-NEXT:    mov v0.h[5], v5.h[0]
725; AARCH64-NEXT:    ld1 { v1.h }[6], [x9]
726; AARCH64-NEXT:    add x9, sp, #64
727; AARCH64-NEXT:    str h2, [x8, #16]
728; AARCH64-NEXT:    mov v0.h[6], v6.h[0]
729; AARCH64-NEXT:    ld1 { v1.h }[7], [x9]
730; AARCH64-NEXT:    fminnm v1.8h, v1.8h, v1.8h
731; AARCH64-NEXT:    mov v0.h[7], v7.h[0]
732; AARCH64-NEXT:    fminnm v0.8h, v0.8h, v0.8h
733; AARCH64-NEXT:    fmaxnm v0.8h, v0.8h, v1.8h
734; AARCH64-NEXT:    str q0, [x8]
735; AARCH64-NEXT:    ret
736entry:
737  %c = call <9 x half> @llvm.maximumnum.v9f16(<9 x half> %a, <9 x half> %b)
738  ret <9 x half> %c
739}
740
741define <16 x half> @max_v16f16(<16 x half> %a, <16 x half> %b) {
742; AARCH64-LABEL: max_v16f16:
743; AARCH64:       // %bb.0: // %entry
744; AARCH64-NEXT:    fminnm v2.8h, v2.8h, v2.8h
745; AARCH64-NEXT:    fminnm v0.8h, v0.8h, v0.8h
746; AARCH64-NEXT:    fminnm v3.8h, v3.8h, v3.8h
747; AARCH64-NEXT:    fminnm v1.8h, v1.8h, v1.8h
748; AARCH64-NEXT:    fmaxnm v0.8h, v0.8h, v2.8h
749; AARCH64-NEXT:    fmaxnm v1.8h, v1.8h, v3.8h
750; AARCH64-NEXT:    ret
751entry:
752  %c = call <16 x half> @llvm.maximumnum.v16f16(<16 x half> %a, <16 x half> %b)
753  ret <16 x half> %c
754}
755
756;;;;;;;;;;;;;;;;  min_f64
757define double @min_f64(double %a, double %b) {
758; AARCH64-LABEL: min_f64:
759; AARCH64:       // %bb.0: // %entry
760; AARCH64-NEXT:    fminnm d1, d1, d1
761; AARCH64-NEXT:    fminnm d0, d0, d0
762; AARCH64-NEXT:    fminnm d0, d0, d1
763; AARCH64-NEXT:    ret
764entry:
765  %c = call double @llvm.minimumnum.f64(double %a, double %b)
766  ret double %c
767}
768
769define <2 x double> @min_v2f64(<2 x double> %a, <2 x double> %b) {
770; AARCH64-LABEL: min_v2f64:
771; AARCH64:       // %bb.0: // %entry
772; AARCH64-NEXT:    fminnm v1.2d, v1.2d, v1.2d
773; AARCH64-NEXT:    fminnm v0.2d, v0.2d, v0.2d
774; AARCH64-NEXT:    fminnm v0.2d, v0.2d, v1.2d
775; AARCH64-NEXT:    ret
776entry:
777  %c = call <2 x double> @llvm.minimumnum.v2f64(<2 x double> %a, <2 x double> %b)
778  ret <2 x double> %c
779}
780
781define <3 x double> @min_v3f64(<3 x double> %a, <3 x double> %b) {
782; AARCH64-LABEL: min_v3f64:
783; AARCH64:       // %bb.0: // %entry
784; AARCH64-NEXT:    // kill: def $d3 killed $d3 def $q3
785; AARCH64-NEXT:    // kill: def $d0 killed $d0 def $q0
786; AARCH64-NEXT:    // kill: def $d4 killed $d4 def $q4
787; AARCH64-NEXT:    // kill: def $d1 killed $d1 def $q1
788; AARCH64-NEXT:    // kill: def $d2 killed $d2 def $q2
789; AARCH64-NEXT:    // kill: def $d5 killed $d5 def $q5
790; AARCH64-NEXT:    mov v0.d[1], v1.d[0]
791; AARCH64-NEXT:    mov v3.d[1], v4.d[0]
792; AARCH64-NEXT:    fminnm v2.2d, v2.2d, v2.2d
793; AARCH64-NEXT:    fminnm v1.2d, v3.2d, v3.2d
794; AARCH64-NEXT:    fminnm v0.2d, v0.2d, v0.2d
795; AARCH64-NEXT:    fminnm v0.2d, v0.2d, v1.2d
796; AARCH64-NEXT:    fminnm v1.2d, v5.2d, v5.2d
797; AARCH64-NEXT:    fminnm v2.2d, v2.2d, v1.2d
798; AARCH64-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
799; AARCH64-NEXT:    // kill: def $d0 killed $d0 killed $q0
800; AARCH64-NEXT:    // kill: def $d1 killed $d1 killed $q1
801; AARCH64-NEXT:    // kill: def $d2 killed $d2 killed $q2
802; AARCH64-NEXT:    ret
803entry:
804  %c = call <3 x double> @llvm.minimumnum.v3f64(<3 x double> %a, <3 x double> %b)
805  ret <3 x double> %c
806}
807
808define <4 x double> @min_v4f64(<4 x double> %a, <4 x double> %b) {
809; AARCH64-LABEL: min_v4f64:
810; AARCH64:       // %bb.0: // %entry
811; AARCH64-NEXT:    fminnm v2.2d, v2.2d, v2.2d
812; AARCH64-NEXT:    fminnm v0.2d, v0.2d, v0.2d
813; AARCH64-NEXT:    fminnm v3.2d, v3.2d, v3.2d
814; AARCH64-NEXT:    fminnm v1.2d, v1.2d, v1.2d
815; AARCH64-NEXT:    fminnm v0.2d, v0.2d, v2.2d
816; AARCH64-NEXT:    fminnm v1.2d, v1.2d, v3.2d
817; AARCH64-NEXT:    ret
818entry:
819  %c = call <4 x double> @llvm.minimumnum.v4f64(<4 x double> %a, <4 x double> %b)
820  ret <4 x double> %c
821}
822
823;;;;;;;;;;;;;;;;;; min_f32
824define float @min_f32(float %a, float %b) {
825; AARCH64-LABEL: min_f32:
826; AARCH64:       // %bb.0: // %entry
827; AARCH64-NEXT:    fminnm s1, s1, s1
828; AARCH64-NEXT:    fminnm s0, s0, s0
829; AARCH64-NEXT:    fminnm s0, s0, s1
830; AARCH64-NEXT:    ret
831entry:
832  %c = call float @llvm.minimumnum.f32(float %a, float %b)
833  ret float %c
834}
835
836define <2 x float> @min_v2f32(<2 x float> %a, <2 x float> %b) {
837; AARCH64-LABEL: min_v2f32:
838; AARCH64:       // %bb.0: // %entry
839; AARCH64-NEXT:    fminnm v1.2s, v1.2s, v1.2s
840; AARCH64-NEXT:    fminnm v0.2s, v0.2s, v0.2s
841; AARCH64-NEXT:    fminnm v0.2s, v0.2s, v1.2s
842; AARCH64-NEXT:    ret
843entry:
844  %c = call <2 x float> @llvm.minimumnum.v2f32(<2 x float> %a, <2 x float> %b)
845  ret <2 x float> %c
846}
847
848define <3 x float> @min_v3f32(<3 x float> %a, <3 x float> %b) {
849; AARCH64-LABEL: min_v3f32:
850; AARCH64:       // %bb.0: // %entry
851; AARCH64-NEXT:    fminnm v1.4s, v1.4s, v1.4s
852; AARCH64-NEXT:    fminnm v0.4s, v0.4s, v0.4s
853; AARCH64-NEXT:    fminnm v0.4s, v0.4s, v1.4s
854; AARCH64-NEXT:    ret
855entry:
856  %c = call <3 x float> @llvm.minimumnum.v3f32(<3 x float> %a, <3 x float> %b)
857  ret <3 x float> %c
858}
859
860define <4 x float> @min_v4f32(<4 x float> %a, <4 x float> %b) {
861; AARCH64-LABEL: min_v4f32:
862; AARCH64:       // %bb.0: // %entry
863; AARCH64-NEXT:    fminnm v1.4s, v1.4s, v1.4s
864; AARCH64-NEXT:    fminnm v0.4s, v0.4s, v0.4s
865; AARCH64-NEXT:    fminnm v0.4s, v0.4s, v1.4s
866; AARCH64-NEXT:    ret
867entry:
868  %c = call <4 x float> @llvm.minimumnum.v4f32(<4 x float> %a, <4 x float> %b)
869  ret <4 x float> %c
870}
871
872define <5 x float> @min_v5f32(<5 x float> %a, <5 x float> %b) {
873; AARCH64-LABEL: min_v5f32:
874; AARCH64:       // %bb.0: // %entry
875; AARCH64-NEXT:    // kill: def $s0 killed $s0 def $q0
876; AARCH64-NEXT:    // kill: def $s5 killed $s5 def $q5
877; AARCH64-NEXT:    // kill: def $s1 killed $s1 def $q1
878; AARCH64-NEXT:    // kill: def $s6 killed $s6 def $q6
879; AARCH64-NEXT:    // kill: def $s2 killed $s2 def $q2
880; AARCH64-NEXT:    // kill: def $s7 killed $s7 def $q7
881; AARCH64-NEXT:    // kill: def $s3 killed $s3 def $q3
882; AARCH64-NEXT:    mov x8, sp
883; AARCH64-NEXT:    // kill: def $s4 killed $s4 def $q4
884; AARCH64-NEXT:    mov v0.s[1], v1.s[0]
885; AARCH64-NEXT:    mov v5.s[1], v6.s[0]
886; AARCH64-NEXT:    mov v0.s[2], v2.s[0]
887; AARCH64-NEXT:    mov v5.s[2], v7.s[0]
888; AARCH64-NEXT:    ldr s2, [sp, #8]
889; AARCH64-NEXT:    fminnm v2.4s, v2.4s, v2.4s
890; AARCH64-NEXT:    mov v0.s[3], v3.s[0]
891; AARCH64-NEXT:    ld1 { v5.s }[3], [x8]
892; AARCH64-NEXT:    fminnm v3.4s, v4.4s, v4.4s
893; AARCH64-NEXT:    fminnm v1.4s, v5.4s, v5.4s
894; AARCH64-NEXT:    fminnm v0.4s, v0.4s, v0.4s
895; AARCH64-NEXT:    fminnm v4.4s, v3.4s, v2.4s
896; AARCH64-NEXT:    // kill: def $s4 killed $s4 killed $q4
897; AARCH64-NEXT:    fminnm v0.4s, v0.4s, v1.4s
898; AARCH64-NEXT:    mov s1, v0.s[1]
899; AARCH64-NEXT:    mov s2, v0.s[2]
900; AARCH64-NEXT:    mov s3, v0.s[3]
901; AARCH64-NEXT:    // kill: def $s0 killed $s0 killed $q0
902; AARCH64-NEXT:    ret
903entry:
904  %c = call <5 x float> @llvm.minimumnum.v5f32(<5 x float> %a, <5 x float> %b)
905  ret <5 x float> %c
906}
907
908define <8 x float> @min_v8f32(<8 x float> %a, <8 x float> %b) {
909; AARCH64-LABEL: min_v8f32:
910; AARCH64:       // %bb.0: // %entry
911; AARCH64-NEXT:    fminnm v2.4s, v2.4s, v2.4s
912; AARCH64-NEXT:    fminnm v0.4s, v0.4s, v0.4s
913; AARCH64-NEXT:    fminnm v3.4s, v3.4s, v3.4s
914; AARCH64-NEXT:    fminnm v1.4s, v1.4s, v1.4s
915; AARCH64-NEXT:    fminnm v0.4s, v0.4s, v2.4s
916; AARCH64-NEXT:    fminnm v1.4s, v1.4s, v3.4s
917; AARCH64-NEXT:    ret
918entry:
919  %c = call <8 x float> @llvm.minimumnum.v8f32(<8 x float> %a, <8 x float> %b)
920  ret <8 x float> %c
921}
922
923;;;;;;;;;;;;;;;;;; min_f16
924define half @min_f16(half %a, half %b) {
925; AARCH64-LABEL: min_f16:
926; AARCH64:       // %bb.0: // %entry
927; AARCH64-NEXT:    fminnm h1, h1, h1
928; AARCH64-NEXT:    fminnm h0, h0, h0
929; AARCH64-NEXT:    fminnm h0, h0, h1
930; AARCH64-NEXT:    ret
931entry:
932  %c = call half @llvm.minimumnum.f16(half %a, half %b)
933  ret half %c
934}
935
936define <2 x half> @min_v2f16(<2 x half> %a, <2 x half> %b) {
937; AARCH64-LABEL: min_v2f16:
938; AARCH64:       // %bb.0: // %entry
939; AARCH64-NEXT:    fminnm v1.4h, v1.4h, v1.4h
940; AARCH64-NEXT:    fminnm v0.4h, v0.4h, v0.4h
941; AARCH64-NEXT:    fminnm v0.4h, v0.4h, v1.4h
942; AARCH64-NEXT:    ret
943entry:
944  %c = call <2 x half> @llvm.minimumnum.v2f16(<2 x half> %a, <2 x half> %b)
945  ret <2 x half> %c
946}
947
948define <4 x half> @min_v4f16(<4 x half> %a, <4 x half> %b) {
949; AARCH64-LABEL: min_v4f16:
950; AARCH64:       // %bb.0: // %entry
951; AARCH64-NEXT:    fminnm v1.4h, v1.4h, v1.4h
952; AARCH64-NEXT:    fminnm v0.4h, v0.4h, v0.4h
953; AARCH64-NEXT:    fminnm v0.4h, v0.4h, v1.4h
954; AARCH64-NEXT:    ret
955entry:
956  %c = call <4 x half> @llvm.minimumnum.v4f16(<4 x half> %a, <4 x half> %b)
957  ret <4 x half> %c
958}
959
960define <8 x half> @min_v8f16(<8 x half> %a, <8 x half> %b) {
961; AARCH64-LABEL: min_v8f16:
962; AARCH64:       // %bb.0: // %entry
963; AARCH64-NEXT:    fminnm v1.8h, v1.8h, v1.8h
964; AARCH64-NEXT:    fminnm v0.8h, v0.8h, v0.8h
965; AARCH64-NEXT:    fminnm v0.8h, v0.8h, v1.8h
966; AARCH64-NEXT:    ret
967entry:
968  %c = call <8 x half> @llvm.minimumnum.v8f16(<8 x half> %a, <8 x half> %b)
969  ret <8 x half> %c
970}
971
972define <9 x half> @min_v9f16(<9 x half> %a, <9 x half> %b) {
973; AARCH64-LABEL: min_v9f16:
974; AARCH64:       // %bb.0: // %entry
975; AARCH64-NEXT:    // kill: def $h0 killed $h0 def $q0
976; AARCH64-NEXT:    // kill: def $h1 killed $h1 def $q1
977; AARCH64-NEXT:    // kill: def $h2 killed $h2 def $q2
978; AARCH64-NEXT:    add x9, sp, #16
979; AARCH64-NEXT:    // kill: def $h3 killed $h3 def $q3
980; AARCH64-NEXT:    // kill: def $h4 killed $h4 def $q4
981; AARCH64-NEXT:    // kill: def $h5 killed $h5 def $q5
982; AARCH64-NEXT:    // kill: def $h6 killed $h6 def $q6
983; AARCH64-NEXT:    // kill: def $h7 killed $h7 def $q7
984; AARCH64-NEXT:    mov v0.h[1], v1.h[0]
985; AARCH64-NEXT:    ldr h1, [sp, #8]
986; AARCH64-NEXT:    ld1 { v1.h }[1], [x9]
987; AARCH64-NEXT:    add x9, sp, #24
988; AARCH64-NEXT:    mov v0.h[2], v2.h[0]
989; AARCH64-NEXT:    ldr h2, [sp]
990; AARCH64-NEXT:    ld1 { v1.h }[2], [x9]
991; AARCH64-NEXT:    add x9, sp, #32
992; AARCH64-NEXT:    fminnm v2.8h, v2.8h, v2.8h
993; AARCH64-NEXT:    mov v0.h[3], v3.h[0]
994; AARCH64-NEXT:    ld1 { v1.h }[3], [x9]
995; AARCH64-NEXT:    add x9, sp, #40
996; AARCH64-NEXT:    ldr h3, [sp, #72]
997; AARCH64-NEXT:    ld1 { v1.h }[4], [x9]
998; AARCH64-NEXT:    add x9, sp, #48
999; AARCH64-NEXT:    fminnm v3.8h, v3.8h, v3.8h
1000; AARCH64-NEXT:    mov v0.h[4], v4.h[0]
1001; AARCH64-NEXT:    ld1 { v1.h }[5], [x9]
1002; AARCH64-NEXT:    add x9, sp, #56
1003; AARCH64-NEXT:    fminnm v2.8h, v2.8h, v3.8h
1004; AARCH64-NEXT:    mov v0.h[5], v5.h[0]
1005; AARCH64-NEXT:    ld1 { v1.h }[6], [x9]
1006; AARCH64-NEXT:    add x9, sp, #64
1007; AARCH64-NEXT:    str h2, [x8, #16]
1008; AARCH64-NEXT:    mov v0.h[6], v6.h[0]
1009; AARCH64-NEXT:    ld1 { v1.h }[7], [x9]
1010; AARCH64-NEXT:    fminnm v1.8h, v1.8h, v1.8h
1011; AARCH64-NEXT:    mov v0.h[7], v7.h[0]
1012; AARCH64-NEXT:    fminnm v0.8h, v0.8h, v0.8h
1013; AARCH64-NEXT:    fminnm v0.8h, v0.8h, v1.8h
1014; AARCH64-NEXT:    str q0, [x8]
1015; AARCH64-NEXT:    ret
1016entry:
1017  %c = call <9 x half> @llvm.minimumnum.v9f16(<9 x half> %a, <9 x half> %b)
1018  ret <9 x half> %c
1019}
1020
1021define <16 x half> @min_v16f16(<16 x half> %a, <16 x half> %b) {
1022; AARCH64-LABEL: min_v16f16:
1023; AARCH64:       // %bb.0: // %entry
1024; AARCH64-NEXT:    fminnm v2.8h, v2.8h, v2.8h
1025; AARCH64-NEXT:    fminnm v0.8h, v0.8h, v0.8h
1026; AARCH64-NEXT:    fminnm v3.8h, v3.8h, v3.8h
1027; AARCH64-NEXT:    fminnm v1.8h, v1.8h, v1.8h
1028; AARCH64-NEXT:    fminnm v0.8h, v0.8h, v2.8h
1029; AARCH64-NEXT:    fminnm v1.8h, v1.8h, v3.8h
1030; AARCH64-NEXT:    ret
1031entry:
1032  %c = call <16 x half> @llvm.minimumnum.v16f16(<16 x half> %a, <16 x half> %b)
1033  ret <16 x half> %c
1034}
1035