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