1 ; RUN: llc < %s -march=arm -mcpu=cortex-a9 | FileCheck %s
3 @A = global <4 x float> <float 0., float 1., float 2., float 3.>
5 define void @test_sqrt(<4 x float>* %X) nounwind {
9 ; CHECK: movw r1, :lower16:{{.*}}
10 ; CHECK: movt r1, :upper16:{{.*}}
12 ; CHECK: vsqrt.f32 {{s[0-9]+}}, {{s[0-9]+}}
13 ; CHECK: vsqrt.f32 {{s[0-9]+}}, {{s[0-9]+}}
14 ; CHECK: vsqrt.f32 {{s[0-9]+}}, {{s[0-9]+}}
15 ; CHECK: vsqrt.f32 {{s[0-9]+}}, {{s[0-9]+}}
16 ; CHECK: vstmia {{.*}}
19 %0 = load <4 x float>* @A, align 16
20 %1 = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %0)
21 store <4 x float> %1, <4 x float>* %X, align 16
25 declare <4 x float> @llvm.sqrt.v4f32(<4 x float>) nounwind readonly
28 define void @test_cos(<4 x float>* %X) nounwind {
32 ; CHECK: movw [[reg0:r[0-9]+]], :lower16:{{.*}}
33 ; CHECK: movt [[reg0]], :upper16:{{.*}}
34 ; CHECK: vldmia r{{[0-9][0-9]?}}, {{.*}}
36 ; CHECK: {{[mov|vmov.32]}} r0,
37 ; CHECK: bl {{.*}}cosf
39 ; CHECK: {{[mov|vmov.32]}} r0,
40 ; CHECK: bl {{.*}}cosf
42 ; CHECK: {{[mov|vmov.32]}} r0,
43 ; CHECK: bl {{.*}}cosf
45 ; CHECK: {{[mov|vmov.32]}} r0,
46 ; CHECK: bl {{.*}}cosf
48 ; CHECK: vstmia {{.*}}
51 %0 = load <4 x float>* @A, align 16
52 %1 = call <4 x float> @llvm.cos.v4f32(<4 x float> %0)
53 store <4 x float> %1, <4 x float>* %X, align 16
57 declare <4 x float> @llvm.cos.v4f32(<4 x float>) nounwind readonly
59 define void @test_exp(<4 x float>* %X) nounwind {
63 ; CHECK: movw [[reg0:r[0-9]+]], :lower16:{{.*}}
64 ; CHECK: movt [[reg0]], :upper16:{{.*}}
65 ; CHECK: vldmia r{{[0-9][0-9]?}}, {{.*}}
67 ; CHECK: {{[mov|vmov.32]}} r0,
68 ; CHECK: bl {{.*}}expf
70 ; CHECK: {{[mov|vmov.32]}} r0,
71 ; CHECK: bl {{.*}}expf
73 ; CHECK: {{[mov|vmov.32]}} r0,
74 ; CHECK: bl {{.*}}expf
76 ; CHECK: {{[mov|vmov.32]}} r0,
77 ; CHECK: bl {{.*}}expf
79 ; CHECK: vstmia {{.*}}
82 %0 = load <4 x float>* @A, align 16
83 %1 = call <4 x float> @llvm.exp.v4f32(<4 x float> %0)
84 store <4 x float> %1, <4 x float>* %X, align 16
88 declare <4 x float> @llvm.exp.v4f32(<4 x float>) nounwind readonly
90 define void @test_exp2(<4 x float>* %X) nounwind {
94 ; CHECK: movw [[reg0:r[0-9]+]], :lower16:{{.*}}
95 ; CHECK: movt [[reg0]], :upper16:{{.*}}
96 ; CHECK: vldmia r{{[0-9][0-9]?}}, {{.*}}
98 ; CHECK: {{[mov|vmov.32]}} r0,
99 ; CHECK: bl {{.*}}exp2f
101 ; CHECK: {{[mov|vmov.32]}} r0,
102 ; CHECK: bl {{.*}}exp2f
104 ; CHECK: {{[mov|vmov.32]}} r0,
105 ; CHECK: bl {{.*}}exp2f
107 ; CHECK: {{[mov|vmov.32]}} r0,
108 ; CHECK: bl {{.*}}exp2f
110 ; CHECK: vstmia {{.*}}
113 %0 = load <4 x float>* @A, align 16
114 %1 = call <4 x float> @llvm.exp2.v4f32(<4 x float> %0)
115 store <4 x float> %1, <4 x float>* %X, align 16
119 declare <4 x float> @llvm.exp2.v4f32(<4 x float>) nounwind readonly
121 define void @test_log10(<4 x float>* %X) nounwind {
125 ; CHECK: movw [[reg0:r[0-9]+]], :lower16:{{.*}}
126 ; CHECK: movt [[reg0]], :upper16:{{.*}}
127 ; CHECK: vldmia r{{[0-9][0-9]?}}, {{.*}}
129 ; CHECK: {{[mov|vmov.32]}} r0,
130 ; CHECK: bl {{.*}}log10f
132 ; CHECK: {{[mov|vmov.32]}} r0,
133 ; CHECK: bl {{.*}}log10f
135 ; CHECK: {{[mov|vmov.32]}} r0,
136 ; CHECK: bl {{.*}}log10f
138 ; CHECK: {{[mov|vmov.32]}} r0,
139 ; CHECK: bl {{.*}}log10f
141 ; CHECK: vstmia {{.*}}
144 %0 = load <4 x float>* @A, align 16
145 %1 = call <4 x float> @llvm.log10.v4f32(<4 x float> %0)
146 store <4 x float> %1, <4 x float>* %X, align 16
150 declare <4 x float> @llvm.log10.v4f32(<4 x float>) nounwind readonly
152 define void @test_log(<4 x float>* %X) nounwind {
156 ; CHECK: movw [[reg0:r[0-9]+]], :lower16:{{.*}}
157 ; CHECK: movt [[reg0]], :upper16:{{.*}}
158 ; CHECK: vldmia r{{[0-9][0-9]?}}, {{.*}}
160 ; CHECK: {{[mov|vmov.32]}} r0,
161 ; CHECK: bl {{.*}}logf
163 ; CHECK: {{[mov|vmov.32]}} r0,
164 ; CHECK: bl {{.*}}logf
166 ; CHECK: {{[mov|vmov.32]}} r0,
167 ; CHECK: bl {{.*}}logf
169 ; CHECK: {{[mov|vmov.32]}} r0,
170 ; CHECK: bl {{.*}}logf
172 ; CHECK: vstmia {{.*}}
175 %0 = load <4 x float>* @A, align 16
176 %1 = call <4 x float> @llvm.log.v4f32(<4 x float> %0)
177 store <4 x float> %1, <4 x float>* %X, align 16
181 declare <4 x float> @llvm.log.v4f32(<4 x float>) nounwind readonly
183 define void @test_log2(<4 x float>* %X) nounwind {
187 ; CHECK: movw [[reg0:r[0-9]+]], :lower16:{{.*}}
188 ; CHECK: movt [[reg0]], :upper16:{{.*}}
189 ; CHECK: vldmia r{{[0-9][0-9]?}}, {{.*}}
191 ; CHECK: {{[mov|vmov.32]}} r0,
192 ; CHECK: bl {{.*}}log2f
194 ; CHECK: {{[mov|vmov.32]}} r0,
195 ; CHECK: bl {{.*}}log2f
197 ; CHECK: {{[mov|vmov.32]}} r0,
198 ; CHECK: bl {{.*}}log2f
200 ; CHECK: {{[mov|vmov.32]}} r0,
201 ; CHECK: bl {{.*}}log2f
203 ; CHECK: vstmia {{.*}}
206 %0 = load <4 x float>* @A, align 16
207 %1 = call <4 x float> @llvm.log2.v4f32(<4 x float> %0)
208 store <4 x float> %1, <4 x float>* %X, align 16
212 declare <4 x float> @llvm.log2.v4f32(<4 x float>) nounwind readonly
215 define void @test_pow(<4 x float>* %X) nounwind {
219 ; CHECK: movw [[reg0:r[0-9]+]], :lower16:{{.*}}
220 ; CHECK: movt [[reg0]], :upper16:{{.*}}
221 ; CHECK: vldmia r{{[0-9][0-9]?}}, {{.*}}
223 ; CHECK: {{[mov|vmov.32]}} r0,
224 ; CHECK: bl {{.*}}powf
226 ; CHECK: {{[mov|vmov.32]}} r0,
227 ; CHECK: bl {{.*}}powf
229 ; CHECK: {{[mov|vmov.32]}} r0,
230 ; CHECK: bl {{.*}}powf
232 ; CHECK: {{[mov|vmov.32]}} r0,
233 ; CHECK: bl {{.*}}powf
235 ; CHECK: vstmia {{.*}}
239 %0 = load <4 x float>* @A, align 16
240 %1 = call <4 x float> @llvm.pow.v4f32(<4 x float> %0, <4 x float> <float 2., float 2., float 2., float 2.>)
242 store <4 x float> %1, <4 x float>* %X, align 16
247 declare <4 x float> @llvm.pow.v4f32(<4 x float>, <4 x float>) nounwind readonly
249 define void @test_powi(<4 x float>* %X) nounwind {
253 ; CHECK: movw [[reg0:r[0-9]+]], :lower16:{{.*}}
254 ; CHECK: movt [[reg0]], :upper16:{{.*}}
255 ; CHECK: vldmia [[reg0]], {{.*}}
256 ; CHECK: vmul.f32 {{.*}}
258 ; CHECK: vstmia {{.*}}
262 %0 = load <4 x float>* @A, align 16
263 %1 = call <4 x float> @llvm.powi.v4f32(<4 x float> %0, i32 2)
265 store <4 x float> %1, <4 x float>* %X, align 16
270 declare <4 x float> @llvm.powi.v4f32(<4 x float>, i32) nounwind readonly
272 define void @test_sin(<4 x float>* %X) nounwind {
276 ; CHECK: movw [[reg0:r[0-9]+]], :lower16:{{.*}}
277 ; CHECK: movt [[reg0]], :upper16:{{.*}}
278 ; CHECK: vldmia r{{[0-9][0-9]?}}, {{.*}}
280 ; CHECK: {{[mov|vmov.32]}} r0,
281 ; CHECK: bl {{.*}}sinf
283 ; CHECK: {{[mov|vmov.32]}} r0,
284 ; CHECK: bl {{.*}}sinf
286 ; CHECK: {{[mov|vmov.32]}} r0,
287 ; CHECK: bl {{.*}}sinf
289 ; CHECK: {{[mov|vmov.32]}} r0,
290 ; CHECK: bl {{.*}}sinf
292 ; CHECK: vstmia {{.*}}
295 %0 = load <4 x float>* @A, align 16
296 %1 = call <4 x float> @llvm.sin.v4f32(<4 x float> %0)
297 store <4 x float> %1, <4 x float>* %X, align 16
301 declare <4 x float> @llvm.sin.v4f32(<4 x float>) nounwind readonly