xref: /llvm-project/llvm/test/CodeGen/AArch64/fminimummaximum.ll (revision 61510b51c33464a6bc15e4cf5b1ee07e2e0ec1c9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-NOFP16-SD
3; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-FP16-SD
4; RUN: llc -mtriple=aarch64 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-NOFP16-GI
5; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-FP16-GI
6
7define double @min_f64(double %a, double %b) {
8; CHECK-LABEL: min_f64:
9; CHECK:       // %bb.0: // %entry
10; CHECK-NEXT:    fmin d0, d0, d1
11; CHECK-NEXT:    ret
12entry:
13  %c = call double @llvm.minimum.f64(double %a, double %b)
14  ret double %c
15}
16
17define double @max_f64(double %a, double %b) {
18; CHECK-LABEL: max_f64:
19; CHECK:       // %bb.0: // %entry
20; CHECK-NEXT:    fmax d0, d0, d1
21; CHECK-NEXT:    ret
22entry:
23  %c = call double @llvm.maximum.f64(double %a, double %b)
24  ret double %c
25}
26
27define float @min_f32(float %a, float %b) {
28; CHECK-LABEL: min_f32:
29; CHECK:       // %bb.0: // %entry
30; CHECK-NEXT:    fmin s0, s0, s1
31; CHECK-NEXT:    ret
32entry:
33  %c = call float @llvm.minimum.f32(float %a, float %b)
34  ret float %c
35}
36
37define float @max_f32(float %a, float %b) {
38; CHECK-LABEL: max_f32:
39; CHECK:       // %bb.0: // %entry
40; CHECK-NEXT:    fmax s0, s0, s1
41; CHECK-NEXT:    ret
42entry:
43  %c = call float @llvm.maximum.f32(float %a, float %b)
44  ret float %c
45}
46
47define half @min_f16(half %a, half %b) {
48; CHECK-NOFP16-SD-LABEL: min_f16:
49; CHECK-NOFP16-SD:       // %bb.0: // %entry
50; CHECK-NOFP16-SD-NEXT:    fcvt s1, h1
51; CHECK-NOFP16-SD-NEXT:    fcvt s0, h0
52; CHECK-NOFP16-SD-NEXT:    fmin s0, s0, s1
53; CHECK-NOFP16-SD-NEXT:    fcvt h0, s0
54; CHECK-NOFP16-SD-NEXT:    ret
55;
56; CHECK-FP16-SD-LABEL: min_f16:
57; CHECK-FP16-SD:       // %bb.0: // %entry
58; CHECK-FP16-SD-NEXT:    fmin h0, h0, h1
59; CHECK-FP16-SD-NEXT:    ret
60;
61; CHECK-NOFP16-GI-LABEL: min_f16:
62; CHECK-NOFP16-GI:       // %bb.0: // %entry
63; CHECK-NOFP16-GI-NEXT:    fcvt s0, h0
64; CHECK-NOFP16-GI-NEXT:    fcvt s1, h1
65; CHECK-NOFP16-GI-NEXT:    fmin s0, s0, s1
66; CHECK-NOFP16-GI-NEXT:    fcvt h0, s0
67; CHECK-NOFP16-GI-NEXT:    ret
68;
69; CHECK-FP16-GI-LABEL: min_f16:
70; CHECK-FP16-GI:       // %bb.0: // %entry
71; CHECK-FP16-GI-NEXT:    fmin h0, h0, h1
72; CHECK-FP16-GI-NEXT:    ret
73entry:
74  %c = call half @llvm.minimum.f16(half %a, half %b)
75  ret half %c
76}
77
78define half @max_f16(half %a, half %b) {
79; CHECK-NOFP16-SD-LABEL: max_f16:
80; CHECK-NOFP16-SD:       // %bb.0: // %entry
81; CHECK-NOFP16-SD-NEXT:    fcvt s1, h1
82; CHECK-NOFP16-SD-NEXT:    fcvt s0, h0
83; CHECK-NOFP16-SD-NEXT:    fmax s0, s0, s1
84; CHECK-NOFP16-SD-NEXT:    fcvt h0, s0
85; CHECK-NOFP16-SD-NEXT:    ret
86;
87; CHECK-FP16-SD-LABEL: max_f16:
88; CHECK-FP16-SD:       // %bb.0: // %entry
89; CHECK-FP16-SD-NEXT:    fmax h0, h0, h1
90; CHECK-FP16-SD-NEXT:    ret
91;
92; CHECK-NOFP16-GI-LABEL: max_f16:
93; CHECK-NOFP16-GI:       // %bb.0: // %entry
94; CHECK-NOFP16-GI-NEXT:    fcvt s0, h0
95; CHECK-NOFP16-GI-NEXT:    fcvt s1, h1
96; CHECK-NOFP16-GI-NEXT:    fmax s0, s0, s1
97; CHECK-NOFP16-GI-NEXT:    fcvt h0, s0
98; CHECK-NOFP16-GI-NEXT:    ret
99;
100; CHECK-FP16-GI-LABEL: max_f16:
101; CHECK-FP16-GI:       // %bb.0: // %entry
102; CHECK-FP16-GI-NEXT:    fmax h0, h0, h1
103; CHECK-FP16-GI-NEXT:    ret
104entry:
105  %c = call half @llvm.maximum.f16(half %a, half %b)
106  ret half %c
107}
108
109define <2 x double> @min_v2f64(<2 x double> %a, <2 x double> %b) {
110; CHECK-LABEL: min_v2f64:
111; CHECK:       // %bb.0: // %entry
112; CHECK-NEXT:    fmin v0.2d, v0.2d, v1.2d
113; CHECK-NEXT:    ret
114entry:
115  %c = call <2 x double> @llvm.minimum.v2f64(<2 x double> %a, <2 x double> %b)
116  ret <2 x double> %c
117}
118
119define <2 x double> @max_v2f64(<2 x double> %a, <2 x double> %b) {
120; CHECK-LABEL: max_v2f64:
121; CHECK:       // %bb.0: // %entry
122; CHECK-NEXT:    fmax v0.2d, v0.2d, v1.2d
123; CHECK-NEXT:    ret
124entry:
125  %c = call <2 x double> @llvm.maximum.v2f64(<2 x double> %a, <2 x double> %b)
126  ret <2 x double> %c
127}
128
129define <3 x double> @min_v3f64(<3 x double> %a, <3 x double> %b) {
130; CHECK-SD-LABEL: min_v3f64:
131; CHECK-SD:       // %bb.0: // %entry
132; CHECK-SD-NEXT:    // kill: def $d3 killed $d3 def $q3
133; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
134; CHECK-SD-NEXT:    // kill: def $d4 killed $d4 def $q4
135; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
136; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
137; CHECK-SD-NEXT:    // kill: def $d5 killed $d5 def $q5
138; CHECK-SD-NEXT:    mov v3.d[1], v4.d[0]
139; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
140; CHECK-SD-NEXT:    fmin v2.2d, v2.2d, v5.2d
141; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
142; CHECK-SD-NEXT:    fmin v0.2d, v0.2d, v3.2d
143; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
144; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
145; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
146; CHECK-SD-NEXT:    ret
147;
148; CHECK-GI-LABEL: min_v3f64:
149; CHECK-GI:       // %bb.0: // %entry
150; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
151; CHECK-GI-NEXT:    // kill: def $d3 killed $d3 def $q3
152; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
153; CHECK-GI-NEXT:    // kill: def $d4 killed $d4 def $q4
154; CHECK-GI-NEXT:    fmin d2, d2, d5
155; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
156; CHECK-GI-NEXT:    mov v3.d[1], v4.d[0]
157; CHECK-GI-NEXT:    fmin v0.2d, v0.2d, v3.2d
158; CHECK-GI-NEXT:    mov d1, v0.d[1]
159; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
160; CHECK-GI-NEXT:    ret
161entry:
162  %c = call <3 x double> @llvm.minimum.v3f64(<3 x double> %a, <3 x double> %b)
163  ret <3 x double> %c
164}
165
166define <3 x double> @max_v3f64(<3 x double> %a, <3 x double> %b) {
167; CHECK-SD-LABEL: max_v3f64:
168; CHECK-SD:       // %bb.0: // %entry
169; CHECK-SD-NEXT:    // kill: def $d3 killed $d3 def $q3
170; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
171; CHECK-SD-NEXT:    // kill: def $d4 killed $d4 def $q4
172; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
173; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
174; CHECK-SD-NEXT:    // kill: def $d5 killed $d5 def $q5
175; CHECK-SD-NEXT:    mov v3.d[1], v4.d[0]
176; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
177; CHECK-SD-NEXT:    fmax v2.2d, v2.2d, v5.2d
178; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 killed $q2
179; CHECK-SD-NEXT:    fmax v0.2d, v0.2d, v3.2d
180; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
181; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
182; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
183; CHECK-SD-NEXT:    ret
184;
185; CHECK-GI-LABEL: max_v3f64:
186; CHECK-GI:       // %bb.0: // %entry
187; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
188; CHECK-GI-NEXT:    // kill: def $d3 killed $d3 def $q3
189; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
190; CHECK-GI-NEXT:    // kill: def $d4 killed $d4 def $q4
191; CHECK-GI-NEXT:    fmax d2, d2, d5
192; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
193; CHECK-GI-NEXT:    mov v3.d[1], v4.d[0]
194; CHECK-GI-NEXT:    fmax v0.2d, v0.2d, v3.2d
195; CHECK-GI-NEXT:    mov d1, v0.d[1]
196; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
197; CHECK-GI-NEXT:    ret
198entry:
199  %c = call <3 x double> @llvm.maximum.v3f64(<3 x double> %a, <3 x double> %b)
200  ret <3 x double> %c
201}
202
203define <4 x double> @min_v4f64(<4 x double> %a, <4 x double> %b) {
204; CHECK-SD-LABEL: min_v4f64:
205; CHECK-SD:       // %bb.0: // %entry
206; CHECK-SD-NEXT:    fmin v1.2d, v1.2d, v3.2d
207; CHECK-SD-NEXT:    fmin v0.2d, v0.2d, v2.2d
208; CHECK-SD-NEXT:    ret
209;
210; CHECK-GI-LABEL: min_v4f64:
211; CHECK-GI:       // %bb.0: // %entry
212; CHECK-GI-NEXT:    fmin v0.2d, v0.2d, v2.2d
213; CHECK-GI-NEXT:    fmin v1.2d, v1.2d, v3.2d
214; CHECK-GI-NEXT:    ret
215entry:
216  %c = call <4 x double> @llvm.minimum.v4f64(<4 x double> %a, <4 x double> %b)
217  ret <4 x double> %c
218}
219
220define <4 x double> @max_v4f64(<4 x double> %a, <4 x double> %b) {
221; CHECK-SD-LABEL: max_v4f64:
222; CHECK-SD:       // %bb.0: // %entry
223; CHECK-SD-NEXT:    fmax v1.2d, v1.2d, v3.2d
224; CHECK-SD-NEXT:    fmax v0.2d, v0.2d, v2.2d
225; CHECK-SD-NEXT:    ret
226;
227; CHECK-GI-LABEL: max_v4f64:
228; CHECK-GI:       // %bb.0: // %entry
229; CHECK-GI-NEXT:    fmax v0.2d, v0.2d, v2.2d
230; CHECK-GI-NEXT:    fmax v1.2d, v1.2d, v3.2d
231; CHECK-GI-NEXT:    ret
232entry:
233  %c = call <4 x double> @llvm.maximum.v4f64(<4 x double> %a, <4 x double> %b)
234  ret <4 x double> %c
235}
236
237define <2 x float> @min_v2f32(<2 x float> %a, <2 x float> %b) {
238; CHECK-LABEL: min_v2f32:
239; CHECK:       // %bb.0: // %entry
240; CHECK-NEXT:    fmin v0.2s, v0.2s, v1.2s
241; CHECK-NEXT:    ret
242entry:
243  %c = call <2 x float> @llvm.minimum.v2f32(<2 x float> %a, <2 x float> %b)
244  ret <2 x float> %c
245}
246
247define <2 x float> @max_v2f32(<2 x float> %a, <2 x float> %b) {
248; CHECK-LABEL: max_v2f32:
249; CHECK:       // %bb.0: // %entry
250; CHECK-NEXT:    fmax v0.2s, v0.2s, v1.2s
251; CHECK-NEXT:    ret
252entry:
253  %c = call <2 x float> @llvm.maximum.v2f32(<2 x float> %a, <2 x float> %b)
254  ret <2 x float> %c
255}
256
257define <3 x float> @min_v3f32(<3 x float> %a, <3 x float> %b) {
258; CHECK-LABEL: min_v3f32:
259; CHECK:       // %bb.0: // %entry
260; CHECK-NEXT:    fmin v0.4s, v0.4s, v1.4s
261; CHECK-NEXT:    ret
262entry:
263  %c = call <3 x float> @llvm.minimum.v3f32(<3 x float> %a, <3 x float> %b)
264  ret <3 x float> %c
265}
266
267define <3 x float> @max_v3f32(<3 x float> %a, <3 x float> %b) {
268; CHECK-LABEL: max_v3f32:
269; CHECK:       // %bb.0: // %entry
270; CHECK-NEXT:    fmax v0.4s, v0.4s, v1.4s
271; CHECK-NEXT:    ret
272entry:
273  %c = call <3 x float> @llvm.maximum.v3f32(<3 x float> %a, <3 x float> %b)
274  ret <3 x float> %c
275}
276
277define <4 x float> @min_v4f32(<4 x float> %a, <4 x float> %b) {
278; CHECK-LABEL: min_v4f32:
279; CHECK:       // %bb.0: // %entry
280; CHECK-NEXT:    fmin v0.4s, v0.4s, v1.4s
281; CHECK-NEXT:    ret
282entry:
283  %c = call <4 x float> @llvm.minimum.v4f32(<4 x float> %a, <4 x float> %b)
284  ret <4 x float> %c
285}
286
287define <4 x float> @max_v4f32(<4 x float> %a, <4 x float> %b) {
288; CHECK-LABEL: max_v4f32:
289; CHECK:       // %bb.0: // %entry
290; CHECK-NEXT:    fmax v0.4s, v0.4s, v1.4s
291; CHECK-NEXT:    ret
292entry:
293  %c = call <4 x float> @llvm.maximum.v4f32(<4 x float> %a, <4 x float> %b)
294  ret <4 x float> %c
295}
296
297define <7 x float> @min_v7f32(<7 x float> %a, <7 x float> %b) {
298; CHECK-SD-LABEL: min_v7f32:
299; CHECK-SD:       // %bb.0: // %entry
300; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
301; CHECK-SD-NEXT:    // kill: def $s1 killed $s1 def $q1
302; CHECK-SD-NEXT:    // kill: def $s7 killed $s7 def $q7
303; CHECK-SD-NEXT:    mov x8, sp
304; CHECK-SD-NEXT:    // kill: def $s4 killed $s4 def $q4
305; CHECK-SD-NEXT:    // kill: def $s5 killed $s5 def $q5
306; CHECK-SD-NEXT:    // kill: def $s2 killed $s2 def $q2
307; CHECK-SD-NEXT:    // kill: def $s6 killed $s6 def $q6
308; CHECK-SD-NEXT:    // kill: def $s3 killed $s3 def $q3
309; CHECK-SD-NEXT:    mov v0.s[1], v1.s[0]
310; CHECK-SD-NEXT:    ld1 { v7.s }[1], [x8]
311; CHECK-SD-NEXT:    ldr s1, [sp, #24]
312; CHECK-SD-NEXT:    add x8, sp, #8
313; CHECK-SD-NEXT:    mov v4.s[1], v5.s[0]
314; CHECK-SD-NEXT:    ld1 { v7.s }[2], [x8]
315; CHECK-SD-NEXT:    add x8, sp, #32
316; CHECK-SD-NEXT:    mov v0.s[2], v2.s[0]
317; CHECK-SD-NEXT:    ld1 { v1.s }[1], [x8]
318; CHECK-SD-NEXT:    add x8, sp, #16
319; CHECK-SD-NEXT:    mov v4.s[2], v6.s[0]
320; CHECK-SD-NEXT:    ld1 { v7.s }[3], [x8]
321; CHECK-SD-NEXT:    add x8, sp, #40
322; CHECK-SD-NEXT:    ld1 { v1.s }[2], [x8]
323; CHECK-SD-NEXT:    mov v0.s[3], v3.s[0]
324; CHECK-SD-NEXT:    fmin v4.4s, v4.4s, v1.4s
325; CHECK-SD-NEXT:    fmin v0.4s, v0.4s, v7.4s
326; CHECK-SD-NEXT:    mov s5, v4.s[1]
327; CHECK-SD-NEXT:    mov s6, v4.s[2]
328; CHECK-SD-NEXT:    // kill: def $s4 killed $s4 killed $q4
329; CHECK-SD-NEXT:    mov s1, v0.s[1]
330; CHECK-SD-NEXT:    mov s2, v0.s[2]
331; CHECK-SD-NEXT:    mov s3, v0.s[3]
332; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
333; CHECK-SD-NEXT:    ret
334;
335; CHECK-GI-LABEL: min_v7f32:
336; CHECK-GI:       // %bb.0: // %entry
337; CHECK-GI-NEXT:    ldr s16, [sp]
338; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
339; CHECK-GI-NEXT:    // kill: def $s7 killed $s7 def $q7
340; CHECK-GI-NEXT:    // kill: def $s1 killed $s1 def $q1
341; CHECK-GI-NEXT:    ldr s17, [sp, #32]
342; CHECK-GI-NEXT:    // kill: def $s4 killed $s4 def $q4
343; CHECK-GI-NEXT:    // kill: def $s2 killed $s2 def $q2
344; CHECK-GI-NEXT:    // kill: def $s5 killed $s5 def $q5
345; CHECK-GI-NEXT:    // kill: def $s3 killed $s3 def $q3
346; CHECK-GI-NEXT:    // kill: def $s6 killed $s6 def $q6
347; CHECK-GI-NEXT:    mov v0.s[1], v1.s[0]
348; CHECK-GI-NEXT:    ldr s1, [sp, #8]
349; CHECK-GI-NEXT:    mov v4.s[1], v5.s[0]
350; CHECK-GI-NEXT:    mov v7.s[1], v16.s[0]
351; CHECK-GI-NEXT:    ldr s16, [sp, #24]
352; CHECK-GI-NEXT:    mov v16.s[1], v17.s[0]
353; CHECK-GI-NEXT:    mov v0.s[2], v2.s[0]
354; CHECK-GI-NEXT:    ldr s2, [sp, #40]
355; CHECK-GI-NEXT:    mov v4.s[2], v6.s[0]
356; CHECK-GI-NEXT:    mov v7.s[2], v1.s[0]
357; CHECK-GI-NEXT:    ldr s1, [sp, #16]
358; CHECK-GI-NEXT:    mov v16.s[2], v2.s[0]
359; CHECK-GI-NEXT:    mov v0.s[3], v3.s[0]
360; CHECK-GI-NEXT:    mov v7.s[3], v1.s[0]
361; CHECK-GI-NEXT:    fmin v4.4s, v4.4s, v16.4s
362; CHECK-GI-NEXT:    fmin v0.4s, v0.4s, v7.4s
363; CHECK-GI-NEXT:    mov s5, v4.s[1]
364; CHECK-GI-NEXT:    mov s6, v4.s[2]
365; CHECK-GI-NEXT:    // kill: def $s4 killed $s4 killed $q4
366; CHECK-GI-NEXT:    mov s1, v0.s[1]
367; CHECK-GI-NEXT:    mov s2, v0.s[2]
368; CHECK-GI-NEXT:    mov s3, v0.s[3]
369; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
370; CHECK-GI-NEXT:    ret
371entry:
372  %c = call <7 x float> @llvm.minimum.v7f32(<7 x float> %a, <7 x float> %b)
373  ret <7 x float> %c
374}
375
376define <7 x float> @max_v7f32(<7 x float> %a, <7 x float> %b) {
377; CHECK-SD-LABEL: max_v7f32:
378; CHECK-SD:       // %bb.0: // %entry
379; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 def $q0
380; CHECK-SD-NEXT:    // kill: def $s1 killed $s1 def $q1
381; CHECK-SD-NEXT:    // kill: def $s7 killed $s7 def $q7
382; CHECK-SD-NEXT:    mov x8, sp
383; CHECK-SD-NEXT:    // kill: def $s4 killed $s4 def $q4
384; CHECK-SD-NEXT:    // kill: def $s5 killed $s5 def $q5
385; CHECK-SD-NEXT:    // kill: def $s2 killed $s2 def $q2
386; CHECK-SD-NEXT:    // kill: def $s6 killed $s6 def $q6
387; CHECK-SD-NEXT:    // kill: def $s3 killed $s3 def $q3
388; CHECK-SD-NEXT:    mov v0.s[1], v1.s[0]
389; CHECK-SD-NEXT:    ld1 { v7.s }[1], [x8]
390; CHECK-SD-NEXT:    ldr s1, [sp, #24]
391; CHECK-SD-NEXT:    add x8, sp, #8
392; CHECK-SD-NEXT:    mov v4.s[1], v5.s[0]
393; CHECK-SD-NEXT:    ld1 { v7.s }[2], [x8]
394; CHECK-SD-NEXT:    add x8, sp, #32
395; CHECK-SD-NEXT:    mov v0.s[2], v2.s[0]
396; CHECK-SD-NEXT:    ld1 { v1.s }[1], [x8]
397; CHECK-SD-NEXT:    add x8, sp, #16
398; CHECK-SD-NEXT:    mov v4.s[2], v6.s[0]
399; CHECK-SD-NEXT:    ld1 { v7.s }[3], [x8]
400; CHECK-SD-NEXT:    add x8, sp, #40
401; CHECK-SD-NEXT:    ld1 { v1.s }[2], [x8]
402; CHECK-SD-NEXT:    mov v0.s[3], v3.s[0]
403; CHECK-SD-NEXT:    fmax v4.4s, v4.4s, v1.4s
404; CHECK-SD-NEXT:    fmax v0.4s, v0.4s, v7.4s
405; CHECK-SD-NEXT:    mov s5, v4.s[1]
406; CHECK-SD-NEXT:    mov s6, v4.s[2]
407; CHECK-SD-NEXT:    // kill: def $s4 killed $s4 killed $q4
408; CHECK-SD-NEXT:    mov s1, v0.s[1]
409; CHECK-SD-NEXT:    mov s2, v0.s[2]
410; CHECK-SD-NEXT:    mov s3, v0.s[3]
411; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
412; CHECK-SD-NEXT:    ret
413;
414; CHECK-GI-LABEL: max_v7f32:
415; CHECK-GI:       // %bb.0: // %entry
416; CHECK-GI-NEXT:    ldr s16, [sp]
417; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 def $q0
418; CHECK-GI-NEXT:    // kill: def $s7 killed $s7 def $q7
419; CHECK-GI-NEXT:    // kill: def $s1 killed $s1 def $q1
420; CHECK-GI-NEXT:    ldr s17, [sp, #32]
421; CHECK-GI-NEXT:    // kill: def $s4 killed $s4 def $q4
422; CHECK-GI-NEXT:    // kill: def $s2 killed $s2 def $q2
423; CHECK-GI-NEXT:    // kill: def $s5 killed $s5 def $q5
424; CHECK-GI-NEXT:    // kill: def $s3 killed $s3 def $q3
425; CHECK-GI-NEXT:    // kill: def $s6 killed $s6 def $q6
426; CHECK-GI-NEXT:    mov v0.s[1], v1.s[0]
427; CHECK-GI-NEXT:    ldr s1, [sp, #8]
428; CHECK-GI-NEXT:    mov v4.s[1], v5.s[0]
429; CHECK-GI-NEXT:    mov v7.s[1], v16.s[0]
430; CHECK-GI-NEXT:    ldr s16, [sp, #24]
431; CHECK-GI-NEXT:    mov v16.s[1], v17.s[0]
432; CHECK-GI-NEXT:    mov v0.s[2], v2.s[0]
433; CHECK-GI-NEXT:    ldr s2, [sp, #40]
434; CHECK-GI-NEXT:    mov v4.s[2], v6.s[0]
435; CHECK-GI-NEXT:    mov v7.s[2], v1.s[0]
436; CHECK-GI-NEXT:    ldr s1, [sp, #16]
437; CHECK-GI-NEXT:    mov v16.s[2], v2.s[0]
438; CHECK-GI-NEXT:    mov v0.s[3], v3.s[0]
439; CHECK-GI-NEXT:    mov v7.s[3], v1.s[0]
440; CHECK-GI-NEXT:    fmax v4.4s, v4.4s, v16.4s
441; CHECK-GI-NEXT:    fmax v0.4s, v0.4s, v7.4s
442; CHECK-GI-NEXT:    mov s5, v4.s[1]
443; CHECK-GI-NEXT:    mov s6, v4.s[2]
444; CHECK-GI-NEXT:    // kill: def $s4 killed $s4 killed $q4
445; CHECK-GI-NEXT:    mov s1, v0.s[1]
446; CHECK-GI-NEXT:    mov s2, v0.s[2]
447; CHECK-GI-NEXT:    mov s3, v0.s[3]
448; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 killed $q0
449; CHECK-GI-NEXT:    ret
450entry:
451  %c = call <7 x float> @llvm.maximum.v7f32(<7 x float> %a, <7 x float> %b)
452  ret <7 x float> %c
453}
454
455define <8 x float> @min_v8f32(<8 x float> %a, <8 x float> %b) {
456; CHECK-SD-LABEL: min_v8f32:
457; CHECK-SD:       // %bb.0: // %entry
458; CHECK-SD-NEXT:    fmin v1.4s, v1.4s, v3.4s
459; CHECK-SD-NEXT:    fmin v0.4s, v0.4s, v2.4s
460; CHECK-SD-NEXT:    ret
461;
462; CHECK-GI-LABEL: min_v8f32:
463; CHECK-GI:       // %bb.0: // %entry
464; CHECK-GI-NEXT:    fmin v0.4s, v0.4s, v2.4s
465; CHECK-GI-NEXT:    fmin v1.4s, v1.4s, v3.4s
466; CHECK-GI-NEXT:    ret
467entry:
468  %c = call <8 x float> @llvm.minimum.v8f32(<8 x float> %a, <8 x float> %b)
469  ret <8 x float> %c
470}
471
472define <8 x float> @max_v8f32(<8 x float> %a, <8 x float> %b) {
473; CHECK-SD-LABEL: max_v8f32:
474; CHECK-SD:       // %bb.0: // %entry
475; CHECK-SD-NEXT:    fmax v1.4s, v1.4s, v3.4s
476; CHECK-SD-NEXT:    fmax v0.4s, v0.4s, v2.4s
477; CHECK-SD-NEXT:    ret
478;
479; CHECK-GI-LABEL: max_v8f32:
480; CHECK-GI:       // %bb.0: // %entry
481; CHECK-GI-NEXT:    fmax v0.4s, v0.4s, v2.4s
482; CHECK-GI-NEXT:    fmax v1.4s, v1.4s, v3.4s
483; CHECK-GI-NEXT:    ret
484entry:
485  %c = call <8 x float> @llvm.maximum.v8f32(<8 x float> %a, <8 x float> %b)
486  ret <8 x float> %c
487}
488
489define <4 x half> @min_v4f16(<4 x half> %a, <4 x half> %b) {
490; CHECK-NOFP16-SD-LABEL: min_v4f16:
491; CHECK-NOFP16-SD:       // %bb.0: // %entry
492; CHECK-NOFP16-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
493; CHECK-NOFP16-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
494; CHECK-NOFP16-SD-NEXT:    mov h2, v1.h[1]
495; CHECK-NOFP16-SD-NEXT:    mov h3, v0.h[1]
496; CHECK-NOFP16-SD-NEXT:    mov h4, v1.h[2]
497; CHECK-NOFP16-SD-NEXT:    mov h5, v0.h[2]
498; CHECK-NOFP16-SD-NEXT:    fcvt s6, h1
499; CHECK-NOFP16-SD-NEXT:    fcvt s7, h0
500; CHECK-NOFP16-SD-NEXT:    mov h1, v1.h[3]
501; CHECK-NOFP16-SD-NEXT:    fcvt s2, h2
502; CHECK-NOFP16-SD-NEXT:    fcvt s3, h3
503; CHECK-NOFP16-SD-NEXT:    fcvt s1, h1
504; CHECK-NOFP16-SD-NEXT:    fmin s2, s3, s2
505; CHECK-NOFP16-SD-NEXT:    fcvt s3, h4
506; CHECK-NOFP16-SD-NEXT:    fcvt s4, h5
507; CHECK-NOFP16-SD-NEXT:    fmin s5, s7, s6
508; CHECK-NOFP16-SD-NEXT:    mov h6, v0.h[3]
509; CHECK-NOFP16-SD-NEXT:    fmin s3, s4, s3
510; CHECK-NOFP16-SD-NEXT:    fcvt h2, s2
511; CHECK-NOFP16-SD-NEXT:    fcvt h0, s5
512; CHECK-NOFP16-SD-NEXT:    fcvt s4, h6
513; CHECK-NOFP16-SD-NEXT:    mov v0.h[1], v2.h[0]
514; CHECK-NOFP16-SD-NEXT:    fcvt h2, s3
515; CHECK-NOFP16-SD-NEXT:    fmin s1, s4, s1
516; CHECK-NOFP16-SD-NEXT:    mov v0.h[2], v2.h[0]
517; CHECK-NOFP16-SD-NEXT:    fcvt h1, s1
518; CHECK-NOFP16-SD-NEXT:    mov v0.h[3], v1.h[0]
519; CHECK-NOFP16-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
520; CHECK-NOFP16-SD-NEXT:    ret
521;
522; CHECK-FP16-SD-LABEL: min_v4f16:
523; CHECK-FP16-SD:       // %bb.0: // %entry
524; CHECK-FP16-SD-NEXT:    fmin v0.4h, v0.4h, v1.4h
525; CHECK-FP16-SD-NEXT:    ret
526;
527; CHECK-NOFP16-GI-LABEL: min_v4f16:
528; CHECK-NOFP16-GI:       // %bb.0: // %entry
529; CHECK-NOFP16-GI-NEXT:    fcvtl v0.4s, v0.4h
530; CHECK-NOFP16-GI-NEXT:    fcvtl v1.4s, v1.4h
531; CHECK-NOFP16-GI-NEXT:    fmin v0.4s, v0.4s, v1.4s
532; CHECK-NOFP16-GI-NEXT:    fcvtn v0.4h, v0.4s
533; CHECK-NOFP16-GI-NEXT:    ret
534;
535; CHECK-FP16-GI-LABEL: min_v4f16:
536; CHECK-FP16-GI:       // %bb.0: // %entry
537; CHECK-FP16-GI-NEXT:    fmin v0.4h, v0.4h, v1.4h
538; CHECK-FP16-GI-NEXT:    ret
539entry:
540  %c = call <4 x half> @llvm.minimum.v4f16(<4 x half> %a, <4 x half> %b)
541  ret <4 x half> %c
542}
543
544define <4 x half> @max_v4f16(<4 x half> %a, <4 x half> %b) {
545; CHECK-NOFP16-SD-LABEL: max_v4f16:
546; CHECK-NOFP16-SD:       // %bb.0: // %entry
547; CHECK-NOFP16-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
548; CHECK-NOFP16-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
549; CHECK-NOFP16-SD-NEXT:    mov h2, v1.h[1]
550; CHECK-NOFP16-SD-NEXT:    mov h3, v0.h[1]
551; CHECK-NOFP16-SD-NEXT:    mov h4, v1.h[2]
552; CHECK-NOFP16-SD-NEXT:    mov h5, v0.h[2]
553; CHECK-NOFP16-SD-NEXT:    fcvt s6, h1
554; CHECK-NOFP16-SD-NEXT:    fcvt s7, h0
555; CHECK-NOFP16-SD-NEXT:    mov h1, v1.h[3]
556; CHECK-NOFP16-SD-NEXT:    fcvt s2, h2
557; CHECK-NOFP16-SD-NEXT:    fcvt s3, h3
558; CHECK-NOFP16-SD-NEXT:    fcvt s1, h1
559; CHECK-NOFP16-SD-NEXT:    fmax s2, s3, s2
560; CHECK-NOFP16-SD-NEXT:    fcvt s3, h4
561; CHECK-NOFP16-SD-NEXT:    fcvt s4, h5
562; CHECK-NOFP16-SD-NEXT:    fmax s5, s7, s6
563; CHECK-NOFP16-SD-NEXT:    mov h6, v0.h[3]
564; CHECK-NOFP16-SD-NEXT:    fmax s3, s4, s3
565; CHECK-NOFP16-SD-NEXT:    fcvt h2, s2
566; CHECK-NOFP16-SD-NEXT:    fcvt h0, s5
567; CHECK-NOFP16-SD-NEXT:    fcvt s4, h6
568; CHECK-NOFP16-SD-NEXT:    mov v0.h[1], v2.h[0]
569; CHECK-NOFP16-SD-NEXT:    fcvt h2, s3
570; CHECK-NOFP16-SD-NEXT:    fmax s1, s4, s1
571; CHECK-NOFP16-SD-NEXT:    mov v0.h[2], v2.h[0]
572; CHECK-NOFP16-SD-NEXT:    fcvt h1, s1
573; CHECK-NOFP16-SD-NEXT:    mov v0.h[3], v1.h[0]
574; CHECK-NOFP16-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
575; CHECK-NOFP16-SD-NEXT:    ret
576;
577; CHECK-FP16-SD-LABEL: max_v4f16:
578; CHECK-FP16-SD:       // %bb.0: // %entry
579; CHECK-FP16-SD-NEXT:    fmax v0.4h, v0.4h, v1.4h
580; CHECK-FP16-SD-NEXT:    ret
581;
582; CHECK-NOFP16-GI-LABEL: max_v4f16:
583; CHECK-NOFP16-GI:       // %bb.0: // %entry
584; CHECK-NOFP16-GI-NEXT:    fcvtl v0.4s, v0.4h
585; CHECK-NOFP16-GI-NEXT:    fcvtl v1.4s, v1.4h
586; CHECK-NOFP16-GI-NEXT:    fmax v0.4s, v0.4s, v1.4s
587; CHECK-NOFP16-GI-NEXT:    fcvtn v0.4h, v0.4s
588; CHECK-NOFP16-GI-NEXT:    ret
589;
590; CHECK-FP16-GI-LABEL: max_v4f16:
591; CHECK-FP16-GI:       // %bb.0: // %entry
592; CHECK-FP16-GI-NEXT:    fmax v0.4h, v0.4h, v1.4h
593; CHECK-FP16-GI-NEXT:    ret
594entry:
595  %c = call <4 x half> @llvm.maximum.v4f16(<4 x half> %a, <4 x half> %b)
596  ret <4 x half> %c
597}
598
599define <7 x half> @min_v7f16(<7 x half> %a, <7 x half> %b) {
600; CHECK-NOFP16-SD-LABEL: min_v7f16:
601; CHECK-NOFP16-SD:       // %bb.0: // %entry
602; CHECK-NOFP16-SD-NEXT:    mov h2, v1.h[1]
603; CHECK-NOFP16-SD-NEXT:    mov h3, v0.h[1]
604; CHECK-NOFP16-SD-NEXT:    fcvt s4, h1
605; CHECK-NOFP16-SD-NEXT:    fcvt s5, h0
606; CHECK-NOFP16-SD-NEXT:    mov h6, v1.h[2]
607; CHECK-NOFP16-SD-NEXT:    mov h7, v0.h[2]
608; CHECK-NOFP16-SD-NEXT:    mov h16, v1.h[3]
609; CHECK-NOFP16-SD-NEXT:    fcvt s2, h2
610; CHECK-NOFP16-SD-NEXT:    fcvt s3, h3
611; CHECK-NOFP16-SD-NEXT:    fmin s4, s5, s4
612; CHECK-NOFP16-SD-NEXT:    mov h5, v0.h[3]
613; CHECK-NOFP16-SD-NEXT:    fcvt s6, h6
614; CHECK-NOFP16-SD-NEXT:    fcvt s7, h7
615; CHECK-NOFP16-SD-NEXT:    fcvt s16, h16
616; CHECK-NOFP16-SD-NEXT:    fmin s3, s3, s2
617; CHECK-NOFP16-SD-NEXT:    fcvt s5, h5
618; CHECK-NOFP16-SD-NEXT:    fcvt h2, s4
619; CHECK-NOFP16-SD-NEXT:    fmin s4, s7, s6
620; CHECK-NOFP16-SD-NEXT:    mov h6, v1.h[4]
621; CHECK-NOFP16-SD-NEXT:    mov h7, v0.h[4]
622; CHECK-NOFP16-SD-NEXT:    fcvt h3, s3
623; CHECK-NOFP16-SD-NEXT:    fmin s5, s5, s16
624; CHECK-NOFP16-SD-NEXT:    mov h16, v0.h[5]
625; CHECK-NOFP16-SD-NEXT:    fcvt h4, s4
626; CHECK-NOFP16-SD-NEXT:    mov v2.h[1], v3.h[0]
627; CHECK-NOFP16-SD-NEXT:    fcvt s3, h6
628; CHECK-NOFP16-SD-NEXT:    fcvt s6, h7
629; CHECK-NOFP16-SD-NEXT:    mov h7, v1.h[5]
630; CHECK-NOFP16-SD-NEXT:    fcvt h5, s5
631; CHECK-NOFP16-SD-NEXT:    fcvt s16, h16
632; CHECK-NOFP16-SD-NEXT:    mov v2.h[2], v4.h[0]
633; CHECK-NOFP16-SD-NEXT:    mov h4, v1.h[6]
634; CHECK-NOFP16-SD-NEXT:    fmin s3, s6, s3
635; CHECK-NOFP16-SD-NEXT:    mov h6, v0.h[6]
636; CHECK-NOFP16-SD-NEXT:    fcvt s7, h7
637; CHECK-NOFP16-SD-NEXT:    mov h1, v1.h[7]
638; CHECK-NOFP16-SD-NEXT:    mov h0, v0.h[7]
639; CHECK-NOFP16-SD-NEXT:    mov v2.h[3], v5.h[0]
640; CHECK-NOFP16-SD-NEXT:    fcvt s4, h4
641; CHECK-NOFP16-SD-NEXT:    fcvt h3, s3
642; CHECK-NOFP16-SD-NEXT:    fcvt s5, h6
643; CHECK-NOFP16-SD-NEXT:    fmin s6, s16, s7
644; CHECK-NOFP16-SD-NEXT:    fcvt s1, h1
645; CHECK-NOFP16-SD-NEXT:    fcvt s0, h0
646; CHECK-NOFP16-SD-NEXT:    mov v2.h[4], v3.h[0]
647; CHECK-NOFP16-SD-NEXT:    fmin s4, s5, s4
648; CHECK-NOFP16-SD-NEXT:    fcvt h3, s6
649; CHECK-NOFP16-SD-NEXT:    fmin s0, s0, s1
650; CHECK-NOFP16-SD-NEXT:    mov v2.h[5], v3.h[0]
651; CHECK-NOFP16-SD-NEXT:    fcvt h3, s4
652; CHECK-NOFP16-SD-NEXT:    fcvt h0, s0
653; CHECK-NOFP16-SD-NEXT:    mov v2.h[6], v3.h[0]
654; CHECK-NOFP16-SD-NEXT:    mov v2.h[7], v0.h[0]
655; CHECK-NOFP16-SD-NEXT:    mov v0.16b, v2.16b
656; CHECK-NOFP16-SD-NEXT:    ret
657;
658; CHECK-FP16-SD-LABEL: min_v7f16:
659; CHECK-FP16-SD:       // %bb.0: // %entry
660; CHECK-FP16-SD-NEXT:    fmin v0.8h, v0.8h, v1.8h
661; CHECK-FP16-SD-NEXT:    ret
662;
663; CHECK-NOFP16-GI-LABEL: min_v7f16:
664; CHECK-NOFP16-GI:       // %bb.0: // %entry
665; CHECK-NOFP16-GI-NEXT:    fcvtl v2.4s, v0.4h
666; CHECK-NOFP16-GI-NEXT:    fcvtl v3.4s, v1.4h
667; CHECK-NOFP16-GI-NEXT:    mov v4.h[0], v0.h[4]
668; CHECK-NOFP16-GI-NEXT:    fmin v2.4s, v2.4s, v3.4s
669; CHECK-NOFP16-GI-NEXT:    mov v3.h[0], v1.h[4]
670; CHECK-NOFP16-GI-NEXT:    mov v4.h[1], v0.h[5]
671; CHECK-NOFP16-GI-NEXT:    mov v3.h[1], v1.h[5]
672; CHECK-NOFP16-GI-NEXT:    fcvtn v2.4h, v2.4s
673; CHECK-NOFP16-GI-NEXT:    mov v4.h[2], v0.h[6]
674; CHECK-NOFP16-GI-NEXT:    mov v3.h[2], v1.h[6]
675; CHECK-NOFP16-GI-NEXT:    mov v0.h[0], v2.h[0]
676; CHECK-NOFP16-GI-NEXT:    fcvtl v1.4s, v4.4h
677; CHECK-NOFP16-GI-NEXT:    fcvtl v3.4s, v3.4h
678; CHECK-NOFP16-GI-NEXT:    mov v0.h[1], v2.h[1]
679; CHECK-NOFP16-GI-NEXT:    fmin v1.4s, v1.4s, v3.4s
680; CHECK-NOFP16-GI-NEXT:    mov v0.h[2], v2.h[2]
681; CHECK-NOFP16-GI-NEXT:    fcvtn v1.4h, v1.4s
682; CHECK-NOFP16-GI-NEXT:    mov v0.h[3], v2.h[3]
683; CHECK-NOFP16-GI-NEXT:    mov v0.h[4], v1.h[0]
684; CHECK-NOFP16-GI-NEXT:    mov v0.h[5], v1.h[1]
685; CHECK-NOFP16-GI-NEXT:    mov v0.h[6], v1.h[2]
686; CHECK-NOFP16-GI-NEXT:    ret
687;
688; CHECK-FP16-GI-LABEL: min_v7f16:
689; CHECK-FP16-GI:       // %bb.0: // %entry
690; CHECK-FP16-GI-NEXT:    fmin v0.8h, v0.8h, v1.8h
691; CHECK-FP16-GI-NEXT:    ret
692entry:
693  %c = call <7 x half> @llvm.minimum.v7f16(<7 x half> %a, <7 x half> %b)
694  ret <7 x half> %c
695}
696
697define <7 x half> @max_v7f16(<7 x half> %a, <7 x half> %b) {
698; CHECK-NOFP16-SD-LABEL: max_v7f16:
699; CHECK-NOFP16-SD:       // %bb.0: // %entry
700; CHECK-NOFP16-SD-NEXT:    mov h2, v1.h[1]
701; CHECK-NOFP16-SD-NEXT:    mov h3, v0.h[1]
702; CHECK-NOFP16-SD-NEXT:    fcvt s4, h1
703; CHECK-NOFP16-SD-NEXT:    fcvt s5, h0
704; CHECK-NOFP16-SD-NEXT:    mov h6, v1.h[2]
705; CHECK-NOFP16-SD-NEXT:    mov h7, v0.h[2]
706; CHECK-NOFP16-SD-NEXT:    mov h16, v1.h[3]
707; CHECK-NOFP16-SD-NEXT:    fcvt s2, h2
708; CHECK-NOFP16-SD-NEXT:    fcvt s3, h3
709; CHECK-NOFP16-SD-NEXT:    fmax s4, s5, s4
710; CHECK-NOFP16-SD-NEXT:    mov h5, v0.h[3]
711; CHECK-NOFP16-SD-NEXT:    fcvt s6, h6
712; CHECK-NOFP16-SD-NEXT:    fcvt s7, h7
713; CHECK-NOFP16-SD-NEXT:    fcvt s16, h16
714; CHECK-NOFP16-SD-NEXT:    fmax s3, s3, s2
715; CHECK-NOFP16-SD-NEXT:    fcvt s5, h5
716; CHECK-NOFP16-SD-NEXT:    fcvt h2, s4
717; CHECK-NOFP16-SD-NEXT:    fmax s4, s7, s6
718; CHECK-NOFP16-SD-NEXT:    mov h6, v1.h[4]
719; CHECK-NOFP16-SD-NEXT:    mov h7, v0.h[4]
720; CHECK-NOFP16-SD-NEXT:    fcvt h3, s3
721; CHECK-NOFP16-SD-NEXT:    fmax s5, s5, s16
722; CHECK-NOFP16-SD-NEXT:    mov h16, v0.h[5]
723; CHECK-NOFP16-SD-NEXT:    fcvt h4, s4
724; CHECK-NOFP16-SD-NEXT:    mov v2.h[1], v3.h[0]
725; CHECK-NOFP16-SD-NEXT:    fcvt s3, h6
726; CHECK-NOFP16-SD-NEXT:    fcvt s6, h7
727; CHECK-NOFP16-SD-NEXT:    mov h7, v1.h[5]
728; CHECK-NOFP16-SD-NEXT:    fcvt h5, s5
729; CHECK-NOFP16-SD-NEXT:    fcvt s16, h16
730; CHECK-NOFP16-SD-NEXT:    mov v2.h[2], v4.h[0]
731; CHECK-NOFP16-SD-NEXT:    mov h4, v1.h[6]
732; CHECK-NOFP16-SD-NEXT:    fmax s3, s6, s3
733; CHECK-NOFP16-SD-NEXT:    mov h6, v0.h[6]
734; CHECK-NOFP16-SD-NEXT:    fcvt s7, h7
735; CHECK-NOFP16-SD-NEXT:    mov h1, v1.h[7]
736; CHECK-NOFP16-SD-NEXT:    mov h0, v0.h[7]
737; CHECK-NOFP16-SD-NEXT:    mov v2.h[3], v5.h[0]
738; CHECK-NOFP16-SD-NEXT:    fcvt s4, h4
739; CHECK-NOFP16-SD-NEXT:    fcvt h3, s3
740; CHECK-NOFP16-SD-NEXT:    fcvt s5, h6
741; CHECK-NOFP16-SD-NEXT:    fmax s6, s16, s7
742; CHECK-NOFP16-SD-NEXT:    fcvt s1, h1
743; CHECK-NOFP16-SD-NEXT:    fcvt s0, h0
744; CHECK-NOFP16-SD-NEXT:    mov v2.h[4], v3.h[0]
745; CHECK-NOFP16-SD-NEXT:    fmax s4, s5, s4
746; CHECK-NOFP16-SD-NEXT:    fcvt h3, s6
747; CHECK-NOFP16-SD-NEXT:    fmax s0, s0, s1
748; CHECK-NOFP16-SD-NEXT:    mov v2.h[5], v3.h[0]
749; CHECK-NOFP16-SD-NEXT:    fcvt h3, s4
750; CHECK-NOFP16-SD-NEXT:    fcvt h0, s0
751; CHECK-NOFP16-SD-NEXT:    mov v2.h[6], v3.h[0]
752; CHECK-NOFP16-SD-NEXT:    mov v2.h[7], v0.h[0]
753; CHECK-NOFP16-SD-NEXT:    mov v0.16b, v2.16b
754; CHECK-NOFP16-SD-NEXT:    ret
755;
756; CHECK-FP16-SD-LABEL: max_v7f16:
757; CHECK-FP16-SD:       // %bb.0: // %entry
758; CHECK-FP16-SD-NEXT:    fmax v0.8h, v0.8h, v1.8h
759; CHECK-FP16-SD-NEXT:    ret
760;
761; CHECK-NOFP16-GI-LABEL: max_v7f16:
762; CHECK-NOFP16-GI:       // %bb.0: // %entry
763; CHECK-NOFP16-GI-NEXT:    fcvtl v2.4s, v0.4h
764; CHECK-NOFP16-GI-NEXT:    fcvtl v3.4s, v1.4h
765; CHECK-NOFP16-GI-NEXT:    mov v4.h[0], v0.h[4]
766; CHECK-NOFP16-GI-NEXT:    fmax v2.4s, v2.4s, v3.4s
767; CHECK-NOFP16-GI-NEXT:    mov v3.h[0], v1.h[4]
768; CHECK-NOFP16-GI-NEXT:    mov v4.h[1], v0.h[5]
769; CHECK-NOFP16-GI-NEXT:    mov v3.h[1], v1.h[5]
770; CHECK-NOFP16-GI-NEXT:    fcvtn v2.4h, v2.4s
771; CHECK-NOFP16-GI-NEXT:    mov v4.h[2], v0.h[6]
772; CHECK-NOFP16-GI-NEXT:    mov v3.h[2], v1.h[6]
773; CHECK-NOFP16-GI-NEXT:    mov v0.h[0], v2.h[0]
774; CHECK-NOFP16-GI-NEXT:    fcvtl v1.4s, v4.4h
775; CHECK-NOFP16-GI-NEXT:    fcvtl v3.4s, v3.4h
776; CHECK-NOFP16-GI-NEXT:    mov v0.h[1], v2.h[1]
777; CHECK-NOFP16-GI-NEXT:    fmax v1.4s, v1.4s, v3.4s
778; CHECK-NOFP16-GI-NEXT:    mov v0.h[2], v2.h[2]
779; CHECK-NOFP16-GI-NEXT:    fcvtn v1.4h, v1.4s
780; CHECK-NOFP16-GI-NEXT:    mov v0.h[3], v2.h[3]
781; CHECK-NOFP16-GI-NEXT:    mov v0.h[4], v1.h[0]
782; CHECK-NOFP16-GI-NEXT:    mov v0.h[5], v1.h[1]
783; CHECK-NOFP16-GI-NEXT:    mov v0.h[6], v1.h[2]
784; CHECK-NOFP16-GI-NEXT:    ret
785;
786; CHECK-FP16-GI-LABEL: max_v7f16:
787; CHECK-FP16-GI:       // %bb.0: // %entry
788; CHECK-FP16-GI-NEXT:    fmax v0.8h, v0.8h, v1.8h
789; CHECK-FP16-GI-NEXT:    ret
790entry:
791  %c = call <7 x half> @llvm.maximum.v7f16(<7 x half> %a, <7 x half> %b)
792  ret <7 x half> %c
793}
794
795define <8 x half> @min_v8f16(<8 x half> %a, <8 x half> %b) {
796; CHECK-NOFP16-SD-LABEL: min_v8f16:
797; CHECK-NOFP16-SD:       // %bb.0: // %entry
798; CHECK-NOFP16-SD-NEXT:    mov h2, v1.h[1]
799; CHECK-NOFP16-SD-NEXT:    mov h3, v0.h[1]
800; CHECK-NOFP16-SD-NEXT:    fcvt s4, h1
801; CHECK-NOFP16-SD-NEXT:    fcvt s5, h0
802; CHECK-NOFP16-SD-NEXT:    mov h6, v1.h[2]
803; CHECK-NOFP16-SD-NEXT:    mov h7, v0.h[2]
804; CHECK-NOFP16-SD-NEXT:    mov h16, v1.h[3]
805; CHECK-NOFP16-SD-NEXT:    fcvt s2, h2
806; CHECK-NOFP16-SD-NEXT:    fcvt s3, h3
807; CHECK-NOFP16-SD-NEXT:    fmin s4, s5, s4
808; CHECK-NOFP16-SD-NEXT:    mov h5, v0.h[3]
809; CHECK-NOFP16-SD-NEXT:    fcvt s6, h6
810; CHECK-NOFP16-SD-NEXT:    fcvt s7, h7
811; CHECK-NOFP16-SD-NEXT:    fcvt s16, h16
812; CHECK-NOFP16-SD-NEXT:    fmin s3, s3, s2
813; CHECK-NOFP16-SD-NEXT:    fcvt s5, h5
814; CHECK-NOFP16-SD-NEXT:    fcvt h2, s4
815; CHECK-NOFP16-SD-NEXT:    fmin s4, s7, s6
816; CHECK-NOFP16-SD-NEXT:    mov h6, v1.h[4]
817; CHECK-NOFP16-SD-NEXT:    mov h7, v0.h[4]
818; CHECK-NOFP16-SD-NEXT:    fcvt h3, s3
819; CHECK-NOFP16-SD-NEXT:    fmin s5, s5, s16
820; CHECK-NOFP16-SD-NEXT:    mov h16, v0.h[5]
821; CHECK-NOFP16-SD-NEXT:    fcvt h4, s4
822; CHECK-NOFP16-SD-NEXT:    mov v2.h[1], v3.h[0]
823; CHECK-NOFP16-SD-NEXT:    fcvt s3, h6
824; CHECK-NOFP16-SD-NEXT:    fcvt s6, h7
825; CHECK-NOFP16-SD-NEXT:    mov h7, v1.h[5]
826; CHECK-NOFP16-SD-NEXT:    fcvt h5, s5
827; CHECK-NOFP16-SD-NEXT:    fcvt s16, h16
828; CHECK-NOFP16-SD-NEXT:    mov v2.h[2], v4.h[0]
829; CHECK-NOFP16-SD-NEXT:    mov h4, v1.h[6]
830; CHECK-NOFP16-SD-NEXT:    fmin s3, s6, s3
831; CHECK-NOFP16-SD-NEXT:    mov h6, v0.h[6]
832; CHECK-NOFP16-SD-NEXT:    fcvt s7, h7
833; CHECK-NOFP16-SD-NEXT:    mov h1, v1.h[7]
834; CHECK-NOFP16-SD-NEXT:    mov h0, v0.h[7]
835; CHECK-NOFP16-SD-NEXT:    mov v2.h[3], v5.h[0]
836; CHECK-NOFP16-SD-NEXT:    fcvt s4, h4
837; CHECK-NOFP16-SD-NEXT:    fcvt h3, s3
838; CHECK-NOFP16-SD-NEXT:    fcvt s5, h6
839; CHECK-NOFP16-SD-NEXT:    fmin s6, s16, s7
840; CHECK-NOFP16-SD-NEXT:    fcvt s1, h1
841; CHECK-NOFP16-SD-NEXT:    fcvt s0, h0
842; CHECK-NOFP16-SD-NEXT:    mov v2.h[4], v3.h[0]
843; CHECK-NOFP16-SD-NEXT:    fmin s4, s5, s4
844; CHECK-NOFP16-SD-NEXT:    fcvt h3, s6
845; CHECK-NOFP16-SD-NEXT:    fmin s0, s0, s1
846; CHECK-NOFP16-SD-NEXT:    mov v2.h[5], v3.h[0]
847; CHECK-NOFP16-SD-NEXT:    fcvt h3, s4
848; CHECK-NOFP16-SD-NEXT:    fcvt h0, s0
849; CHECK-NOFP16-SD-NEXT:    mov v2.h[6], v3.h[0]
850; CHECK-NOFP16-SD-NEXT:    mov v2.h[7], v0.h[0]
851; CHECK-NOFP16-SD-NEXT:    mov v0.16b, v2.16b
852; CHECK-NOFP16-SD-NEXT:    ret
853;
854; CHECK-FP16-SD-LABEL: min_v8f16:
855; CHECK-FP16-SD:       // %bb.0: // %entry
856; CHECK-FP16-SD-NEXT:    fmin v0.8h, v0.8h, v1.8h
857; CHECK-FP16-SD-NEXT:    ret
858;
859; CHECK-NOFP16-GI-LABEL: min_v8f16:
860; CHECK-NOFP16-GI:       // %bb.0: // %entry
861; CHECK-NOFP16-GI-NEXT:    fcvtl v2.4s, v0.4h
862; CHECK-NOFP16-GI-NEXT:    fcvtl v3.4s, v1.4h
863; CHECK-NOFP16-GI-NEXT:    fcvtl2 v0.4s, v0.8h
864; CHECK-NOFP16-GI-NEXT:    fcvtl2 v1.4s, v1.8h
865; CHECK-NOFP16-GI-NEXT:    fmin v2.4s, v2.4s, v3.4s
866; CHECK-NOFP16-GI-NEXT:    fmin v1.4s, v0.4s, v1.4s
867; CHECK-NOFP16-GI-NEXT:    fcvtn v0.4h, v2.4s
868; CHECK-NOFP16-GI-NEXT:    fcvtn2 v0.8h, v1.4s
869; CHECK-NOFP16-GI-NEXT:    ret
870;
871; CHECK-FP16-GI-LABEL: min_v8f16:
872; CHECK-FP16-GI:       // %bb.0: // %entry
873; CHECK-FP16-GI-NEXT:    fmin v0.8h, v0.8h, v1.8h
874; CHECK-FP16-GI-NEXT:    ret
875entry:
876  %c = call <8 x half> @llvm.minimum.v8f16(<8 x half> %a, <8 x half> %b)
877  ret <8 x half> %c
878}
879
880define <8 x half> @max_v8f16(<8 x half> %a, <8 x half> %b) {
881; CHECK-NOFP16-SD-LABEL: max_v8f16:
882; CHECK-NOFP16-SD:       // %bb.0: // %entry
883; CHECK-NOFP16-SD-NEXT:    mov h2, v1.h[1]
884; CHECK-NOFP16-SD-NEXT:    mov h3, v0.h[1]
885; CHECK-NOFP16-SD-NEXT:    fcvt s4, h1
886; CHECK-NOFP16-SD-NEXT:    fcvt s5, h0
887; CHECK-NOFP16-SD-NEXT:    mov h6, v1.h[2]
888; CHECK-NOFP16-SD-NEXT:    mov h7, v0.h[2]
889; CHECK-NOFP16-SD-NEXT:    mov h16, v1.h[3]
890; CHECK-NOFP16-SD-NEXT:    fcvt s2, h2
891; CHECK-NOFP16-SD-NEXT:    fcvt s3, h3
892; CHECK-NOFP16-SD-NEXT:    fmax s4, s5, s4
893; CHECK-NOFP16-SD-NEXT:    mov h5, v0.h[3]
894; CHECK-NOFP16-SD-NEXT:    fcvt s6, h6
895; CHECK-NOFP16-SD-NEXT:    fcvt s7, h7
896; CHECK-NOFP16-SD-NEXT:    fcvt s16, h16
897; CHECK-NOFP16-SD-NEXT:    fmax s3, s3, s2
898; CHECK-NOFP16-SD-NEXT:    fcvt s5, h5
899; CHECK-NOFP16-SD-NEXT:    fcvt h2, s4
900; CHECK-NOFP16-SD-NEXT:    fmax s4, s7, s6
901; CHECK-NOFP16-SD-NEXT:    mov h6, v1.h[4]
902; CHECK-NOFP16-SD-NEXT:    mov h7, v0.h[4]
903; CHECK-NOFP16-SD-NEXT:    fcvt h3, s3
904; CHECK-NOFP16-SD-NEXT:    fmax s5, s5, s16
905; CHECK-NOFP16-SD-NEXT:    mov h16, v0.h[5]
906; CHECK-NOFP16-SD-NEXT:    fcvt h4, s4
907; CHECK-NOFP16-SD-NEXT:    mov v2.h[1], v3.h[0]
908; CHECK-NOFP16-SD-NEXT:    fcvt s3, h6
909; CHECK-NOFP16-SD-NEXT:    fcvt s6, h7
910; CHECK-NOFP16-SD-NEXT:    mov h7, v1.h[5]
911; CHECK-NOFP16-SD-NEXT:    fcvt h5, s5
912; CHECK-NOFP16-SD-NEXT:    fcvt s16, h16
913; CHECK-NOFP16-SD-NEXT:    mov v2.h[2], v4.h[0]
914; CHECK-NOFP16-SD-NEXT:    mov h4, v1.h[6]
915; CHECK-NOFP16-SD-NEXT:    fmax s3, s6, s3
916; CHECK-NOFP16-SD-NEXT:    mov h6, v0.h[6]
917; CHECK-NOFP16-SD-NEXT:    fcvt s7, h7
918; CHECK-NOFP16-SD-NEXT:    mov h1, v1.h[7]
919; CHECK-NOFP16-SD-NEXT:    mov h0, v0.h[7]
920; CHECK-NOFP16-SD-NEXT:    mov v2.h[3], v5.h[0]
921; CHECK-NOFP16-SD-NEXT:    fcvt s4, h4
922; CHECK-NOFP16-SD-NEXT:    fcvt h3, s3
923; CHECK-NOFP16-SD-NEXT:    fcvt s5, h6
924; CHECK-NOFP16-SD-NEXT:    fmax s6, s16, s7
925; CHECK-NOFP16-SD-NEXT:    fcvt s1, h1
926; CHECK-NOFP16-SD-NEXT:    fcvt s0, h0
927; CHECK-NOFP16-SD-NEXT:    mov v2.h[4], v3.h[0]
928; CHECK-NOFP16-SD-NEXT:    fmax s4, s5, s4
929; CHECK-NOFP16-SD-NEXT:    fcvt h3, s6
930; CHECK-NOFP16-SD-NEXT:    fmax s0, s0, s1
931; CHECK-NOFP16-SD-NEXT:    mov v2.h[5], v3.h[0]
932; CHECK-NOFP16-SD-NEXT:    fcvt h3, s4
933; CHECK-NOFP16-SD-NEXT:    fcvt h0, s0
934; CHECK-NOFP16-SD-NEXT:    mov v2.h[6], v3.h[0]
935; CHECK-NOFP16-SD-NEXT:    mov v2.h[7], v0.h[0]
936; CHECK-NOFP16-SD-NEXT:    mov v0.16b, v2.16b
937; CHECK-NOFP16-SD-NEXT:    ret
938;
939; CHECK-FP16-SD-LABEL: max_v8f16:
940; CHECK-FP16-SD:       // %bb.0: // %entry
941; CHECK-FP16-SD-NEXT:    fmax v0.8h, v0.8h, v1.8h
942; CHECK-FP16-SD-NEXT:    ret
943;
944; CHECK-NOFP16-GI-LABEL: max_v8f16:
945; CHECK-NOFP16-GI:       // %bb.0: // %entry
946; CHECK-NOFP16-GI-NEXT:    fcvtl v2.4s, v0.4h
947; CHECK-NOFP16-GI-NEXT:    fcvtl v3.4s, v1.4h
948; CHECK-NOFP16-GI-NEXT:    fcvtl2 v0.4s, v0.8h
949; CHECK-NOFP16-GI-NEXT:    fcvtl2 v1.4s, v1.8h
950; CHECK-NOFP16-GI-NEXT:    fmax v2.4s, v2.4s, v3.4s
951; CHECK-NOFP16-GI-NEXT:    fmax v1.4s, v0.4s, v1.4s
952; CHECK-NOFP16-GI-NEXT:    fcvtn v0.4h, v2.4s
953; CHECK-NOFP16-GI-NEXT:    fcvtn2 v0.8h, v1.4s
954; CHECK-NOFP16-GI-NEXT:    ret
955;
956; CHECK-FP16-GI-LABEL: max_v8f16:
957; CHECK-FP16-GI:       // %bb.0: // %entry
958; CHECK-FP16-GI-NEXT:    fmax v0.8h, v0.8h, v1.8h
959; CHECK-FP16-GI-NEXT:    ret
960entry:
961  %c = call <8 x half> @llvm.maximum.v8f16(<8 x half> %a, <8 x half> %b)
962  ret <8 x half> %c
963}
964
965define <16 x half> @min_v16f16(<16 x half> %a, <16 x half> %b) {
966; CHECK-NOFP16-SD-LABEL: min_v16f16:
967; CHECK-NOFP16-SD:       // %bb.0: // %entry
968; CHECK-NOFP16-SD-NEXT:    mov h6, v2.h[1]
969; CHECK-NOFP16-SD-NEXT:    mov h7, v0.h[1]
970; CHECK-NOFP16-SD-NEXT:    fcvt s4, h2
971; CHECK-NOFP16-SD-NEXT:    fcvt s5, h0
972; CHECK-NOFP16-SD-NEXT:    mov h16, v3.h[1]
973; CHECK-NOFP16-SD-NEXT:    mov h17, v1.h[1]
974; CHECK-NOFP16-SD-NEXT:    mov h18, v2.h[2]
975; CHECK-NOFP16-SD-NEXT:    mov h19, v0.h[2]
976; CHECK-NOFP16-SD-NEXT:    fcvt s20, h3
977; CHECK-NOFP16-SD-NEXT:    fcvt s21, h1
978; CHECK-NOFP16-SD-NEXT:    mov h22, v3.h[2]
979; CHECK-NOFP16-SD-NEXT:    mov h23, v1.h[2]
980; CHECK-NOFP16-SD-NEXT:    fcvt s6, h6
981; CHECK-NOFP16-SD-NEXT:    fcvt s7, h7
982; CHECK-NOFP16-SD-NEXT:    mov h24, v0.h[6]
983; CHECK-NOFP16-SD-NEXT:    fmin s4, s5, s4
984; CHECK-NOFP16-SD-NEXT:    fcvt s5, h16
985; CHECK-NOFP16-SD-NEXT:    fcvt s16, h17
986; CHECK-NOFP16-SD-NEXT:    fcvt s17, h18
987; CHECK-NOFP16-SD-NEXT:    fcvt s18, h19
988; CHECK-NOFP16-SD-NEXT:    mov h19, v0.h[3]
989; CHECK-NOFP16-SD-NEXT:    fmin s20, s21, s20
990; CHECK-NOFP16-SD-NEXT:    fcvt s21, h22
991; CHECK-NOFP16-SD-NEXT:    mov h22, v3.h[3]
992; CHECK-NOFP16-SD-NEXT:    fmin s6, s7, s6
993; CHECK-NOFP16-SD-NEXT:    mov h7, v2.h[3]
994; CHECK-NOFP16-SD-NEXT:    mov h25, v1.h[6]
995; CHECK-NOFP16-SD-NEXT:    fcvt h4, s4
996; CHECK-NOFP16-SD-NEXT:    fmin s5, s16, s5
997; CHECK-NOFP16-SD-NEXT:    fcvt s16, h23
998; CHECK-NOFP16-SD-NEXT:    mov h23, v1.h[3]
999; CHECK-NOFP16-SD-NEXT:    fmin s17, s18, s17
1000; CHECK-NOFP16-SD-NEXT:    fcvt s18, h19
1001; CHECK-NOFP16-SD-NEXT:    fcvt h6, s6
1002; CHECK-NOFP16-SD-NEXT:    fcvt s7, h7
1003; CHECK-NOFP16-SD-NEXT:    fcvt h19, s5
1004; CHECK-NOFP16-SD-NEXT:    fcvt h5, s20
1005; CHECK-NOFP16-SD-NEXT:    fmin s16, s16, s21
1006; CHECK-NOFP16-SD-NEXT:    fcvt s20, h23
1007; CHECK-NOFP16-SD-NEXT:    fcvt h17, s17
1008; CHECK-NOFP16-SD-NEXT:    mov h21, v2.h[4]
1009; CHECK-NOFP16-SD-NEXT:    mov h23, v1.h[4]
1010; CHECK-NOFP16-SD-NEXT:    mov v4.h[1], v6.h[0]
1011; CHECK-NOFP16-SD-NEXT:    fcvt s6, h22
1012; CHECK-NOFP16-SD-NEXT:    mov h22, v0.h[4]
1013; CHECK-NOFP16-SD-NEXT:    fmin s7, s18, s7
1014; CHECK-NOFP16-SD-NEXT:    mov h18, v3.h[4]
1015; CHECK-NOFP16-SD-NEXT:    mov v5.h[1], v19.h[0]
1016; CHECK-NOFP16-SD-NEXT:    fcvt h16, s16
1017; CHECK-NOFP16-SD-NEXT:    fmin s6, s20, s6
1018; CHECK-NOFP16-SD-NEXT:    mov v4.h[2], v17.h[0]
1019; CHECK-NOFP16-SD-NEXT:    fcvt s17, h21
1020; CHECK-NOFP16-SD-NEXT:    fcvt s19, h22
1021; CHECK-NOFP16-SD-NEXT:    fcvt h7, s7
1022; CHECK-NOFP16-SD-NEXT:    fcvt s18, h18
1023; CHECK-NOFP16-SD-NEXT:    fcvt s20, h23
1024; CHECK-NOFP16-SD-NEXT:    mov h21, v2.h[5]
1025; CHECK-NOFP16-SD-NEXT:    mov h22, v0.h[5]
1026; CHECK-NOFP16-SD-NEXT:    mov v5.h[2], v16.h[0]
1027; CHECK-NOFP16-SD-NEXT:    mov h16, v3.h[5]
1028; CHECK-NOFP16-SD-NEXT:    mov h23, v1.h[5]
1029; CHECK-NOFP16-SD-NEXT:    fcvt h6, s6
1030; CHECK-NOFP16-SD-NEXT:    mov h0, v0.h[7]
1031; CHECK-NOFP16-SD-NEXT:    mov h1, v1.h[7]
1032; CHECK-NOFP16-SD-NEXT:    fmin s17, s19, s17
1033; CHECK-NOFP16-SD-NEXT:    mov h19, v2.h[6]
1034; CHECK-NOFP16-SD-NEXT:    mov v4.h[3], v7.h[0]
1035; CHECK-NOFP16-SD-NEXT:    fmin s18, s20, s18
1036; CHECK-NOFP16-SD-NEXT:    mov h20, v3.h[6]
1037; CHECK-NOFP16-SD-NEXT:    fcvt s7, h21
1038; CHECK-NOFP16-SD-NEXT:    fcvt s21, h22
1039; CHECK-NOFP16-SD-NEXT:    fcvt s22, h24
1040; CHECK-NOFP16-SD-NEXT:    mov h2, v2.h[7]
1041; CHECK-NOFP16-SD-NEXT:    mov v5.h[3], v6.h[0]
1042; CHECK-NOFP16-SD-NEXT:    fcvt s6, h16
1043; CHECK-NOFP16-SD-NEXT:    fcvt s16, h23
1044; CHECK-NOFP16-SD-NEXT:    fcvt h17, s17
1045; CHECK-NOFP16-SD-NEXT:    fcvt s19, h19
1046; CHECK-NOFP16-SD-NEXT:    fcvt s23, h25
1047; CHECK-NOFP16-SD-NEXT:    fcvt h18, s18
1048; CHECK-NOFP16-SD-NEXT:    fcvt s20, h20
1049; CHECK-NOFP16-SD-NEXT:    mov h3, v3.h[7]
1050; CHECK-NOFP16-SD-NEXT:    fmin s7, s21, s7
1051; CHECK-NOFP16-SD-NEXT:    fcvt s2, h2
1052; CHECK-NOFP16-SD-NEXT:    fcvt s0, h0
1053; CHECK-NOFP16-SD-NEXT:    fmin s6, s16, s6
1054; CHECK-NOFP16-SD-NEXT:    fcvt s1, h1
1055; CHECK-NOFP16-SD-NEXT:    mov v4.h[4], v17.h[0]
1056; CHECK-NOFP16-SD-NEXT:    fmin s16, s22, s19
1057; CHECK-NOFP16-SD-NEXT:    mov v5.h[4], v18.h[0]
1058; CHECK-NOFP16-SD-NEXT:    fmin s17, s23, s20
1059; CHECK-NOFP16-SD-NEXT:    fcvt s3, h3
1060; CHECK-NOFP16-SD-NEXT:    fcvt h7, s7
1061; CHECK-NOFP16-SD-NEXT:    fmin s0, s0, s2
1062; CHECK-NOFP16-SD-NEXT:    fcvt h6, s6
1063; CHECK-NOFP16-SD-NEXT:    fcvt h2, s16
1064; CHECK-NOFP16-SD-NEXT:    fmin s1, s1, s3
1065; CHECK-NOFP16-SD-NEXT:    mov v4.h[5], v7.h[0]
1066; CHECK-NOFP16-SD-NEXT:    fcvt h0, s0
1067; CHECK-NOFP16-SD-NEXT:    mov v5.h[5], v6.h[0]
1068; CHECK-NOFP16-SD-NEXT:    fcvt h6, s17
1069; CHECK-NOFP16-SD-NEXT:    fcvt h1, s1
1070; CHECK-NOFP16-SD-NEXT:    mov v4.h[6], v2.h[0]
1071; CHECK-NOFP16-SD-NEXT:    mov v5.h[6], v6.h[0]
1072; CHECK-NOFP16-SD-NEXT:    mov v4.h[7], v0.h[0]
1073; CHECK-NOFP16-SD-NEXT:    mov v5.h[7], v1.h[0]
1074; CHECK-NOFP16-SD-NEXT:    mov v0.16b, v4.16b
1075; CHECK-NOFP16-SD-NEXT:    mov v1.16b, v5.16b
1076; CHECK-NOFP16-SD-NEXT:    ret
1077;
1078; CHECK-FP16-SD-LABEL: min_v16f16:
1079; CHECK-FP16-SD:       // %bb.0: // %entry
1080; CHECK-FP16-SD-NEXT:    fmin v1.8h, v1.8h, v3.8h
1081; CHECK-FP16-SD-NEXT:    fmin v0.8h, v0.8h, v2.8h
1082; CHECK-FP16-SD-NEXT:    ret
1083;
1084; CHECK-NOFP16-GI-LABEL: min_v16f16:
1085; CHECK-NOFP16-GI:       // %bb.0: // %entry
1086; CHECK-NOFP16-GI-NEXT:    fcvtl v4.4s, v0.4h
1087; CHECK-NOFP16-GI-NEXT:    fcvtl v5.4s, v1.4h
1088; CHECK-NOFP16-GI-NEXT:    fcvtl v6.4s, v2.4h
1089; CHECK-NOFP16-GI-NEXT:    fcvtl v7.4s, v3.4h
1090; CHECK-NOFP16-GI-NEXT:    fcvtl2 v0.4s, v0.8h
1091; CHECK-NOFP16-GI-NEXT:    fcvtl2 v1.4s, v1.8h
1092; CHECK-NOFP16-GI-NEXT:    fcvtl2 v2.4s, v2.8h
1093; CHECK-NOFP16-GI-NEXT:    fcvtl2 v3.4s, v3.8h
1094; CHECK-NOFP16-GI-NEXT:    fmin v4.4s, v4.4s, v6.4s
1095; CHECK-NOFP16-GI-NEXT:    fmin v5.4s, v5.4s, v7.4s
1096; CHECK-NOFP16-GI-NEXT:    fmin v2.4s, v0.4s, v2.4s
1097; CHECK-NOFP16-GI-NEXT:    fmin v3.4s, v1.4s, v3.4s
1098; CHECK-NOFP16-GI-NEXT:    fcvtn v0.4h, v4.4s
1099; CHECK-NOFP16-GI-NEXT:    fcvtn v1.4h, v5.4s
1100; CHECK-NOFP16-GI-NEXT:    fcvtn2 v0.8h, v2.4s
1101; CHECK-NOFP16-GI-NEXT:    fcvtn2 v1.8h, v3.4s
1102; CHECK-NOFP16-GI-NEXT:    ret
1103;
1104; CHECK-FP16-GI-LABEL: min_v16f16:
1105; CHECK-FP16-GI:       // %bb.0: // %entry
1106; CHECK-FP16-GI-NEXT:    fmin v0.8h, v0.8h, v2.8h
1107; CHECK-FP16-GI-NEXT:    fmin v1.8h, v1.8h, v3.8h
1108; CHECK-FP16-GI-NEXT:    ret
1109entry:
1110  %c = call <16 x half> @llvm.minimum.v16f16(<16 x half> %a, <16 x half> %b)
1111  ret <16 x half> %c
1112}
1113
1114define <16 x half> @max_v16f16(<16 x half> %a, <16 x half> %b) {
1115; CHECK-NOFP16-SD-LABEL: max_v16f16:
1116; CHECK-NOFP16-SD:       // %bb.0: // %entry
1117; CHECK-NOFP16-SD-NEXT:    mov h6, v2.h[1]
1118; CHECK-NOFP16-SD-NEXT:    mov h7, v0.h[1]
1119; CHECK-NOFP16-SD-NEXT:    fcvt s4, h2
1120; CHECK-NOFP16-SD-NEXT:    fcvt s5, h0
1121; CHECK-NOFP16-SD-NEXT:    mov h16, v3.h[1]
1122; CHECK-NOFP16-SD-NEXT:    mov h17, v1.h[1]
1123; CHECK-NOFP16-SD-NEXT:    mov h18, v2.h[2]
1124; CHECK-NOFP16-SD-NEXT:    mov h19, v0.h[2]
1125; CHECK-NOFP16-SD-NEXT:    fcvt s20, h3
1126; CHECK-NOFP16-SD-NEXT:    fcvt s21, h1
1127; CHECK-NOFP16-SD-NEXT:    mov h22, v3.h[2]
1128; CHECK-NOFP16-SD-NEXT:    mov h23, v1.h[2]
1129; CHECK-NOFP16-SD-NEXT:    fcvt s6, h6
1130; CHECK-NOFP16-SD-NEXT:    fcvt s7, h7
1131; CHECK-NOFP16-SD-NEXT:    mov h24, v0.h[6]
1132; CHECK-NOFP16-SD-NEXT:    fmax s4, s5, s4
1133; CHECK-NOFP16-SD-NEXT:    fcvt s5, h16
1134; CHECK-NOFP16-SD-NEXT:    fcvt s16, h17
1135; CHECK-NOFP16-SD-NEXT:    fcvt s17, h18
1136; CHECK-NOFP16-SD-NEXT:    fcvt s18, h19
1137; CHECK-NOFP16-SD-NEXT:    mov h19, v0.h[3]
1138; CHECK-NOFP16-SD-NEXT:    fmax s20, s21, s20
1139; CHECK-NOFP16-SD-NEXT:    fcvt s21, h22
1140; CHECK-NOFP16-SD-NEXT:    mov h22, v3.h[3]
1141; CHECK-NOFP16-SD-NEXT:    fmax s6, s7, s6
1142; CHECK-NOFP16-SD-NEXT:    mov h7, v2.h[3]
1143; CHECK-NOFP16-SD-NEXT:    mov h25, v1.h[6]
1144; CHECK-NOFP16-SD-NEXT:    fcvt h4, s4
1145; CHECK-NOFP16-SD-NEXT:    fmax s5, s16, s5
1146; CHECK-NOFP16-SD-NEXT:    fcvt s16, h23
1147; CHECK-NOFP16-SD-NEXT:    mov h23, v1.h[3]
1148; CHECK-NOFP16-SD-NEXT:    fmax s17, s18, s17
1149; CHECK-NOFP16-SD-NEXT:    fcvt s18, h19
1150; CHECK-NOFP16-SD-NEXT:    fcvt h6, s6
1151; CHECK-NOFP16-SD-NEXT:    fcvt s7, h7
1152; CHECK-NOFP16-SD-NEXT:    fcvt h19, s5
1153; CHECK-NOFP16-SD-NEXT:    fcvt h5, s20
1154; CHECK-NOFP16-SD-NEXT:    fmax s16, s16, s21
1155; CHECK-NOFP16-SD-NEXT:    fcvt s20, h23
1156; CHECK-NOFP16-SD-NEXT:    fcvt h17, s17
1157; CHECK-NOFP16-SD-NEXT:    mov h21, v2.h[4]
1158; CHECK-NOFP16-SD-NEXT:    mov h23, v1.h[4]
1159; CHECK-NOFP16-SD-NEXT:    mov v4.h[1], v6.h[0]
1160; CHECK-NOFP16-SD-NEXT:    fcvt s6, h22
1161; CHECK-NOFP16-SD-NEXT:    mov h22, v0.h[4]
1162; CHECK-NOFP16-SD-NEXT:    fmax s7, s18, s7
1163; CHECK-NOFP16-SD-NEXT:    mov h18, v3.h[4]
1164; CHECK-NOFP16-SD-NEXT:    mov v5.h[1], v19.h[0]
1165; CHECK-NOFP16-SD-NEXT:    fcvt h16, s16
1166; CHECK-NOFP16-SD-NEXT:    fmax s6, s20, s6
1167; CHECK-NOFP16-SD-NEXT:    mov v4.h[2], v17.h[0]
1168; CHECK-NOFP16-SD-NEXT:    fcvt s17, h21
1169; CHECK-NOFP16-SD-NEXT:    fcvt s19, h22
1170; CHECK-NOFP16-SD-NEXT:    fcvt h7, s7
1171; CHECK-NOFP16-SD-NEXT:    fcvt s18, h18
1172; CHECK-NOFP16-SD-NEXT:    fcvt s20, h23
1173; CHECK-NOFP16-SD-NEXT:    mov h21, v2.h[5]
1174; CHECK-NOFP16-SD-NEXT:    mov h22, v0.h[5]
1175; CHECK-NOFP16-SD-NEXT:    mov v5.h[2], v16.h[0]
1176; CHECK-NOFP16-SD-NEXT:    mov h16, v3.h[5]
1177; CHECK-NOFP16-SD-NEXT:    mov h23, v1.h[5]
1178; CHECK-NOFP16-SD-NEXT:    fcvt h6, s6
1179; CHECK-NOFP16-SD-NEXT:    mov h0, v0.h[7]
1180; CHECK-NOFP16-SD-NEXT:    mov h1, v1.h[7]
1181; CHECK-NOFP16-SD-NEXT:    fmax s17, s19, s17
1182; CHECK-NOFP16-SD-NEXT:    mov h19, v2.h[6]
1183; CHECK-NOFP16-SD-NEXT:    mov v4.h[3], v7.h[0]
1184; CHECK-NOFP16-SD-NEXT:    fmax s18, s20, s18
1185; CHECK-NOFP16-SD-NEXT:    mov h20, v3.h[6]
1186; CHECK-NOFP16-SD-NEXT:    fcvt s7, h21
1187; CHECK-NOFP16-SD-NEXT:    fcvt s21, h22
1188; CHECK-NOFP16-SD-NEXT:    fcvt s22, h24
1189; CHECK-NOFP16-SD-NEXT:    mov h2, v2.h[7]
1190; CHECK-NOFP16-SD-NEXT:    mov v5.h[3], v6.h[0]
1191; CHECK-NOFP16-SD-NEXT:    fcvt s6, h16
1192; CHECK-NOFP16-SD-NEXT:    fcvt s16, h23
1193; CHECK-NOFP16-SD-NEXT:    fcvt h17, s17
1194; CHECK-NOFP16-SD-NEXT:    fcvt s19, h19
1195; CHECK-NOFP16-SD-NEXT:    fcvt s23, h25
1196; CHECK-NOFP16-SD-NEXT:    fcvt h18, s18
1197; CHECK-NOFP16-SD-NEXT:    fcvt s20, h20
1198; CHECK-NOFP16-SD-NEXT:    mov h3, v3.h[7]
1199; CHECK-NOFP16-SD-NEXT:    fmax s7, s21, s7
1200; CHECK-NOFP16-SD-NEXT:    fcvt s2, h2
1201; CHECK-NOFP16-SD-NEXT:    fcvt s0, h0
1202; CHECK-NOFP16-SD-NEXT:    fmax s6, s16, s6
1203; CHECK-NOFP16-SD-NEXT:    fcvt s1, h1
1204; CHECK-NOFP16-SD-NEXT:    mov v4.h[4], v17.h[0]
1205; CHECK-NOFP16-SD-NEXT:    fmax s16, s22, s19
1206; CHECK-NOFP16-SD-NEXT:    mov v5.h[4], v18.h[0]
1207; CHECK-NOFP16-SD-NEXT:    fmax s17, s23, s20
1208; CHECK-NOFP16-SD-NEXT:    fcvt s3, h3
1209; CHECK-NOFP16-SD-NEXT:    fcvt h7, s7
1210; CHECK-NOFP16-SD-NEXT:    fmax s0, s0, s2
1211; CHECK-NOFP16-SD-NEXT:    fcvt h6, s6
1212; CHECK-NOFP16-SD-NEXT:    fcvt h2, s16
1213; CHECK-NOFP16-SD-NEXT:    fmax s1, s1, s3
1214; CHECK-NOFP16-SD-NEXT:    mov v4.h[5], v7.h[0]
1215; CHECK-NOFP16-SD-NEXT:    fcvt h0, s0
1216; CHECK-NOFP16-SD-NEXT:    mov v5.h[5], v6.h[0]
1217; CHECK-NOFP16-SD-NEXT:    fcvt h6, s17
1218; CHECK-NOFP16-SD-NEXT:    fcvt h1, s1
1219; CHECK-NOFP16-SD-NEXT:    mov v4.h[6], v2.h[0]
1220; CHECK-NOFP16-SD-NEXT:    mov v5.h[6], v6.h[0]
1221; CHECK-NOFP16-SD-NEXT:    mov v4.h[7], v0.h[0]
1222; CHECK-NOFP16-SD-NEXT:    mov v5.h[7], v1.h[0]
1223; CHECK-NOFP16-SD-NEXT:    mov v0.16b, v4.16b
1224; CHECK-NOFP16-SD-NEXT:    mov v1.16b, v5.16b
1225; CHECK-NOFP16-SD-NEXT:    ret
1226;
1227; CHECK-FP16-SD-LABEL: max_v16f16:
1228; CHECK-FP16-SD:       // %bb.0: // %entry
1229; CHECK-FP16-SD-NEXT:    fmax v1.8h, v1.8h, v3.8h
1230; CHECK-FP16-SD-NEXT:    fmax v0.8h, v0.8h, v2.8h
1231; CHECK-FP16-SD-NEXT:    ret
1232;
1233; CHECK-NOFP16-GI-LABEL: max_v16f16:
1234; CHECK-NOFP16-GI:       // %bb.0: // %entry
1235; CHECK-NOFP16-GI-NEXT:    fcvtl v4.4s, v0.4h
1236; CHECK-NOFP16-GI-NEXT:    fcvtl v5.4s, v1.4h
1237; CHECK-NOFP16-GI-NEXT:    fcvtl v6.4s, v2.4h
1238; CHECK-NOFP16-GI-NEXT:    fcvtl v7.4s, v3.4h
1239; CHECK-NOFP16-GI-NEXT:    fcvtl2 v0.4s, v0.8h
1240; CHECK-NOFP16-GI-NEXT:    fcvtl2 v1.4s, v1.8h
1241; CHECK-NOFP16-GI-NEXT:    fcvtl2 v2.4s, v2.8h
1242; CHECK-NOFP16-GI-NEXT:    fcvtl2 v3.4s, v3.8h
1243; CHECK-NOFP16-GI-NEXT:    fmax v4.4s, v4.4s, v6.4s
1244; CHECK-NOFP16-GI-NEXT:    fmax v5.4s, v5.4s, v7.4s
1245; CHECK-NOFP16-GI-NEXT:    fmax v2.4s, v0.4s, v2.4s
1246; CHECK-NOFP16-GI-NEXT:    fmax v3.4s, v1.4s, v3.4s
1247; CHECK-NOFP16-GI-NEXT:    fcvtn v0.4h, v4.4s
1248; CHECK-NOFP16-GI-NEXT:    fcvtn v1.4h, v5.4s
1249; CHECK-NOFP16-GI-NEXT:    fcvtn2 v0.8h, v2.4s
1250; CHECK-NOFP16-GI-NEXT:    fcvtn2 v1.8h, v3.4s
1251; CHECK-NOFP16-GI-NEXT:    ret
1252;
1253; CHECK-FP16-GI-LABEL: max_v16f16:
1254; CHECK-FP16-GI:       // %bb.0: // %entry
1255; CHECK-FP16-GI-NEXT:    fmax v0.8h, v0.8h, v2.8h
1256; CHECK-FP16-GI-NEXT:    fmax v1.8h, v1.8h, v3.8h
1257; CHECK-FP16-GI-NEXT:    ret
1258entry:
1259  %c = call <16 x half> @llvm.maximum.v16f16(<16 x half> %a, <16 x half> %b)
1260  ret <16 x half> %c
1261}
1262
1263declare <16 x half> @llvm.maximum.v16f16(<16 x half>, <16 x half>)
1264declare <16 x half> @llvm.minimum.v16f16(<16 x half>, <16 x half>)
1265declare <2 x double> @llvm.maximum.v2f64(<2 x double>, <2 x double>)
1266declare <2 x double> @llvm.minimum.v2f64(<2 x double>, <2 x double>)
1267declare <2 x float> @llvm.maximum.v2f32(<2 x float>, <2 x float>)
1268declare <2 x float> @llvm.minimum.v2f32(<2 x float>, <2 x float>)
1269declare <3 x double> @llvm.maximum.v3f64(<3 x double>, <3 x double>)
1270declare <3 x double> @llvm.minimum.v3f64(<3 x double>, <3 x double>)
1271declare <3 x float> @llvm.maximum.v3f32(<3 x float>, <3 x float>)
1272declare <3 x float> @llvm.minimum.v3f32(<3 x float>, <3 x float>)
1273declare <4 x double> @llvm.maximum.v4f64(<4 x double>, <4 x double>)
1274declare <4 x double> @llvm.minimum.v4f64(<4 x double>, <4 x double>)
1275declare <4 x float> @llvm.maximum.v4f32(<4 x float>, <4 x float>)
1276declare <4 x float> @llvm.minimum.v4f32(<4 x float>, <4 x float>)
1277declare <4 x half> @llvm.maximum.v4f16(<4 x half>, <4 x half>)
1278declare <4 x half> @llvm.minimum.v4f16(<4 x half>, <4 x half>)
1279declare <7 x float> @llvm.maximum.v7f32(<7 x float>, <7 x float>)
1280declare <7 x float> @llvm.minimum.v7f32(<7 x float>, <7 x float>)
1281declare <7 x half> @llvm.maximum.v7f16(<7 x half>, <7 x half>)
1282declare <7 x half> @llvm.minimum.v7f16(<7 x half>, <7 x half>)
1283declare <8 x float> @llvm.maximum.v8f32(<8 x float>, <8 x float>)
1284declare <8 x float> @llvm.minimum.v8f32(<8 x float>, <8 x float>)
1285declare <8 x half> @llvm.maximum.v8f16(<8 x half>, <8 x half>)
1286declare <8 x half> @llvm.minimum.v8f16(<8 x half>, <8 x half>)
1287declare double @llvm.maximum.f64(double, double)
1288declare double @llvm.minimum.f64(double, double)
1289declare float @llvm.maximum.f32(float, float)
1290declare float @llvm.minimum.f32(float, float)
1291declare half @llvm.maximum.f16(half, half)
1292declare half @llvm.minimum.f16(half, half)
1293