AArch64: make inexact signalling on round Darwin-specific
[oota-llvm.git] / test / CodeGen / AArch64 / arm64-rounding.ll
1 ; RUN: llc -O3 < %s -mtriple=arm64-apple-ios7.0 | FileCheck %s --check-prefix=CHECK-INEXACT
2 ; RUN: llc -O3 < %s -mtriple=aarch64-linux-gnu | FileCheck %s --check-prefix=CHECK-FAST
3
4 ; CHECK-INEXACT-LABEL: test1:
5 ; CHECK-INEXACT-DAG: frintm
6 ; CHECK-INEXACT-DAG: frintx
7
8 ; CHECK-FAST-LABEL: test1:
9 ; CHECK-FAST: frintm
10 ; CHECK-FAST-NOT: frintx
11 define float @test1(float %a) #0 {
12 entry:
13   %call = tail call float @floorf(float %a) nounwind readnone
14   ret float %call
15 }
16
17 declare float @floorf(float) nounwind readnone
18
19 ; CHECK-INEXACT-LABEL: test2:
20 ; CHECK-INEXACT: frintm
21 ; CHECK-INEXACT: frintx
22
23 ; CHECK-FAST-LABEL: test2:
24 ; CHECK-FAST: frintm
25 ; CHECK-FAST-NOT: frintx
26 define double @test2(double %a) #0 {
27 entry:
28   %call = tail call double @floor(double %a) nounwind readnone
29   ret double %call
30 }
31
32 declare double @floor(double) nounwind readnone
33
34 ; CHECK-INEXACT-LABEL: test3:
35 ; CHECK-INEXACT: frinti
36
37 ; CHECK-FAST-LABEL: test3:
38 ; CHECK-FAST: frinti
39 define float @test3(float %a) #0 {
40 entry:
41   %call = tail call float @nearbyintf(float %a) nounwind readnone
42   ret float %call
43 }
44
45 declare float @nearbyintf(float) nounwind readnone
46
47 ; CHECK-INEXACT-LABEL: test4:
48 ; CHECK-INEXACT: frinti
49
50 ; CHECK-FAST-LABEL: test4:
51 ; CHECK-FAST: frinti
52 define double @test4(double %a) #0 {
53 entry:
54   %call = tail call double @nearbyint(double %a) nounwind readnone
55   ret double %call
56 }
57
58 declare double @nearbyint(double) nounwind readnone
59
60 ; CHECK-INEXACT-LABEL: test5:
61 ; CHECK-INEXACT: frintp
62 ; CHECK-INEXACT: frintx
63
64 ; CHECK-FAST-LABEL: test5:
65 ; CHECK-FAST: frintp
66 ; CHECK-FAST-NOT: frintx
67 define float @test5(float %a) #0 {
68 entry:
69   %call = tail call float @ceilf(float %a) nounwind readnone
70   ret float %call
71 }
72
73 declare float @ceilf(float) nounwind readnone
74
75 ; CHECK-INEXACT-LABEL: test6:
76 ; CHECK-INEXACT: frintp
77 ; CHECK-INEXACT: frintx
78
79 ; CHECK-FAST-LABEL: test6:
80 ; CHECK-FAST: frintp
81 ; CHECK-FAST-NOT: frintx
82 define double @test6(double %a) #0 {
83 entry:
84   %call = tail call double @ceil(double %a) nounwind readnone
85   ret double %call
86 }
87
88 declare double @ceil(double) nounwind readnone
89
90 ; CHECK-INEXACT-LABEL: test7:
91 ; CHECK-INEXACT: frintx
92
93 ; CHECK-FAST-LABEL: test7:
94 ; CHECK-FAST: frintx
95 define float @test7(float %a) #0 {
96 entry:
97   %call = tail call float @rintf(float %a) nounwind readnone
98   ret float %call
99 }
100
101 declare float @rintf(float) nounwind readnone
102
103 ; CHECK-INEXACT-LABEL: test8:
104 ; CHECK-INEXACT: frintx
105
106 ; CHECK-FAST-LABEL: test8:
107 ; CHECK-FAST: frintx
108 define double @test8(double %a) #0 {
109 entry:
110   %call = tail call double @rint(double %a) nounwind readnone
111   ret double %call
112 }
113
114 declare double @rint(double) nounwind readnone
115
116 ; CHECK-INEXACT-LABEL: test9:
117 ; CHECK-INEXACT: frintz
118 ; CHECK-INEXACT: frintx
119
120 ; CHECK-FAST-LABEL: test9:
121 ; CHECK-FAST: frintz
122 ; CHECK-FAST-NOT: frintx
123 define float @test9(float %a) #0 {
124 entry:
125   %call = tail call float @truncf(float %a) nounwind readnone
126   ret float %call
127 }
128
129 declare float @truncf(float) nounwind readnone
130
131 ; CHECK-INEXACT-LABEL: test10:
132 ; CHECK-INEXACT: frintz
133 ; CHECK-INEXACT: frintx
134
135 ; CHECK-FAST-LABEL: test10:
136 ; CHECK-FAST: frintz
137 ; CHECK-FAST-NOT: frintx
138 define double @test10(double %a) #0 {
139 entry:
140   %call = tail call double @trunc(double %a) nounwind readnone
141   ret double %call
142 }
143
144 declare double @trunc(double) nounwind readnone
145
146 ; CHECK-INEXACT-LABEL: test11:
147 ; CHECK-INEXACT: frinta
148 ; CHECK-INEXACT: frintx
149
150 ; CHECK-FAST-LABEL: test11:
151 ; CHECK-FAST: frinta
152 ; CHECK-FAST-NOT: frintx
153 define float @test11(float %a) #0 {
154 entry:
155   %call = tail call float @roundf(float %a) nounwind readnone
156   ret float %call
157 }
158
159 declare float @roundf(float %a) nounwind readnone
160
161 ; CHECK-INEXACT-LABEL: test12:
162 ; CHECK-INEXACT: frinta
163 ; CHECK-INEXACT: frintx
164
165 ; CHECK-FAST-LABEL: test12:
166 ; CHECK-FAST: frinta
167 ; CHECK-FAST-NOT: frintx
168 define double @test12(double %a) #0 {
169 entry:
170   %call = tail call double @round(double %a) nounwind readnone
171   ret double %call
172 }
173
174 declare double @round(double %a) nounwind readnone
175
176 ; CHECK-INEXACT-LABEL: test13:
177 ; CHECK-INEXACT-NOT: frintx
178 ; CHECK-INEXACT: frintm
179
180 ; CHECK-FAST-LABEL: test13:
181 ; CHECK-FAST-NOT: frintx
182 ; CHECK-FAST: frintm
183 define float @test13(float %a) #1 {
184 entry:
185   %call = tail call float @floorf(float %a) nounwind readnone
186   ret float %call
187 }
188
189 ; CHECK-INEXACT-LABEL: test14:
190 ; CHECK-INEXACT-NOT: frintx
191 ; CHECK-INEXACT: frintm
192
193 ; CHECK-FAST-LABEL: test14:
194 ; CHECK-FAST-NOT: frintx
195 ; CHECK-FAST: frintm
196 define double @test14(double %a) #1 {
197 entry:
198   %call = tail call double @floor(double %a) nounwind readnone
199   ret double %call
200 }
201
202 ; CHECK-INEXACT-LABEL: test15:
203 ; CHECK-INEXACT-NOT: frintx
204 ; CHECK-INEXACT: frintp
205
206 ; CHECK-FAST-LABEL: test15:
207 ; CHECK-FAST-NOT: frintx
208 ; CHECK-FAST: frintp
209 define float @test15(float %a) #1 {
210 entry:
211   %call = tail call float @ceilf(float %a) nounwind readnone
212   ret float %call
213 }
214
215 ; CHECK-INEXACT-LABEL: test16:
216 ; CHECK-INEXACT-NOT: frintx
217 ; CHECK-INEXACT: frintp
218
219 ; CHECK-FAST-LABEL: test16:
220 ; CHECK-FAST-NOT: frintx
221 ; CHECK-FAST: frintp
222 define double @test16(double %a) #1 {
223 entry:
224   %call = tail call double @ceil(double %a) nounwind readnone
225   ret double %call
226 }
227
228 ; CHECK-INEXACT-LABEL: test17:
229 ; CHECK-INEXACT-NOT: frintx
230 ; CHECK-INEXACT: frintz
231
232 ; CHECK-FAST-LABEL: test17:
233 ; CHECK-FAST-NOT: frintx
234 ; CHECK-FAST: frintz
235 define float @test17(float %a) #1 {
236 entry:
237   %call = tail call float @truncf(float %a) nounwind readnone
238   ret float %call
239 }
240
241 ; CHECK-INEXACT-LABEL: test18:
242 ; CHECK-INEXACT-NOT: frintx
243 ; CHECK-INEXACT: frintz
244
245 ; CHECK-FAST-LABEL: test18:
246 ; CHECK-FAST-NOT: frintx
247 ; CHECK-FAST: frintz
248 define double @test18(double %a) #1 {
249 entry:
250   %call = tail call double @trunc(double %a) nounwind readnone
251   ret double %call
252 }
253
254 ; CHECK-INEXACT-LABEL: test19:
255 ; CHECK-INEXACT-NOT: frintx
256 ; CHECK-INEXACT: frinta
257
258 ; CHECK-FAST-LABEL: test19:
259 ; CHECK-FAST-NOT: frintx
260 ; CHECK-FAST: frinta
261 define float @test19(float %a) #1 {
262 entry:
263   %call = tail call float @roundf(float %a) nounwind readnone
264   ret float %call
265 }
266
267 ; CHECK-INEXACT-LABEL: test20:
268 ; CHECK-INEXACT-NOT: frintx
269 ; CHECK-INEXACT: frinta
270
271 ; CHECK-FAST-LABEL: test20:
272 ; CHECK-FAST-NOT: frintx
273 ; CHECK-FAST: frinta
274 define double @test20(double %a) #1 {
275 entry:
276   %call = tail call double @round(double %a) nounwind readnone
277   ret double %call
278 }
279
280
281
282 attributes #0 = { nounwind }
283 attributes #1 = { nounwind "unsafe-fp-math"="true" }