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:A
10 ; CHECK-NEXT: movt r1, :upper16:A
11 ; CHECK: vldmia r1, {[[short0:s[0-9]+]], [[short1:s[0-9]+]], [[short2:s[0-9]+]], [[short3:s[0-9]+]]}
12 ; CHECK: vsqrt.f32 {{s[0-9]+}}, [[short3]]
13 ; CHECK: vsqrt.f32 {{s[0-9]+}}, [[short2]]
14 ; CHECK: vsqrt.f32 {{s[0-9]+}}, [[short1]]
15 ; CHECK: vsqrt.f32 {{s[0-9]+}}, [[short0]]
16 ; CHECK-NEXT: 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:A
33 ; CHECK-NEXT: movt [[reg0]], :upper16:A
34 ; CHECK: vldmia [[reg0]], {{.*}}
36 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
39 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
42 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
45 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
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:A
64 ; CHECK-NEXT: movt [[reg0]], :upper16:A
65 ; CHECK: vldmia [[reg0]], {{.*}}
67 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
70 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
73 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
76 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
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:A
95 ; CHECK-NEXT: movt [[reg0]], :upper16:A
96 ; CHECK: vldmia [[reg0]], {{.*}}
98 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
101 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
104 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
107 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
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:A
126 ; CHECK-NEXT: movt [[reg0]], :upper16:A
127 ; CHECK: vldmia [[reg0]], {{.*}}
129 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
132 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
135 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
138 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
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:A
157 ; CHECK-NEXT: movt [[reg0]], :upper16:A
158 ; CHECK: vldmia [[reg0]], {{.*}}
160 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
163 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
166 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
169 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
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:A
188 ; CHECK-NEXT: movt [[reg0]], :upper16:A
189 ; CHECK: vldmia [[reg0]], {{.*}}
191 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
194 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
197 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
200 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
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:A
220 ; CHECK-NEXT: movt [[reg0]], :upper16:A
221 ; CHECK: vldmia [[reg0]], {{.*}}
223 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
226 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
229 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
232 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
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:A
254 ; CHECK-NEXT: movt [[reg0]], :upper16:A
255 ; CHECK-NEXT: 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:A
277 ; CHECK-NEXT: movt [[reg0]], :upper16:A
278 ; CHECK: vldmia [[reg0]], {{.*}}
280 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
283 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
286 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
289 ; CHECK: {{[v]?mov}} r0, {{[r|s][0-9]+}}
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