1
1
; RUN: llc -mtriple=armv8 -mattr=+neon %s -o - | FileCheck %s
2
2
3
3
declare 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
4
6
5
7
; CHECK-LABEL: vrintn_f32:
6
8
; CHECK: vrintn.f32
@@ -9,3 +11,109 @@ define float @vrintn_f32(ptr %A) nounwind {
9
11
%tmp2 = call float @llvm.arm.neon.vrintn.f32 (float %tmp1 )
10
12
ret float %tmp2
11
13
}
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