[MVE] VMOVX patterns
[llvm-core.git] / test / CodeGen / Thumb2 / mve-fmath.ll
blobdc60f71d235643d313f93fa309db4e5a8a075a91
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=thumbv8.1m.main-arm-none-eabi -mattr=+mve,+fullfp16 -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-MVE
3 ; RUN: llc -mtriple=thumbv8.1m.main-arm-none-eabi -mattr=+mve.fp -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-MVEFP
5 define arm_aapcs_vfpcc <4 x float> @sqrt_float32_t(<4 x float> %src) {
6 ; CHECK-LABEL: sqrt_float32_t:
7 ; CHECK:       @ %bb.0: @ %entry
8 ; CHECK-NEXT:    vsqrt.f32 s7, s3
9 ; CHECK-NEXT:    vsqrt.f32 s6, s2
10 ; CHECK-NEXT:    vsqrt.f32 s5, s1
11 ; CHECK-NEXT:    vsqrt.f32 s4, s0
12 ; CHECK-NEXT:    vmov q0, q1
13 ; CHECK-NEXT:    bx lr
14 entry:
15   %0 = call fast <4 x float> @llvm.sqrt.v4f32(<4 x float> %src)
16   ret <4 x float> %0
19 define arm_aapcs_vfpcc <8 x half> @sqrt_float16_t(<8 x half> %src) {
20 ; CHECK-LABEL: sqrt_float16_t:
21 ; CHECK:       @ %bb.0: @ %entry
22 ; CHECK-NEXT:    vmovx.f16 s4, s0
23 ; CHECK-NEXT:    vsqrt.f16 s8, s1
24 ; CHECK-NEXT:    vsqrt.f16 s4, s4
25 ; CHECK-NEXT:    vmov r0, s4
26 ; CHECK-NEXT:    vsqrt.f16 s4, s0
27 ; CHECK-NEXT:    vmov r1, s4
28 ; CHECK-NEXT:    vmovx.f16 s0, s3
29 ; CHECK-NEXT:    vmov.16 q1[0], r1
30 ; CHECK-NEXT:    vsqrt.f16 s0, s0
31 ; CHECK-NEXT:    vmov.16 q1[1], r0
32 ; CHECK-NEXT:    vmov r0, s8
33 ; CHECK-NEXT:    vmovx.f16 s8, s1
34 ; CHECK-NEXT:    vmov.16 q1[2], r0
35 ; CHECK-NEXT:    vsqrt.f16 s8, s8
36 ; CHECK-NEXT:    vmov r0, s8
37 ; CHECK-NEXT:    vsqrt.f16 s8, s2
38 ; CHECK-NEXT:    vmov.16 q1[3], r0
39 ; CHECK-NEXT:    vmov r0, s8
40 ; CHECK-NEXT:    vmovx.f16 s8, s2
41 ; CHECK-NEXT:    vmov.16 q1[4], r0
42 ; CHECK-NEXT:    vsqrt.f16 s8, s8
43 ; CHECK-NEXT:    vmov r0, s8
44 ; CHECK-NEXT:    vsqrt.f16 s8, s3
45 ; CHECK-NEXT:    vmov.16 q1[5], r0
46 ; CHECK-NEXT:    vmov r0, s8
47 ; CHECK-NEXT:    vmov.16 q1[6], r0
48 ; CHECK-NEXT:    vmov r0, s0
49 ; CHECK-NEXT:    vmov.16 q1[7], r0
50 ; CHECK-NEXT:    vmov q0, q1
51 ; CHECK-NEXT:    bx lr
52 entry:
53   %0 = call fast <8 x half> @llvm.sqrt.v8f16(<8 x half> %src)
54   ret <8 x half> %0
57 define arm_aapcs_vfpcc <2 x double> @sqrt_float64_t(<2 x double> %src) {
58 ; CHECK-LABEL: sqrt_float64_t:
59 ; CHECK:       @ %bb.0: @ %entry
60 ; CHECK-NEXT:    .save {r7, lr}
61 ; CHECK-NEXT:    push {r7, lr}
62 ; CHECK-NEXT:    .vsave {d8, d9}
63 ; CHECK-NEXT:    vpush {d8, d9}
64 ; CHECK-NEXT:    vmov q4, q0
65 ; CHECK-NEXT:    vmov r0, r1, d9
66 ; CHECK-NEXT:    bl sqrt
67 ; CHECK-NEXT:    vmov r2, r3, d8
68 ; CHECK-NEXT:    vmov d9, r0, r1
69 ; CHECK-NEXT:    mov r0, r2
70 ; CHECK-NEXT:    mov r1, r3
71 ; CHECK-NEXT:    bl sqrt
72 ; CHECK-NEXT:    vmov d8, r0, r1
73 ; CHECK-NEXT:    vmov q0, q4
74 ; CHECK-NEXT:    vpop {d8, d9}
75 ; CHECK-NEXT:    pop {r7, pc}
76 entry:
77   %0 = call fast <2 x double> @llvm.sqrt.v2f64(<2 x double> %src)
78   ret <2 x double> %0
81 define arm_aapcs_vfpcc <4 x float> @cos_float32_t(<4 x float> %src) {
82 ; CHECK-LABEL: cos_float32_t:
83 ; CHECK:       @ %bb.0: @ %entry
84 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
85 ; CHECK-NEXT:    push {r4, r5, r7, lr}
86 ; CHECK-NEXT:    .vsave {d8, d9}
87 ; CHECK-NEXT:    vpush {d8, d9}
88 ; CHECK-NEXT:    .pad #16
89 ; CHECK-NEXT:    sub sp, #16
90 ; CHECK-NEXT:    vstmia sp, {s0, s1, s2, s3}
91 ; CHECK-NEXT:    ldr r0, [sp, #8]
92 ; CHECK-NEXT:    bl cosf
93 ; CHECK-NEXT:    mov r4, r0
94 ; CHECK-NEXT:    ldr r0, [sp, #12]
95 ; CHECK-NEXT:    bl cosf
96 ; CHECK-NEXT:    ldrd r5, r1, [sp]
97 ; CHECK-NEXT:    vmov s19, r0
98 ; CHECK-NEXT:    mov r0, r1
99 ; CHECK-NEXT:    vmov s18, r4
100 ; CHECK-NEXT:    bl cosf
101 ; CHECK-NEXT:    vmov s17, r0
102 ; CHECK-NEXT:    mov r0, r5
103 ; CHECK-NEXT:    bl cosf
104 ; CHECK-NEXT:    vmov s16, r0
105 ; CHECK-NEXT:    vmov q0, q4
106 ; CHECK-NEXT:    add sp, #16
107 ; CHECK-NEXT:    vpop {d8, d9}
108 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
109 entry:
110   %0 = call fast <4 x float> @llvm.cos.v4f32(<4 x float> %src)
111   ret <4 x float> %0
114 define arm_aapcs_vfpcc <8 x half> @cos_float16_t(<8 x half> %src) {
115 ; CHECK-LABEL: cos_float16_t:
116 ; CHECK:       @ %bb.0: @ %entry
117 ; CHECK-NEXT:    .save {r4, lr}
118 ; CHECK-NEXT:    push {r4, lr}
119 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11}
120 ; CHECK-NEXT:    vpush {d8, d9, d10, d11}
121 ; CHECK-NEXT:    .pad #32
122 ; CHECK-NEXT:    sub sp, #32
123 ; CHECK-NEXT:    vmov q4, q0
124 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s16
125 ; CHECK-NEXT:    vstr s0, [sp, #28]
126 ; CHECK-NEXT:    ldr r0, [sp, #28]
127 ; CHECK-NEXT:    bl cosf
128 ; CHECK-NEXT:    vmov s0, r0
129 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
130 ; CHECK-NEXT:    vmov r4, s0
131 ; CHECK-NEXT:    vmovx.f16 s0, s16
132 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
133 ; CHECK-NEXT:    vstr s0, [sp, #24]
134 ; CHECK-NEXT:    ldr r0, [sp, #24]
135 ; CHECK-NEXT:    bl cosf
136 ; CHECK-NEXT:    vmov s0, r0
137 ; CHECK-NEXT:    vmov.16 q5[0], r4
138 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
139 ; CHECK-NEXT:    vmov r0, s0
140 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s17
141 ; CHECK-NEXT:    vstr s0, [sp, #20]
142 ; CHECK-NEXT:    vmov.16 q5[1], r0
143 ; CHECK-NEXT:    ldr r0, [sp, #20]
144 ; CHECK-NEXT:    bl cosf
145 ; CHECK-NEXT:    vmov s0, r0
146 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
147 ; CHECK-NEXT:    vmov r0, s0
148 ; CHECK-NEXT:    vmovx.f16 s0, s17
149 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
150 ; CHECK-NEXT:    vmov.16 q5[2], r0
151 ; CHECK-NEXT:    vstr s0, [sp, #16]
152 ; CHECK-NEXT:    ldr r0, [sp, #16]
153 ; CHECK-NEXT:    bl cosf
154 ; CHECK-NEXT:    vmov s0, r0
155 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
156 ; CHECK-NEXT:    vmov r0, s0
157 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s18
158 ; CHECK-NEXT:    vstr s0, [sp, #12]
159 ; CHECK-NEXT:    vmov.16 q5[3], r0
160 ; CHECK-NEXT:    ldr r0, [sp, #12]
161 ; CHECK-NEXT:    bl cosf
162 ; CHECK-NEXT:    vmov s0, r0
163 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
164 ; CHECK-NEXT:    vmov r0, s0
165 ; CHECK-NEXT:    vmovx.f16 s0, s18
166 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
167 ; CHECK-NEXT:    vmov.16 q5[4], r0
168 ; CHECK-NEXT:    vstr s0, [sp, #8]
169 ; CHECK-NEXT:    ldr r0, [sp, #8]
170 ; CHECK-NEXT:    bl cosf
171 ; CHECK-NEXT:    vmov s0, r0
172 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
173 ; CHECK-NEXT:    vmov r0, s0
174 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s19
175 ; CHECK-NEXT:    vstr s0, [sp, #4]
176 ; CHECK-NEXT:    vmov.16 q5[5], r0
177 ; CHECK-NEXT:    ldr r0, [sp, #4]
178 ; CHECK-NEXT:    bl cosf
179 ; CHECK-NEXT:    vmov s0, r0
180 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
181 ; CHECK-NEXT:    vmov r0, s0
182 ; CHECK-NEXT:    vmovx.f16 s0, s19
183 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
184 ; CHECK-NEXT:    vmov.16 q5[6], r0
185 ; CHECK-NEXT:    vstr s0, [sp]
186 ; CHECK-NEXT:    ldr r0, [sp]
187 ; CHECK-NEXT:    bl cosf
188 ; CHECK-NEXT:    vmov s0, r0
189 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
190 ; CHECK-NEXT:    vmov r0, s0
191 ; CHECK-NEXT:    vmov.16 q5[7], r0
192 ; CHECK-NEXT:    vmov q0, q5
193 ; CHECK-NEXT:    add sp, #32
194 ; CHECK-NEXT:    vpop {d8, d9, d10, d11}
195 ; CHECK-NEXT:    pop {r4, pc}
196 entry:
197   %0 = call fast <8 x half> @llvm.cos.v8f16(<8 x half> %src)
198   ret <8 x half> %0
201 define arm_aapcs_vfpcc <2 x double> @cos_float64_t(<2 x double> %src) {
202 ; CHECK-LABEL: cos_float64_t:
203 ; CHECK:       @ %bb.0: @ %entry
204 ; CHECK-NEXT:    .save {r7, lr}
205 ; CHECK-NEXT:    push {r7, lr}
206 ; CHECK-NEXT:    .vsave {d8, d9}
207 ; CHECK-NEXT:    vpush {d8, d9}
208 ; CHECK-NEXT:    vmov q4, q0
209 ; CHECK-NEXT:    vmov r0, r1, d9
210 ; CHECK-NEXT:    bl cos
211 ; CHECK-NEXT:    vmov r2, r3, d8
212 ; CHECK-NEXT:    vmov d9, r0, r1
213 ; CHECK-NEXT:    mov r0, r2
214 ; CHECK-NEXT:    mov r1, r3
215 ; CHECK-NEXT:    bl cos
216 ; CHECK-NEXT:    vmov d8, r0, r1
217 ; CHECK-NEXT:    vmov q0, q4
218 ; CHECK-NEXT:    vpop {d8, d9}
219 ; CHECK-NEXT:    pop {r7, pc}
220 entry:
221   %0 = call fast <2 x double> @llvm.cos.v2f64(<2 x double> %src)
222   ret <2 x double> %0
225 define arm_aapcs_vfpcc <4 x float> @sin_float32_t(<4 x float> %src) {
226 ; CHECK-LABEL: sin_float32_t:
227 ; CHECK:       @ %bb.0: @ %entry
228 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
229 ; CHECK-NEXT:    push {r4, r5, r7, lr}
230 ; CHECK-NEXT:    .vsave {d8, d9}
231 ; CHECK-NEXT:    vpush {d8, d9}
232 ; CHECK-NEXT:    .pad #16
233 ; CHECK-NEXT:    sub sp, #16
234 ; CHECK-NEXT:    vstmia sp, {s0, s1, s2, s3}
235 ; CHECK-NEXT:    ldr r0, [sp, #8]
236 ; CHECK-NEXT:    bl sinf
237 ; CHECK-NEXT:    mov r4, r0
238 ; CHECK-NEXT:    ldr r0, [sp, #12]
239 ; CHECK-NEXT:    bl sinf
240 ; CHECK-NEXT:    ldrd r5, r1, [sp]
241 ; CHECK-NEXT:    vmov s19, r0
242 ; CHECK-NEXT:    mov r0, r1
243 ; CHECK-NEXT:    vmov s18, r4
244 ; CHECK-NEXT:    bl sinf
245 ; CHECK-NEXT:    vmov s17, r0
246 ; CHECK-NEXT:    mov r0, r5
247 ; CHECK-NEXT:    bl sinf
248 ; CHECK-NEXT:    vmov s16, r0
249 ; CHECK-NEXT:    vmov q0, q4
250 ; CHECK-NEXT:    add sp, #16
251 ; CHECK-NEXT:    vpop {d8, d9}
252 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
253 entry:
254   %0 = call fast <4 x float> @llvm.sin.v4f32(<4 x float> %src)
255   ret <4 x float> %0
258 define arm_aapcs_vfpcc <8 x half> @sin_float16_t(<8 x half> %src) {
259 ; CHECK-LABEL: sin_float16_t:
260 ; CHECK:       @ %bb.0: @ %entry
261 ; CHECK-NEXT:    .save {r4, lr}
262 ; CHECK-NEXT:    push {r4, lr}
263 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11}
264 ; CHECK-NEXT:    vpush {d8, d9, d10, d11}
265 ; CHECK-NEXT:    .pad #32
266 ; CHECK-NEXT:    sub sp, #32
267 ; CHECK-NEXT:    vmov q4, q0
268 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s16
269 ; CHECK-NEXT:    vstr s0, [sp, #28]
270 ; CHECK-NEXT:    ldr r0, [sp, #28]
271 ; CHECK-NEXT:    bl sinf
272 ; CHECK-NEXT:    vmov s0, r0
273 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
274 ; CHECK-NEXT:    vmov r4, s0
275 ; CHECK-NEXT:    vmovx.f16 s0, s16
276 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
277 ; CHECK-NEXT:    vstr s0, [sp, #24]
278 ; CHECK-NEXT:    ldr r0, [sp, #24]
279 ; CHECK-NEXT:    bl sinf
280 ; CHECK-NEXT:    vmov s0, r0
281 ; CHECK-NEXT:    vmov.16 q5[0], r4
282 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
283 ; CHECK-NEXT:    vmov r0, s0
284 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s17
285 ; CHECK-NEXT:    vstr s0, [sp, #20]
286 ; CHECK-NEXT:    vmov.16 q5[1], r0
287 ; CHECK-NEXT:    ldr r0, [sp, #20]
288 ; CHECK-NEXT:    bl sinf
289 ; CHECK-NEXT:    vmov s0, r0
290 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
291 ; CHECK-NEXT:    vmov r0, s0
292 ; CHECK-NEXT:    vmovx.f16 s0, s17
293 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
294 ; CHECK-NEXT:    vmov.16 q5[2], r0
295 ; CHECK-NEXT:    vstr s0, [sp, #16]
296 ; CHECK-NEXT:    ldr r0, [sp, #16]
297 ; CHECK-NEXT:    bl sinf
298 ; CHECK-NEXT:    vmov s0, r0
299 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
300 ; CHECK-NEXT:    vmov r0, s0
301 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s18
302 ; CHECK-NEXT:    vstr s0, [sp, #12]
303 ; CHECK-NEXT:    vmov.16 q5[3], r0
304 ; CHECK-NEXT:    ldr r0, [sp, #12]
305 ; CHECK-NEXT:    bl sinf
306 ; CHECK-NEXT:    vmov s0, r0
307 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
308 ; CHECK-NEXT:    vmov r0, s0
309 ; CHECK-NEXT:    vmovx.f16 s0, s18
310 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
311 ; CHECK-NEXT:    vmov.16 q5[4], r0
312 ; CHECK-NEXT:    vstr s0, [sp, #8]
313 ; CHECK-NEXT:    ldr r0, [sp, #8]
314 ; CHECK-NEXT:    bl sinf
315 ; CHECK-NEXT:    vmov s0, r0
316 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
317 ; CHECK-NEXT:    vmov r0, s0
318 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s19
319 ; CHECK-NEXT:    vstr s0, [sp, #4]
320 ; CHECK-NEXT:    vmov.16 q5[5], r0
321 ; CHECK-NEXT:    ldr r0, [sp, #4]
322 ; CHECK-NEXT:    bl sinf
323 ; CHECK-NEXT:    vmov s0, r0
324 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
325 ; CHECK-NEXT:    vmov r0, s0
326 ; CHECK-NEXT:    vmovx.f16 s0, s19
327 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
328 ; CHECK-NEXT:    vmov.16 q5[6], r0
329 ; CHECK-NEXT:    vstr s0, [sp]
330 ; CHECK-NEXT:    ldr r0, [sp]
331 ; CHECK-NEXT:    bl sinf
332 ; CHECK-NEXT:    vmov s0, r0
333 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
334 ; CHECK-NEXT:    vmov r0, s0
335 ; CHECK-NEXT:    vmov.16 q5[7], r0
336 ; CHECK-NEXT:    vmov q0, q5
337 ; CHECK-NEXT:    add sp, #32
338 ; CHECK-NEXT:    vpop {d8, d9, d10, d11}
339 ; CHECK-NEXT:    pop {r4, pc}
340 entry:
341   %0 = call fast <8 x half> @llvm.sin.v8f16(<8 x half> %src)
342   ret <8 x half> %0
345 define arm_aapcs_vfpcc <2 x double> @sin_float64_t(<2 x double> %src) {
346 ; CHECK-LABEL: sin_float64_t:
347 ; CHECK:       @ %bb.0: @ %entry
348 ; CHECK-NEXT:    .save {r7, lr}
349 ; CHECK-NEXT:    push {r7, lr}
350 ; CHECK-NEXT:    .vsave {d8, d9}
351 ; CHECK-NEXT:    vpush {d8, d9}
352 ; CHECK-NEXT:    vmov q4, q0
353 ; CHECK-NEXT:    vmov r0, r1, d9
354 ; CHECK-NEXT:    bl sin
355 ; CHECK-NEXT:    vmov r2, r3, d8
356 ; CHECK-NEXT:    vmov d9, r0, r1
357 ; CHECK-NEXT:    mov r0, r2
358 ; CHECK-NEXT:    mov r1, r3
359 ; CHECK-NEXT:    bl sin
360 ; CHECK-NEXT:    vmov d8, r0, r1
361 ; CHECK-NEXT:    vmov q0, q4
362 ; CHECK-NEXT:    vpop {d8, d9}
363 ; CHECK-NEXT:    pop {r7, pc}
364 entry:
365   %0 = call fast <2 x double> @llvm.sin.v2f64(<2 x double> %src)
366   ret <2 x double> %0
369 define arm_aapcs_vfpcc <4 x float> @exp_float32_t(<4 x float> %src) {
370 ; CHECK-LABEL: exp_float32_t:
371 ; CHECK:       @ %bb.0: @ %entry
372 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
373 ; CHECK-NEXT:    push {r4, r5, r7, lr}
374 ; CHECK-NEXT:    .vsave {d8, d9}
375 ; CHECK-NEXT:    vpush {d8, d9}
376 ; CHECK-NEXT:    .pad #16
377 ; CHECK-NEXT:    sub sp, #16
378 ; CHECK-NEXT:    vstmia sp, {s0, s1, s2, s3}
379 ; CHECK-NEXT:    ldr r0, [sp, #8]
380 ; CHECK-NEXT:    bl expf
381 ; CHECK-NEXT:    mov r4, r0
382 ; CHECK-NEXT:    ldr r0, [sp, #12]
383 ; CHECK-NEXT:    bl expf
384 ; CHECK-NEXT:    ldrd r5, r1, [sp]
385 ; CHECK-NEXT:    vmov s19, r0
386 ; CHECK-NEXT:    mov r0, r1
387 ; CHECK-NEXT:    vmov s18, r4
388 ; CHECK-NEXT:    bl expf
389 ; CHECK-NEXT:    vmov s17, r0
390 ; CHECK-NEXT:    mov r0, r5
391 ; CHECK-NEXT:    bl expf
392 ; CHECK-NEXT:    vmov s16, r0
393 ; CHECK-NEXT:    vmov q0, q4
394 ; CHECK-NEXT:    add sp, #16
395 ; CHECK-NEXT:    vpop {d8, d9}
396 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
397 entry:
398   %0 = call fast <4 x float> @llvm.exp.v4f32(<4 x float> %src)
399   ret <4 x float> %0
402 define arm_aapcs_vfpcc <8 x half> @exp_float16_t(<8 x half> %src) {
403 ; CHECK-LABEL: exp_float16_t:
404 ; CHECK:       @ %bb.0: @ %entry
405 ; CHECK-NEXT:    .save {r4, lr}
406 ; CHECK-NEXT:    push {r4, lr}
407 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11}
408 ; CHECK-NEXT:    vpush {d8, d9, d10, d11}
409 ; CHECK-NEXT:    .pad #32
410 ; CHECK-NEXT:    sub sp, #32
411 ; CHECK-NEXT:    vmov q4, q0
412 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s16
413 ; CHECK-NEXT:    vstr s0, [sp, #28]
414 ; CHECK-NEXT:    ldr r0, [sp, #28]
415 ; CHECK-NEXT:    bl expf
416 ; CHECK-NEXT:    vmov s0, r0
417 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
418 ; CHECK-NEXT:    vmov r4, s0
419 ; CHECK-NEXT:    vmovx.f16 s0, s16
420 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
421 ; CHECK-NEXT:    vstr s0, [sp, #24]
422 ; CHECK-NEXT:    ldr r0, [sp, #24]
423 ; CHECK-NEXT:    bl expf
424 ; CHECK-NEXT:    vmov s0, r0
425 ; CHECK-NEXT:    vmov.16 q5[0], r4
426 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
427 ; CHECK-NEXT:    vmov r0, s0
428 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s17
429 ; CHECK-NEXT:    vstr s0, [sp, #20]
430 ; CHECK-NEXT:    vmov.16 q5[1], r0
431 ; CHECK-NEXT:    ldr r0, [sp, #20]
432 ; CHECK-NEXT:    bl expf
433 ; CHECK-NEXT:    vmov s0, r0
434 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
435 ; CHECK-NEXT:    vmov r0, s0
436 ; CHECK-NEXT:    vmovx.f16 s0, s17
437 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
438 ; CHECK-NEXT:    vmov.16 q5[2], r0
439 ; CHECK-NEXT:    vstr s0, [sp, #16]
440 ; CHECK-NEXT:    ldr r0, [sp, #16]
441 ; CHECK-NEXT:    bl expf
442 ; CHECK-NEXT:    vmov s0, r0
443 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
444 ; CHECK-NEXT:    vmov r0, s0
445 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s18
446 ; CHECK-NEXT:    vstr s0, [sp, #12]
447 ; CHECK-NEXT:    vmov.16 q5[3], r0
448 ; CHECK-NEXT:    ldr r0, [sp, #12]
449 ; CHECK-NEXT:    bl expf
450 ; CHECK-NEXT:    vmov s0, r0
451 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
452 ; CHECK-NEXT:    vmov r0, s0
453 ; CHECK-NEXT:    vmovx.f16 s0, s18
454 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
455 ; CHECK-NEXT:    vmov.16 q5[4], r0
456 ; CHECK-NEXT:    vstr s0, [sp, #8]
457 ; CHECK-NEXT:    ldr r0, [sp, #8]
458 ; CHECK-NEXT:    bl expf
459 ; CHECK-NEXT:    vmov s0, r0
460 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
461 ; CHECK-NEXT:    vmov r0, s0
462 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s19
463 ; CHECK-NEXT:    vstr s0, [sp, #4]
464 ; CHECK-NEXT:    vmov.16 q5[5], r0
465 ; CHECK-NEXT:    ldr r0, [sp, #4]
466 ; CHECK-NEXT:    bl expf
467 ; CHECK-NEXT:    vmov s0, r0
468 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
469 ; CHECK-NEXT:    vmov r0, s0
470 ; CHECK-NEXT:    vmovx.f16 s0, s19
471 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
472 ; CHECK-NEXT:    vmov.16 q5[6], r0
473 ; CHECK-NEXT:    vstr s0, [sp]
474 ; CHECK-NEXT:    ldr r0, [sp]
475 ; CHECK-NEXT:    bl expf
476 ; CHECK-NEXT:    vmov s0, r0
477 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
478 ; CHECK-NEXT:    vmov r0, s0
479 ; CHECK-NEXT:    vmov.16 q5[7], r0
480 ; CHECK-NEXT:    vmov q0, q5
481 ; CHECK-NEXT:    add sp, #32
482 ; CHECK-NEXT:    vpop {d8, d9, d10, d11}
483 ; CHECK-NEXT:    pop {r4, pc}
484 entry:
485   %0 = call fast <8 x half> @llvm.exp.v8f16(<8 x half> %src)
486   ret <8 x half> %0
489 define arm_aapcs_vfpcc <2 x double> @exp_float64_t(<2 x double> %src) {
490 ; CHECK-LABEL: exp_float64_t:
491 ; CHECK:       @ %bb.0: @ %entry
492 ; CHECK-NEXT:    .save {r7, lr}
493 ; CHECK-NEXT:    push {r7, lr}
494 ; CHECK-NEXT:    .vsave {d8, d9}
495 ; CHECK-NEXT:    vpush {d8, d9}
496 ; CHECK-NEXT:    vmov q4, q0
497 ; CHECK-NEXT:    vmov r0, r1, d9
498 ; CHECK-NEXT:    bl exp
499 ; CHECK-NEXT:    vmov r2, r3, d8
500 ; CHECK-NEXT:    vmov d9, r0, r1
501 ; CHECK-NEXT:    mov r0, r2
502 ; CHECK-NEXT:    mov r1, r3
503 ; CHECK-NEXT:    bl exp
504 ; CHECK-NEXT:    vmov d8, r0, r1
505 ; CHECK-NEXT:    vmov q0, q4
506 ; CHECK-NEXT:    vpop {d8, d9}
507 ; CHECK-NEXT:    pop {r7, pc}
508 entry:
509   %0 = call fast <2 x double> @llvm.exp.v2f64(<2 x double> %src)
510   ret <2 x double> %0
513 define arm_aapcs_vfpcc <4 x float> @exp2_float32_t(<4 x float> %src) {
514 ; CHECK-LABEL: exp2_float32_t:
515 ; CHECK:       @ %bb.0: @ %entry
516 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
517 ; CHECK-NEXT:    push {r4, r5, r7, lr}
518 ; CHECK-NEXT:    .vsave {d8, d9}
519 ; CHECK-NEXT:    vpush {d8, d9}
520 ; CHECK-NEXT:    .pad #16
521 ; CHECK-NEXT:    sub sp, #16
522 ; CHECK-NEXT:    vstmia sp, {s0, s1, s2, s3}
523 ; CHECK-NEXT:    ldr r0, [sp, #8]
524 ; CHECK-NEXT:    bl exp2f
525 ; CHECK-NEXT:    mov r4, r0
526 ; CHECK-NEXT:    ldr r0, [sp, #12]
527 ; CHECK-NEXT:    bl exp2f
528 ; CHECK-NEXT:    ldrd r5, r1, [sp]
529 ; CHECK-NEXT:    vmov s19, r0
530 ; CHECK-NEXT:    mov r0, r1
531 ; CHECK-NEXT:    vmov s18, r4
532 ; CHECK-NEXT:    bl exp2f
533 ; CHECK-NEXT:    vmov s17, r0
534 ; CHECK-NEXT:    mov r0, r5
535 ; CHECK-NEXT:    bl exp2f
536 ; CHECK-NEXT:    vmov s16, r0
537 ; CHECK-NEXT:    vmov q0, q4
538 ; CHECK-NEXT:    add sp, #16
539 ; CHECK-NEXT:    vpop {d8, d9}
540 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
541 entry:
542   %0 = call fast <4 x float> @llvm.exp2.v4f32(<4 x float> %src)
543   ret <4 x float> %0
546 define arm_aapcs_vfpcc <8 x half> @exp2_float16_t(<8 x half> %src) {
547 ; CHECK-LABEL: exp2_float16_t:
548 ; CHECK:       @ %bb.0: @ %entry
549 ; CHECK-NEXT:    .save {r4, lr}
550 ; CHECK-NEXT:    push {r4, lr}
551 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11}
552 ; CHECK-NEXT:    vpush {d8, d9, d10, d11}
553 ; CHECK-NEXT:    .pad #32
554 ; CHECK-NEXT:    sub sp, #32
555 ; CHECK-NEXT:    vmov q4, q0
556 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s16
557 ; CHECK-NEXT:    vstr s0, [sp, #28]
558 ; CHECK-NEXT:    ldr r0, [sp, #28]
559 ; CHECK-NEXT:    bl exp2f
560 ; CHECK-NEXT:    vmov s0, r0
561 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
562 ; CHECK-NEXT:    vmov r4, s0
563 ; CHECK-NEXT:    vmovx.f16 s0, s16
564 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
565 ; CHECK-NEXT:    vstr s0, [sp, #24]
566 ; CHECK-NEXT:    ldr r0, [sp, #24]
567 ; CHECK-NEXT:    bl exp2f
568 ; CHECK-NEXT:    vmov s0, r0
569 ; CHECK-NEXT:    vmov.16 q5[0], r4
570 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
571 ; CHECK-NEXT:    vmov r0, s0
572 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s17
573 ; CHECK-NEXT:    vstr s0, [sp, #20]
574 ; CHECK-NEXT:    vmov.16 q5[1], r0
575 ; CHECK-NEXT:    ldr r0, [sp, #20]
576 ; CHECK-NEXT:    bl exp2f
577 ; CHECK-NEXT:    vmov s0, r0
578 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
579 ; CHECK-NEXT:    vmov r0, s0
580 ; CHECK-NEXT:    vmovx.f16 s0, s17
581 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
582 ; CHECK-NEXT:    vmov.16 q5[2], r0
583 ; CHECK-NEXT:    vstr s0, [sp, #16]
584 ; CHECK-NEXT:    ldr r0, [sp, #16]
585 ; CHECK-NEXT:    bl exp2f
586 ; CHECK-NEXT:    vmov s0, r0
587 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
588 ; CHECK-NEXT:    vmov r0, s0
589 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s18
590 ; CHECK-NEXT:    vstr s0, [sp, #12]
591 ; CHECK-NEXT:    vmov.16 q5[3], r0
592 ; CHECK-NEXT:    ldr r0, [sp, #12]
593 ; CHECK-NEXT:    bl exp2f
594 ; CHECK-NEXT:    vmov s0, r0
595 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
596 ; CHECK-NEXT:    vmov r0, s0
597 ; CHECK-NEXT:    vmovx.f16 s0, s18
598 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
599 ; CHECK-NEXT:    vmov.16 q5[4], r0
600 ; CHECK-NEXT:    vstr s0, [sp, #8]
601 ; CHECK-NEXT:    ldr r0, [sp, #8]
602 ; CHECK-NEXT:    bl exp2f
603 ; CHECK-NEXT:    vmov s0, r0
604 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
605 ; CHECK-NEXT:    vmov r0, s0
606 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s19
607 ; CHECK-NEXT:    vstr s0, [sp, #4]
608 ; CHECK-NEXT:    vmov.16 q5[5], r0
609 ; CHECK-NEXT:    ldr r0, [sp, #4]
610 ; CHECK-NEXT:    bl exp2f
611 ; CHECK-NEXT:    vmov s0, r0
612 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
613 ; CHECK-NEXT:    vmov r0, s0
614 ; CHECK-NEXT:    vmovx.f16 s0, s19
615 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
616 ; CHECK-NEXT:    vmov.16 q5[6], r0
617 ; CHECK-NEXT:    vstr s0, [sp]
618 ; CHECK-NEXT:    ldr r0, [sp]
619 ; CHECK-NEXT:    bl exp2f
620 ; CHECK-NEXT:    vmov s0, r0
621 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
622 ; CHECK-NEXT:    vmov r0, s0
623 ; CHECK-NEXT:    vmov.16 q5[7], r0
624 ; CHECK-NEXT:    vmov q0, q5
625 ; CHECK-NEXT:    add sp, #32
626 ; CHECK-NEXT:    vpop {d8, d9, d10, d11}
627 ; CHECK-NEXT:    pop {r4, pc}
628 entry:
629   %0 = call fast <8 x half> @llvm.exp2.v8f16(<8 x half> %src)
630   ret <8 x half> %0
633 define arm_aapcs_vfpcc <2 x double> @exp2_float64_t(<2 x double> %src) {
634 ; CHECK-LABEL: exp2_float64_t:
635 ; CHECK:       @ %bb.0: @ %entry
636 ; CHECK-NEXT:    .save {r7, lr}
637 ; CHECK-NEXT:    push {r7, lr}
638 ; CHECK-NEXT:    .vsave {d8, d9}
639 ; CHECK-NEXT:    vpush {d8, d9}
640 ; CHECK-NEXT:    vmov q4, q0
641 ; CHECK-NEXT:    vmov r0, r1, d9
642 ; CHECK-NEXT:    bl exp2
643 ; CHECK-NEXT:    vmov r2, r3, d8
644 ; CHECK-NEXT:    vmov d9, r0, r1
645 ; CHECK-NEXT:    mov r0, r2
646 ; CHECK-NEXT:    mov r1, r3
647 ; CHECK-NEXT:    bl exp2
648 ; CHECK-NEXT:    vmov d8, r0, r1
649 ; CHECK-NEXT:    vmov q0, q4
650 ; CHECK-NEXT:    vpop {d8, d9}
651 ; CHECK-NEXT:    pop {r7, pc}
652 entry:
653   %0 = call fast <2 x double> @llvm.exp2.v2f64(<2 x double> %src)
654   ret <2 x double> %0
657 define arm_aapcs_vfpcc <4 x float> @log_float32_t(<4 x float> %src) {
658 ; CHECK-LABEL: log_float32_t:
659 ; CHECK:       @ %bb.0: @ %entry
660 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
661 ; CHECK-NEXT:    push {r4, r5, r7, lr}
662 ; CHECK-NEXT:    .vsave {d8, d9}
663 ; CHECK-NEXT:    vpush {d8, d9}
664 ; CHECK-NEXT:    .pad #16
665 ; CHECK-NEXT:    sub sp, #16
666 ; CHECK-NEXT:    vstmia sp, {s0, s1, s2, s3}
667 ; CHECK-NEXT:    ldr r0, [sp, #8]
668 ; CHECK-NEXT:    bl logf
669 ; CHECK-NEXT:    mov r4, r0
670 ; CHECK-NEXT:    ldr r0, [sp, #12]
671 ; CHECK-NEXT:    bl logf
672 ; CHECK-NEXT:    ldrd r5, r1, [sp]
673 ; CHECK-NEXT:    vmov s19, r0
674 ; CHECK-NEXT:    mov r0, r1
675 ; CHECK-NEXT:    vmov s18, r4
676 ; CHECK-NEXT:    bl logf
677 ; CHECK-NEXT:    vmov s17, r0
678 ; CHECK-NEXT:    mov r0, r5
679 ; CHECK-NEXT:    bl logf
680 ; CHECK-NEXT:    vmov s16, r0
681 ; CHECK-NEXT:    vmov q0, q4
682 ; CHECK-NEXT:    add sp, #16
683 ; CHECK-NEXT:    vpop {d8, d9}
684 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
685 entry:
686   %0 = call fast <4 x float> @llvm.log.v4f32(<4 x float> %src)
687   ret <4 x float> %0
690 define arm_aapcs_vfpcc <8 x half> @log_float16_t(<8 x half> %src) {
691 ; CHECK-LABEL: log_float16_t:
692 ; CHECK:       @ %bb.0: @ %entry
693 ; CHECK-NEXT:    .save {r4, lr}
694 ; CHECK-NEXT:    push {r4, lr}
695 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11}
696 ; CHECK-NEXT:    vpush {d8, d9, d10, d11}
697 ; CHECK-NEXT:    .pad #32
698 ; CHECK-NEXT:    sub sp, #32
699 ; CHECK-NEXT:    vmov q4, q0
700 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s16
701 ; CHECK-NEXT:    vstr s0, [sp, #28]
702 ; CHECK-NEXT:    ldr r0, [sp, #28]
703 ; CHECK-NEXT:    bl logf
704 ; CHECK-NEXT:    vmov s0, r0
705 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
706 ; CHECK-NEXT:    vmov r4, s0
707 ; CHECK-NEXT:    vmovx.f16 s0, s16
708 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
709 ; CHECK-NEXT:    vstr s0, [sp, #24]
710 ; CHECK-NEXT:    ldr r0, [sp, #24]
711 ; CHECK-NEXT:    bl logf
712 ; CHECK-NEXT:    vmov s0, r0
713 ; CHECK-NEXT:    vmov.16 q5[0], r4
714 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
715 ; CHECK-NEXT:    vmov r0, s0
716 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s17
717 ; CHECK-NEXT:    vstr s0, [sp, #20]
718 ; CHECK-NEXT:    vmov.16 q5[1], r0
719 ; CHECK-NEXT:    ldr r0, [sp, #20]
720 ; CHECK-NEXT:    bl logf
721 ; CHECK-NEXT:    vmov s0, r0
722 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
723 ; CHECK-NEXT:    vmov r0, s0
724 ; CHECK-NEXT:    vmovx.f16 s0, s17
725 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
726 ; CHECK-NEXT:    vmov.16 q5[2], r0
727 ; CHECK-NEXT:    vstr s0, [sp, #16]
728 ; CHECK-NEXT:    ldr r0, [sp, #16]
729 ; CHECK-NEXT:    bl logf
730 ; CHECK-NEXT:    vmov s0, r0
731 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
732 ; CHECK-NEXT:    vmov r0, s0
733 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s18
734 ; CHECK-NEXT:    vstr s0, [sp, #12]
735 ; CHECK-NEXT:    vmov.16 q5[3], r0
736 ; CHECK-NEXT:    ldr r0, [sp, #12]
737 ; CHECK-NEXT:    bl logf
738 ; CHECK-NEXT:    vmov s0, r0
739 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
740 ; CHECK-NEXT:    vmov r0, s0
741 ; CHECK-NEXT:    vmovx.f16 s0, s18
742 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
743 ; CHECK-NEXT:    vmov.16 q5[4], r0
744 ; CHECK-NEXT:    vstr s0, [sp, #8]
745 ; CHECK-NEXT:    ldr r0, [sp, #8]
746 ; CHECK-NEXT:    bl logf
747 ; CHECK-NEXT:    vmov s0, r0
748 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
749 ; CHECK-NEXT:    vmov r0, s0
750 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s19
751 ; CHECK-NEXT:    vstr s0, [sp, #4]
752 ; CHECK-NEXT:    vmov.16 q5[5], r0
753 ; CHECK-NEXT:    ldr r0, [sp, #4]
754 ; CHECK-NEXT:    bl logf
755 ; CHECK-NEXT:    vmov s0, r0
756 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
757 ; CHECK-NEXT:    vmov r0, s0
758 ; CHECK-NEXT:    vmovx.f16 s0, s19
759 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
760 ; CHECK-NEXT:    vmov.16 q5[6], r0
761 ; CHECK-NEXT:    vstr s0, [sp]
762 ; CHECK-NEXT:    ldr r0, [sp]
763 ; CHECK-NEXT:    bl logf
764 ; CHECK-NEXT:    vmov s0, r0
765 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
766 ; CHECK-NEXT:    vmov r0, s0
767 ; CHECK-NEXT:    vmov.16 q5[7], r0
768 ; CHECK-NEXT:    vmov q0, q5
769 ; CHECK-NEXT:    add sp, #32
770 ; CHECK-NEXT:    vpop {d8, d9, d10, d11}
771 ; CHECK-NEXT:    pop {r4, pc}
772 entry:
773   %0 = call fast <8 x half> @llvm.log.v8f16(<8 x half> %src)
774   ret <8 x half> %0
777 define arm_aapcs_vfpcc <2 x double> @log_float64_t(<2 x double> %src) {
778 ; CHECK-LABEL: log_float64_t:
779 ; CHECK:       @ %bb.0: @ %entry
780 ; CHECK-NEXT:    .save {r7, lr}
781 ; CHECK-NEXT:    push {r7, lr}
782 ; CHECK-NEXT:    .vsave {d8, d9}
783 ; CHECK-NEXT:    vpush {d8, d9}
784 ; CHECK-NEXT:    vmov q4, q0
785 ; CHECK-NEXT:    vmov r0, r1, d9
786 ; CHECK-NEXT:    bl log
787 ; CHECK-NEXT:    vmov r2, r3, d8
788 ; CHECK-NEXT:    vmov d9, r0, r1
789 ; CHECK-NEXT:    mov r0, r2
790 ; CHECK-NEXT:    mov r1, r3
791 ; CHECK-NEXT:    bl log
792 ; CHECK-NEXT:    vmov d8, r0, r1
793 ; CHECK-NEXT:    vmov q0, q4
794 ; CHECK-NEXT:    vpop {d8, d9}
795 ; CHECK-NEXT:    pop {r7, pc}
796 entry:
797   %0 = call fast <2 x double> @llvm.log.v2f64(<2 x double> %src)
798   ret <2 x double> %0
801 define arm_aapcs_vfpcc <4 x float> @log2_float32_t(<4 x float> %src) {
802 ; CHECK-LABEL: log2_float32_t:
803 ; CHECK:       @ %bb.0: @ %entry
804 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
805 ; CHECK-NEXT:    push {r4, r5, r7, lr}
806 ; CHECK-NEXT:    .vsave {d8, d9}
807 ; CHECK-NEXT:    vpush {d8, d9}
808 ; CHECK-NEXT:    .pad #16
809 ; CHECK-NEXT:    sub sp, #16
810 ; CHECK-NEXT:    vstmia sp, {s0, s1, s2, s3}
811 ; CHECK-NEXT:    ldr r0, [sp, #8]
812 ; CHECK-NEXT:    bl log2f
813 ; CHECK-NEXT:    mov r4, r0
814 ; CHECK-NEXT:    ldr r0, [sp, #12]
815 ; CHECK-NEXT:    bl log2f
816 ; CHECK-NEXT:    ldrd r5, r1, [sp]
817 ; CHECK-NEXT:    vmov s19, r0
818 ; CHECK-NEXT:    mov r0, r1
819 ; CHECK-NEXT:    vmov s18, r4
820 ; CHECK-NEXT:    bl log2f
821 ; CHECK-NEXT:    vmov s17, r0
822 ; CHECK-NEXT:    mov r0, r5
823 ; CHECK-NEXT:    bl log2f
824 ; CHECK-NEXT:    vmov s16, r0
825 ; CHECK-NEXT:    vmov q0, q4
826 ; CHECK-NEXT:    add sp, #16
827 ; CHECK-NEXT:    vpop {d8, d9}
828 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
829 entry:
830   %0 = call fast <4 x float> @llvm.log2.v4f32(<4 x float> %src)
831   ret <4 x float> %0
834 define arm_aapcs_vfpcc <8 x half> @log2_float16_t(<8 x half> %src) {
835 ; CHECK-LABEL: log2_float16_t:
836 ; CHECK:       @ %bb.0: @ %entry
837 ; CHECK-NEXT:    .save {r4, lr}
838 ; CHECK-NEXT:    push {r4, lr}
839 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11}
840 ; CHECK-NEXT:    vpush {d8, d9, d10, d11}
841 ; CHECK-NEXT:    .pad #32
842 ; CHECK-NEXT:    sub sp, #32
843 ; CHECK-NEXT:    vmov q4, q0
844 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s16
845 ; CHECK-NEXT:    vstr s0, [sp, #28]
846 ; CHECK-NEXT:    ldr r0, [sp, #28]
847 ; CHECK-NEXT:    bl log2f
848 ; CHECK-NEXT:    vmov s0, r0
849 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
850 ; CHECK-NEXT:    vmov r4, s0
851 ; CHECK-NEXT:    vmovx.f16 s0, s16
852 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
853 ; CHECK-NEXT:    vstr s0, [sp, #24]
854 ; CHECK-NEXT:    ldr r0, [sp, #24]
855 ; CHECK-NEXT:    bl log2f
856 ; CHECK-NEXT:    vmov s0, r0
857 ; CHECK-NEXT:    vmov.16 q5[0], r4
858 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
859 ; CHECK-NEXT:    vmov r0, s0
860 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s17
861 ; CHECK-NEXT:    vstr s0, [sp, #20]
862 ; CHECK-NEXT:    vmov.16 q5[1], r0
863 ; CHECK-NEXT:    ldr r0, [sp, #20]
864 ; CHECK-NEXT:    bl log2f
865 ; CHECK-NEXT:    vmov s0, r0
866 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
867 ; CHECK-NEXT:    vmov r0, s0
868 ; CHECK-NEXT:    vmovx.f16 s0, s17
869 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
870 ; CHECK-NEXT:    vmov.16 q5[2], r0
871 ; CHECK-NEXT:    vstr s0, [sp, #16]
872 ; CHECK-NEXT:    ldr r0, [sp, #16]
873 ; CHECK-NEXT:    bl log2f
874 ; CHECK-NEXT:    vmov s0, r0
875 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
876 ; CHECK-NEXT:    vmov r0, s0
877 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s18
878 ; CHECK-NEXT:    vstr s0, [sp, #12]
879 ; CHECK-NEXT:    vmov.16 q5[3], r0
880 ; CHECK-NEXT:    ldr r0, [sp, #12]
881 ; CHECK-NEXT:    bl log2f
882 ; CHECK-NEXT:    vmov s0, r0
883 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
884 ; CHECK-NEXT:    vmov r0, s0
885 ; CHECK-NEXT:    vmovx.f16 s0, s18
886 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
887 ; CHECK-NEXT:    vmov.16 q5[4], r0
888 ; CHECK-NEXT:    vstr s0, [sp, #8]
889 ; CHECK-NEXT:    ldr r0, [sp, #8]
890 ; CHECK-NEXT:    bl log2f
891 ; CHECK-NEXT:    vmov s0, r0
892 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
893 ; CHECK-NEXT:    vmov r0, s0
894 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s19
895 ; CHECK-NEXT:    vstr s0, [sp, #4]
896 ; CHECK-NEXT:    vmov.16 q5[5], r0
897 ; CHECK-NEXT:    ldr r0, [sp, #4]
898 ; CHECK-NEXT:    bl log2f
899 ; CHECK-NEXT:    vmov s0, r0
900 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
901 ; CHECK-NEXT:    vmov r0, s0
902 ; CHECK-NEXT:    vmovx.f16 s0, s19
903 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
904 ; CHECK-NEXT:    vmov.16 q5[6], r0
905 ; CHECK-NEXT:    vstr s0, [sp]
906 ; CHECK-NEXT:    ldr r0, [sp]
907 ; CHECK-NEXT:    bl log2f
908 ; CHECK-NEXT:    vmov s0, r0
909 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
910 ; CHECK-NEXT:    vmov r0, s0
911 ; CHECK-NEXT:    vmov.16 q5[7], r0
912 ; CHECK-NEXT:    vmov q0, q5
913 ; CHECK-NEXT:    add sp, #32
914 ; CHECK-NEXT:    vpop {d8, d9, d10, d11}
915 ; CHECK-NEXT:    pop {r4, pc}
916 entry:
917   %0 = call fast <8 x half> @llvm.log2.v8f16(<8 x half> %src)
918   ret <8 x half> %0
921 define arm_aapcs_vfpcc <2 x double> @log2_float64_t(<2 x double> %src) {
922 ; CHECK-LABEL: log2_float64_t:
923 ; CHECK:       @ %bb.0: @ %entry
924 ; CHECK-NEXT:    .save {r7, lr}
925 ; CHECK-NEXT:    push {r7, lr}
926 ; CHECK-NEXT:    .vsave {d8, d9}
927 ; CHECK-NEXT:    vpush {d8, d9}
928 ; CHECK-NEXT:    vmov q4, q0
929 ; CHECK-NEXT:    vmov r0, r1, d9
930 ; CHECK-NEXT:    bl log2
931 ; CHECK-NEXT:    vmov r2, r3, d8
932 ; CHECK-NEXT:    vmov d9, r0, r1
933 ; CHECK-NEXT:    mov r0, r2
934 ; CHECK-NEXT:    mov r1, r3
935 ; CHECK-NEXT:    bl log2
936 ; CHECK-NEXT:    vmov d8, r0, r1
937 ; CHECK-NEXT:    vmov q0, q4
938 ; CHECK-NEXT:    vpop {d8, d9}
939 ; CHECK-NEXT:    pop {r7, pc}
940 entry:
941   %0 = call fast <2 x double> @llvm.log2.v2f64(<2 x double> %src)
942   ret <2 x double> %0
945 define arm_aapcs_vfpcc <4 x float> @log10_float32_t(<4 x float> %src) {
946 ; CHECK-LABEL: log10_float32_t:
947 ; CHECK:       @ %bb.0: @ %entry
948 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
949 ; CHECK-NEXT:    push {r4, r5, r7, lr}
950 ; CHECK-NEXT:    .vsave {d8, d9}
951 ; CHECK-NEXT:    vpush {d8, d9}
952 ; CHECK-NEXT:    .pad #16
953 ; CHECK-NEXT:    sub sp, #16
954 ; CHECK-NEXT:    vstmia sp, {s0, s1, s2, s3}
955 ; CHECK-NEXT:    ldr r0, [sp, #8]
956 ; CHECK-NEXT:    bl log10f
957 ; CHECK-NEXT:    mov r4, r0
958 ; CHECK-NEXT:    ldr r0, [sp, #12]
959 ; CHECK-NEXT:    bl log10f
960 ; CHECK-NEXT:    ldrd r5, r1, [sp]
961 ; CHECK-NEXT:    vmov s19, r0
962 ; CHECK-NEXT:    mov r0, r1
963 ; CHECK-NEXT:    vmov s18, r4
964 ; CHECK-NEXT:    bl log10f
965 ; CHECK-NEXT:    vmov s17, r0
966 ; CHECK-NEXT:    mov r0, r5
967 ; CHECK-NEXT:    bl log10f
968 ; CHECK-NEXT:    vmov s16, r0
969 ; CHECK-NEXT:    vmov q0, q4
970 ; CHECK-NEXT:    add sp, #16
971 ; CHECK-NEXT:    vpop {d8, d9}
972 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
973 entry:
974   %0 = call fast <4 x float> @llvm.log10.v4f32(<4 x float> %src)
975   ret <4 x float> %0
978 define arm_aapcs_vfpcc <8 x half> @log10_float16_t(<8 x half> %src) {
979 ; CHECK-LABEL: log10_float16_t:
980 ; CHECK:       @ %bb.0: @ %entry
981 ; CHECK-NEXT:    .save {r4, lr}
982 ; CHECK-NEXT:    push {r4, lr}
983 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11}
984 ; CHECK-NEXT:    vpush {d8, d9, d10, d11}
985 ; CHECK-NEXT:    .pad #32
986 ; CHECK-NEXT:    sub sp, #32
987 ; CHECK-NEXT:    vmov q4, q0
988 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s16
989 ; CHECK-NEXT:    vstr s0, [sp, #28]
990 ; CHECK-NEXT:    ldr r0, [sp, #28]
991 ; CHECK-NEXT:    bl log10f
992 ; CHECK-NEXT:    vmov s0, r0
993 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
994 ; CHECK-NEXT:    vmov r4, s0
995 ; CHECK-NEXT:    vmovx.f16 s0, s16
996 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
997 ; CHECK-NEXT:    vstr s0, [sp, #24]
998 ; CHECK-NEXT:    ldr r0, [sp, #24]
999 ; CHECK-NEXT:    bl log10f
1000 ; CHECK-NEXT:    vmov s0, r0
1001 ; CHECK-NEXT:    vmov.16 q5[0], r4
1002 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
1003 ; CHECK-NEXT:    vmov r0, s0
1004 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s17
1005 ; CHECK-NEXT:    vstr s0, [sp, #20]
1006 ; CHECK-NEXT:    vmov.16 q5[1], r0
1007 ; CHECK-NEXT:    ldr r0, [sp, #20]
1008 ; CHECK-NEXT:    bl log10f
1009 ; CHECK-NEXT:    vmov s0, r0
1010 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
1011 ; CHECK-NEXT:    vmov r0, s0
1012 ; CHECK-NEXT:    vmovx.f16 s0, s17
1013 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
1014 ; CHECK-NEXT:    vmov.16 q5[2], r0
1015 ; CHECK-NEXT:    vstr s0, [sp, #16]
1016 ; CHECK-NEXT:    ldr r0, [sp, #16]
1017 ; CHECK-NEXT:    bl log10f
1018 ; CHECK-NEXT:    vmov s0, r0
1019 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
1020 ; CHECK-NEXT:    vmov r0, s0
1021 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s18
1022 ; CHECK-NEXT:    vstr s0, [sp, #12]
1023 ; CHECK-NEXT:    vmov.16 q5[3], r0
1024 ; CHECK-NEXT:    ldr r0, [sp, #12]
1025 ; CHECK-NEXT:    bl log10f
1026 ; CHECK-NEXT:    vmov s0, r0
1027 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
1028 ; CHECK-NEXT:    vmov r0, s0
1029 ; CHECK-NEXT:    vmovx.f16 s0, s18
1030 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
1031 ; CHECK-NEXT:    vmov.16 q5[4], r0
1032 ; CHECK-NEXT:    vstr s0, [sp, #8]
1033 ; CHECK-NEXT:    ldr r0, [sp, #8]
1034 ; CHECK-NEXT:    bl log10f
1035 ; CHECK-NEXT:    vmov s0, r0
1036 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
1037 ; CHECK-NEXT:    vmov r0, s0
1038 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s19
1039 ; CHECK-NEXT:    vstr s0, [sp, #4]
1040 ; CHECK-NEXT:    vmov.16 q5[5], r0
1041 ; CHECK-NEXT:    ldr r0, [sp, #4]
1042 ; CHECK-NEXT:    bl log10f
1043 ; CHECK-NEXT:    vmov s0, r0
1044 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
1045 ; CHECK-NEXT:    vmov r0, s0
1046 ; CHECK-NEXT:    vmovx.f16 s0, s19
1047 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
1048 ; CHECK-NEXT:    vmov.16 q5[6], r0
1049 ; CHECK-NEXT:    vstr s0, [sp]
1050 ; CHECK-NEXT:    ldr r0, [sp]
1051 ; CHECK-NEXT:    bl log10f
1052 ; CHECK-NEXT:    vmov s0, r0
1053 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
1054 ; CHECK-NEXT:    vmov r0, s0
1055 ; CHECK-NEXT:    vmov.16 q5[7], r0
1056 ; CHECK-NEXT:    vmov q0, q5
1057 ; CHECK-NEXT:    add sp, #32
1058 ; CHECK-NEXT:    vpop {d8, d9, d10, d11}
1059 ; CHECK-NEXT:    pop {r4, pc}
1060 entry:
1061   %0 = call fast <8 x half> @llvm.log10.v8f16(<8 x half> %src)
1062   ret <8 x half> %0
1065 define arm_aapcs_vfpcc <2 x double> @log10_float64_t(<2 x double> %src) {
1066 ; CHECK-LABEL: log10_float64_t:
1067 ; CHECK:       @ %bb.0: @ %entry
1068 ; CHECK-NEXT:    .save {r7, lr}
1069 ; CHECK-NEXT:    push {r7, lr}
1070 ; CHECK-NEXT:    .vsave {d8, d9}
1071 ; CHECK-NEXT:    vpush {d8, d9}
1072 ; CHECK-NEXT:    vmov q4, q0
1073 ; CHECK-NEXT:    vmov r0, r1, d9
1074 ; CHECK-NEXT:    bl log10
1075 ; CHECK-NEXT:    vmov r2, r3, d8
1076 ; CHECK-NEXT:    vmov d9, r0, r1
1077 ; CHECK-NEXT:    mov r0, r2
1078 ; CHECK-NEXT:    mov r1, r3
1079 ; CHECK-NEXT:    bl log10
1080 ; CHECK-NEXT:    vmov d8, r0, r1
1081 ; CHECK-NEXT:    vmov q0, q4
1082 ; CHECK-NEXT:    vpop {d8, d9}
1083 ; CHECK-NEXT:    pop {r7, pc}
1084 entry:
1085   %0 = call fast <2 x double> @llvm.log10.v2f64(<2 x double> %src)
1086   ret <2 x double> %0
1089 define arm_aapcs_vfpcc <4 x float> @pow_float32_t(<4 x float> %src1, <4 x float> %src2) {
1090 ; CHECK-LABEL: pow_float32_t:
1091 ; CHECK:       @ %bb.0: @ %entry
1092 ; CHECK-NEXT:    .save {r4, r5, r6, lr}
1093 ; CHECK-NEXT:    push {r4, r5, r6, lr}
1094 ; CHECK-NEXT:    .vsave {d8, d9}
1095 ; CHECK-NEXT:    vpush {d8, d9}
1096 ; CHECK-NEXT:    .pad #32
1097 ; CHECK-NEXT:    sub sp, #32
1098 ; CHECK-NEXT:    vstr s0, [sp]
1099 ; CHECK-NEXT:    ldr r4, [sp]
1100 ; CHECK-NEXT:    vstr s2, [sp, #16]
1101 ; CHECK-NEXT:    vstr s6, [sp, #20]
1102 ; CHECK-NEXT:    vstr s3, [sp, #24]
1103 ; CHECK-NEXT:    vstr s7, [sp, #28]
1104 ; CHECK-NEXT:    vstr s4, [sp, #4]
1105 ; CHECK-NEXT:    vstr s1, [sp, #8]
1106 ; CHECK-NEXT:    vstr s5, [sp, #12]
1107 ; CHECK-NEXT:    ldrd r0, r1, [sp, #16]
1108 ; CHECK-NEXT:    bl powf
1109 ; CHECK-NEXT:    mov r5, r0
1110 ; CHECK-NEXT:    ldrd r0, r1, [sp, #24]
1111 ; CHECK-NEXT:    bl powf
1112 ; CHECK-NEXT:    ldr r1, [sp, #12]
1113 ; CHECK-NEXT:    vmov s19, r0
1114 ; CHECK-NEXT:    ldrd r6, r2, [sp, #4]
1115 ; CHECK-NEXT:    vmov s18, r5
1116 ; CHECK-NEXT:    mov r0, r2
1117 ; CHECK-NEXT:    bl powf
1118 ; CHECK-NEXT:    vmov s17, r0
1119 ; CHECK-NEXT:    mov r0, r4
1120 ; CHECK-NEXT:    mov r1, r6
1121 ; CHECK-NEXT:    bl powf
1122 ; CHECK-NEXT:    vmov s16, r0
1123 ; CHECK-NEXT:    vmov q0, q4
1124 ; CHECK-NEXT:    add sp, #32
1125 ; CHECK-NEXT:    vpop {d8, d9}
1126 ; CHECK-NEXT:    pop {r4, r5, r6, pc}
1127 entry:
1128   %0 = call fast <4 x float> @llvm.pow.v4f32(<4 x float> %src1, <4 x float> %src2)
1129   ret <4 x float> %0
1132 define arm_aapcs_vfpcc <8 x half> @pow_float16_t(<8 x half> %src1, <8 x half> %src2) {
1133 ; CHECK-LABEL: pow_float16_t:
1134 ; CHECK:       @ %bb.0: @ %entry
1135 ; CHECK-NEXT:    .save {r4, lr}
1136 ; CHECK-NEXT:    push {r4, lr}
1137 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11, d12, d13}
1138 ; CHECK-NEXT:    vpush {d8, d9, d10, d11, d12, d13}
1139 ; CHECK-NEXT:    .pad #64
1140 ; CHECK-NEXT:    sub sp, #64
1141 ; CHECK-NEXT:    vmov q4, q0
1142 ; CHECK-NEXT:    vmov q5, q1
1143 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s16
1144 ; CHECK-NEXT:    vstr s0, [sp, #56]
1145 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s20
1146 ; CHECK-NEXT:    vstr s0, [sp, #60]
1147 ; CHECK-NEXT:    ldrd r0, r1, [sp, #56]
1148 ; CHECK-NEXT:    bl powf
1149 ; CHECK-NEXT:    vmov s0, r0
1150 ; CHECK-NEXT:    vmovx.f16 s2, s16
1151 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
1152 ; CHECK-NEXT:    vcvtb.f32.f16 s2, s2
1153 ; CHECK-NEXT:    vmov r4, s0
1154 ; CHECK-NEXT:    vmovx.f16 s0, s20
1155 ; CHECK-NEXT:    vstr s2, [sp, #48]
1156 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
1157 ; CHECK-NEXT:    vstr s0, [sp, #52]
1158 ; CHECK-NEXT:    ldrd r0, r1, [sp, #48]
1159 ; CHECK-NEXT:    bl powf
1160 ; CHECK-NEXT:    vmov s0, r0
1161 ; CHECK-NEXT:    vmov.16 q6[0], r4
1162 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
1163 ; CHECK-NEXT:    vmov r0, s0
1164 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s17
1165 ; CHECK-NEXT:    vstr s0, [sp, #40]
1166 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s21
1167 ; CHECK-NEXT:    vstr s0, [sp, #44]
1168 ; CHECK-NEXT:    vmov.16 q6[1], r0
1169 ; CHECK-NEXT:    ldrd r0, r1, [sp, #40]
1170 ; CHECK-NEXT:    bl powf
1171 ; CHECK-NEXT:    vmov s0, r0
1172 ; CHECK-NEXT:    vmovx.f16 s2, s17
1173 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
1174 ; CHECK-NEXT:    vcvtb.f32.f16 s2, s2
1175 ; CHECK-NEXT:    vmov r0, s0
1176 ; CHECK-NEXT:    vmovx.f16 s0, s21
1177 ; CHECK-NEXT:    vstr s2, [sp, #32]
1178 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
1179 ; CHECK-NEXT:    vstr s0, [sp, #36]
1180 ; CHECK-NEXT:    vmov.16 q6[2], r0
1181 ; CHECK-NEXT:    ldrd r0, r1, [sp, #32]
1182 ; CHECK-NEXT:    bl powf
1183 ; CHECK-NEXT:    vmov s0, r0
1184 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
1185 ; CHECK-NEXT:    vmov r0, s0
1186 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s18
1187 ; CHECK-NEXT:    vstr s0, [sp, #24]
1188 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s22
1189 ; CHECK-NEXT:    vstr s0, [sp, #28]
1190 ; CHECK-NEXT:    vmov.16 q6[3], r0
1191 ; CHECK-NEXT:    ldrd r0, r1, [sp, #24]
1192 ; CHECK-NEXT:    bl powf
1193 ; CHECK-NEXT:    vmov s0, r0
1194 ; CHECK-NEXT:    vmovx.f16 s2, s18
1195 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
1196 ; CHECK-NEXT:    vcvtb.f32.f16 s2, s2
1197 ; CHECK-NEXT:    vmov r0, s0
1198 ; CHECK-NEXT:    vmovx.f16 s0, s22
1199 ; CHECK-NEXT:    vstr s2, [sp, #16]
1200 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
1201 ; CHECK-NEXT:    vstr s0, [sp, #20]
1202 ; CHECK-NEXT:    vmov.16 q6[4], r0
1203 ; CHECK-NEXT:    ldrd r0, r1, [sp, #16]
1204 ; CHECK-NEXT:    bl powf
1205 ; CHECK-NEXT:    vmov s0, r0
1206 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
1207 ; CHECK-NEXT:    vmov r0, s0
1208 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s19
1209 ; CHECK-NEXT:    vstr s0, [sp, #8]
1210 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s23
1211 ; CHECK-NEXT:    vstr s0, [sp, #12]
1212 ; CHECK-NEXT:    vmov.16 q6[5], r0
1213 ; CHECK-NEXT:    ldrd r0, r1, [sp, #8]
1214 ; CHECK-NEXT:    bl powf
1215 ; CHECK-NEXT:    vmov s0, r0
1216 ; CHECK-NEXT:    vmovx.f16 s2, s19
1217 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
1218 ; CHECK-NEXT:    vcvtb.f32.f16 s2, s2
1219 ; CHECK-NEXT:    vmov r0, s0
1220 ; CHECK-NEXT:    vmovx.f16 s0, s23
1221 ; CHECK-NEXT:    vstr s2, [sp]
1222 ; CHECK-NEXT:    vcvtb.f32.f16 s0, s0
1223 ; CHECK-NEXT:    vstr s0, [sp, #4]
1224 ; CHECK-NEXT:    vmov.16 q6[6], r0
1225 ; CHECK-NEXT:    ldrd r0, r1, [sp]
1226 ; CHECK-NEXT:    bl powf
1227 ; CHECK-NEXT:    vmov s0, r0
1228 ; CHECK-NEXT:    vcvtb.f16.f32 s0, s0
1229 ; CHECK-NEXT:    vmov r0, s0
1230 ; CHECK-NEXT:    vmov.16 q6[7], r0
1231 ; CHECK-NEXT:    vmov q0, q6
1232 ; CHECK-NEXT:    add sp, #64
1233 ; CHECK-NEXT:    vpop {d8, d9, d10, d11, d12, d13}
1234 ; CHECK-NEXT:    pop {r4, pc}
1235 entry:
1236   %0 = call fast <8 x half> @llvm.pow.v8f16(<8 x half> %src1, <8 x half> %src2)
1237   ret <8 x half> %0
1240 define arm_aapcs_vfpcc <2 x double> @pow_float64_t(<2 x double> %src1, <2 x double> %src2) {
1241 ; CHECK-LABEL: pow_float64_t:
1242 ; CHECK:       @ %bb.0: @ %entry
1243 ; CHECK-NEXT:    .save {r7, lr}
1244 ; CHECK-NEXT:    push {r7, lr}
1245 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11}
1246 ; CHECK-NEXT:    vpush {d8, d9, d10, d11}
1247 ; CHECK-NEXT:    vmov q4, q1
1248 ; CHECK-NEXT:    vmov q5, q0
1249 ; CHECK-NEXT:    vmov r0, r1, d11
1250 ; CHECK-NEXT:    vmov r2, r3, d9
1251 ; CHECK-NEXT:    bl pow
1252 ; CHECK-NEXT:    vmov lr, r12, d10
1253 ; CHECK-NEXT:    vmov r2, r3, d8
1254 ; CHECK-NEXT:    vmov d9, r0, r1
1255 ; CHECK-NEXT:    mov r0, lr
1256 ; CHECK-NEXT:    mov r1, r12
1257 ; CHECK-NEXT:    bl pow
1258 ; CHECK-NEXT:    vmov d8, r0, r1
1259 ; CHECK-NEXT:    vmov q0, q4
1260 ; CHECK-NEXT:    vpop {d8, d9, d10, d11}
1261 ; CHECK-NEXT:    pop {r7, pc}
1262 entry:
1263   %0 = call fast <2 x double> @llvm.pow.v2f64(<2 x double> %src1, <2 x double> %src2)
1264   ret <2 x double> %0
1267 define arm_aapcs_vfpcc <4 x float> @copysign_float32_t(<4 x float> %src1, <4 x float> %src2) {
1268 ; CHECK-LABEL: copysign_float32_t:
1269 ; CHECK:       @ %bb.0: @ %entry
1270 ; CHECK-NEXT:    .save {r4, r5, r6, lr}
1271 ; CHECK-NEXT:    push {r4, r5, r6, lr}
1272 ; CHECK-NEXT:    .pad #32
1273 ; CHECK-NEXT:    sub sp, #32
1274 ; CHECK-NEXT:    vstr s5, [sp, #8]
1275 ; CHECK-NEXT:    ldr.w r12, [sp, #8]
1276 ; CHECK-NEXT:    vstr s6, [sp, #16]
1277 ; CHECK-NEXT:    ldr.w lr, [sp, #16]
1278 ; CHECK-NEXT:    vstr s7, [sp, #24]
1279 ; CHECK-NEXT:    lsr.w r2, r12, #31
1280 ; CHECK-NEXT:    ldr r6, [sp, #24]
1281 ; CHECK-NEXT:    vstr s3, [sp, #28]
1282 ; CHECK-NEXT:    ldr r3, [sp, #28]
1283 ; CHECK-NEXT:    vstr s4, [sp]
1284 ; CHECK-NEXT:    ldr r0, [sp]
1285 ; CHECK-NEXT:    vstr s0, [sp, #4]
1286 ; CHECK-NEXT:    ldr r1, [sp, #4]
1287 ; CHECK-NEXT:    vstr s1, [sp, #12]
1288 ; CHECK-NEXT:    lsrs r0, r0, #31
1289 ; CHECK-NEXT:    vstr s2, [sp, #20]
1290 ; CHECK-NEXT:    bfi r1, r0, #31, #1
1291 ; CHECK-NEXT:    ldr r4, [sp, #12]
1292 ; CHECK-NEXT:    ldr r5, [sp, #20]
1293 ; CHECK-NEXT:    bfi r4, r2, #31, #1
1294 ; CHECK-NEXT:    lsr.w r2, lr, #31
1295 ; CHECK-NEXT:    bfi r5, r2, #31, #1
1296 ; CHECK-NEXT:    lsrs r2, r6, #31
1297 ; CHECK-NEXT:    bfi r3, r2, #31, #1
1298 ; CHECK-NEXT:    vmov s3, r3
1299 ; CHECK-NEXT:    vmov s2, r5
1300 ; CHECK-NEXT:    vmov s1, r4
1301 ; CHECK-NEXT:    vmov s0, r1
1302 ; CHECK-NEXT:    add sp, #32
1303 ; CHECK-NEXT:    pop {r4, r5, r6, pc}
1304 entry:
1305   %0 = call fast <4 x float> @llvm.copysign.v4f32(<4 x float> %src1, <4 x float> %src2)
1306   ret <4 x float> %0
1309 define arm_aapcs_vfpcc <8 x half> @copysign_float16_t(<8 x half> %src1, <8 x half> %src2) {
1310 ; CHECK-LABEL: copysign_float16_t:
1311 ; CHECK:       @ %bb.0: @ %entry
1312 ; CHECK-NEXT:    .pad #32
1313 ; CHECK-NEXT:    sub sp, #32
1314 ; CHECK-NEXT:    vmovx.f16 s8, s4
1315 ; CHECK-NEXT:    vstr.16 s4, [sp, #28]
1316 ; CHECK-NEXT:    vstr.16 s8, [sp, #24]
1317 ; CHECK-NEXT:    vmovx.f16 s8, s5
1318 ; CHECK-NEXT:    vstr.16 s5, [sp, #20]
1319 ; CHECK-NEXT:    vstr.16 s8, [sp, #16]
1320 ; CHECK-NEXT:    vmovx.f16 s8, s6
1321 ; CHECK-NEXT:    vmovx.f16 s4, s7
1322 ; CHECK-NEXT:    vstr.16 s6, [sp, #12]
1323 ; CHECK-NEXT:    vstr.16 s8, [sp, #8]
1324 ; CHECK-NEXT:    vstr.16 s7, [sp, #4]
1325 ; CHECK-NEXT:    vstr.16 s4, [sp]
1326 ; CHECK-NEXT:    ldrb.w r0, [sp, #29]
1327 ; CHECK-NEXT:    vabs.f16 s4, s0
1328 ; CHECK-NEXT:    vneg.f16 s6, s4
1329 ; CHECK-NEXT:    vabs.f16 s8, s1
1330 ; CHECK-NEXT:    ands r0, r0, #128
1331 ; CHECK-NEXT:    vneg.f16 s10, s8
1332 ; CHECK-NEXT:    it ne
1333 ; CHECK-NEXT:    movne r0, #1
1334 ; CHECK-NEXT:    cmp r0, #0
1335 ; CHECK-NEXT:    vseleq.f16 s4, s4, s6
1336 ; CHECK-NEXT:    ldrb.w r1, [sp, #25]
1337 ; CHECK-NEXT:    vmov r0, s4
1338 ; CHECK-NEXT:    vmovx.f16 s4, s0
1339 ; CHECK-NEXT:    ands r1, r1, #128
1340 ; CHECK-NEXT:    vabs.f16 s4, s4
1341 ; CHECK-NEXT:    it ne
1342 ; CHECK-NEXT:    movne r1, #1
1343 ; CHECK-NEXT:    vneg.f16 s6, s4
1344 ; CHECK-NEXT:    cmp r1, #0
1345 ; CHECK-NEXT:    vmovx.f16 s0, s3
1346 ; CHECK-NEXT:    vseleq.f16 s4, s4, s6
1347 ; CHECK-NEXT:    vabs.f16 s0, s0
1348 ; CHECK-NEXT:    vmov r1, s4
1349 ; CHECK-NEXT:    vmov.16 q1[0], r0
1350 ; CHECK-NEXT:    ldrb.w r0, [sp, #21]
1351 ; CHECK-NEXT:    vmov.16 q1[1], r1
1352 ; CHECK-NEXT:    ands r0, r0, #128
1353 ; CHECK-NEXT:    it ne
1354 ; CHECK-NEXT:    movne r0, #1
1355 ; CHECK-NEXT:    cmp r0, #0
1356 ; CHECK-NEXT:    vseleq.f16 s8, s8, s10
1357 ; CHECK-NEXT:    vmov r0, s8
1358 ; CHECK-NEXT:    vmovx.f16 s8, s1
1359 ; CHECK-NEXT:    vmov.16 q1[2], r0
1360 ; CHECK-NEXT:    ldrb.w r0, [sp, #17]
1361 ; CHECK-NEXT:    vabs.f16 s8, s8
1362 ; CHECK-NEXT:    ands r0, r0, #128
1363 ; CHECK-NEXT:    vneg.f16 s10, s8
1364 ; CHECK-NEXT:    it ne
1365 ; CHECK-NEXT:    movne r0, #1
1366 ; CHECK-NEXT:    cmp r0, #0
1367 ; CHECK-NEXT:    vseleq.f16 s8, s8, s10
1368 ; CHECK-NEXT:    vmov r0, s8
1369 ; CHECK-NEXT:    vabs.f16 s8, s2
1370 ; CHECK-NEXT:    vmov.16 q1[3], r0
1371 ; CHECK-NEXT:    ldrb.w r0, [sp, #13]
1372 ; CHECK-NEXT:    vneg.f16 s10, s8
1373 ; CHECK-NEXT:    ands r0, r0, #128
1374 ; CHECK-NEXT:    it ne
1375 ; CHECK-NEXT:    movne r0, #1
1376 ; CHECK-NEXT:    cmp r0, #0
1377 ; CHECK-NEXT:    vseleq.f16 s8, s8, s10
1378 ; CHECK-NEXT:    vmov r0, s8
1379 ; CHECK-NEXT:    vmovx.f16 s8, s2
1380 ; CHECK-NEXT:    vmov.16 q1[4], r0
1381 ; CHECK-NEXT:    ldrb.w r0, [sp, #9]
1382 ; CHECK-NEXT:    vabs.f16 s8, s8
1383 ; CHECK-NEXT:    vneg.f16 s2, s0
1384 ; CHECK-NEXT:    ands r0, r0, #128
1385 ; CHECK-NEXT:    vneg.f16 s10, s8
1386 ; CHECK-NEXT:    it ne
1387 ; CHECK-NEXT:    movne r0, #1
1388 ; CHECK-NEXT:    cmp r0, #0
1389 ; CHECK-NEXT:    vseleq.f16 s8, s8, s10
1390 ; CHECK-NEXT:    vmov r0, s8
1391 ; CHECK-NEXT:    vabs.f16 s8, s3
1392 ; CHECK-NEXT:    vmov.16 q1[5], r0
1393 ; CHECK-NEXT:    ldrb.w r0, [sp, #5]
1394 ; CHECK-NEXT:    vneg.f16 s10, s8
1395 ; CHECK-NEXT:    ands r0, r0, #128
1396 ; CHECK-NEXT:    it ne
1397 ; CHECK-NEXT:    movne r0, #1
1398 ; CHECK-NEXT:    cmp r0, #0
1399 ; CHECK-NEXT:    vseleq.f16 s8, s8, s10
1400 ; CHECK-NEXT:    vmov r0, s8
1401 ; CHECK-NEXT:    vmov.16 q1[6], r0
1402 ; CHECK-NEXT:    ldrb.w r0, [sp, #1]
1403 ; CHECK-NEXT:    ands r0, r0, #128
1404 ; CHECK-NEXT:    it ne
1405 ; CHECK-NEXT:    movne r0, #1
1406 ; CHECK-NEXT:    cmp r0, #0
1407 ; CHECK-NEXT:    vseleq.f16 s0, s0, s2
1408 ; CHECK-NEXT:    vmov r0, s0
1409 ; CHECK-NEXT:    vmov.16 q1[7], r0
1410 ; CHECK-NEXT:    vmov q0, q1
1411 ; CHECK-NEXT:    add sp, #32
1412 ; CHECK-NEXT:    bx lr
1413 entry:
1414   %0 = call fast <8 x half> @llvm.copysign.v8f16(<8 x half> %src1, <8 x half> %src2)
1415   ret <8 x half> %0
1418 define arm_aapcs_vfpcc <2 x double> @copysign_float64_t(<2 x double> %src1, <2 x double> %src2) {
1419 ; CHECK-LABEL: copysign_float64_t:
1420 ; CHECK:       @ %bb.0: @ %entry
1421 ; CHECK-NEXT:    .save {r7, lr}
1422 ; CHECK-NEXT:    push {r7, lr}
1423 ; CHECK-NEXT:    vmov r0, r1, d3
1424 ; CHECK-NEXT:    vmov r0, lr, d2
1425 ; CHECK-NEXT:    vmov r0, r3, d1
1426 ; CHECK-NEXT:    vmov r12, r2, d0
1427 ; CHECK-NEXT:    lsrs r1, r1, #31
1428 ; CHECK-NEXT:    bfi r3, r1, #31, #1
1429 ; CHECK-NEXT:    lsr.w r1, lr, #31
1430 ; CHECK-NEXT:    bfi r2, r1, #31, #1
1431 ; CHECK-NEXT:    vmov d1, r0, r3
1432 ; CHECK-NEXT:    vmov d0, r12, r2
1433 ; CHECK-NEXT:    pop {r7, pc}
1434 entry:
1435   %0 = call fast <2 x double> @llvm.copysign.v2f64(<2 x double> %src1, <2 x double> %src2)
1436   ret <2 x double> %0
1439 declare <4 x float> @llvm.sqrt.v4f32(<4 x float>)
1440 declare <4 x float> @llvm.cos.v4f32(<4 x float>)
1441 declare <4 x float> @llvm.sin.v4f32(<4 x float>)
1442 declare <4 x float> @llvm.exp.v4f32(<4 x float>)
1443 declare <4 x float> @llvm.exp2.v4f32(<4 x float>)
1444 declare <4 x float> @llvm.log.v4f32(<4 x float>)
1445 declare <4 x float> @llvm.log2.v4f32(<4 x float>)
1446 declare <4 x float> @llvm.log10.v4f32(<4 x float>)
1447 declare <4 x float> @llvm.pow.v4f32(<4 x float>, <4 x float>)
1448 declare <4 x float> @llvm.copysign.v4f32(<4 x float>, <4 x float>)
1449 declare <8 x half> @llvm.sqrt.v8f16(<8 x half>)
1450 declare <8 x half> @llvm.cos.v8f16(<8 x half>)
1451 declare <8 x half> @llvm.sin.v8f16(<8 x half>)
1452 declare <8 x half> @llvm.exp.v8f16(<8 x half>)
1453 declare <8 x half> @llvm.exp2.v8f16(<8 x half>)
1454 declare <8 x half> @llvm.log.v8f16(<8 x half>)
1455 declare <8 x half> @llvm.log2.v8f16(<8 x half>)
1456 declare <8 x half> @llvm.log10.v8f16(<8 x half>)
1457 declare <8 x half> @llvm.pow.v8f16(<8 x half>, <8 x half>)
1458 declare <8 x half> @llvm.copysign.v8f16(<8 x half>, <8 x half>)
1459 declare <2 x double> @llvm.sqrt.v2f64(<2 x double>)
1460 declare <2 x double> @llvm.cos.v2f64(<2 x double>)
1461 declare <2 x double> @llvm.sin.v2f64(<2 x double>)
1462 declare <2 x double> @llvm.exp.v2f64(<2 x double>)
1463 declare <2 x double> @llvm.exp2.v2f64(<2 x double>)
1464 declare <2 x double> @llvm.log.v2f64(<2 x double>)
1465 declare <2 x double> @llvm.log2.v2f64(<2 x double>)
1466 declare <2 x double> @llvm.log10.v2f64(<2 x double>)
1467 declare <2 x double> @llvm.pow.v2f64(<2 x double>, <2 x double>)
1468 declare <2 x double> @llvm.copysign.v2f64(<2 x double>, <2 x double>)