xref: /llvm-project/llvm/test/CodeGen/ARM/minnum-maxnum-intrinsics.ll (revision e0ed0333f0fed2e73f805afd58b61176a87aa3ad)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=armv7 -mattr=+neon %s -o - | FileCheck %s --check-prefix=ARMV7
3; RUN: llc -mtriple=armv7 -mattr=+fp-armv8 %s -o - | FileCheck %s --check-prefix=ARMV8
4; RUN: llc -mtriple=armv8.2a -mattr=+fp-armv8 %s -o - | FileCheck %s --check-prefix=ARMV8
5; RUN: llc -mtriple=armv8.1m-none-none-eabi -mattr=+mve.fp,+fp64 %s -o - | FileCheck %s --check-prefix=ARMV8M
6
7declare float @llvm.minnum.f32(float, float)
8declare float @llvm.maxnum.f32(float, float)
9declare double @llvm.minnum.f64(double, double)
10declare double @llvm.maxnum.f64(double, double)
11declare <4 x float> @llvm.minnum.v4f32(<4 x float>, <4 x float>)
12declare <4 x float> @llvm.maxnum.v4f32(<4 x float>, <4 x float>)
13declare <2 x double> @llvm.minnum.v2f64(<2 x double>, <2 x double>)
14declare <2 x double> @llvm.maxnum.v2f64(<2 x double>, <2 x double>)
15
16define float @fminnum32_intrinsic(float %x, float %y) {
17; ARMV7-LABEL: fminnum32_intrinsic:
18; ARMV7:       @ %bb.0:
19; ARMV7-NEXT:    vmov s0, r1
20; ARMV7-NEXT:    vmov s2, r0
21; ARMV7-NEXT:    vcmp.f32 s2, s0
22; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
23; ARMV7-NEXT:    vmovlt.f32 s0, s2
24; ARMV7-NEXT:    vmov r0, s0
25; ARMV7-NEXT:    bx lr
26;
27; ARMV8-LABEL: fminnum32_intrinsic:
28; ARMV8:       @ %bb.0:
29; ARMV8-NEXT:    vmov s0, r1
30; ARMV8-NEXT:    vmov s2, r0
31; ARMV8-NEXT:    vminnm.f32 s0, s2, s0
32; ARMV8-NEXT:    vmov r0, s0
33; ARMV8-NEXT:    bx lr
34;
35; ARMV8M-LABEL: fminnum32_intrinsic:
36; ARMV8M:       @ %bb.0:
37; ARMV8M-NEXT:    vmov s0, r1
38; ARMV8M-NEXT:    vmov s2, r0
39; ARMV8M-NEXT:    vminnm.f32 s0, s2, s0
40; ARMV8M-NEXT:    vmov r0, s0
41; ARMV8M-NEXT:    bx lr
42  %a = call nnan float @llvm.minnum.f32(float %x, float %y)
43  ret float %a
44}
45
46define float @fminnum32_nsz_intrinsic(float %x, float %y) {
47; ARMV7-LABEL: fminnum32_nsz_intrinsic:
48; ARMV7:       @ %bb.0:
49; ARMV7-NEXT:    vmov s0, r1
50; ARMV7-NEXT:    vmov s2, r0
51; ARMV7-NEXT:    vmin.f32 d0, d1, d0
52; ARMV7-NEXT:    vmov r0, s0
53; ARMV7-NEXT:    bx lr
54;
55; ARMV8-LABEL: fminnum32_nsz_intrinsic:
56; ARMV8:       @ %bb.0:
57; ARMV8-NEXT:    vmov s0, r1
58; ARMV8-NEXT:    vmov s2, r0
59; ARMV8-NEXT:    vminnm.f32 s0, s2, s0
60; ARMV8-NEXT:    vmov r0, s0
61; ARMV8-NEXT:    bx lr
62;
63; ARMV8M-LABEL: fminnum32_nsz_intrinsic:
64; ARMV8M:       @ %bb.0:
65; ARMV8M-NEXT:    vmov s0, r1
66; ARMV8M-NEXT:    vmov s2, r0
67; ARMV8M-NEXT:    vminnm.f32 s0, s2, s0
68; ARMV8M-NEXT:    vmov r0, s0
69; ARMV8M-NEXT:    bx lr
70  %a = call nnan nsz float @llvm.minnum.f32(float %x, float %y)
71  ret float %a
72}
73
74define float @fminnum32_non_zero_intrinsic(float %x) {
75; ARMV7-LABEL: fminnum32_non_zero_intrinsic:
76; ARMV7:       @ %bb.0:
77; ARMV7-NEXT:    vmov.f32 s0, #-1.000000e+00
78; ARMV7-NEXT:    vmov s2, r0
79; ARMV7-NEXT:    vmin.f32 d0, d1, d0
80; ARMV7-NEXT:    vmov r0, s0
81; ARMV7-NEXT:    bx lr
82;
83; ARMV8-LABEL: fminnum32_non_zero_intrinsic:
84; ARMV8:       @ %bb.0:
85; ARMV8-NEXT:    vmov.f32 s0, #-1.000000e+00
86; ARMV8-NEXT:    vmov s2, r0
87; ARMV8-NEXT:    vminnm.f32 s0, s2, s0
88; ARMV8-NEXT:    vmov r0, s0
89; ARMV8-NEXT:    bx lr
90;
91; ARMV8M-LABEL: fminnum32_non_zero_intrinsic:
92; ARMV8M:       @ %bb.0:
93; ARMV8M-NEXT:    vmov.f32 s0, #-1.000000e+00
94; ARMV8M-NEXT:    vmov s2, r0
95; ARMV8M-NEXT:    vminnm.f32 s0, s2, s0
96; ARMV8M-NEXT:    vmov r0, s0
97; ARMV8M-NEXT:    bx lr
98  %a = call nnan float @llvm.minnum.f32(float %x, float -1.0)
99  ret float %a
100}
101
102define float @fmaxnum32_intrinsic(float %x, float %y) {
103; ARMV7-LABEL: fmaxnum32_intrinsic:
104; ARMV7:       @ %bb.0:
105; ARMV7-NEXT:    vmov s0, r1
106; ARMV7-NEXT:    vmov s2, r0
107; ARMV7-NEXT:    vcmp.f32 s2, s0
108; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
109; ARMV7-NEXT:    vmovgt.f32 s0, s2
110; ARMV7-NEXT:    vmov r0, s0
111; ARMV7-NEXT:    bx lr
112;
113; ARMV8-LABEL: fmaxnum32_intrinsic:
114; ARMV8:       @ %bb.0:
115; ARMV8-NEXT:    vmov s0, r1
116; ARMV8-NEXT:    vmov s2, r0
117; ARMV8-NEXT:    vmaxnm.f32 s0, s2, s0
118; ARMV8-NEXT:    vmov r0, s0
119; ARMV8-NEXT:    bx lr
120;
121; ARMV8M-LABEL: fmaxnum32_intrinsic:
122; ARMV8M:       @ %bb.0:
123; ARMV8M-NEXT:    vmov s0, r1
124; ARMV8M-NEXT:    vmov s2, r0
125; ARMV8M-NEXT:    vmaxnm.f32 s0, s2, s0
126; ARMV8M-NEXT:    vmov r0, s0
127; ARMV8M-NEXT:    bx lr
128  %a = call nnan float @llvm.maxnum.f32(float %x, float %y)
129  ret float %a
130}
131
132define float @fmaxnum32_nsz_intrinsic(float %x, float %y) {
133; ARMV7-LABEL: fmaxnum32_nsz_intrinsic:
134; ARMV7:       @ %bb.0:
135; ARMV7-NEXT:    vmov s0, r1
136; ARMV7-NEXT:    vmov s2, r0
137; ARMV7-NEXT:    vmax.f32 d0, d1, d0
138; ARMV7-NEXT:    vmov r0, s0
139; ARMV7-NEXT:    bx lr
140;
141; ARMV8-LABEL: fmaxnum32_nsz_intrinsic:
142; ARMV8:       @ %bb.0:
143; ARMV8-NEXT:    vmov s0, r1
144; ARMV8-NEXT:    vmov s2, r0
145; ARMV8-NEXT:    vmaxnm.f32 s0, s2, s0
146; ARMV8-NEXT:    vmov r0, s0
147; ARMV8-NEXT:    bx lr
148;
149; ARMV8M-LABEL: fmaxnum32_nsz_intrinsic:
150; ARMV8M:       @ %bb.0:
151; ARMV8M-NEXT:    vmov s0, r1
152; ARMV8M-NEXT:    vmov s2, r0
153; ARMV8M-NEXT:    vmaxnm.f32 s0, s2, s0
154; ARMV8M-NEXT:    vmov r0, s0
155; ARMV8M-NEXT:    bx lr
156  %a = call nnan nsz float @llvm.maxnum.f32(float %x, float %y)
157  ret float %a
158}
159
160define float @fmaxnum32_zero_intrinsic(float %x) {
161; ARMV7-LABEL: fmaxnum32_zero_intrinsic:
162; ARMV7:       @ %bb.0:
163; ARMV7-NEXT:    vmov s0, r0
164; ARMV7-NEXT:    vldr s2, .LCPI5_0
165; ARMV7-NEXT:    vcmp.f32 s0, #0
166; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
167; ARMV7-NEXT:    vmovgt.f32 s2, s0
168; ARMV7-NEXT:    vmov r0, s2
169; ARMV7-NEXT:    bx lr
170; ARMV7-NEXT:    .p2align 2
171; ARMV7-NEXT:  @ %bb.1:
172; ARMV7-NEXT:  .LCPI5_0:
173; ARMV7-NEXT:    .long 0x00000000 @ float 0
174;
175; ARMV8-LABEL: fmaxnum32_zero_intrinsic:
176; ARMV8:       @ %bb.0:
177; ARMV8-NEXT:    vldr s0, .LCPI5_0
178; ARMV8-NEXT:    vmov s2, r0
179; ARMV8-NEXT:    vmaxnm.f32 s0, s2, s0
180; ARMV8-NEXT:    vmov r0, s0
181; ARMV8-NEXT:    bx lr
182; ARMV8-NEXT:    .p2align 2
183; ARMV8-NEXT:  @ %bb.1:
184; ARMV8-NEXT:  .LCPI5_0:
185; ARMV8-NEXT:    .long 0x00000000 @ float 0
186;
187; ARMV8M-LABEL: fmaxnum32_zero_intrinsic:
188; ARMV8M:       @ %bb.0:
189; ARMV8M-NEXT:    vldr s0, .LCPI5_0
190; ARMV8M-NEXT:    vmov s2, r0
191; ARMV8M-NEXT:    vmaxnm.f32 s0, s2, s0
192; ARMV8M-NEXT:    vmov r0, s0
193; ARMV8M-NEXT:    bx lr
194; ARMV8M-NEXT:    .p2align 2
195; ARMV8M-NEXT:  @ %bb.1:
196; ARMV8M-NEXT:  .LCPI5_0:
197; ARMV8M-NEXT:    .long 0x00000000 @ float 0
198  %a = call nnan float @llvm.maxnum.f32(float %x, float 0.0)
199  ret float %a
200}
201
202define float @fmaxnum32_non_zero_intrinsic(float %x) {
203; ARMV7-LABEL: fmaxnum32_non_zero_intrinsic:
204; ARMV7:       @ %bb.0:
205; ARMV7-NEXT:    vmov.f32 s0, #1.000000e+00
206; ARMV7-NEXT:    vmov s2, r0
207; ARMV7-NEXT:    vmax.f32 d0, d1, d0
208; ARMV7-NEXT:    vmov r0, s0
209; ARMV7-NEXT:    bx lr
210;
211; ARMV8-LABEL: fmaxnum32_non_zero_intrinsic:
212; ARMV8:       @ %bb.0:
213; ARMV8-NEXT:    vmov.f32 s0, #1.000000e+00
214; ARMV8-NEXT:    vmov s2, r0
215; ARMV8-NEXT:    vmaxnm.f32 s0, s2, s0
216; ARMV8-NEXT:    vmov r0, s0
217; ARMV8-NEXT:    bx lr
218;
219; ARMV8M-LABEL: fmaxnum32_non_zero_intrinsic:
220; ARMV8M:       @ %bb.0:
221; ARMV8M-NEXT:    vmov.f32 s0, #1.000000e+00
222; ARMV8M-NEXT:    vmov s2, r0
223; ARMV8M-NEXT:    vmaxnm.f32 s0, s2, s0
224; ARMV8M-NEXT:    vmov r0, s0
225; ARMV8M-NEXT:    bx lr
226  %a = call nnan float @llvm.maxnum.f32(float %x, float 1.0)
227  ret float %a
228}
229
230define double @fminnum64_intrinsic(double %x, double %y) {
231; ARMV7-LABEL: fminnum64_intrinsic:
232; ARMV7:       @ %bb.0:
233; ARMV7-NEXT:    vmov d16, r2, r3
234; ARMV7-NEXT:    vmov d17, r0, r1
235; ARMV7-NEXT:    vcmp.f64 d17, d16
236; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
237; ARMV7-NEXT:    vmovlt.f64 d16, d17
238; ARMV7-NEXT:    vmov r0, r1, d16
239; ARMV7-NEXT:    bx lr
240;
241; ARMV8-LABEL: fminnum64_intrinsic:
242; ARMV8:       @ %bb.0:
243; ARMV8-NEXT:    vmov d16, r2, r3
244; ARMV8-NEXT:    vmov d17, r0, r1
245; ARMV8-NEXT:    vminnm.f64 d16, d17, d16
246; ARMV8-NEXT:    vmov r0, r1, d16
247; ARMV8-NEXT:    bx lr
248;
249; ARMV8M-LABEL: fminnum64_intrinsic:
250; ARMV8M:       @ %bb.0:
251; ARMV8M-NEXT:    vmov d0, r2, r3
252; ARMV8M-NEXT:    vmov d1, r0, r1
253; ARMV8M-NEXT:    vminnm.f64 d0, d1, d0
254; ARMV8M-NEXT:    vmov r0, r1, d0
255; ARMV8M-NEXT:    bx lr
256  %a = call nnan double @llvm.minnum.f64(double %x, double %y)
257  ret double %a
258}
259
260define double @fminnum64_nsz_intrinsic(double %x, double %y) {
261; ARMV7-LABEL: fminnum64_nsz_intrinsic:
262; ARMV7:       @ %bb.0:
263; ARMV7-NEXT:    vmov d16, r2, r3
264; ARMV7-NEXT:    vmov d17, r0, r1
265; ARMV7-NEXT:    vcmp.f64 d17, d16
266; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
267; ARMV7-NEXT:    vmovlt.f64 d16, d17
268; ARMV7-NEXT:    vmov r0, r1, d16
269; ARMV7-NEXT:    bx lr
270;
271; ARMV8-LABEL: fminnum64_nsz_intrinsic:
272; ARMV8:       @ %bb.0:
273; ARMV8-NEXT:    vmov d16, r2, r3
274; ARMV8-NEXT:    vmov d17, r0, r1
275; ARMV8-NEXT:    vminnm.f64 d16, d17, d16
276; ARMV8-NEXT:    vmov r0, r1, d16
277; ARMV8-NEXT:    bx lr
278;
279; ARMV8M-LABEL: fminnum64_nsz_intrinsic:
280; ARMV8M:       @ %bb.0:
281; ARMV8M-NEXT:    vmov d0, r2, r3
282; ARMV8M-NEXT:    vmov d1, r0, r1
283; ARMV8M-NEXT:    vminnm.f64 d0, d1, d0
284; ARMV8M-NEXT:    vmov r0, r1, d0
285; ARMV8M-NEXT:    bx lr
286  %a = call nnan nsz double @llvm.minnum.f64(double %x, double %y)
287  ret double %a
288}
289
290define double @fminnum64_zero_intrinsic(double %x) {
291; ARMV7-LABEL: fminnum64_zero_intrinsic:
292; ARMV7:       @ %bb.0:
293; ARMV7-NEXT:    vldr d16, .LCPI9_0
294; ARMV7-NEXT:    vmov d17, r0, r1
295; ARMV7-NEXT:    vcmp.f64 d17, d16
296; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
297; ARMV7-NEXT:    vmovlt.f64 d16, d17
298; ARMV7-NEXT:    vmov r0, r1, d16
299; ARMV7-NEXT:    bx lr
300; ARMV7-NEXT:    .p2align 3
301; ARMV7-NEXT:  @ %bb.1:
302; ARMV7-NEXT:  .LCPI9_0:
303; ARMV7-NEXT:    .long 0 @ double -0
304; ARMV7-NEXT:    .long 2147483648
305;
306; ARMV8-LABEL: fminnum64_zero_intrinsic:
307; ARMV8:       @ %bb.0:
308; ARMV8-NEXT:    vldr d16, .LCPI9_0
309; ARMV8-NEXT:    vmov d17, r0, r1
310; ARMV8-NEXT:    vminnm.f64 d16, d17, d16
311; ARMV8-NEXT:    vmov r0, r1, d16
312; ARMV8-NEXT:    bx lr
313; ARMV8-NEXT:    .p2align 3
314; ARMV8-NEXT:  @ %bb.1:
315; ARMV8-NEXT:  .LCPI9_0:
316; ARMV8-NEXT:    .long 0 @ double -0
317; ARMV8-NEXT:    .long 2147483648
318;
319; ARMV8M-LABEL: fminnum64_zero_intrinsic:
320; ARMV8M:       @ %bb.0:
321; ARMV8M-NEXT:    vldr d0, .LCPI9_0
322; ARMV8M-NEXT:    vmov d1, r0, r1
323; ARMV8M-NEXT:    vminnm.f64 d0, d1, d0
324; ARMV8M-NEXT:    vmov r0, r1, d0
325; ARMV8M-NEXT:    bx lr
326; ARMV8M-NEXT:    .p2align 3
327; ARMV8M-NEXT:  @ %bb.1:
328; ARMV8M-NEXT:  .LCPI9_0:
329; ARMV8M-NEXT:    .long 0 @ double -0
330; ARMV8M-NEXT:    .long 2147483648
331  %a = call nnan double @llvm.minnum.f64(double %x, double -0.0)
332  ret double %a
333}
334
335define double @fminnum64_non_zero_intrinsic(double %x) {
336; ARMV7-LABEL: fminnum64_non_zero_intrinsic:
337; ARMV7:       @ %bb.0:
338; ARMV7-NEXT:    vmov.f64 d16, #-1.000000e+00
339; ARMV7-NEXT:    vmov d17, r0, r1
340; ARMV7-NEXT:    vcmp.f64 d17, d16
341; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
342; ARMV7-NEXT:    vmovlt.f64 d16, d17
343; ARMV7-NEXT:    vmov r0, r1, d16
344; ARMV7-NEXT:    bx lr
345;
346; ARMV8-LABEL: fminnum64_non_zero_intrinsic:
347; ARMV8:       @ %bb.0:
348; ARMV8-NEXT:    vmov.f64 d16, #-1.000000e+00
349; ARMV8-NEXT:    vmov d17, r0, r1
350; ARMV8-NEXT:    vminnm.f64 d16, d17, d16
351; ARMV8-NEXT:    vmov r0, r1, d16
352; ARMV8-NEXT:    bx lr
353;
354; ARMV8M-LABEL: fminnum64_non_zero_intrinsic:
355; ARMV8M:       @ %bb.0:
356; ARMV8M-NEXT:    vmov.f64 d0, #-1.000000e+00
357; ARMV8M-NEXT:    vmov d1, r0, r1
358; ARMV8M-NEXT:    vminnm.f64 d0, d1, d0
359; ARMV8M-NEXT:    vmov r0, r1, d0
360; ARMV8M-NEXT:    bx lr
361  %a = call nnan double @llvm.minnum.f64(double %x, double -1.0)
362  ret double %a
363}
364
365define double@fmaxnum64_intrinsic(double %x, double %y) {
366; ARMV7-LABEL: fmaxnum64_intrinsic:
367; ARMV7:       @ %bb.0:
368; ARMV7-NEXT:    vmov d16, r2, r3
369; ARMV7-NEXT:    vmov d17, r0, r1
370; ARMV7-NEXT:    vcmp.f64 d17, d16
371; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
372; ARMV7-NEXT:    vmovgt.f64 d16, d17
373; ARMV7-NEXT:    vmov r0, r1, d16
374; ARMV7-NEXT:    bx lr
375;
376; ARMV8-LABEL: fmaxnum64_intrinsic:
377; ARMV8:       @ %bb.0:
378; ARMV8-NEXT:    vmov d16, r2, r3
379; ARMV8-NEXT:    vmov d17, r0, r1
380; ARMV8-NEXT:    vmaxnm.f64 d16, d17, d16
381; ARMV8-NEXT:    vmov r0, r1, d16
382; ARMV8-NEXT:    bx lr
383;
384; ARMV8M-LABEL: fmaxnum64_intrinsic:
385; ARMV8M:       @ %bb.0:
386; ARMV8M-NEXT:    vmov d0, r2, r3
387; ARMV8M-NEXT:    vmov d1, r0, r1
388; ARMV8M-NEXT:    vmaxnm.f64 d0, d1, d0
389; ARMV8M-NEXT:    vmov r0, r1, d0
390; ARMV8M-NEXT:    bx lr
391  %a = call nnan double @llvm.maxnum.f64(double %x, double %y)
392  ret double %a
393}
394
395define double@fmaxnum64_nsz_intrinsic(double %x, double %y) {
396; ARMV7-LABEL: fmaxnum64_nsz_intrinsic:
397; ARMV7:       @ %bb.0:
398; ARMV7-NEXT:    vmov d16, r2, r3
399; ARMV7-NEXT:    vmov d17, r0, r1
400; ARMV7-NEXT:    vcmp.f64 d17, d16
401; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
402; ARMV7-NEXT:    vmovgt.f64 d16, d17
403; ARMV7-NEXT:    vmov r0, r1, d16
404; ARMV7-NEXT:    bx lr
405;
406; ARMV8-LABEL: fmaxnum64_nsz_intrinsic:
407; ARMV8:       @ %bb.0:
408; ARMV8-NEXT:    vmov d16, r2, r3
409; ARMV8-NEXT:    vmov d17, r0, r1
410; ARMV8-NEXT:    vmaxnm.f64 d16, d17, d16
411; ARMV8-NEXT:    vmov r0, r1, d16
412; ARMV8-NEXT:    bx lr
413;
414; ARMV8M-LABEL: fmaxnum64_nsz_intrinsic:
415; ARMV8M:       @ %bb.0:
416; ARMV8M-NEXT:    vmov d0, r2, r3
417; ARMV8M-NEXT:    vmov d1, r0, r1
418; ARMV8M-NEXT:    vmaxnm.f64 d0, d1, d0
419; ARMV8M-NEXT:    vmov r0, r1, d0
420; ARMV8M-NEXT:    bx lr
421  %a = call nnan nsz double @llvm.maxnum.f64(double %x, double %y)
422  ret double %a
423}
424
425define double @fmaxnum64_zero_intrinsic(double %x) {
426; ARMV7-LABEL: fmaxnum64_zero_intrinsic:
427; ARMV7:       @ %bb.0:
428; ARMV7-NEXT:    vmov d16, r0, r1
429; ARMV7-NEXT:    vcmp.f64 d16, #0
430; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
431; ARMV7-NEXT:    vmov.i32 d17, #0x0
432; ARMV7-NEXT:    vmovgt.f64 d17, d16
433; ARMV7-NEXT:    vmov r0, r1, d17
434; ARMV7-NEXT:    bx lr
435;
436; ARMV8-LABEL: fmaxnum64_zero_intrinsic:
437; ARMV8:       @ %bb.0:
438; ARMV8-NEXT:    vmov.i32 d16, #0x0
439; ARMV8-NEXT:    vmov d17, r0, r1
440; ARMV8-NEXT:    vmaxnm.f64 d16, d17, d16
441; ARMV8-NEXT:    vmov r0, r1, d16
442; ARMV8-NEXT:    bx lr
443;
444; ARMV8M-LABEL: fmaxnum64_zero_intrinsic:
445; ARMV8M:       @ %bb.0:
446; ARMV8M-NEXT:    vldr d0, .LCPI13_0
447; ARMV8M-NEXT:    vmov d1, r0, r1
448; ARMV8M-NEXT:    vmaxnm.f64 d0, d1, d0
449; ARMV8M-NEXT:    vmov r0, r1, d0
450; ARMV8M-NEXT:    bx lr
451; ARMV8M-NEXT:    .p2align 3
452; ARMV8M-NEXT:  @ %bb.1:
453; ARMV8M-NEXT:  .LCPI13_0:
454; ARMV8M-NEXT:    .long 0 @ double 0
455; ARMV8M-NEXT:    .long 0
456  %a = call nnan double @llvm.maxnum.f64(double %x, double 0.0)
457  ret double %a
458}
459
460define double @fmaxnum64_non_zero_intrinsic(double %x) {
461; ARMV7-LABEL: fmaxnum64_non_zero_intrinsic:
462; ARMV7:       @ %bb.0:
463; ARMV7-NEXT:    vmov.f64 d16, #1.000000e+00
464; ARMV7-NEXT:    vmov d17, r0, r1
465; ARMV7-NEXT:    vcmp.f64 d17, d16
466; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
467; ARMV7-NEXT:    vmovgt.f64 d16, d17
468; ARMV7-NEXT:    vmov r0, r1, d16
469; ARMV7-NEXT:    bx lr
470;
471; ARMV8-LABEL: fmaxnum64_non_zero_intrinsic:
472; ARMV8:       @ %bb.0:
473; ARMV8-NEXT:    vmov.f64 d16, #1.000000e+00
474; ARMV8-NEXT:    vmov d17, r0, r1
475; ARMV8-NEXT:    vmaxnm.f64 d16, d17, d16
476; ARMV8-NEXT:    vmov r0, r1, d16
477; ARMV8-NEXT:    bx lr
478;
479; ARMV8M-LABEL: fmaxnum64_non_zero_intrinsic:
480; ARMV8M:       @ %bb.0:
481; ARMV8M-NEXT:    vmov.f64 d0, #1.000000e+00
482; ARMV8M-NEXT:    vmov d1, r0, r1
483; ARMV8M-NEXT:    vmaxnm.f64 d0, d1, d0
484; ARMV8M-NEXT:    vmov r0, r1, d0
485; ARMV8M-NEXT:    bx lr
486  %a = call nnan double @llvm.maxnum.f64(double %x, double 1.0)
487  ret double %a
488}
489
490define <4 x float> @fminnumv432_intrinsic(<4 x float> %x, <4 x float> %y) {
491; ARMV7-LABEL: fminnumv432_intrinsic:
492; ARMV7:       @ %bb.0:
493; ARMV7-NEXT:    mov r12, sp
494; ARMV7-NEXT:    vld1.64 {d0, d1}, [r12]
495; ARMV7-NEXT:    vmov d3, r2, r3
496; ARMV7-NEXT:    vmov d2, r0, r1
497; ARMV7-NEXT:    vcmp.f32 s6, s2
498; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
499; ARMV7-NEXT:    vcmp.f32 s7, s3
500; ARMV7-NEXT:    vmovlt.f32 s2, s6
501; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
502; ARMV7-NEXT:    vcmp.f32 s5, s1
503; ARMV7-NEXT:    vmovlt.f32 s3, s7
504; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
505; ARMV7-NEXT:    vcmp.f32 s4, s0
506; ARMV7-NEXT:    vmovlt.f32 s1, s5
507; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
508; ARMV7-NEXT:    vmovlt.f32 s0, s4
509; ARMV7-NEXT:    vmov r2, r3, d1
510; ARMV7-NEXT:    vmov r0, r1, d0
511; ARMV7-NEXT:    bx lr
512;
513; ARMV8-LABEL: fminnumv432_intrinsic:
514; ARMV8:       @ %bb.0:
515; ARMV8-NEXT:    vmov d17, r2, r3
516; ARMV8-NEXT:    vmov d16, r0, r1
517; ARMV8-NEXT:    mov r0, sp
518; ARMV8-NEXT:    vld1.64 {d18, d19}, [r0]
519; ARMV8-NEXT:    vminnm.f32 q8, q8, q9
520; ARMV8-NEXT:    vmov r0, r1, d16
521; ARMV8-NEXT:    vmov r2, r3, d17
522; ARMV8-NEXT:    bx lr
523;
524; ARMV8M-LABEL: fminnumv432_intrinsic:
525; ARMV8M:       @ %bb.0:
526; ARMV8M-NEXT:    vmov d0, r0, r1
527; ARMV8M-NEXT:    mov r0, sp
528; ARMV8M-NEXT:    vldrw.u32 q1, [r0]
529; ARMV8M-NEXT:    vmov d1, r2, r3
530; ARMV8M-NEXT:    vminnm.f32 q0, q0, q1
531; ARMV8M-NEXT:    vmov r0, r1, d0
532; ARMV8M-NEXT:    vmov r2, r3, d1
533; ARMV8M-NEXT:    bx lr
534  %a = call nnan <4 x float> @llvm.minnum.v4f32(<4 x float> %x, <4 x float> %y)
535  ret <4 x float> %a
536}
537
538define <4 x float> @fminnumv432_nsz_intrinsic(<4 x float> %x, <4 x float> %y) {
539; ARMV7-LABEL: fminnumv432_nsz_intrinsic:
540; ARMV7:       @ %bb.0:
541; ARMV7-NEXT:    vmov d17, r2, r3
542; ARMV7-NEXT:    vmov d16, r0, r1
543; ARMV7-NEXT:    mov r0, sp
544; ARMV7-NEXT:    vld1.64 {d18, d19}, [r0]
545; ARMV7-NEXT:    vmin.f32 q8, q8, q9
546; ARMV7-NEXT:    vmov r0, r1, d16
547; ARMV7-NEXT:    vmov r2, r3, d17
548; ARMV7-NEXT:    bx lr
549;
550; ARMV8-LABEL: fminnumv432_nsz_intrinsic:
551; ARMV8:       @ %bb.0:
552; ARMV8-NEXT:    vmov d17, r2, r3
553; ARMV8-NEXT:    vmov d16, r0, r1
554; ARMV8-NEXT:    mov r0, sp
555; ARMV8-NEXT:    vld1.64 {d18, d19}, [r0]
556; ARMV8-NEXT:    vminnm.f32 q8, q8, q9
557; ARMV8-NEXT:    vmov r0, r1, d16
558; ARMV8-NEXT:    vmov r2, r3, d17
559; ARMV8-NEXT:    bx lr
560;
561; ARMV8M-LABEL: fminnumv432_nsz_intrinsic:
562; ARMV8M:       @ %bb.0:
563; ARMV8M-NEXT:    vmov d0, r0, r1
564; ARMV8M-NEXT:    mov r0, sp
565; ARMV8M-NEXT:    vldrw.u32 q1, [r0]
566; ARMV8M-NEXT:    vmov d1, r2, r3
567; ARMV8M-NEXT:    vminnm.f32 q0, q0, q1
568; ARMV8M-NEXT:    vmov r0, r1, d0
569; ARMV8M-NEXT:    vmov r2, r3, d1
570; ARMV8M-NEXT:    bx lr
571  %a = call nnan nsz <4 x float> @llvm.minnum.v4f32(<4 x float> %x, <4 x float> %y)
572  ret <4 x float> %a
573}
574
575define <4 x float> @fminnumv432_non_zero_intrinsic(<4 x float> %x) {
576; ARMV7-LABEL: fminnumv432_non_zero_intrinsic:
577; ARMV7:       @ %bb.0:
578; ARMV7-NEXT:    vmov d19, r2, r3
579; ARMV7-NEXT:    vmov.f32 q8, #-1.000000e+00
580; ARMV7-NEXT:    vmov d18, r0, r1
581; ARMV7-NEXT:    vmin.f32 q8, q9, q8
582; ARMV7-NEXT:    vmov r0, r1, d16
583; ARMV7-NEXT:    vmov r2, r3, d17
584; ARMV7-NEXT:    bx lr
585;
586; ARMV8-LABEL: fminnumv432_non_zero_intrinsic:
587; ARMV8:       @ %bb.0:
588; ARMV8-NEXT:    vmov d17, r2, r3
589; ARMV8-NEXT:    vmov d16, r0, r1
590; ARMV8-NEXT:    vmov.f32 q9, #-1.000000e+00
591; ARMV8-NEXT:    vminnm.f32 q8, q8, q9
592; ARMV8-NEXT:    vmov r0, r1, d16
593; ARMV8-NEXT:    vmov r2, r3, d17
594; ARMV8-NEXT:    bx lr
595;
596; ARMV8M-LABEL: fminnumv432_non_zero_intrinsic:
597; ARMV8M:       @ %bb.0:
598; ARMV8M-NEXT:    vmov d1, r2, r3
599; ARMV8M-NEXT:    vmov.f32 q1, #-1.000000e+00
600; ARMV8M-NEXT:    vmov d0, r0, r1
601; ARMV8M-NEXT:    vminnm.f32 q0, q0, q1
602; ARMV8M-NEXT:    vmov r0, r1, d0
603; ARMV8M-NEXT:    vmov r2, r3, d1
604; ARMV8M-NEXT:    bx lr
605  %a = call nnan <4 x float> @llvm.minnum.v4f32(<4 x float> %x, <4 x float><float -1.0, float -1.0, float -1.0, float -1.0>)
606  ret <4 x float> %a
607}
608
609define <4 x float> @fminnumv432_one_zero_intrinsic(<4 x float> %x) {
610; ARMV7-LABEL: fminnumv432_one_zero_intrinsic:
611; ARMV7:       @ %bb.0:
612; ARMV7-NEXT:    vmov d1, r2, r3
613; ARMV7-NEXT:    vldr s8, .LCPI18_0
614; ARMV7-NEXT:    vmov d0, r0, r1
615; ARMV7-NEXT:    vmov.f32 s10, #-1.000000e+00
616; ARMV7-NEXT:    vcmp.f32 s1, #0
617; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
618; ARMV7-NEXT:    vmov.f32 s4, s3
619; ARMV7-NEXT:    vmin.f32 d6, d2, d5
620; ARMV7-NEXT:    vmin.f32 d3, d1, d5
621; ARMV7-NEXT:    vmin.f32 d2, d0, d5
622; ARMV7-NEXT:    vmovlt.f32 s8, s1
623; ARMV7-NEXT:    vmov.f32 s5, s8
624; ARMV7-NEXT:    vmov.f32 s7, s12
625; ARMV7-NEXT:    vmov r0, r1, d2
626; ARMV7-NEXT:    vmov r2, r3, d3
627; ARMV7-NEXT:    bx lr
628; ARMV7-NEXT:    .p2align 2
629; ARMV7-NEXT:  @ %bb.1:
630; ARMV7-NEXT:  .LCPI18_0:
631; ARMV7-NEXT:    .long 0x00000000 @ float 0
632;
633; ARMV8-LABEL: fminnumv432_one_zero_intrinsic:
634; ARMV8:       @ %bb.0:
635; ARMV8-NEXT:    vmov d17, r2, r3
636; ARMV8-NEXT:    vmov d16, r0, r1
637; ARMV8-NEXT:    adr r0, .LCPI18_0
638; ARMV8-NEXT:    vld1.64 {d18, d19}, [r0:128]
639; ARMV8-NEXT:    vminnm.f32 q8, q8, q9
640; ARMV8-NEXT:    vmov r0, r1, d16
641; ARMV8-NEXT:    vmov r2, r3, d17
642; ARMV8-NEXT:    bx lr
643; ARMV8-NEXT:    .p2align 4
644; ARMV8-NEXT:  @ %bb.1:
645; ARMV8-NEXT:  .LCPI18_0:
646; ARMV8-NEXT:    .long 0xbf800000 @ float -1
647; ARMV8-NEXT:    .long 0x00000000 @ float 0
648; ARMV8-NEXT:    .long 0xbf800000 @ float -1
649; ARMV8-NEXT:    .long 0xbf800000 @ float -1
650;
651; ARMV8M-LABEL: fminnumv432_one_zero_intrinsic:
652; ARMV8M:       @ %bb.0:
653; ARMV8M-NEXT:    vmov d0, r0, r1
654; ARMV8M-NEXT:    adr r0, .LCPI18_0
655; ARMV8M-NEXT:    vldrw.u32 q1, [r0]
656; ARMV8M-NEXT:    vmov d1, r2, r3
657; ARMV8M-NEXT:    vminnm.f32 q0, q0, q1
658; ARMV8M-NEXT:    vmov r0, r1, d0
659; ARMV8M-NEXT:    vmov r2, r3, d1
660; ARMV8M-NEXT:    bx lr
661; ARMV8M-NEXT:    .p2align 4
662; ARMV8M-NEXT:  @ %bb.1:
663; ARMV8M-NEXT:  .LCPI18_0:
664; ARMV8M-NEXT:    .long 0xbf800000 @ float -1
665; ARMV8M-NEXT:    .long 0x00000000 @ float 0
666; ARMV8M-NEXT:    .long 0xbf800000 @ float -1
667; ARMV8M-NEXT:    .long 0xbf800000 @ float -1
668  %a = call nnan <4 x float> @llvm.minnum.v4f32(<4 x float> %x, <4 x float><float -1.0, float 0.0, float -1.0, float -1.0>)
669  ret <4 x float> %a
670}
671
672define <4 x float> @fmaxnumv432_intrinsic(<4 x float> %x, <4 x float> %y) {
673; ARMV7-LABEL: fmaxnumv432_intrinsic:
674; ARMV7:       @ %bb.0:
675; ARMV7-NEXT:    mov r12, sp
676; ARMV7-NEXT:    vld1.64 {d0, d1}, [r12]
677; ARMV7-NEXT:    vmov d3, r2, r3
678; ARMV7-NEXT:    vmov d2, r0, r1
679; ARMV7-NEXT:    vcmp.f32 s6, s2
680; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
681; ARMV7-NEXT:    vcmp.f32 s7, s3
682; ARMV7-NEXT:    vmovgt.f32 s2, s6
683; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
684; ARMV7-NEXT:    vcmp.f32 s5, s1
685; ARMV7-NEXT:    vmovgt.f32 s3, s7
686; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
687; ARMV7-NEXT:    vcmp.f32 s4, s0
688; ARMV7-NEXT:    vmovgt.f32 s1, s5
689; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
690; ARMV7-NEXT:    vmovgt.f32 s0, s4
691; ARMV7-NEXT:    vmov r2, r3, d1
692; ARMV7-NEXT:    vmov r0, r1, d0
693; ARMV7-NEXT:    bx lr
694;
695; ARMV8-LABEL: fmaxnumv432_intrinsic:
696; ARMV8:       @ %bb.0:
697; ARMV8-NEXT:    vmov d17, r2, r3
698; ARMV8-NEXT:    vmov d16, r0, r1
699; ARMV8-NEXT:    mov r0, sp
700; ARMV8-NEXT:    vld1.64 {d18, d19}, [r0]
701; ARMV8-NEXT:    vmaxnm.f32 q8, q8, q9
702; ARMV8-NEXT:    vmov r0, r1, d16
703; ARMV8-NEXT:    vmov r2, r3, d17
704; ARMV8-NEXT:    bx lr
705;
706; ARMV8M-LABEL: fmaxnumv432_intrinsic:
707; ARMV8M:       @ %bb.0:
708; ARMV8M-NEXT:    vmov d0, r0, r1
709; ARMV8M-NEXT:    mov r0, sp
710; ARMV8M-NEXT:    vldrw.u32 q1, [r0]
711; ARMV8M-NEXT:    vmov d1, r2, r3
712; ARMV8M-NEXT:    vmaxnm.f32 q0, q0, q1
713; ARMV8M-NEXT:    vmov r0, r1, d0
714; ARMV8M-NEXT:    vmov r2, r3, d1
715; ARMV8M-NEXT:    bx lr
716  %a = call nnan <4 x float> @llvm.maxnum.v4f32(<4 x float> %x, <4 x float> %y)
717  ret <4 x float> %a
718}
719
720define <4 x float> @fmaxnumv432_nsz_intrinsic(<4 x float> %x, <4 x float> %y) {
721; ARMV7-LABEL: fmaxnumv432_nsz_intrinsic:
722; ARMV7:       @ %bb.0:
723; ARMV7-NEXT:    vmov d17, r2, r3
724; ARMV7-NEXT:    vmov d16, r0, r1
725; ARMV7-NEXT:    mov r0, sp
726; ARMV7-NEXT:    vld1.64 {d18, d19}, [r0]
727; ARMV7-NEXT:    vmax.f32 q8, q8, q9
728; ARMV7-NEXT:    vmov r0, r1, d16
729; ARMV7-NEXT:    vmov r2, r3, d17
730; ARMV7-NEXT:    bx lr
731;
732; ARMV8-LABEL: fmaxnumv432_nsz_intrinsic:
733; ARMV8:       @ %bb.0:
734; ARMV8-NEXT:    vmov d17, r2, r3
735; ARMV8-NEXT:    vmov d16, r0, r1
736; ARMV8-NEXT:    mov r0, sp
737; ARMV8-NEXT:    vld1.64 {d18, d19}, [r0]
738; ARMV8-NEXT:    vmaxnm.f32 q8, q8, q9
739; ARMV8-NEXT:    vmov r0, r1, d16
740; ARMV8-NEXT:    vmov r2, r3, d17
741; ARMV8-NEXT:    bx lr
742;
743; ARMV8M-LABEL: fmaxnumv432_nsz_intrinsic:
744; ARMV8M:       @ %bb.0:
745; ARMV8M-NEXT:    vmov d0, r0, r1
746; ARMV8M-NEXT:    mov r0, sp
747; ARMV8M-NEXT:    vldrw.u32 q1, [r0]
748; ARMV8M-NEXT:    vmov d1, r2, r3
749; ARMV8M-NEXT:    vmaxnm.f32 q0, q0, q1
750; ARMV8M-NEXT:    vmov r0, r1, d0
751; ARMV8M-NEXT:    vmov r2, r3, d1
752; ARMV8M-NEXT:    bx lr
753  %a = call nnan nsz <4 x float> @llvm.maxnum.v4f32(<4 x float> %x, <4 x float> %y)
754  ret <4 x float> %a
755}
756
757define <4 x float> @fmaxnumv432_zero_intrinsic(<4 x float> %x) {
758; ARMV7-LABEL: fmaxnumv432_zero_intrinsic:
759; ARMV7:       @ %bb.0:
760; ARMV7-NEXT:    vmov d3, r2, r3
761; ARMV7-NEXT:    vldr s0, .LCPI21_0
762; ARMV7-NEXT:    vmov d2, r0, r1
763; ARMV7-NEXT:    vcmp.f32 s6, #0
764; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
765; ARMV7-NEXT:    vmov.f32 s2, s0
766; ARMV7-NEXT:    vcmp.f32 s7, #0
767; ARMV7-NEXT:    vmovgt.f32 s2, s6
768; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
769; ARMV7-NEXT:    vmov.f32 s3, s0
770; ARMV7-NEXT:    vcmp.f32 s5, #0
771; ARMV7-NEXT:    vmovgt.f32 s3, s7
772; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
773; ARMV7-NEXT:    vmov.f32 s1, s0
774; ARMV7-NEXT:    vcmp.f32 s4, #0
775; ARMV7-NEXT:    vmovgt.f32 s1, s5
776; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
777; ARMV7-NEXT:    vmovgt.f32 s0, s4
778; ARMV7-NEXT:    vmov r2, r3, d1
779; ARMV7-NEXT:    vmov r0, r1, d0
780; ARMV7-NEXT:    bx lr
781; ARMV7-NEXT:    .p2align 2
782; ARMV7-NEXT:  @ %bb.1:
783; ARMV7-NEXT:  .LCPI21_0:
784; ARMV7-NEXT:    .long 0x00000000 @ float 0
785;
786; ARMV8-LABEL: fmaxnumv432_zero_intrinsic:
787; ARMV8:       @ %bb.0:
788; ARMV8-NEXT:    vmov d17, r2, r3
789; ARMV8-NEXT:    vmov d16, r0, r1
790; ARMV8-NEXT:    vmov.i32 q9, #0x0
791; ARMV8-NEXT:    vmaxnm.f32 q8, q8, q9
792; ARMV8-NEXT:    vmov r0, r1, d16
793; ARMV8-NEXT:    vmov r2, r3, d17
794; ARMV8-NEXT:    bx lr
795;
796; ARMV8M-LABEL: fmaxnumv432_zero_intrinsic:
797; ARMV8M:       @ %bb.0:
798; ARMV8M-NEXT:    vmov d1, r2, r3
799; ARMV8M-NEXT:    vmov.i32 q1, #0x0
800; ARMV8M-NEXT:    vmov d0, r0, r1
801; ARMV8M-NEXT:    vmaxnm.f32 q0, q0, q1
802; ARMV8M-NEXT:    vmov r0, r1, d0
803; ARMV8M-NEXT:    vmov r2, r3, d1
804; ARMV8M-NEXT:    bx lr
805  %a = call nnan <4 x float> @llvm.maxnum.v4f32(<4 x float> %x, <4 x float><float 0.0, float 0.0, float 0.0, float 0.0>)
806  ret <4 x float> %a
807}
808
809define <4 x float> @fmaxnumv432_minus_zero_intrinsic(<4 x float> %x) {
810; ARMV7-LABEL: fmaxnumv432_minus_zero_intrinsic:
811; ARMV7:       @ %bb.0:
812; ARMV7-NEXT:    vldr s0, .LCPI22_0
813; ARMV7-NEXT:    vmov d3, r2, r3
814; ARMV7-NEXT:    vmov d2, r0, r1
815; ARMV7-NEXT:    vcmp.f32 s6, s0
816; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
817; ARMV7-NEXT:    vcmp.f32 s7, s0
818; ARMV7-NEXT:    vmov.f32 s2, s0
819; ARMV7-NEXT:    vmovgt.f32 s2, s6
820; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
821; ARMV7-NEXT:    vcmp.f32 s5, s0
822; ARMV7-NEXT:    vmov.f32 s3, s0
823; ARMV7-NEXT:    vmovgt.f32 s3, s7
824; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
825; ARMV7-NEXT:    vcmp.f32 s4, s0
826; ARMV7-NEXT:    vmov.f32 s1, s0
827; ARMV7-NEXT:    vmovgt.f32 s1, s5
828; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
829; ARMV7-NEXT:    vmovgt.f32 s0, s4
830; ARMV7-NEXT:    vmov r2, r3, d1
831; ARMV7-NEXT:    vmov r0, r1, d0
832; ARMV7-NEXT:    bx lr
833; ARMV7-NEXT:    .p2align 2
834; ARMV7-NEXT:  @ %bb.1:
835; ARMV7-NEXT:  .LCPI22_0:
836; ARMV7-NEXT:    .long 0x80000000 @ float -0
837;
838; ARMV8-LABEL: fmaxnumv432_minus_zero_intrinsic:
839; ARMV8:       @ %bb.0:
840; ARMV8-NEXT:    vmov d17, r2, r3
841; ARMV8-NEXT:    vmov d16, r0, r1
842; ARMV8-NEXT:    vmov.i32 q9, #0x80000000
843; ARMV8-NEXT:    vmaxnm.f32 q8, q8, q9
844; ARMV8-NEXT:    vmov r0, r1, d16
845; ARMV8-NEXT:    vmov r2, r3, d17
846; ARMV8-NEXT:    bx lr
847;
848; ARMV8M-LABEL: fmaxnumv432_minus_zero_intrinsic:
849; ARMV8M:       @ %bb.0:
850; ARMV8M-NEXT:    vmov d1, r2, r3
851; ARMV8M-NEXT:    vmov.i32 q1, #0x80000000
852; ARMV8M-NEXT:    vmov d0, r0, r1
853; ARMV8M-NEXT:    vmaxnm.f32 q0, q0, q1
854; ARMV8M-NEXT:    vmov r0, r1, d0
855; ARMV8M-NEXT:    vmov r2, r3, d1
856; ARMV8M-NEXT:    bx lr
857  %a = call nnan <4 x float> @llvm.maxnum.v4f32(<4 x float> %x, <4 x float><float -0.0, float -0.0, float -0.0, float -0.0>)
858  ret <4 x float> %a
859}
860
861define <4 x float> @fmaxnumv432_non_zero_intrinsic(<4 x float> %x) {
862; ARMV7-LABEL: fmaxnumv432_non_zero_intrinsic:
863; ARMV7:       @ %bb.0:
864; ARMV7-NEXT:    vmov d19, r2, r3
865; ARMV7-NEXT:    vmov.f32 q8, #1.000000e+00
866; ARMV7-NEXT:    vmov d18, r0, r1
867; ARMV7-NEXT:    vmax.f32 q8, q9, q8
868; ARMV7-NEXT:    vmov r0, r1, d16
869; ARMV7-NEXT:    vmov r2, r3, d17
870; ARMV7-NEXT:    bx lr
871;
872; ARMV8-LABEL: fmaxnumv432_non_zero_intrinsic:
873; ARMV8:       @ %bb.0:
874; ARMV8-NEXT:    vmov d17, r2, r3
875; ARMV8-NEXT:    vmov d16, r0, r1
876; ARMV8-NEXT:    vmov.f32 q9, #1.000000e+00
877; ARMV8-NEXT:    vmaxnm.f32 q8, q8, q9
878; ARMV8-NEXT:    vmov r0, r1, d16
879; ARMV8-NEXT:    vmov r2, r3, d17
880; ARMV8-NEXT:    bx lr
881;
882; ARMV8M-LABEL: fmaxnumv432_non_zero_intrinsic:
883; ARMV8M:       @ %bb.0:
884; ARMV8M-NEXT:    vmov d1, r2, r3
885; ARMV8M-NEXT:    vmov.f32 q1, #1.000000e+00
886; ARMV8M-NEXT:    vmov d0, r0, r1
887; ARMV8M-NEXT:    vmaxnm.f32 q0, q0, q1
888; ARMV8M-NEXT:    vmov r0, r1, d0
889; ARMV8M-NEXT:    vmov r2, r3, d1
890; ARMV8M-NEXT:    bx lr
891  %a = call nnan <4 x float> @llvm.maxnum.v4f32(<4 x float> %x, <4 x float><float 1.0, float 1.0, float 1.0, float 1.0>)
892  ret <4 x float> %a
893}
894
895define <2 x double> @fminnumv264_intrinsic(<2 x double> %x, <2 x double> %y) {
896; ARMV7-LABEL: fminnumv264_intrinsic:
897; ARMV7:       @ %bb.0:
898; ARMV7-NEXT:    mov r12, sp
899; ARMV7-NEXT:    vld1.64 {d16, d17}, [r12]
900; ARMV7-NEXT:    vmov d18, r0, r1
901; ARMV7-NEXT:    vcmp.f64 d18, d16
902; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
903; ARMV7-NEXT:    vmov d19, r2, r3
904; ARMV7-NEXT:    vcmp.f64 d19, d17
905; ARMV7-NEXT:    vmovlt.f64 d16, d18
906; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
907; ARMV7-NEXT:    vmov r0, r1, d16
908; ARMV7-NEXT:    vmovlt.f64 d17, d19
909; ARMV7-NEXT:    vmov r2, r3, d17
910; ARMV7-NEXT:    bx lr
911;
912; ARMV8-LABEL: fminnumv264_intrinsic:
913; ARMV8:       @ %bb.0:
914; ARMV8-NEXT:    mov r12, sp
915; ARMV8-NEXT:    vld1.64 {d16, d17}, [r12]
916; ARMV8-NEXT:    vmov d19, r0, r1
917; ARMV8-NEXT:    vmov d18, r2, r3
918; ARMV8-NEXT:    vminnm.f64 d19, d19, d16
919; ARMV8-NEXT:    vminnm.f64 d16, d18, d17
920; ARMV8-NEXT:    vmov r0, r1, d19
921; ARMV8-NEXT:    vmov r2, r3, d16
922; ARMV8-NEXT:    bx lr
923;
924; ARMV8M-LABEL: fminnumv264_intrinsic:
925; ARMV8M:       @ %bb.0:
926; ARMV8M-NEXT:    mov r12, sp
927; ARMV8M-NEXT:    vmov d0, r0, r1
928; ARMV8M-NEXT:    vldrw.u32 q1, [r12]
929; ARMV8M-NEXT:    vmov d1, r2, r3
930; ARMV8M-NEXT:    vcmp.f64 d2, d0
931; ARMV8M-NEXT:    vmrs APSR_nzcv, fpscr
932; ARMV8M-NEXT:    vcmp.f64 d3, d1
933; ARMV8M-NEXT:    vselgt.f64 d0, d0, d2
934; ARMV8M-NEXT:    vmrs APSR_nzcv, fpscr
935; ARMV8M-NEXT:    vmov r0, r1, d0
936; ARMV8M-NEXT:    vselgt.f64 d0, d1, d3
937; ARMV8M-NEXT:    vmov r2, r3, d0
938; ARMV8M-NEXT:    bx lr
939  %a = call nnan <2 x double> @llvm.minnum.v2f64(<2 x double> %x, <2 x double> %y)
940  ret <2 x double> %a
941}
942
943define <2 x double> @fminnumv264_nsz_intrinsic(<2 x double> %x, <2 x double> %y) {
944; ARMV7-LABEL: fminnumv264_nsz_intrinsic:
945; ARMV7:       @ %bb.0:
946; ARMV7-NEXT:    mov r12, sp
947; ARMV7-NEXT:    vld1.64 {d16, d17}, [r12]
948; ARMV7-NEXT:    vmov d18, r0, r1
949; ARMV7-NEXT:    vcmp.f64 d18, d16
950; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
951; ARMV7-NEXT:    vmov d19, r2, r3
952; ARMV7-NEXT:    vcmp.f64 d19, d17
953; ARMV7-NEXT:    vmovlt.f64 d16, d18
954; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
955; ARMV7-NEXT:    vmov r0, r1, d16
956; ARMV7-NEXT:    vmovlt.f64 d17, d19
957; ARMV7-NEXT:    vmov r2, r3, d17
958; ARMV7-NEXT:    bx lr
959;
960; ARMV8-LABEL: fminnumv264_nsz_intrinsic:
961; ARMV8:       @ %bb.0:
962; ARMV8-NEXT:    mov r12, sp
963; ARMV8-NEXT:    vld1.64 {d16, d17}, [r12]
964; ARMV8-NEXT:    vmov d19, r0, r1
965; ARMV8-NEXT:    vmov d18, r2, r3
966; ARMV8-NEXT:    vminnm.f64 d19, d19, d16
967; ARMV8-NEXT:    vminnm.f64 d16, d18, d17
968; ARMV8-NEXT:    vmov r0, r1, d19
969; ARMV8-NEXT:    vmov r2, r3, d16
970; ARMV8-NEXT:    bx lr
971;
972; ARMV8M-LABEL: fminnumv264_nsz_intrinsic:
973; ARMV8M:       @ %bb.0:
974; ARMV8M-NEXT:    mov r12, sp
975; ARMV8M-NEXT:    vmov d0, r0, r1
976; ARMV8M-NEXT:    vldrw.u32 q1, [r12]
977; ARMV8M-NEXT:    vmov d1, r2, r3
978; ARMV8M-NEXT:    vcmp.f64 d2, d0
979; ARMV8M-NEXT:    vmrs APSR_nzcv, fpscr
980; ARMV8M-NEXT:    vcmp.f64 d3, d1
981; ARMV8M-NEXT:    vselgt.f64 d0, d0, d2
982; ARMV8M-NEXT:    vmrs APSR_nzcv, fpscr
983; ARMV8M-NEXT:    vmov r0, r1, d0
984; ARMV8M-NEXT:    vselgt.f64 d0, d1, d3
985; ARMV8M-NEXT:    vmov r2, r3, d0
986; ARMV8M-NEXT:    bx lr
987  %a = call nnan nsz <2 x double> @llvm.minnum.v2f64(<2 x double> %x, <2 x double> %y)
988  ret <2 x double> %a
989}
990
991define <2 x double> @fminnumv264_non_zero_intrinsic(<2 x double> %x) {
992; ARMV7-LABEL: fminnumv264_non_zero_intrinsic:
993; ARMV7:       @ %bb.0:
994; ARMV7-NEXT:    vmov.f64 d16, #1.000000e+00
995; ARMV7-NEXT:    vmov d17, r0, r1
996; ARMV7-NEXT:    vcmp.f64 d17, d16
997; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
998; ARMV7-NEXT:    vmov d18, r2, r3
999; ARMV7-NEXT:    vcmp.f64 d18, d16
1000; ARMV7-NEXT:    vmov.f64 d19, d16
1001; ARMV7-NEXT:    vmovlt.f64 d19, d17
1002; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
1003; ARMV7-NEXT:    vmov r0, r1, d19
1004; ARMV7-NEXT:    vmovlt.f64 d16, d18
1005; ARMV7-NEXT:    vmov r2, r3, d16
1006; ARMV7-NEXT:    bx lr
1007;
1008; ARMV8-LABEL: fminnumv264_non_zero_intrinsic:
1009; ARMV8:       @ %bb.0:
1010; ARMV8-NEXT:    vmov.f64 d16, #1.000000e+00
1011; ARMV8-NEXT:    vmov d18, r0, r1
1012; ARMV8-NEXT:    vmov d17, r2, r3
1013; ARMV8-NEXT:    vminnm.f64 d18, d18, d16
1014; ARMV8-NEXT:    vminnm.f64 d16, d17, d16
1015; ARMV8-NEXT:    vmov r0, r1, d18
1016; ARMV8-NEXT:    vmov r2, r3, d16
1017; ARMV8-NEXT:    bx lr
1018;
1019; ARMV8M-LABEL: fminnumv264_non_zero_intrinsic:
1020; ARMV8M:       @ %bb.0:
1021; ARMV8M-NEXT:    vmov d1, r0, r1
1022; ARMV8M-NEXT:    vmov.f64 d0, #1.000000e+00
1023; ARMV8M-NEXT:    vcmp.f64 d0, d1
1024; ARMV8M-NEXT:    vmrs APSR_nzcv, fpscr
1025; ARMV8M-NEXT:    vmov d2, r2, r3
1026; ARMV8M-NEXT:    vcmp.f64 d0, d2
1027; ARMV8M-NEXT:    vselgt.f64 d1, d1, d0
1028; ARMV8M-NEXT:    vmrs APSR_nzcv, fpscr
1029; ARMV8M-NEXT:    vmov r0, r1, d1
1030; ARMV8M-NEXT:    vselgt.f64 d0, d2, d0
1031; ARMV8M-NEXT:    vmov r2, r3, d0
1032; ARMV8M-NEXT:    bx lr
1033  %a = call nnan <2 x double> @llvm.minnum.v2f64(<2 x double> %x, <2 x double><double 1.0, double 1.0>)
1034  ret <2 x double> %a
1035}
1036
1037define <2 x double> @fminnumv264_one_zero_intrinsic(<2 x double> %x) {
1038; ARMV7-LABEL: fminnumv264_one_zero_intrinsic:
1039; ARMV7:       @ %bb.0:
1040; ARMV7-NEXT:    vmov d18, r2, r3
1041; ARMV7-NEXT:    vcmp.f64 d18, #0
1042; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
1043; ARMV7-NEXT:    vmov d19, r0, r1
1044; ARMV7-NEXT:    vmov.f64 d16, #-1.000000e+00
1045; ARMV7-NEXT:    vcmp.f64 d19, d16
1046; ARMV7-NEXT:    vmov.i32 d17, #0x0
1047; ARMV7-NEXT:    vmovlt.f64 d17, d18
1048; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
1049; ARMV7-NEXT:    vmov r2, r3, d17
1050; ARMV7-NEXT:    vmovlt.f64 d16, d19
1051; ARMV7-NEXT:    vmov r0, r1, d16
1052; ARMV7-NEXT:    bx lr
1053;
1054; ARMV8-LABEL: fminnumv264_one_zero_intrinsic:
1055; ARMV8:       @ %bb.0:
1056; ARMV8-NEXT:    vmov.f64 d16, #-1.000000e+00
1057; ARMV8-NEXT:    vmov d18, r0, r1
1058; ARMV8-NEXT:    vmov.i32 d17, #0x0
1059; ARMV8-NEXT:    vminnm.f64 d16, d18, d16
1060; ARMV8-NEXT:    vmov d19, r2, r3
1061; ARMV8-NEXT:    vminnm.f64 d17, d19, d17
1062; ARMV8-NEXT:    vmov r0, r1, d16
1063; ARMV8-NEXT:    vmov r2, r3, d17
1064; ARMV8-NEXT:    bx lr
1065;
1066; ARMV8M-LABEL: fminnumv264_one_zero_intrinsic:
1067; ARMV8M:       @ %bb.0:
1068; ARMV8M-NEXT:    vmov d1, r2, r3
1069; ARMV8M-NEXT:    vldr d0, .LCPI27_0
1070; ARMV8M-NEXT:    vcmp.f64 d1, #0
1071; ARMV8M-NEXT:    vmrs APSR_nzcv, fpscr
1072; ARMV8M-NEXT:    vmov d2, r0, r1
1073; ARMV8M-NEXT:    vmov.f64 d3, #-1.000000e+00
1074; ARMV8M-NEXT:    vcmp.f64 d3, d2
1075; ARMV8M-NEXT:    vmovlt.f64 d0, d1
1076; ARMV8M-NEXT:    vmrs APSR_nzcv, fpscr
1077; ARMV8M-NEXT:    vmov r2, r3, d0
1078; ARMV8M-NEXT:    vselgt.f64 d1, d2, d3
1079; ARMV8M-NEXT:    vmov r0, r1, d1
1080; ARMV8M-NEXT:    bx lr
1081; ARMV8M-NEXT:    .p2align 3
1082; ARMV8M-NEXT:  @ %bb.1:
1083; ARMV8M-NEXT:  .LCPI27_0:
1084; ARMV8M-NEXT:    .long 0 @ double 0
1085; ARMV8M-NEXT:    .long 0
1086  %a = call nnan <2 x double> @llvm.minnum.v2f64(<2 x double> %x, <2 x double><double -1.0, double 0.0>)
1087  ret <2 x double> %a
1088}
1089
1090define <2 x double> @fmaxnumv264_intrinsic(<2 x double> %x, <2 x double> %y) {
1091; ARMV7-LABEL: fmaxnumv264_intrinsic:
1092; ARMV7:       @ %bb.0:
1093; ARMV7-NEXT:    mov r12, sp
1094; ARMV7-NEXT:    vld1.64 {d16, d17}, [r12]
1095; ARMV7-NEXT:    vmov d18, r0, r1
1096; ARMV7-NEXT:    vcmp.f64 d18, d16
1097; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
1098; ARMV7-NEXT:    vmov d19, r2, r3
1099; ARMV7-NEXT:    vcmp.f64 d19, d17
1100; ARMV7-NEXT:    vmovgt.f64 d16, d18
1101; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
1102; ARMV7-NEXT:    vmov r0, r1, d16
1103; ARMV7-NEXT:    vmovgt.f64 d17, d19
1104; ARMV7-NEXT:    vmov r2, r3, d17
1105; ARMV7-NEXT:    bx lr
1106;
1107; ARMV8-LABEL: fmaxnumv264_intrinsic:
1108; ARMV8:       @ %bb.0:
1109; ARMV8-NEXT:    mov r12, sp
1110; ARMV8-NEXT:    vld1.64 {d16, d17}, [r12]
1111; ARMV8-NEXT:    vmov d19, r0, r1
1112; ARMV8-NEXT:    vmov d18, r2, r3
1113; ARMV8-NEXT:    vmaxnm.f64 d19, d19, d16
1114; ARMV8-NEXT:    vmaxnm.f64 d16, d18, d17
1115; ARMV8-NEXT:    vmov r0, r1, d19
1116; ARMV8-NEXT:    vmov r2, r3, d16
1117; ARMV8-NEXT:    bx lr
1118;
1119; ARMV8M-LABEL: fmaxnumv264_intrinsic:
1120; ARMV8M:       @ %bb.0:
1121; ARMV8M-NEXT:    mov r12, sp
1122; ARMV8M-NEXT:    vmov d1, r0, r1
1123; ARMV8M-NEXT:    vldrw.u32 q1, [r12]
1124; ARMV8M-NEXT:    vmov d0, r2, r3
1125; ARMV8M-NEXT:    vcmp.f64 d1, d2
1126; ARMV8M-NEXT:    vmrs APSR_nzcv, fpscr
1127; ARMV8M-NEXT:    vcmp.f64 d0, d3
1128; ARMV8M-NEXT:    vselgt.f64 d1, d1, d2
1129; ARMV8M-NEXT:    vmrs APSR_nzcv, fpscr
1130; ARMV8M-NEXT:    vmov r0, r1, d1
1131; ARMV8M-NEXT:    vselgt.f64 d0, d0, d3
1132; ARMV8M-NEXT:    vmov r2, r3, d0
1133; ARMV8M-NEXT:    bx lr
1134  %a = call nnan <2 x double> @llvm.maxnum.v2f64(<2 x double> %x, <2 x double> %y)
1135  ret <2 x double> %a
1136}
1137
1138define <2 x double> @fmaxnumv264_nsz_intrinsic(<2 x double> %x, <2 x double> %y) {
1139; ARMV7-LABEL: fmaxnumv264_nsz_intrinsic:
1140; ARMV7:       @ %bb.0:
1141; ARMV7-NEXT:    mov r12, sp
1142; ARMV7-NEXT:    vld1.64 {d16, d17}, [r12]
1143; ARMV7-NEXT:    vmov d18, r0, r1
1144; ARMV7-NEXT:    vcmp.f64 d18, d16
1145; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
1146; ARMV7-NEXT:    vmov d19, r2, r3
1147; ARMV7-NEXT:    vcmp.f64 d19, d17
1148; ARMV7-NEXT:    vmovgt.f64 d16, d18
1149; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
1150; ARMV7-NEXT:    vmov r0, r1, d16
1151; ARMV7-NEXT:    vmovgt.f64 d17, d19
1152; ARMV7-NEXT:    vmov r2, r3, d17
1153; ARMV7-NEXT:    bx lr
1154;
1155; ARMV8-LABEL: fmaxnumv264_nsz_intrinsic:
1156; ARMV8:       @ %bb.0:
1157; ARMV8-NEXT:    mov r12, sp
1158; ARMV8-NEXT:    vld1.64 {d16, d17}, [r12]
1159; ARMV8-NEXT:    vmov d19, r0, r1
1160; ARMV8-NEXT:    vmov d18, r2, r3
1161; ARMV8-NEXT:    vmaxnm.f64 d19, d19, d16
1162; ARMV8-NEXT:    vmaxnm.f64 d16, d18, d17
1163; ARMV8-NEXT:    vmov r0, r1, d19
1164; ARMV8-NEXT:    vmov r2, r3, d16
1165; ARMV8-NEXT:    bx lr
1166;
1167; ARMV8M-LABEL: fmaxnumv264_nsz_intrinsic:
1168; ARMV8M:       @ %bb.0:
1169; ARMV8M-NEXT:    mov r12, sp
1170; ARMV8M-NEXT:    vmov d1, r0, r1
1171; ARMV8M-NEXT:    vldrw.u32 q1, [r12]
1172; ARMV8M-NEXT:    vmov d0, r2, r3
1173; ARMV8M-NEXT:    vcmp.f64 d1, d2
1174; ARMV8M-NEXT:    vmrs APSR_nzcv, fpscr
1175; ARMV8M-NEXT:    vcmp.f64 d0, d3
1176; ARMV8M-NEXT:    vselgt.f64 d1, d1, d2
1177; ARMV8M-NEXT:    vmrs APSR_nzcv, fpscr
1178; ARMV8M-NEXT:    vmov r0, r1, d1
1179; ARMV8M-NEXT:    vselgt.f64 d0, d0, d3
1180; ARMV8M-NEXT:    vmov r2, r3, d0
1181; ARMV8M-NEXT:    bx lr
1182  %a = call nnan nsz <2 x double> @llvm.maxnum.v2f64(<2 x double> %x, <2 x double> %y)
1183  ret <2 x double> %a
1184}
1185
1186define <2 x double> @fmaxnumv264_zero_intrinsic(<2 x double> %x) {
1187; ARMV7-LABEL: fmaxnumv264_zero_intrinsic:
1188; ARMV7:       @ %bb.0:
1189; ARMV7-NEXT:    vmov d18, r0, r1
1190; ARMV7-NEXT:    vldr d16, .LCPI30_0
1191; ARMV7-NEXT:    vcmp.f64 d18, #0
1192; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
1193; ARMV7-NEXT:    vmov d19, r2, r3
1194; ARMV7-NEXT:    vcmp.f64 d19, d16
1195; ARMV7-NEXT:    vmov.i32 d17, #0x0
1196; ARMV7-NEXT:    vmovgt.f64 d17, d18
1197; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
1198; ARMV7-NEXT:    vmov r0, r1, d17
1199; ARMV7-NEXT:    vmovgt.f64 d16, d19
1200; ARMV7-NEXT:    vmov r2, r3, d16
1201; ARMV7-NEXT:    bx lr
1202; ARMV7-NEXT:    .p2align 3
1203; ARMV7-NEXT:  @ %bb.1:
1204; ARMV7-NEXT:  .LCPI30_0:
1205; ARMV7-NEXT:    .long 0 @ double -0
1206; ARMV7-NEXT:    .long 2147483648
1207;
1208; ARMV8-LABEL: fmaxnumv264_zero_intrinsic:
1209; ARMV8:       @ %bb.0:
1210; ARMV8-NEXT:    vldr d16, .LCPI30_0
1211; ARMV8-NEXT:    vmov d18, r2, r3
1212; ARMV8-NEXT:    vmov.i32 d17, #0x0
1213; ARMV8-NEXT:    vmov d19, r0, r1
1214; ARMV8-NEXT:    vmaxnm.f64 d16, d18, d16
1215; ARMV8-NEXT:    vmaxnm.f64 d17, d19, d17
1216; ARMV8-NEXT:    vmov r2, r3, d16
1217; ARMV8-NEXT:    vmov r0, r1, d17
1218; ARMV8-NEXT:    bx lr
1219; ARMV8-NEXT:    .p2align 3
1220; ARMV8-NEXT:  @ %bb.1:
1221; ARMV8-NEXT:  .LCPI30_0:
1222; ARMV8-NEXT:    .long 0 @ double -0
1223; ARMV8-NEXT:    .long 2147483648
1224;
1225; ARMV8M-LABEL: fmaxnumv264_zero_intrinsic:
1226; ARMV8M:       @ %bb.0:
1227; ARMV8M-NEXT:    vmov d2, r0, r1
1228; ARMV8M-NEXT:    vldr d0, .LCPI30_0
1229; ARMV8M-NEXT:    vcmp.f64 d2, #0
1230; ARMV8M-NEXT:    vmrs APSR_nzcv, fpscr
1231; ARMV8M-NEXT:    vmov d1, r2, r3
1232; ARMV8M-NEXT:    vcmp.f64 d1, d0
1233; ARMV8M-NEXT:    vldr d3, .LCPI30_1
1234; ARMV8M-NEXT:    vselgt.f64 d2, d2, d3
1235; ARMV8M-NEXT:    vmrs APSR_nzcv, fpscr
1236; ARMV8M-NEXT:    vmov r0, r1, d2
1237; ARMV8M-NEXT:    vselgt.f64 d0, d1, d0
1238; ARMV8M-NEXT:    vmov r2, r3, d0
1239; ARMV8M-NEXT:    bx lr
1240; ARMV8M-NEXT:    .p2align 3
1241; ARMV8M-NEXT:  @ %bb.1:
1242; ARMV8M-NEXT:  .LCPI30_0:
1243; ARMV8M-NEXT:    .long 0 @ double -0
1244; ARMV8M-NEXT:    .long 2147483648
1245; ARMV8M-NEXT:  .LCPI30_1:
1246; ARMV8M-NEXT:    .long 0 @ double 0
1247; ARMV8M-NEXT:    .long 0
1248  %a = call nnan <2 x double> @llvm.maxnum.v2f64(<2 x double> %x, <2 x double><double 0.0, double -0.0>)
1249  ret <2 x double> %a
1250}
1251
1252define <2 x double> @fmaxnumv264_minus_zero_intrinsic(<2 x double> %x) {
1253; ARMV7-LABEL: fmaxnumv264_minus_zero_intrinsic:
1254; ARMV7:       @ %bb.0:
1255; ARMV7-NEXT:    vldr d16, .LCPI31_0
1256; ARMV7-NEXT:    vmov d17, r0, r1
1257; ARMV7-NEXT:    vmov d18, r2, r3
1258; ARMV7-NEXT:    vcmp.f64 d17, d16
1259; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
1260; ARMV7-NEXT:    vcmp.f64 d18, d16
1261; ARMV7-NEXT:    vmov.f64 d19, d16
1262; ARMV7-NEXT:    vmovgt.f64 d19, d17
1263; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
1264; ARMV7-NEXT:    vmov r0, r1, d19
1265; ARMV7-NEXT:    vmovgt.f64 d16, d18
1266; ARMV7-NEXT:    vmov r2, r3, d16
1267; ARMV7-NEXT:    bx lr
1268; ARMV7-NEXT:    .p2align 3
1269; ARMV7-NEXT:  @ %bb.1:
1270; ARMV7-NEXT:  .LCPI31_0:
1271; ARMV7-NEXT:    .long 0 @ double -0
1272; ARMV7-NEXT:    .long 2147483648
1273;
1274; ARMV8-LABEL: fmaxnumv264_minus_zero_intrinsic:
1275; ARMV8:       @ %bb.0:
1276; ARMV8-NEXT:    vldr d16, .LCPI31_0
1277; ARMV8-NEXT:    vmov d18, r0, r1
1278; ARMV8-NEXT:    vmov d17, r2, r3
1279; ARMV8-NEXT:    vmaxnm.f64 d18, d18, d16
1280; ARMV8-NEXT:    vmaxnm.f64 d16, d17, d16
1281; ARMV8-NEXT:    vmov r0, r1, d18
1282; ARMV8-NEXT:    vmov r2, r3, d16
1283; ARMV8-NEXT:    bx lr
1284; ARMV8-NEXT:    .p2align 3
1285; ARMV8-NEXT:  @ %bb.1:
1286; ARMV8-NEXT:  .LCPI31_0:
1287; ARMV8-NEXT:    .long 0 @ double -0
1288; ARMV8-NEXT:    .long 2147483648
1289;
1290; ARMV8M-LABEL: fmaxnumv264_minus_zero_intrinsic:
1291; ARMV8M:       @ %bb.0:
1292; ARMV8M-NEXT:    vldr d0, .LCPI31_0
1293; ARMV8M-NEXT:    vmov d1, r0, r1
1294; ARMV8M-NEXT:    vmov d2, r2, r3
1295; ARMV8M-NEXT:    vcmp.f64 d1, d0
1296; ARMV8M-NEXT:    vmrs APSR_nzcv, fpscr
1297; ARMV8M-NEXT:    vcmp.f64 d2, d0
1298; ARMV8M-NEXT:    vselgt.f64 d1, d1, d0
1299; ARMV8M-NEXT:    vmrs APSR_nzcv, fpscr
1300; ARMV8M-NEXT:    vmov r0, r1, d1
1301; ARMV8M-NEXT:    vselgt.f64 d0, d2, d0
1302; ARMV8M-NEXT:    vmov r2, r3, d0
1303; ARMV8M-NEXT:    bx lr
1304; ARMV8M-NEXT:    .p2align 3
1305; ARMV8M-NEXT:  @ %bb.1:
1306; ARMV8M-NEXT:  .LCPI31_0:
1307; ARMV8M-NEXT:    .long 0 @ double -0
1308; ARMV8M-NEXT:    .long 2147483648
1309  %a = call nnan <2 x double> @llvm.maxnum.v2f64(<2 x double> %x, <2 x double><double -0.0, double -0.0>)
1310  ret <2 x double> %a
1311}
1312
1313define <2 x double> @fmaxnumv264_non_zero_intrinsic(<2 x double> %x) {
1314; ARMV7-LABEL: fmaxnumv264_non_zero_intrinsic:
1315; ARMV7:       @ %bb.0:
1316; ARMV7-NEXT:    vmov.f64 d16, #1.000000e+00
1317; ARMV7-NEXT:    vmov d17, r0, r1
1318; ARMV7-NEXT:    vcmp.f64 d17, d16
1319; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
1320; ARMV7-NEXT:    vmov d18, r2, r3
1321; ARMV7-NEXT:    vcmp.f64 d18, d16
1322; ARMV7-NEXT:    vmov.f64 d19, d16
1323; ARMV7-NEXT:    vmovgt.f64 d19, d17
1324; ARMV7-NEXT:    vmrs APSR_nzcv, fpscr
1325; ARMV7-NEXT:    vmov r0, r1, d19
1326; ARMV7-NEXT:    vmovgt.f64 d16, d18
1327; ARMV7-NEXT:    vmov r2, r3, d16
1328; ARMV7-NEXT:    bx lr
1329;
1330; ARMV8-LABEL: fmaxnumv264_non_zero_intrinsic:
1331; ARMV8:       @ %bb.0:
1332; ARMV8-NEXT:    vmov.f64 d16, #1.000000e+00
1333; ARMV8-NEXT:    vmov d18, r0, r1
1334; ARMV8-NEXT:    vmov d17, r2, r3
1335; ARMV8-NEXT:    vmaxnm.f64 d18, d18, d16
1336; ARMV8-NEXT:    vmaxnm.f64 d16, d17, d16
1337; ARMV8-NEXT:    vmov r0, r1, d18
1338; ARMV8-NEXT:    vmov r2, r3, d16
1339; ARMV8-NEXT:    bx lr
1340;
1341; ARMV8M-LABEL: fmaxnumv264_non_zero_intrinsic:
1342; ARMV8M:       @ %bb.0:
1343; ARMV8M-NEXT:    vmov.f64 d0, #1.000000e+00
1344; ARMV8M-NEXT:    vmov d1, r0, r1
1345; ARMV8M-NEXT:    vcmp.f64 d1, d0
1346; ARMV8M-NEXT:    vmrs APSR_nzcv, fpscr
1347; ARMV8M-NEXT:    vmov d2, r2, r3
1348; ARMV8M-NEXT:    vcmp.f64 d2, d0
1349; ARMV8M-NEXT:    vselgt.f64 d1, d1, d0
1350; ARMV8M-NEXT:    vmrs APSR_nzcv, fpscr
1351; ARMV8M-NEXT:    vmov r0, r1, d1
1352; ARMV8M-NEXT:    vselgt.f64 d0, d2, d0
1353; ARMV8M-NEXT:    vmov r2, r3, d0
1354; ARMV8M-NEXT:    bx lr
1355  %a = call nnan <2 x double> @llvm.maxnum.v2f64(<2 x double> %x, <2 x double><double 1.0, double 1.0>)
1356  ret <2 x double> %a
1357}
1358
1359define void @pr65820(ptr %y, <4 x float> %splat) {
1360; ARMV7-LABEL: pr65820:
1361; ARMV7:       @ %bb.0: @ %entry
1362; ARMV7-NEXT:    vmov d16, r2, r3
1363; ARMV7-NEXT:    vdup.32 q8, d16[0]
1364; ARMV7-NEXT:    vcgt.f32 q9, q8, #0
1365; ARMV7-NEXT:    vand q8, q8, q9
1366; ARMV7-NEXT:    vst1.32 {d16, d17}, [r0]
1367; ARMV7-NEXT:    bx lr
1368;
1369; ARMV8-LABEL: pr65820:
1370; ARMV8:       @ %bb.0: @ %entry
1371; ARMV8-NEXT:    vmov d16, r2, r3
1372; ARMV8-NEXT:    vmov.i32 q9, #0x0
1373; ARMV8-NEXT:    vdup.32 q8, d16[0]
1374; ARMV8-NEXT:    vmaxnm.f32 q8, q8, q9
1375; ARMV8-NEXT:    vst1.32 {d16, d17}, [r0]
1376; ARMV8-NEXT:    bx lr
1377;
1378; ARMV8M-LABEL: pr65820:
1379; ARMV8M:       @ %bb.0: @ %entry
1380; ARMV8M-NEXT:    vmov d0, r2, r3
1381; ARMV8M-NEXT:    vmov r1, s0
1382; ARMV8M-NEXT:    vmov.i32 q0, #0x0
1383; ARMV8M-NEXT:    vdup.32 q1, r1
1384; ARMV8M-NEXT:    vmaxnm.f32 q0, q1, q0
1385; ARMV8M-NEXT:    vstrw.32 q0, [r0]
1386; ARMV8M-NEXT:    bx lr
1387entry:
1388  %broadcast.splat = shufflevector <4 x float> %splat, <4 x float> zeroinitializer, <4 x i32> zeroinitializer
1389  %0 = fcmp ogt <4 x float> %broadcast.splat, zeroinitializer
1390  %1 = select <4 x i1> %0, <4 x float> %broadcast.splat, <4 x float> zeroinitializer
1391  store <4 x float> %1, ptr %y, align 4
1392  ret void
1393}
1394