xref: /llvm-project/llvm/test/CodeGen/ARM/llvm.exp10.ll (revision 52864d9c7bd49ca41191bd34fcee47f61cfea743)
1b14e83d1SMatt Arsenault; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2b14e83d1SMatt Arsenault; RUN: llc -mtriple=thumbv7-unknown-linux < %s | FileCheck -check-prefixes=CHECK %s
3b14e83d1SMatt Arsenault
4b14e83d1SMatt Arsenaultdeclare half @llvm.exp10.f16(half)
5b14e83d1SMatt Arsenaultdeclare <1 x half> @llvm.exp10.v1f16(<1 x half>)
6b14e83d1SMatt Arsenaultdeclare <2 x half> @llvm.exp10.v2f16(<2 x half>)
7b14e83d1SMatt Arsenaultdeclare <3 x half> @llvm.exp10.v3f16(<3 x half>)
8b14e83d1SMatt Arsenaultdeclare <4 x half> @llvm.exp10.v4f16(<4 x half>)
9b14e83d1SMatt Arsenaultdeclare float @llvm.exp10.f32(float)
10b14e83d1SMatt Arsenaultdeclare <1 x float> @llvm.exp10.v1f32(<1 x float>)
11b14e83d1SMatt Arsenaultdeclare <2 x float> @llvm.exp10.v2f32(<2 x float>)
12b14e83d1SMatt Arsenaultdeclare <3 x float> @llvm.exp10.v3f32(<3 x float>)
13b14e83d1SMatt Arsenaultdeclare <4 x float> @llvm.exp10.v4f32(<4 x float>)
14b14e83d1SMatt Arsenaultdeclare double @llvm.exp10.f64(double)
15b14e83d1SMatt Arsenaultdeclare <1 x double> @llvm.exp10.v1f64(<1 x double>)
16b14e83d1SMatt Arsenaultdeclare <2 x double> @llvm.exp10.v2f64(<2 x double>)
17b14e83d1SMatt Arsenaultdeclare <3 x double> @llvm.exp10.v3f64(<3 x double>)
18b14e83d1SMatt Arsenaultdeclare <4 x double> @llvm.exp10.v4f64(<4 x double>)
19b14e83d1SMatt Arsenault
20b14e83d1SMatt Arsenaultdefine half @exp10_f16(half %x) {
21b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_f16:
22b14e83d1SMatt Arsenault; CHECK:       @ %bb.0:
23b14e83d1SMatt Arsenault; CHECK-NEXT:    push {r7, lr}
24b14e83d1SMatt Arsenault; CHECK-NEXT:    bl __gnu_h2f_ieee
25b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10f
26b14e83d1SMatt Arsenault; CHECK-NEXT:    bl __gnu_f2h_ieee
27b14e83d1SMatt Arsenault; CHECK-NEXT:    pop {r7, pc}
28b14e83d1SMatt Arsenault  %r = call half @llvm.exp10.f16(half %x)
29b14e83d1SMatt Arsenault  ret half %r
30b14e83d1SMatt Arsenault}
31b14e83d1SMatt Arsenault
32b14e83d1SMatt Arsenaultdefine <1 x half> @exp10_v1f16(<1 x half> %x) {
33b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_v1f16:
34b14e83d1SMatt Arsenault; CHECK:       @ %bb.0:
35b14e83d1SMatt Arsenault; CHECK-NEXT:    push {r7, lr}
36b14e83d1SMatt Arsenault; CHECK-NEXT:    bl __gnu_f2h_ieee
37b14e83d1SMatt Arsenault; CHECK-NEXT:    bl __gnu_h2f_ieee
38b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10f
39*52864d9cSHarald van Dijk; CHECK-NEXT:    bl __gnu_f2h_ieee
40*52864d9cSHarald van Dijk; CHECK-NEXT:    bl __gnu_h2f_ieee
41b14e83d1SMatt Arsenault; CHECK-NEXT:    pop {r7, pc}
42b14e83d1SMatt Arsenault  %r = call <1 x half> @llvm.exp10.v1f16(<1 x half> %x)
43b14e83d1SMatt Arsenault  ret <1 x half> %r
44b14e83d1SMatt Arsenault}
45b14e83d1SMatt Arsenault
46b14e83d1SMatt Arsenaultdefine <2 x half> @exp10_v2f16(<2 x half> %x) {
47b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_v2f16:
48b14e83d1SMatt Arsenault; CHECK:       @ %bb.0:
49*52864d9cSHarald van Dijk; CHECK-NEXT:    push {r4, lr}
50*52864d9cSHarald van Dijk; CHECK-NEXT:    sub sp, #8
51*52864d9cSHarald van Dijk; CHECK-NEXT:    mov r4, r0
52*52864d9cSHarald van Dijk; CHECK-NEXT:    mov r0, r1
53b14e83d1SMatt Arsenault; CHECK-NEXT:    bl __gnu_h2f_ieee
54b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10f
55b14e83d1SMatt Arsenault; CHECK-NEXT:    bl __gnu_f2h_ieee
56*52864d9cSHarald van Dijk; CHECK-NEXT:    strh.w r0, [sp, #6]
57b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r0, r4
58b14e83d1SMatt Arsenault; CHECK-NEXT:    bl __gnu_h2f_ieee
59b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10f
60b14e83d1SMatt Arsenault; CHECK-NEXT:    bl __gnu_f2h_ieee
61*52864d9cSHarald van Dijk; CHECK-NEXT:    strh.w r0, [sp, #4]
62*52864d9cSHarald van Dijk; CHECK-NEXT:    add r0, sp, #4
63*52864d9cSHarald van Dijk; CHECK-NEXT:    vld1.32 {d16[0]}, [r0:32]
64*52864d9cSHarald van Dijk; CHECK-NEXT:    vmovl.u16 q8, d16
65*52864d9cSHarald van Dijk; CHECK-NEXT:    vmov.32 r0, d16[0]
66*52864d9cSHarald van Dijk; CHECK-NEXT:    vmov.32 r1, d16[1]
67*52864d9cSHarald van Dijk; CHECK-NEXT:    add sp, #8
68*52864d9cSHarald van Dijk; CHECK-NEXT:    pop {r4, pc}
69b14e83d1SMatt Arsenault  %r = call <2 x half> @llvm.exp10.v2f16(<2 x half> %x)
70b14e83d1SMatt Arsenault  ret <2 x half> %r
71b14e83d1SMatt Arsenault}
72b14e83d1SMatt Arsenault
73b14e83d1SMatt Arsenaultdefine <3 x half> @exp10_v3f16(<3 x half> %x) {
74b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_v3f16:
75b14e83d1SMatt Arsenault; CHECK:       @ %bb.0:
76b14e83d1SMatt Arsenault; CHECK-NEXT:    push {r4, r5, r6, lr}
77b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r5, r0
78*52864d9cSHarald van Dijk; CHECK-NEXT:    mov r0, r1
79*52864d9cSHarald van Dijk; CHECK-NEXT:    mov r4, r2
80b14e83d1SMatt Arsenault; CHECK-NEXT:    bl __gnu_h2f_ieee
81b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10f
82b14e83d1SMatt Arsenault; CHECK-NEXT:    bl __gnu_f2h_ieee
83b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r6, r0
84*52864d9cSHarald van Dijk; CHECK-NEXT:    mov r0, r5
85*52864d9cSHarald van Dijk; CHECK-NEXT:    bl __gnu_h2f_ieee
86*52864d9cSHarald van Dijk; CHECK-NEXT:    bl exp10f
87*52864d9cSHarald van Dijk; CHECK-NEXT:    bl __gnu_f2h_ieee
88*52864d9cSHarald van Dijk; CHECK-NEXT:    pkhbt r5, r0, r6, lsl #16
89b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r0, r4
90b14e83d1SMatt Arsenault; CHECK-NEXT:    bl __gnu_h2f_ieee
91b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10f
92b14e83d1SMatt Arsenault; CHECK-NEXT:    bl __gnu_f2h_ieee
93*52864d9cSHarald van Dijk; CHECK-NEXT:    uxth r0, r0
94*52864d9cSHarald van Dijk; CHECK-NEXT:    vmov d16, r5, r0
95*52864d9cSHarald van Dijk; CHECK-NEXT:    vmov.u16 r0, d16[0]
96*52864d9cSHarald van Dijk; CHECK-NEXT:    vmov.u16 r1, d16[1]
97*52864d9cSHarald van Dijk; CHECK-NEXT:    vmov.u16 r2, d16[2]
98b14e83d1SMatt Arsenault; CHECK-NEXT:    pop {r4, r5, r6, pc}
99b14e83d1SMatt Arsenault  %r = call <3 x half> @llvm.exp10.v3f16(<3 x half> %x)
100b14e83d1SMatt Arsenault  ret <3 x half> %r
101b14e83d1SMatt Arsenault}
102b14e83d1SMatt Arsenault
103b14e83d1SMatt Arsenaultdefine <4 x half> @exp10_v4f16(<4 x half> %x) {
104b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_v4f16:
105b14e83d1SMatt Arsenault; CHECK:       @ %bb.0:
106b14e83d1SMatt Arsenault; CHECK-NEXT:    push {r4, r5, r6, r7, lr}
107b14e83d1SMatt Arsenault; CHECK-NEXT:    sub sp, #4
108*52864d9cSHarald van Dijk; CHECK-NEXT:    mov r4, r0
109*52864d9cSHarald van Dijk; CHECK-NEXT:    mov r0, r3
110b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r6, r2
111*52864d9cSHarald van Dijk; CHECK-NEXT:    mov r5, r1
112b14e83d1SMatt Arsenault; CHECK-NEXT:    bl __gnu_h2f_ieee
113b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10f
114b14e83d1SMatt Arsenault; CHECK-NEXT:    bl __gnu_f2h_ieee
115b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r7, r0
116b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r0, r6
117b14e83d1SMatt Arsenault; CHECK-NEXT:    bl __gnu_h2f_ieee
118b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10f
119b14e83d1SMatt Arsenault; CHECK-NEXT:    bl __gnu_f2h_ieee
120*52864d9cSHarald van Dijk; CHECK-NEXT:    pkhbt r6, r0, r7, lsl #16
121*52864d9cSHarald van Dijk; CHECK-NEXT:    mov r0, r5
122*52864d9cSHarald van Dijk; CHECK-NEXT:    bl __gnu_h2f_ieee
123*52864d9cSHarald van Dijk; CHECK-NEXT:    bl exp10f
124*52864d9cSHarald van Dijk; CHECK-NEXT:    bl __gnu_f2h_ieee
125*52864d9cSHarald van Dijk; CHECK-NEXT:    mov r5, r0
126b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r0, r4
127b14e83d1SMatt Arsenault; CHECK-NEXT:    bl __gnu_h2f_ieee
128b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10f
129b14e83d1SMatt Arsenault; CHECK-NEXT:    bl __gnu_f2h_ieee
130*52864d9cSHarald van Dijk; CHECK-NEXT:    pkhbt r0, r0, r5, lsl #16
131*52864d9cSHarald van Dijk; CHECK-NEXT:    vmov d16, r0, r6
132*52864d9cSHarald van Dijk; CHECK-NEXT:    vmov.u16 r0, d16[0]
133*52864d9cSHarald van Dijk; CHECK-NEXT:    vmov.u16 r1, d16[1]
134*52864d9cSHarald van Dijk; CHECK-NEXT:    vmov.u16 r2, d16[2]
135*52864d9cSHarald van Dijk; CHECK-NEXT:    vmov.u16 r3, d16[3]
136b14e83d1SMatt Arsenault; CHECK-NEXT:    add sp, #4
137b14e83d1SMatt Arsenault; CHECK-NEXT:    pop {r4, r5, r6, r7, pc}
138b14e83d1SMatt Arsenault  %r = call <4 x half> @llvm.exp10.v4f16(<4 x half> %x)
139b14e83d1SMatt Arsenault  ret <4 x half> %r
140b14e83d1SMatt Arsenault}
141b14e83d1SMatt Arsenault
142b14e83d1SMatt Arsenaultdefine float @exp10_f32(float %x) {
143b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_f32:
144b14e83d1SMatt Arsenault; CHECK:       @ %bb.0:
145b14e83d1SMatt Arsenault; CHECK-NEXT:    b exp10f
146b14e83d1SMatt Arsenault  %r = call float @llvm.exp10.f32(float %x)
147b14e83d1SMatt Arsenault  ret float %r
148b14e83d1SMatt Arsenault}
149b14e83d1SMatt Arsenault
150b14e83d1SMatt Arsenaultdefine <1 x float> @exp10_v1f32(<1 x float> %x) {
151b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_v1f32:
152b14e83d1SMatt Arsenault; CHECK:       @ %bb.0:
153b14e83d1SMatt Arsenault; CHECK-NEXT:    push {r7, lr}
154b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10f
155b14e83d1SMatt Arsenault; CHECK-NEXT:    pop {r7, pc}
156b14e83d1SMatt Arsenault  %r = call <1 x float> @llvm.exp10.v1f32(<1 x float> %x)
157b14e83d1SMatt Arsenault  ret <1 x float> %r
158b14e83d1SMatt Arsenault}
159b14e83d1SMatt Arsenault
160b14e83d1SMatt Arsenaultdefine <2 x float> @exp10_v2f32(<2 x float> %x) {
161b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_v2f32:
162b14e83d1SMatt Arsenault; CHECK:       @ %bb.0:
163b14e83d1SMatt Arsenault; CHECK-NEXT:    push {r4, lr}
164b14e83d1SMatt Arsenault; CHECK-NEXT:    vpush {d8}
165b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov d8, r0, r1
166b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov r0, s17
167b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10f
168b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r4, r0
169b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov r0, s16
170b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10f
171b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r1, r4
172b14e83d1SMatt Arsenault; CHECK-NEXT:    vpop {d8}
173b14e83d1SMatt Arsenault; CHECK-NEXT:    pop {r4, pc}
174b14e83d1SMatt Arsenault  %r = call <2 x float> @llvm.exp10.v2f32(<2 x float> %x)
175b14e83d1SMatt Arsenault  ret <2 x float> %r
176b14e83d1SMatt Arsenault}
177b14e83d1SMatt Arsenault
178b14e83d1SMatt Arsenaultdefine <3 x float> @exp10_v3f32(<3 x float> %x) {
179b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_v3f32:
180b14e83d1SMatt Arsenault; CHECK:       @ %bb.0:
181b14e83d1SMatt Arsenault; CHECK-NEXT:    push {r4, r5, r6, lr}
182b14e83d1SMatt Arsenault; CHECK-NEXT:    vpush {d8, d9}
183b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov d1, r2, r3
184b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r5, r0
185b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov d0, r0, r1
186b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r4, r1
187b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov r0, s2
188b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10f
189b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r6, r0
190b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r0, r4
191b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10f
192b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov s17, r0
193b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r0, r5
194b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10f
195b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov s16, r0
196b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov s18, r6
197b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov r0, r1, d8
198b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov r2, r3, d9
199b14e83d1SMatt Arsenault; CHECK-NEXT:    vpop {d8, d9}
200b14e83d1SMatt Arsenault; CHECK-NEXT:    pop {r4, r5, r6, pc}
201b14e83d1SMatt Arsenault  %r = call <3 x float> @llvm.exp10.v3f32(<3 x float> %x)
202b14e83d1SMatt Arsenault  ret <3 x float> %r
203b14e83d1SMatt Arsenault}
204b14e83d1SMatt Arsenault
205b14e83d1SMatt Arsenaultdefine <4 x float> @exp10_v4f32(<4 x float> %x) {
206b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_v4f32:
207b14e83d1SMatt Arsenault; CHECK:       @ %bb.0:
208b14e83d1SMatt Arsenault; CHECK-NEXT:    push {r4, r5, r6, r7, lr}
209b14e83d1SMatt Arsenault; CHECK-NEXT:    sub sp, #4
210b14e83d1SMatt Arsenault; CHECK-NEXT:    vpush {d8, d9}
211b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r6, r0
212b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r0, r1
213b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r4, r3
214b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r5, r2
215b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10f
216b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r7, r0
217b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r0, r4
218b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10f
219b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov s19, r0
220b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r0, r5
221b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10f
222b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov s18, r0
223b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r0, r6
224b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov s17, r7
225b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10f
226b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov s16, r0
227b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov r2, r3, d9
228b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov r0, r1, d8
229b14e83d1SMatt Arsenault; CHECK-NEXT:    vpop {d8, d9}
230b14e83d1SMatt Arsenault; CHECK-NEXT:    add sp, #4
231b14e83d1SMatt Arsenault; CHECK-NEXT:    pop {r4, r5, r6, r7, pc}
232b14e83d1SMatt Arsenault  %r = call <4 x float> @llvm.exp10.v4f32(<4 x float> %x)
233b14e83d1SMatt Arsenault  ret <4 x float> %r
234b14e83d1SMatt Arsenault}
235b14e83d1SMatt Arsenault
236b14e83d1SMatt Arsenaultdefine double @exp10_f64(double %x) {
237b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_f64:
238b14e83d1SMatt Arsenault; CHECK:       @ %bb.0:
239b14e83d1SMatt Arsenault; CHECK-NEXT:    b exp10
240b14e83d1SMatt Arsenault  %r = call double @llvm.exp10.f64(double %x)
241b14e83d1SMatt Arsenault  ret double %r
242b14e83d1SMatt Arsenault}
243b14e83d1SMatt Arsenault
244b14e83d1SMatt Arsenault; FIXME: Broken
245b14e83d1SMatt Arsenault; define <1 x double> @exp10_v1f64(<1 x double> %x) {
246b14e83d1SMatt Arsenault;   %r = call <1 x double> @llvm.exp10.v1f64(<1 x double> %x)
247b14e83d1SMatt Arsenault;   ret <1 x double> %r
248b14e83d1SMatt Arsenault; }
249b14e83d1SMatt Arsenault
250b14e83d1SMatt Arsenaultdefine <2 x double> @exp10_v2f64(<2 x double> %x) {
251b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_v2f64:
252b14e83d1SMatt Arsenault; CHECK:       @ %bb.0:
253b14e83d1SMatt Arsenault; CHECK-NEXT:    push {r4, r5, r6, r7, lr}
254b14e83d1SMatt Arsenault; CHECK-NEXT:    sub sp, #4
255b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r4, r3
256b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r5, r2
257b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10
258b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r6, r0
259b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r7, r1
260b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r0, r5
261b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r1, r4
262b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10
263b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r2, r0
264b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r3, r1
265b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r0, r6
266b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r1, r7
267b14e83d1SMatt Arsenault; CHECK-NEXT:    add sp, #4
268b14e83d1SMatt Arsenault; CHECK-NEXT:    pop {r4, r5, r6, r7, pc}
269b14e83d1SMatt Arsenault  %r = call <2 x double> @llvm.exp10.v2f64(<2 x double> %x)
270b14e83d1SMatt Arsenault  ret <2 x double> %r
271b14e83d1SMatt Arsenault}
272b14e83d1SMatt Arsenault
273b14e83d1SMatt Arsenaultdefine <3 x double> @exp10_v3f64(<3 x double> %x) {
274b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_v3f64:
275b14e83d1SMatt Arsenault; CHECK:       @ %bb.0:
276b14e83d1SMatt Arsenault; CHECK-NEXT:    push {r4, lr}
277b14e83d1SMatt Arsenault; CHECK-NEXT:    vpush {d8, d9}
278b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r4, r0
279b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r1, r3
280b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r0, r2
281b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10
282b14e83d1SMatt Arsenault; CHECK-NEXT:    ldrd r2, r3, [sp, #24]
283b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov d8, r0, r1
284b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r1, r3
285b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r0, r2
286b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10
287b14e83d1SMatt Arsenault; CHECK-NEXT:    ldrd r2, r3, [sp, #32]
288b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov d9, r0, r1
289b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r1, r3
290b14e83d1SMatt Arsenault; CHECK-NEXT:    vst1.64 {d8, d9}, [r4:128]!
291b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r0, r2
292b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10
293b14e83d1SMatt Arsenault; CHECK-NEXT:    strd r0, r1, [r4]
294b14e83d1SMatt Arsenault; CHECK-NEXT:    vpop {d8, d9}
295b14e83d1SMatt Arsenault; CHECK-NEXT:    pop {r4, pc}
296b14e83d1SMatt Arsenault  %r = call <3 x double> @llvm.exp10.v3f64(<3 x double> %x)
297b14e83d1SMatt Arsenault  ret <3 x double> %r
298b14e83d1SMatt Arsenault}
299b14e83d1SMatt Arsenault
300b14e83d1SMatt Arsenaultdefine <4 x double> @exp10_v4f64(<4 x double> %x) {
301b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_v4f64:
302b14e83d1SMatt Arsenault; CHECK:       @ %bb.0:
303b14e83d1SMatt Arsenault; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, lr}
304b14e83d1SMatt Arsenault; CHECK-NEXT:    vpush {d8, d9, d10, d11}
305b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r4, r0
306b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r1, r3
307b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r0, r2
308b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10
309b14e83d1SMatt Arsenault; CHECK-NEXT:    add r2, sp, #64
310b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov d8, r0, r1
311b14e83d1SMatt Arsenault; CHECK-NEXT:    vld1.64 {d16, d17}, [r2]
312b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov r2, r3, d17
313b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov r5, r8, d16
314b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r0, r2
315b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r1, r3
316b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10
317b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r7, r0
318b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r6, r1
319b14e83d1SMatt Arsenault; CHECK-NEXT:    ldrd r0, r1, [sp, #56]
320b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10
321b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov d9, r0, r1
322b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r0, r5
323b14e83d1SMatt Arsenault; CHECK-NEXT:    mov r1, r8
324b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov d11, r7, r6
325b14e83d1SMatt Arsenault; CHECK-NEXT:    bl exp10
326b14e83d1SMatt Arsenault; CHECK-NEXT:    vmov d10, r0, r1
327b14e83d1SMatt Arsenault; CHECK-NEXT:    vst1.64 {d8, d9}, [r4:128]!
328b14e83d1SMatt Arsenault; CHECK-NEXT:    vst1.64 {d10, d11}, [r4:128]
329b14e83d1SMatt Arsenault; CHECK-NEXT:    vpop {d8, d9, d10, d11}
330b14e83d1SMatt Arsenault; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, pc}
331b14e83d1SMatt Arsenault  %r = call <4 x double> @llvm.exp10.v4f64(<4 x double> %x)
332b14e83d1SMatt Arsenault  ret <4 x double> %r
333b14e83d1SMatt Arsenault}
334