[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / ARM / vfloatintrinsics.ll
blobb4c5061fa18b1dc4a2abc67dcea2c8d421b7b1c8
1 ; RUN: llc -mcpu=swift < %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 = "arm-apple-ios6.1.0"
5 ;;; Float vectors
7 %v2f32 = type <2 x float>
8 ; CHECK-LABEL: 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
14 ; CHECK-LABEL: 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
20 ; CHECK-LABEL: 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
26 ; CHECK-LABEL: 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
32 ; CHECK-LABEL: 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
38 ; CHECK-LABEL: 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
44 ; CHECK-LABEL: 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
50 ; CHECK-LABEL: 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
56 ; CHECK-LABEL: 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
62 ; CHECK-LABEL: 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
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
74 ; CHECK-LABEL: test_v2f32.fabs:{{.*}}
75 define %v2f32 @test_v2f32.fabs(%v2f32 %a) {
76   ; CHECK: vabs.f32
77   %1 = call %v2f32 @llvm.fabs.v2f32(%v2f32 %a)
78   ret %v2f32 %1
80 ; CHECK-LABEL: test_v2f32.floor:{{.*}}
81 define %v2f32 @test_v2f32.floor(%v2f32 %a) {
82   ; CHECK: _floorf
83   %1 = call %v2f32 @llvm.floor.v2f32(%v2f32 %a)
84   ret %v2f32 %1
86 ; CHECK-LABEL: 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
92 ; CHECK-LABEL: 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
98 ; CHECK-LABEL: 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
104 ; CHECK-LABEL: 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
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
131 %v4f32 = type <4 x float>
132 ; CHECK-LABEL: 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
138 ; CHECK-LABEL: 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
144 ; CHECK-LABEL: 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
150 ; CHECK-LABEL: 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
156 ; CHECK-LABEL: 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
162 ; CHECK-LABEL: 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
168 ; CHECK-LABEL: 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
174 ; CHECK-LABEL: 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
180 ; CHECK-LABEL: 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
186 ; CHECK-LABEL: 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
192 ; CHECK-LABEL: 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
198 ; CHECK-LABEL: test_v4f32.fabs:{{.*}}
199 define %v4f32 @test_v4f32.fabs(%v4f32 %a) {
200   ; CHECK: vabs.f32
201   %1 = call %v4f32 @llvm.fabs.v4f32(%v4f32 %a)
202   ret %v4f32 %1
204 ; CHECK-LABEL: 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
210 ; CHECK-LABEL: 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
216 ; CHECK-LABEL: 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
222 ; CHECK-LABEL: 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
228 ; CHECK-LABEL: 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
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
253 ;;; Double vector
255 %v2f64 = type <2 x double>
256 ; CHECK-LABEL: 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
262 ; CHECK-LABEL: 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
268 ; CHECK-LABEL: 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
274 ; CHECK-LABEL: 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
280 ; CHECK-LABEL: 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
286 ; CHECK-LABEL: 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
292 ; CHECK-LABEL: 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
298 ; CHECK-LABEL: 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
304 ; CHECK-LABEL: 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
310 ; CHECK-LABEL: 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
316 ; CHECK-LABEL: 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
322 ; CHECK-LABEL: test_v2f64.fabs:{{.*}}
323 define %v2f64 @test_v2f64.fabs(%v2f64 %a) {
324   ; CHECK: bfc {{r[1,3]}}, #31, #1
325   ; CHECK: bfc {{r[1,3]}}, #31, #1
326   %1 = call %v2f64 @llvm.fabs.v2f64(%v2f64 %a)
327   ret %v2f64 %1
329 ; CHECK-LABEL: test_v2f64.floor:{{.*}}
330 define %v2f64 @test_v2f64.floor(%v2f64 %a) {
331   ; CHECK: floor
332   %1 = call %v2f64 @llvm.floor.v2f64(%v2f64 %a)
333   ret %v2f64 %1
335 ; CHECK-LABEL: test_v2f64.fceil:{{.*}}
336 define %v2f64 @test_v2f64.fceil(%v2f64 %a) {
337   ; CHECK: ceil
338   %1 = call %v2f64 @llvm.fceil.v2f64(%v2f64 %a)
339   ret %v2f64 %1
341 ; CHECK-LABEL: test_v2f64.trunc:{{.*}}
342 define %v2f64 @test_v2f64.trunc(%v2f64 %a) {
343   ; CHECK: trunc
344   %1 = call %v2f64 @llvm.trunc.v2f64(%v2f64 %a)
345   ret %v2f64 %1
347 ; CHECK-LABEL: test_v2f64.rint:{{.*}}
348 define %v2f64 @test_v2f64.rint(%v2f64 %a) {
349   ; CHECK: rint
350   %1 = call %v2f64 @llvm.rint.v2f64(%v2f64 %a)
351   ret %v2f64 %1
353 ; CHECK-LABEL: test_v2f64.nearbyint:{{.*}}
354 define %v2f64 @test_v2f64.nearbyint(%v2f64 %a) {
355   ; CHECK: nearbyint
356   %1 = call %v2f64 @llvm.nearbyint.v2f64(%v2f64 %a)
357   ret %v2f64 %1
360 declare %v2f64 @llvm.sqrt.v2f64(%v2f64) #0
361 declare %v2f64 @llvm.powi.v2f64(%v2f64, i32) #0
362 declare %v2f64 @llvm.sin.v2f64(%v2f64) #0
363 declare %v2f64 @llvm.cos.v2f64(%v2f64) #0
364 declare %v2f64 @llvm.pow.v2f64(%v2f64, %v2f64) #0
365 declare %v2f64 @llvm.exp.v2f64(%v2f64) #0
366 declare %v2f64 @llvm.exp2.v2f64(%v2f64) #0
367 declare %v2f64 @llvm.log.v2f64(%v2f64) #0
368 declare %v2f64 @llvm.log10.v2f64(%v2f64) #0
369 declare %v2f64 @llvm.log2.v2f64(%v2f64) #0
370 declare %v2f64 @llvm.fma.v2f64(%v2f64, %v2f64, %v2f64) #0
371 declare %v2f64 @llvm.fabs.v2f64(%v2f64) #0
372 declare %v2f64 @llvm.floor.v2f64(%v2f64) #0
373 declare %v2f64 @llvm.fceil.v2f64(%v2f64) #0
374 declare %v2f64 @llvm.trunc.v2f64(%v2f64) #0
375 declare %v2f64 @llvm.rint.v2f64(%v2f64) #0
376 declare %v2f64 @llvm.nearbyint.v2f64(%v2f64) #0
378 attributes #0 = { nounwind readonly }