11; RUN: llc -mtriple=armv8 -mattr=+neon %s -o - | FileCheck %s
22
33declare float @llvm.arm.neon.vrintn.f32 (float ) nounwind readnone
4+ declare <2 x float > @llvm.arm.neon.vrintn.v2f32 (<2 x float >) nounwind readnone
5+ declare <4 x float > @llvm.arm.neon.vrintn.v4f32 (<4 x float >) nounwind readnone
46
57; CHECK-LABEL: vrintn_f32:
68; CHECK: vrintn.f32
@@ -9,3 +11,109 @@ define float @vrintn_f32(ptr %A) nounwind {
911 %tmp2 = call float @llvm.arm.neon.vrintn.f32 (float %tmp1 )
1012 ret float %tmp2
1113}
14+
15+ define <2 x float > @frintn_2s (<2 x float > %A ) nounwind {
16+ ; CHECK-LABEL: frintn_2s:
17+ ; CHECK: @ %bb.0:
18+ ; CHECK-NEXT: vmov d16, r0, r1
19+ ; CHECK-NEXT: vrintn.f32 d16, d16
20+ ; CHECK-NEXT: vmov r0, r1, d16
21+ ; CHECK-NEXT: bx lr
22+ %tmp3 = call <2 x float > @llvm.arm.neon.vrintn.v2f32 (<2 x float > %A )
23+ ret <2 x float > %tmp3
24+ }
25+
26+ define <4 x float > @frintn_4s (<4 x float > %A ) nounwind {
27+ ; CHECK-LABEL: frintn_4s:
28+ ; CHECK: @ %bb.0:
29+ ; CHECK-NEXT: vmov d17, r2, r3
30+ ; CHECK-NEXT: vmov d16, r0, r1
31+ ; CHECK-NEXT: vrintn.f32 q8, q8
32+ ; CHECK-NEXT: vmov r0, r1, d16
33+ ; CHECK-NEXT: vmov r2, r3, d17
34+ ; CHECK-NEXT: bx lr
35+ %tmp3 = call <4 x float > @llvm.arm.neon.vrintn.v4f32 (<4 x float > %A )
36+ ret <4 x float > %tmp3
37+ }
38+
39+ define <4 x half > @roundeven_4h (<4 x half > %A ) nounwind {
40+ ; CHECK-LABEL: roundeven_4h:
41+ ; CHECK: @ %bb.0:
42+ ; CHECK-NEXT: vmov s0, r3
43+ ; CHECK-NEXT: vcvtb.f32.f16 s0, s0
44+ ; CHECK-NEXT: vmov s2, r2
45+ ; CHECK-NEXT: vrintn.f32 s0, s0
46+ ; CHECK-NEXT: vcvtb.f32.f16 s2, s2
47+ ; CHECK-NEXT: vrintn.f32 s2, s2
48+ ; CHECK-NEXT: vcvtb.f16.f32 s0, s0
49+ ; CHECK-NEXT: vcvtb.f16.f32 s2, s2
50+ ; CHECK-NEXT: vmov r2, s0
51+ ; CHECK-NEXT: vmov s0, r1
52+ ; CHECK-NEXT: vmov r3, s2
53+ ; CHECK-NEXT: vcvtb.f32.f16 s0, s0
54+ ; CHECK-NEXT: vmov s2, r0
55+ ; CHECK-NEXT: vrintn.f32 s0, s0
56+ ; CHECK-NEXT: vcvtb.f32.f16 s2, s2
57+ ; CHECK-NEXT: vcvtb.f16.f32 s0, s0
58+ ; CHECK-NEXT: vrintn.f32 s2, s2
59+ ; CHECK-NEXT: vmov r0, s0
60+ ; CHECK-NEXT: vcvtb.f16.f32 s2, s2
61+ ; CHECK-NEXT: vmov r1, s2
62+ ; CHECK-NEXT: pkhbt r2, r3, r2, lsl #16
63+ ; CHECK-NEXT: pkhbt r0, r1, r0, lsl #16
64+ ; CHECK-NEXT: vmov d16, r0, r2
65+ ; CHECK-NEXT: vmov.u16 r0, d16[0]
66+ ; CHECK-NEXT: vmov.u16 r1, d16[1]
67+ ; CHECK-NEXT: vmov.u16 r2, d16[2]
68+ ; CHECK-NEXT: vmov.u16 r3, d16[3]
69+ ; CHECK-NEXT: bx lr
70+ %tmp3 = call <4 x half > @llvm.roundeven.v4f16 (<4 x half > %A )
71+ ret <4 x half > %tmp3
72+ }
73+
74+ define <2 x float > @roundeven_2s (<2 x float > %A ) nounwind {
75+ ; CHECK-LABEL: roundeven_2s:
76+ ; CHECK: @ %bb.0:
77+ ; CHECK-NEXT: vmov d0, r0, r1
78+ ; CHECK-NEXT: vrintn.f32 s3, s1
79+ ; CHECK-NEXT: vrintn.f32 s2, s0
80+ ; CHECK-NEXT: vmov r0, r1, d1
81+ ; CHECK-NEXT: bx lr
82+ %tmp3 = call <2 x float > @llvm.roundeven.v2f32 (<2 x float > %A )
83+ ret <2 x float > %tmp3
84+ }
85+
86+ define <4 x float > @roundeven_4s (<4 x float > %A ) nounwind {
87+ ; CHECK-LABEL: roundeven_4s:
88+ ; CHECK: @ %bb.0:
89+ ; CHECK-NEXT: vmov d1, r2, r3
90+ ; CHECK-NEXT: vmov d0, r0, r1
91+ ; CHECK-NEXT: vrintn.f32 s7, s3
92+ ; CHECK-NEXT: vrintn.f32 s6, s2
93+ ; CHECK-NEXT: vrintn.f32 s5, s1
94+ ; CHECK-NEXT: vrintn.f32 s4, s0
95+ ; CHECK-NEXT: vmov r2, r3, d3
96+ ; CHECK-NEXT: vmov r0, r1, d2
97+ ; CHECK-NEXT: bx lr
98+ %tmp3 = call <4 x float > @llvm.roundeven.v4f32 (<4 x float > %A )
99+ ret <4 x float > %tmp3
100+ }
101+
102+ define <2 x double > @roundeven_2d (<2 x double > %A ) nounwind {
103+ ; CHECK-LABEL: roundeven_2d:
104+ ; CHECK: @ %bb.0:
105+ ; CHECK-NEXT: vmov d16, r2, r3
106+ ; CHECK-NEXT: vmov d17, r0, r1
107+ ; CHECK-NEXT: vrintn.f64 d16, d16
108+ ; CHECK-NEXT: vrintn.f64 d17, d17
109+ ; CHECK-NEXT: vmov r2, r3, d16
110+ ; CHECK-NEXT: vmov r0, r1, d17
111+ ; CHECK-NEXT: bx lr
112+ %tmp3 = call <2 x double > @llvm.roundeven.v2f64 (<2 x double > %A )
113+ ret <2 x double > %tmp3
114+ }
115+
116+ declare <4 x half > @llvm.roundeven.v4f16 (<4 x half >) nounwind readnone
117+ declare <2 x float > @llvm.roundeven.v2f32 (<2 x float >) nounwind readnone
118+ declare <4 x float > @llvm.roundeven.v4f32 (<4 x float >) nounwind readnone
119+ declare <2 x double > @llvm.roundeven.v2f64 (<2 x double >) nounwind readnone
0 commit comments