xref: /aosp_15_r20/external/cronet/third_party/boringssl/src/gen/test_support/trampoline-armv4-linux.S (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1// This file is generated from a similarly-named Perl script in the BoringSSL
2// source tree. Do not edit by hand.
3
4#include <openssl/asm_base.h>
5
6#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_ARM) && defined(__ELF__)
7.syntax	unified
8
9.arch	armv7-a
10.fpu	vfp
11
12.text
13
14@ abi_test_trampoline loads callee-saved registers from |state|, calls |func|
15@ with |argv|, then saves the callee-saved registers into |state|. It returns
16@ the result of |func|. The |unwind| argument is unused.
17@ uint32_t abi_test_trampoline(void (*func)(...), CallerState *state,
18@                              const uint32_t *argv, size_t argc,
19@                              int unwind);
20.type	abi_test_trampoline, %function
21.globl	abi_test_trampoline
22.hidden	abi_test_trampoline
23.align	4
24abi_test_trampoline:
25	@ Save parameters and all callee-saved registers. For convenience, we
26	@ save r9 on iOS even though it's volatile.
27	vstmdb	sp!, {d8,d9,d10,d11,d12,d13,d14,d15}
28	stmdb	sp!, {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,lr}
29
30	@ Reserve stack space for six (10-4) stack parameters, plus an extra 4
31	@ bytes to keep it 8-byte-aligned (see AAPCS, section 5.3).
32	sub	sp, sp, #28
33
34	@ Every register in AAPCS is either non-volatile or a parameter (except
35	@ r9 on iOS), so this code, by the actual call, loses all its scratch
36	@ registers. First fill in stack parameters while there are registers
37	@ to spare.
38	cmp	r3, #4
39	bls	.Lstack_args_done
40	mov	r4, sp				@ r4 is the output pointer.
41	add	r5, r2, r3, lsl #2	@ Set r5 to the end of argv.
42	add	r2, r2, #16		@ Skip four arguments.
43.Lstack_args_loop:
44	ldr	r6, [r2], #4
45	cmp	r2, r5
46	str	r6, [r4], #4
47	bne	.Lstack_args_loop
48
49.Lstack_args_done:
50	@ Load registers from |r1|.
51	vldmia	r1!, {d8,d9,d10,d11,d12,d13,d14,d15}
52#if defined(__APPLE__)
53	@ r9 is not volatile on iOS.
54	ldmia	r1!, {r4,r5,r6,r7,r8,r10-r11}
55#else
56	ldmia	r1!, {r4,r5,r6,r7,r8,r9,r10,r11}
57#endif
58
59	@ Load register parameters. This uses up our remaining registers, so we
60	@ repurpose lr as scratch space.
61	ldr	r3, [sp, #40]	@ Reload argc.
62	ldr	lr, [sp, #36]		@ .Load argv into lr.
63	cmp	r3, #3
64	bhi	.Larg_r3
65	beq	.Larg_r2
66	cmp	r3, #1
67	bhi	.Larg_r1
68	beq	.Larg_r0
69	b	.Largs_done
70
71.Larg_r3:
72	ldr	r3, [lr, #12]	@ argv[3]
73.Larg_r2:
74	ldr	r2, [lr, #8]	@ argv[2]
75.Larg_r1:
76	ldr	r1, [lr, #4]	@ argv[1]
77.Larg_r0:
78	ldr	r0, [lr]	@ argv[0]
79.Largs_done:
80
81	@ With every other register in use, load the function pointer into lr
82	@ and call the function.
83	ldr	lr, [sp, #28]
84	blx	lr
85
86	@ r1-r3 are free for use again. The trampoline only supports
87	@ single-return functions. Pass r4-r11 to the caller.
88	ldr	r1, [sp, #32]
89	vstmia	r1!, {d8,d9,d10,d11,d12,d13,d14,d15}
90#if defined(__APPLE__)
91	@ r9 is not volatile on iOS.
92	stmia	r1!, {r4,r5,r6,r7,r8,r10-r11}
93#else
94	stmia	r1!, {r4,r5,r6,r7,r8,r9,r10,r11}
95#endif
96
97	@ Unwind the stack and restore registers.
98	add	sp, sp, #44		@ 44 = 28+16
99	ldmia	sp!, {r4,r5,r6,r7,r8,r9,r10,r11,lr}	@ Skip r0-r3 (see +16 above).
100	vldmia	sp!, {d8,d9,d10,d11,d12,d13,d14,d15}
101
102	bx	lr
103.size	abi_test_trampoline,.-abi_test_trampoline
104.type	abi_test_clobber_r0, %function
105.globl	abi_test_clobber_r0
106.hidden	abi_test_clobber_r0
107.align	4
108abi_test_clobber_r0:
109	mov	r0, #0
110	bx	lr
111.size	abi_test_clobber_r0,.-abi_test_clobber_r0
112.type	abi_test_clobber_r1, %function
113.globl	abi_test_clobber_r1
114.hidden	abi_test_clobber_r1
115.align	4
116abi_test_clobber_r1:
117	mov	r1, #0
118	bx	lr
119.size	abi_test_clobber_r1,.-abi_test_clobber_r1
120.type	abi_test_clobber_r2, %function
121.globl	abi_test_clobber_r2
122.hidden	abi_test_clobber_r2
123.align	4
124abi_test_clobber_r2:
125	mov	r2, #0
126	bx	lr
127.size	abi_test_clobber_r2,.-abi_test_clobber_r2
128.type	abi_test_clobber_r3, %function
129.globl	abi_test_clobber_r3
130.hidden	abi_test_clobber_r3
131.align	4
132abi_test_clobber_r3:
133	mov	r3, #0
134	bx	lr
135.size	abi_test_clobber_r3,.-abi_test_clobber_r3
136.type	abi_test_clobber_r4, %function
137.globl	abi_test_clobber_r4
138.hidden	abi_test_clobber_r4
139.align	4
140abi_test_clobber_r4:
141	mov	r4, #0
142	bx	lr
143.size	abi_test_clobber_r4,.-abi_test_clobber_r4
144.type	abi_test_clobber_r5, %function
145.globl	abi_test_clobber_r5
146.hidden	abi_test_clobber_r5
147.align	4
148abi_test_clobber_r5:
149	mov	r5, #0
150	bx	lr
151.size	abi_test_clobber_r5,.-abi_test_clobber_r5
152.type	abi_test_clobber_r6, %function
153.globl	abi_test_clobber_r6
154.hidden	abi_test_clobber_r6
155.align	4
156abi_test_clobber_r6:
157	mov	r6, #0
158	bx	lr
159.size	abi_test_clobber_r6,.-abi_test_clobber_r6
160.type	abi_test_clobber_r7, %function
161.globl	abi_test_clobber_r7
162.hidden	abi_test_clobber_r7
163.align	4
164abi_test_clobber_r7:
165	mov	r7, #0
166	bx	lr
167.size	abi_test_clobber_r7,.-abi_test_clobber_r7
168.type	abi_test_clobber_r8, %function
169.globl	abi_test_clobber_r8
170.hidden	abi_test_clobber_r8
171.align	4
172abi_test_clobber_r8:
173	mov	r8, #0
174	bx	lr
175.size	abi_test_clobber_r8,.-abi_test_clobber_r8
176.type	abi_test_clobber_r9, %function
177.globl	abi_test_clobber_r9
178.hidden	abi_test_clobber_r9
179.align	4
180abi_test_clobber_r9:
181	mov	r9, #0
182	bx	lr
183.size	abi_test_clobber_r9,.-abi_test_clobber_r9
184.type	abi_test_clobber_r10, %function
185.globl	abi_test_clobber_r10
186.hidden	abi_test_clobber_r10
187.align	4
188abi_test_clobber_r10:
189	mov	r10, #0
190	bx	lr
191.size	abi_test_clobber_r10,.-abi_test_clobber_r10
192.type	abi_test_clobber_r11, %function
193.globl	abi_test_clobber_r11
194.hidden	abi_test_clobber_r11
195.align	4
196abi_test_clobber_r11:
197	mov	r11, #0
198	bx	lr
199.size	abi_test_clobber_r11,.-abi_test_clobber_r11
200.type	abi_test_clobber_r12, %function
201.globl	abi_test_clobber_r12
202.hidden	abi_test_clobber_r12
203.align	4
204abi_test_clobber_r12:
205	mov	r12, #0
206	bx	lr
207.size	abi_test_clobber_r12,.-abi_test_clobber_r12
208.type	abi_test_clobber_d0, %function
209.globl	abi_test_clobber_d0
210.hidden	abi_test_clobber_d0
211.align	4
212abi_test_clobber_d0:
213	mov	r0, #0
214	vmov	s0, r0
215	vmov	s1, r0
216	bx	lr
217.size	abi_test_clobber_d0,.-abi_test_clobber_d0
218.type	abi_test_clobber_d1, %function
219.globl	abi_test_clobber_d1
220.hidden	abi_test_clobber_d1
221.align	4
222abi_test_clobber_d1:
223	mov	r0, #0
224	vmov	s2, r0
225	vmov	s3, r0
226	bx	lr
227.size	abi_test_clobber_d1,.-abi_test_clobber_d1
228.type	abi_test_clobber_d2, %function
229.globl	abi_test_clobber_d2
230.hidden	abi_test_clobber_d2
231.align	4
232abi_test_clobber_d2:
233	mov	r0, #0
234	vmov	s4, r0
235	vmov	s5, r0
236	bx	lr
237.size	abi_test_clobber_d2,.-abi_test_clobber_d2
238.type	abi_test_clobber_d3, %function
239.globl	abi_test_clobber_d3
240.hidden	abi_test_clobber_d3
241.align	4
242abi_test_clobber_d3:
243	mov	r0, #0
244	vmov	s6, r0
245	vmov	s7, r0
246	bx	lr
247.size	abi_test_clobber_d3,.-abi_test_clobber_d3
248.type	abi_test_clobber_d4, %function
249.globl	abi_test_clobber_d4
250.hidden	abi_test_clobber_d4
251.align	4
252abi_test_clobber_d4:
253	mov	r0, #0
254	vmov	s8, r0
255	vmov	s9, r0
256	bx	lr
257.size	abi_test_clobber_d4,.-abi_test_clobber_d4
258.type	abi_test_clobber_d5, %function
259.globl	abi_test_clobber_d5
260.hidden	abi_test_clobber_d5
261.align	4
262abi_test_clobber_d5:
263	mov	r0, #0
264	vmov	s10, r0
265	vmov	s11, r0
266	bx	lr
267.size	abi_test_clobber_d5,.-abi_test_clobber_d5
268.type	abi_test_clobber_d6, %function
269.globl	abi_test_clobber_d6
270.hidden	abi_test_clobber_d6
271.align	4
272abi_test_clobber_d6:
273	mov	r0, #0
274	vmov	s12, r0
275	vmov	s13, r0
276	bx	lr
277.size	abi_test_clobber_d6,.-abi_test_clobber_d6
278.type	abi_test_clobber_d7, %function
279.globl	abi_test_clobber_d7
280.hidden	abi_test_clobber_d7
281.align	4
282abi_test_clobber_d7:
283	mov	r0, #0
284	vmov	s14, r0
285	vmov	s15, r0
286	bx	lr
287.size	abi_test_clobber_d7,.-abi_test_clobber_d7
288.type	abi_test_clobber_d8, %function
289.globl	abi_test_clobber_d8
290.hidden	abi_test_clobber_d8
291.align	4
292abi_test_clobber_d8:
293	mov	r0, #0
294	vmov	s16, r0
295	vmov	s17, r0
296	bx	lr
297.size	abi_test_clobber_d8,.-abi_test_clobber_d8
298.type	abi_test_clobber_d9, %function
299.globl	abi_test_clobber_d9
300.hidden	abi_test_clobber_d9
301.align	4
302abi_test_clobber_d9:
303	mov	r0, #0
304	vmov	s18, r0
305	vmov	s19, r0
306	bx	lr
307.size	abi_test_clobber_d9,.-abi_test_clobber_d9
308.type	abi_test_clobber_d10, %function
309.globl	abi_test_clobber_d10
310.hidden	abi_test_clobber_d10
311.align	4
312abi_test_clobber_d10:
313	mov	r0, #0
314	vmov	s20, r0
315	vmov	s21, r0
316	bx	lr
317.size	abi_test_clobber_d10,.-abi_test_clobber_d10
318.type	abi_test_clobber_d11, %function
319.globl	abi_test_clobber_d11
320.hidden	abi_test_clobber_d11
321.align	4
322abi_test_clobber_d11:
323	mov	r0, #0
324	vmov	s22, r0
325	vmov	s23, r0
326	bx	lr
327.size	abi_test_clobber_d11,.-abi_test_clobber_d11
328.type	abi_test_clobber_d12, %function
329.globl	abi_test_clobber_d12
330.hidden	abi_test_clobber_d12
331.align	4
332abi_test_clobber_d12:
333	mov	r0, #0
334	vmov	s24, r0
335	vmov	s25, r0
336	bx	lr
337.size	abi_test_clobber_d12,.-abi_test_clobber_d12
338.type	abi_test_clobber_d13, %function
339.globl	abi_test_clobber_d13
340.hidden	abi_test_clobber_d13
341.align	4
342abi_test_clobber_d13:
343	mov	r0, #0
344	vmov	s26, r0
345	vmov	s27, r0
346	bx	lr
347.size	abi_test_clobber_d13,.-abi_test_clobber_d13
348.type	abi_test_clobber_d14, %function
349.globl	abi_test_clobber_d14
350.hidden	abi_test_clobber_d14
351.align	4
352abi_test_clobber_d14:
353	mov	r0, #0
354	vmov	s28, r0
355	vmov	s29, r0
356	bx	lr
357.size	abi_test_clobber_d14,.-abi_test_clobber_d14
358.type	abi_test_clobber_d15, %function
359.globl	abi_test_clobber_d15
360.hidden	abi_test_clobber_d15
361.align	4
362abi_test_clobber_d15:
363	mov	r0, #0
364	vmov	s30, r0
365	vmov	s31, r0
366	bx	lr
367.size	abi_test_clobber_d15,.-abi_test_clobber_d15
368#endif  // !OPENSSL_NO_ASM && defined(OPENSSL_ARM) && defined(__ELF__)
369