Guard fabs to bfc convert with V6T2 flag
[oota-llvm.git] / test / CodeGen / ARM / vfloatintrinsics.ll
1 ; RUN: llc -mcpu=swift -march=arm < %s | FileCheck %s
2 target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32"
3 target triple = "thumbv7-apple-ios6.1.0"
4
5 ;;; Float vectors
6
7 %v2f32 = type <2 x float>
8 ; CHECK: test_v2f32.sqrt:
9 define %v2f32 @test_v2f32.sqrt(%v2f32 %a) {
10   ; CHECK: sqrt
11   %1 = call %v2f32 @llvm.sqrt.v2f32(%v2f32 %a)
12   ret %v2f32 %1
13 }
14 ; CHECK: test_v2f32.powi:
15 define %v2f32 @test_v2f32.powi(%v2f32 %a, i32 %b) {
16   ; CHECK: pow
17   %1 = call %v2f32 @llvm.powi.v2f32(%v2f32 %a, i32 %b)
18   ret %v2f32 %1
19 }
20 ; CHECK: test_v2f32.sin:
21 define %v2f32 @test_v2f32.sin(%v2f32 %a) {
22   ; CHECK: sin
23   %1 = call %v2f32 @llvm.sin.v2f32(%v2f32 %a)
24   ret %v2f32 %1
25 }
26 ; CHECK: test_v2f32.cos:
27 define %v2f32 @test_v2f32.cos(%v2f32 %a) {
28   ; CHECK: cos
29   %1 = call %v2f32 @llvm.cos.v2f32(%v2f32 %a)
30   ret %v2f32 %1
31 }
32 ; CHECK: test_v2f32.pow:
33 define %v2f32 @test_v2f32.pow(%v2f32 %a, %v2f32 %b) {
34   ; CHECK: pow
35   %1 = call %v2f32 @llvm.pow.v2f32(%v2f32 %a, %v2f32 %b)
36   ret %v2f32 %1
37 }
38 ; CHECK: test_v2f32.exp:
39 define %v2f32 @test_v2f32.exp(%v2f32 %a) {
40   ; CHECK: exp
41   %1 = call %v2f32 @llvm.exp.v2f32(%v2f32 %a)
42   ret %v2f32 %1
43 }
44 ; CHECK: test_v2f32.exp2:
45 define %v2f32 @test_v2f32.exp2(%v2f32 %a) {
46   ; CHECK: exp
47   %1 = call %v2f32 @llvm.exp2.v2f32(%v2f32 %a)
48   ret %v2f32 %1
49 }
50 ; CHECK: test_v2f32.log:
51 define %v2f32 @test_v2f32.log(%v2f32 %a) {
52   ; CHECK: log
53   %1 = call %v2f32 @llvm.log.v2f32(%v2f32 %a)
54   ret %v2f32 %1
55 }
56 ; CHECK: test_v2f32.log10:
57 define %v2f32 @test_v2f32.log10(%v2f32 %a) {
58   ; CHECK: log
59   %1 = call %v2f32 @llvm.log10.v2f32(%v2f32 %a)
60   ret %v2f32 %1
61 }
62 ; CHECK: test_v2f32.log2:
63 define %v2f32 @test_v2f32.log2(%v2f32 %a) {
64   ; CHECK: log
65   %1 = call %v2f32 @llvm.log2.v2f32(%v2f32 %a)
66   ret %v2f32 %1
67 }
68 ; CHECK: test_v2f32.fma:
69 define %v2f32 @test_v2f32.fma(%v2f32 %a, %v2f32 %b, %v2f32 %c) {
70   ; CHECK: fma
71   %1 = call %v2f32 @llvm.fma.v2f32(%v2f32 %a, %v2f32 %b, %v2f32 %c)
72   ret %v2f32 %1
73 }
74 ; CHECK: test_v2f32.fabs:
75 define %v2f32 @test_v2f32.fabs(%v2f32 %a) {
76   ; CHECK: fabs
77   %1 = call %v2f32 @llvm.fabs.v2f32(%v2f32 %a)
78   ret %v2f32 %1
79 }
80 ; CHECK: test_v2f32.floor:
81 define %v2f32 @test_v2f32.floor(%v2f32 %a) {
82   ; CHECK: floor
83   %1 = call %v2f32 @llvm.floor.v2f32(%v2f32 %a)
84   ret %v2f32 %1
85 }
86 ; CHECK: test_v2f32.fceil:
87 define %v2f32 @test_v2f32.fceil(%v2f32 %a) {
88   ; CHECK: ceil
89   %1 = call %v2f32 @llvm.fceil.v2f32(%v2f32 %a)
90   ret %v2f32 %1
91 }
92 ; CHECK: test_v2f32.trunc:
93 define %v2f32 @test_v2f32.trunc(%v2f32 %a) {
94   ; CHECK: trunc
95   %1 = call %v2f32 @llvm.trunc.v2f32(%v2f32 %a)
96   ret %v2f32 %1
97 }
98 ; CHECK: test_v2f32.rint:
99 define %v2f32 @test_v2f32.rint(%v2f32 %a) {
100   ; CHECK: rint
101   %1 = call %v2f32 @llvm.rint.v2f32(%v2f32 %a)
102   ret %v2f32 %1
103 }
104 ; CHECK: test_v2f32.nearbyint:
105 define %v2f32 @test_v2f32.nearbyint(%v2f32 %a) {
106   ; CHECK: nearbyint
107   %1 = call %v2f32 @llvm.nearbyint.v2f32(%v2f32 %a)
108   ret %v2f32 %1
109 }
110
111 declare %v2f32 @llvm.sqrt.v2f32(%v2f32) #0
112 declare %v2f32 @llvm.powi.v2f32(%v2f32, i32) #0
113 declare %v2f32 @llvm.sin.v2f32(%v2f32) #0
114 declare %v2f32 @llvm.cos.v2f32(%v2f32) #0
115 declare %v2f32 @llvm.pow.v2f32(%v2f32, %v2f32) #0
116 declare %v2f32 @llvm.exp.v2f32(%v2f32) #0
117 declare %v2f32 @llvm.exp2.v2f32(%v2f32) #0
118 declare %v2f32 @llvm.log.v2f32(%v2f32) #0
119 declare %v2f32 @llvm.log10.v2f32(%v2f32) #0
120 declare %v2f32 @llvm.log2.v2f32(%v2f32) #0
121 declare %v2f32 @llvm.fma.v2f32(%v2f32, %v2f32, %v2f32) #0
122 declare %v2f32 @llvm.fabs.v2f32(%v2f32) #0
123 declare %v2f32 @llvm.floor.v2f32(%v2f32) #0
124 declare %v2f32 @llvm.fceil.v2f32(%v2f32) #0
125 declare %v2f32 @llvm.trunc.v2f32(%v2f32) #0
126 declare %v2f32 @llvm.rint.v2f32(%v2f32) #0
127 declare %v2f32 @llvm.nearbyint.v2f32(%v2f32) #0
128
129 ;;;
130
131 %v4f32 = type <4 x float>
132 ; CHECK: test_v4f32.sqrt:
133 define %v4f32 @test_v4f32.sqrt(%v4f32 %a) {
134   ; CHECK: sqrt
135   %1 = call %v4f32 @llvm.sqrt.v4f32(%v4f32 %a)
136   ret %v4f32 %1
137 }
138 ; CHECK: test_v4f32.powi:
139 define %v4f32 @test_v4f32.powi(%v4f32 %a, i32 %b) {
140   ; CHECK: pow
141   %1 = call %v4f32 @llvm.powi.v4f32(%v4f32 %a, i32 %b)
142   ret %v4f32 %1
143 }
144 ; CHECK: test_v4f32.sin:
145 define %v4f32 @test_v4f32.sin(%v4f32 %a) {
146   ; CHECK: sin
147   %1 = call %v4f32 @llvm.sin.v4f32(%v4f32 %a)
148   ret %v4f32 %1
149 }
150 ; CHECK: test_v4f32.cos:
151 define %v4f32 @test_v4f32.cos(%v4f32 %a) {
152   ; CHECK: cos
153   %1 = call %v4f32 @llvm.cos.v4f32(%v4f32 %a)
154   ret %v4f32 %1
155 }
156 ; CHECK: test_v4f32.pow:
157 define %v4f32 @test_v4f32.pow(%v4f32 %a, %v4f32 %b) {
158   ; CHECK: pow
159   %1 = call %v4f32 @llvm.pow.v4f32(%v4f32 %a, %v4f32 %b)
160   ret %v4f32 %1
161 }
162 ; CHECK: test_v4f32.exp:
163 define %v4f32 @test_v4f32.exp(%v4f32 %a) {
164   ; CHECK: exp
165   %1 = call %v4f32 @llvm.exp.v4f32(%v4f32 %a)
166   ret %v4f32 %1
167 }
168 ; CHECK: test_v4f32.exp2:
169 define %v4f32 @test_v4f32.exp2(%v4f32 %a) {
170   ; CHECK: exp
171   %1 = call %v4f32 @llvm.exp2.v4f32(%v4f32 %a)
172   ret %v4f32 %1
173 }
174 ; CHECK: test_v4f32.log:
175 define %v4f32 @test_v4f32.log(%v4f32 %a) {
176   ; CHECK: log
177   %1 = call %v4f32 @llvm.log.v4f32(%v4f32 %a)
178   ret %v4f32 %1
179 }
180 ; CHECK: test_v4f32.log10:
181 define %v4f32 @test_v4f32.log10(%v4f32 %a) {
182   ; CHECK: log
183   %1 = call %v4f32 @llvm.log10.v4f32(%v4f32 %a)
184   ret %v4f32 %1
185 }
186 ; CHECK: test_v4f32.log2:
187 define %v4f32 @test_v4f32.log2(%v4f32 %a) {
188   ; CHECK: log
189   %1 = call %v4f32 @llvm.log2.v4f32(%v4f32 %a)
190   ret %v4f32 %1
191 }
192 ; CHECK: test_v4f32.fma:
193 define %v4f32 @test_v4f32.fma(%v4f32 %a, %v4f32 %b, %v4f32 %c) {
194   ; CHECK: fma
195   %1 = call %v4f32 @llvm.fma.v4f32(%v4f32 %a, %v4f32 %b, %v4f32 %c)
196   ret %v4f32 %1
197 }
198 ; CHECK: test_v4f32.fabs:
199 define %v4f32 @test_v4f32.fabs(%v4f32 %a) {
200   ; CHECK: fabs
201   %1 = call %v4f32 @llvm.fabs.v4f32(%v4f32 %a)
202   ret %v4f32 %1
203 }
204 ; CHECK: test_v4f32.floor:
205 define %v4f32 @test_v4f32.floor(%v4f32 %a) {
206   ; CHECK: floor
207   %1 = call %v4f32 @llvm.floor.v4f32(%v4f32 %a)
208   ret %v4f32 %1
209 }
210 ; CHECK: test_v4f32.fceil:
211 define %v4f32 @test_v4f32.fceil(%v4f32 %a) {
212   ; CHECK: ceil
213   %1 = call %v4f32 @llvm.fceil.v4f32(%v4f32 %a)
214   ret %v4f32 %1
215 }
216 ; CHECK: test_v4f32.trunc:
217 define %v4f32 @test_v4f32.trunc(%v4f32 %a) {
218   ; CHECK: trunc
219   %1 = call %v4f32 @llvm.trunc.v4f32(%v4f32 %a)
220   ret %v4f32 %1
221 }
222 ; CHECK: test_v4f32.rint:
223 define %v4f32 @test_v4f32.rint(%v4f32 %a) {
224   ; CHECK: rint
225   %1 = call %v4f32 @llvm.rint.v4f32(%v4f32 %a)
226   ret %v4f32 %1
227 }
228 ; CHECK: test_v4f32.nearbyint:
229 define %v4f32 @test_v4f32.nearbyint(%v4f32 %a) {
230   ; CHECK: nearbyint
231   %1 = call %v4f32 @llvm.nearbyint.v4f32(%v4f32 %a)
232   ret %v4f32 %1
233 }
234
235 declare %v4f32 @llvm.sqrt.v4f32(%v4f32) #0
236 declare %v4f32 @llvm.powi.v4f32(%v4f32, i32) #0
237 declare %v4f32 @llvm.sin.v4f32(%v4f32) #0
238 declare %v4f32 @llvm.cos.v4f32(%v4f32) #0
239 declare %v4f32 @llvm.pow.v4f32(%v4f32, %v4f32) #0
240 declare %v4f32 @llvm.exp.v4f32(%v4f32) #0
241 declare %v4f32 @llvm.exp2.v4f32(%v4f32) #0
242 declare %v4f32 @llvm.log.v4f32(%v4f32) #0
243 declare %v4f32 @llvm.log10.v4f32(%v4f32) #0
244 declare %v4f32 @llvm.log2.v4f32(%v4f32) #0
245 declare %v4f32 @llvm.fma.v4f32(%v4f32, %v4f32, %v4f32) #0
246 declare %v4f32 @llvm.fabs.v4f32(%v4f32) #0
247 declare %v4f32 @llvm.floor.v4f32(%v4f32) #0
248 declare %v4f32 @llvm.fceil.v4f32(%v4f32) #0
249 declare %v4f32 @llvm.trunc.v4f32(%v4f32) #0
250 declare %v4f32 @llvm.rint.v4f32(%v4f32) #0
251 declare %v4f32 @llvm.nearbyint.v4f32(%v4f32) #0
252
253 ;;; Double vector
254
255 %v2f64 = type <2 x double>
256 ; CHECK: test_v2f64.sqrt:
257 define %v2f64 @test_v2f64.sqrt(%v2f64 %a) {
258   ; CHECK: sqrt
259   %1 = call %v2f64 @llvm.sqrt.v2f64(%v2f64 %a)
260   ret %v2f64 %1
261 }
262 ; CHECK: test_v2f64.powi:
263 define %v2f64 @test_v2f64.powi(%v2f64 %a, i32 %b) {
264   ; CHECK: pow
265   %1 = call %v2f64 @llvm.powi.v2f64(%v2f64 %a, i32 %b)
266   ret %v2f64 %1
267 }
268 ; CHECK: test_v2f64.sin:
269 define %v2f64 @test_v2f64.sin(%v2f64 %a) {
270   ; CHECK: sin
271   %1 = call %v2f64 @llvm.sin.v2f64(%v2f64 %a)
272   ret %v2f64 %1
273 }
274 ; CHECK: test_v2f64.cos:
275 define %v2f64 @test_v2f64.cos(%v2f64 %a) {
276   ; CHECK: cos
277   %1 = call %v2f64 @llvm.cos.v2f64(%v2f64 %a)
278   ret %v2f64 %1
279 }
280 ; CHECK: test_v2f64.pow:
281 define %v2f64 @test_v2f64.pow(%v2f64 %a, %v2f64 %b) {
282   ; CHECK: pow
283   %1 = call %v2f64 @llvm.pow.v2f64(%v2f64 %a, %v2f64 %b)
284   ret %v2f64 %1
285 }
286 ; CHECK: test_v2f64.exp:
287 define %v2f64 @test_v2f64.exp(%v2f64 %a) {
288   ; CHECK: exp
289   %1 = call %v2f64 @llvm.exp.v2f64(%v2f64 %a)
290   ret %v2f64 %1
291 }
292 ; CHECK: test_v2f64.exp2:
293 define %v2f64 @test_v2f64.exp2(%v2f64 %a) {
294   ; CHECK: exp
295   %1 = call %v2f64 @llvm.exp2.v2f64(%v2f64 %a)
296   ret %v2f64 %1
297 }
298 ; CHECK: test_v2f64.log:
299 define %v2f64 @test_v2f64.log(%v2f64 %a) {
300   ; CHECK: log
301   %1 = call %v2f64 @llvm.log.v2f64(%v2f64 %a)
302   ret %v2f64 %1
303 }
304 ; CHECK: test_v2f64.log10:
305 define %v2f64 @test_v2f64.log10(%v2f64 %a) {
306   ; CHECK: log
307   %1 = call %v2f64 @llvm.log10.v2f64(%v2f64 %a)
308   ret %v2f64 %1
309 }
310 ; CHECK: test_v2f64.log2:
311 define %v2f64 @test_v2f64.log2(%v2f64 %a) {
312   ; CHECK: log
313   %1 = call %v2f64 @llvm.log2.v2f64(%v2f64 %a)
314   ret %v2f64 %1
315 }
316 ; CHECK: test_v2f64.fma:
317 define %v2f64 @test_v2f64.fma(%v2f64 %a, %v2f64 %b, %v2f64 %c) {
318   ; CHECK: fma
319   %1 = call %v2f64 @llvm.fma.v2f64(%v2f64 %a, %v2f64 %b, %v2f64 %c)
320   ret %v2f64 %1
321 }
322 ; CHECK: test_v2f64.fabs:
323 define %v2f64 @test_v2f64.fabs(%v2f64 %a) {
324   ; CHECK: fabs
325   %1 = call %v2f64 @llvm.fabs.v2f64(%v2f64 %a)
326   ret %v2f64 %1
327 }
328 ; CHECK: test_v2f64.floor:
329 define %v2f64 @test_v2f64.floor(%v2f64 %a) {
330   ; CHECK: floor
331   %1 = call %v2f64 @llvm.floor.v2f64(%v2f64 %a)
332   ret %v2f64 %1
333 }
334 ; CHECK: test_v2f64.fceil:
335 define %v2f64 @test_v2f64.fceil(%v2f64 %a) {
336   ; CHECK: ceil
337   %1 = call %v2f64 @llvm.fceil.v2f64(%v2f64 %a)
338   ret %v2f64 %1
339 }
340 ; CHECK: test_v2f64.trunc:
341 define %v2f64 @test_v2f64.trunc(%v2f64 %a) {
342   ; CHECK: trunc
343   %1 = call %v2f64 @llvm.trunc.v2f64(%v2f64 %a)
344   ret %v2f64 %1
345 }
346 ; CHECK: test_v2f64.rint:
347 define %v2f64 @test_v2f64.rint(%v2f64 %a) {
348   ; CHECK: rint
349   %1 = call %v2f64 @llvm.rint.v2f64(%v2f64 %a)
350   ret %v2f64 %1
351 }
352 ; CHECK: test_v2f64.nearbyint:
353 define %v2f64 @test_v2f64.nearbyint(%v2f64 %a) {
354   ; CHECK: nearbyint
355   %1 = call %v2f64 @llvm.nearbyint.v2f64(%v2f64 %a)
356   ret %v2f64 %1
357 }
358
359 declare %v2f64 @llvm.sqrt.v2f64(%v2f64) #0
360 declare %v2f64 @llvm.powi.v2f64(%v2f64, i32) #0
361 declare %v2f64 @llvm.sin.v2f64(%v2f64) #0
362 declare %v2f64 @llvm.cos.v2f64(%v2f64) #0
363 declare %v2f64 @llvm.pow.v2f64(%v2f64, %v2f64) #0
364 declare %v2f64 @llvm.exp.v2f64(%v2f64) #0
365 declare %v2f64 @llvm.exp2.v2f64(%v2f64) #0
366 declare %v2f64 @llvm.log.v2f64(%v2f64) #0
367 declare %v2f64 @llvm.log10.v2f64(%v2f64) #0
368 declare %v2f64 @llvm.log2.v2f64(%v2f64) #0
369 declare %v2f64 @llvm.fma.v2f64(%v2f64, %v2f64, %v2f64) #0
370 declare %v2f64 @llvm.fabs.v2f64(%v2f64) #0
371 declare %v2f64 @llvm.floor.v2f64(%v2f64) #0
372 declare %v2f64 @llvm.fceil.v2f64(%v2f64) #0
373 declare %v2f64 @llvm.trunc.v2f64(%v2f64) #0
374 declare %v2f64 @llvm.rint.v2f64(%v2f64) #0
375 declare %v2f64 @llvm.nearbyint.v2f64(%v2f64) #0
376
377 attributes #0 = { nounwind readonly }