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