| // This file is generated from a similarly-named Perl script in the BoringSSL | |
| // source tree. Do not edit by hand. | |
| #include <openssl/asm_base.h> | |
| #if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_ARM) && defined(__ELF__) | |
| .syntax unified | |
| .arch armv7-a | |
| .fpu vfp | |
| .text | |
| @ abi_test_trampoline loads callee-saved registers from |state|, calls |func| | |
| @ with |argv|, then saves the callee-saved registers into |state|. It returns | |
| @ the result of |func|. The |unwind| argument is unused. | |
| @ uint32_t abi_test_trampoline(void (*func)(...), CallerState *state, | |
| @ const uint32_t *argv, size_t argc, | |
| @ int unwind); | |
| .type abi_test_trampoline, %function | |
| .globl abi_test_trampoline | |
| .hidden abi_test_trampoline | |
| .align 4 | |
| abi_test_trampoline: | |
| @ Save parameters and all callee-saved registers. For convenience, we | |
| @ save r9 on iOS even though it's volatile. | |
| vstmdb sp!, {d8,d9,d10,d11,d12,d13,d14,d15} | |
| stmdb sp!, {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,lr} | |
| @ Reserve stack space for six (10-4) stack parameters, plus an extra 4 | |
| @ bytes to keep it 8-byte-aligned (see AAPCS, section 5.3). | |
| sub sp, sp, #28 | |
| @ Every register in AAPCS is either non-volatile or a parameter (except | |
| @ r9 on iOS), so this code, by the actual call, loses all its scratch | |
| @ registers. First fill in stack parameters while there are registers | |
| @ to spare. | |
| cmp r3, #4 | |
| bls .Lstack_args_done | |
| mov r4, sp @ r4 is the output pointer. | |
| add r5, r2, r3, lsl #2 @ Set r5 to the end of argv. | |
| add r2, r2, #16 @ Skip four arguments. | |
| .Lstack_args_loop: | |
| ldr r6, [r2], #4 | |
| cmp r2, r5 | |
| str r6, [r4], #4 | |
| bne .Lstack_args_loop | |
| .Lstack_args_done: | |
| @ Load registers from |r1|. | |
| vldmia r1!, {d8,d9,d10,d11,d12,d13,d14,d15} | |
| #if defined(__APPLE__) | |
| @ r9 is not volatile on iOS. | |
| ldmia r1!, {r4,r5,r6,r7,r8,r10-r11} | |
| #else | |
| ldmia r1!, {r4,r5,r6,r7,r8,r9,r10,r11} | |
| #endif | |
| @ Load register parameters. This uses up our remaining registers, so we | |
| @ repurpose lr as scratch space. | |
| ldr r3, [sp, #40] @ Reload argc. | |
| ldr lr, [sp, #36] @ .Load argv into lr. | |
| cmp r3, #3 | |
| bhi .Larg_r3 | |
| beq .Larg_r2 | |
| cmp r3, #1 | |
| bhi .Larg_r1 | |
| beq .Larg_r0 | |
| b .Largs_done | |
| .Larg_r3: | |
| ldr r3, [lr, #12] @ argv[3] | |
| .Larg_r2: | |
| ldr r2, [lr, #8] @ argv[2] | |
| .Larg_r1: | |
| ldr r1, [lr, #4] @ argv[1] | |
| .Larg_r0: | |
| ldr r0, [lr] @ argv[0] | |
| .Largs_done: | |
| @ With every other register in use, load the function pointer into lr | |
| @ and call the function. | |
| ldr lr, [sp, #28] | |
| blx lr | |
| @ r1-r3 are free for use again. The trampoline only supports | |
| @ single-return functions. Pass r4-r11 to the caller. | |
| ldr r1, [sp, #32] | |
| vstmia r1!, {d8,d9,d10,d11,d12,d13,d14,d15} | |
| #if defined(__APPLE__) | |
| @ r9 is not volatile on iOS. | |
| stmia r1!, {r4,r5,r6,r7,r8,r10-r11} | |
| #else | |
| stmia r1!, {r4,r5,r6,r7,r8,r9,r10,r11} | |
| #endif | |
| @ Unwind the stack and restore registers. | |
| add sp, sp, #44 @ 44 = 28+16 | |
| ldmia sp!, {r4,r5,r6,r7,r8,r9,r10,r11,lr} @ Skip r0-r3 (see +16 above). | |
| vldmia sp!, {d8,d9,d10,d11,d12,d13,d14,d15} | |
| bx lr | |
| .size abi_test_trampoline,.-abi_test_trampoline | |
| .type abi_test_clobber_r0, %function | |
| .globl abi_test_clobber_r0 | |
| .hidden abi_test_clobber_r0 | |
| .align 4 | |
| abi_test_clobber_r0: | |
| mov r0, #0 | |
| bx lr | |
| .size abi_test_clobber_r0,.-abi_test_clobber_r0 | |
| .type abi_test_clobber_r1, %function | |
| .globl abi_test_clobber_r1 | |
| .hidden abi_test_clobber_r1 | |
| .align 4 | |
| abi_test_clobber_r1: | |
| mov r1, #0 | |
| bx lr | |
| .size abi_test_clobber_r1,.-abi_test_clobber_r1 | |
| .type abi_test_clobber_r2, %function | |
| .globl abi_test_clobber_r2 | |
| .hidden abi_test_clobber_r2 | |
| .align 4 | |
| abi_test_clobber_r2: | |
| mov r2, #0 | |
| bx lr | |
| .size abi_test_clobber_r2,.-abi_test_clobber_r2 | |
| .type abi_test_clobber_r3, %function | |
| .globl abi_test_clobber_r3 | |
| .hidden abi_test_clobber_r3 | |
| .align 4 | |
| abi_test_clobber_r3: | |
| mov r3, #0 | |
| bx lr | |
| .size abi_test_clobber_r3,.-abi_test_clobber_r3 | |
| .type abi_test_clobber_r4, %function | |
| .globl abi_test_clobber_r4 | |
| .hidden abi_test_clobber_r4 | |
| .align 4 | |
| abi_test_clobber_r4: | |
| mov r4, #0 | |
| bx lr | |
| .size abi_test_clobber_r4,.-abi_test_clobber_r4 | |
| .type abi_test_clobber_r5, %function | |
| .globl abi_test_clobber_r5 | |
| .hidden abi_test_clobber_r5 | |
| .align 4 | |
| abi_test_clobber_r5: | |
| mov r5, #0 | |
| bx lr | |
| .size abi_test_clobber_r5,.-abi_test_clobber_r5 | |
| .type abi_test_clobber_r6, %function | |
| .globl abi_test_clobber_r6 | |
| .hidden abi_test_clobber_r6 | |
| .align 4 | |
| abi_test_clobber_r6: | |
| mov r6, #0 | |
| bx lr | |
| .size abi_test_clobber_r6,.-abi_test_clobber_r6 | |
| .type abi_test_clobber_r7, %function | |
| .globl abi_test_clobber_r7 | |
| .hidden abi_test_clobber_r7 | |
| .align 4 | |
| abi_test_clobber_r7: | |
| mov r7, #0 | |
| bx lr | |
| .size abi_test_clobber_r7,.-abi_test_clobber_r7 | |
| .type abi_test_clobber_r8, %function | |
| .globl abi_test_clobber_r8 | |
| .hidden abi_test_clobber_r8 | |
| .align 4 | |
| abi_test_clobber_r8: | |
| mov r8, #0 | |
| bx lr | |
| .size abi_test_clobber_r8,.-abi_test_clobber_r8 | |
| .type abi_test_clobber_r9, %function | |
| .globl abi_test_clobber_r9 | |
| .hidden abi_test_clobber_r9 | |
| .align 4 | |
| abi_test_clobber_r9: | |
| mov r9, #0 | |
| bx lr | |
| .size abi_test_clobber_r9,.-abi_test_clobber_r9 | |
| .type abi_test_clobber_r10, %function | |
| .globl abi_test_clobber_r10 | |
| .hidden abi_test_clobber_r10 | |
| .align 4 | |
| abi_test_clobber_r10: | |
| mov r10, #0 | |
| bx lr | |
| .size abi_test_clobber_r10,.-abi_test_clobber_r10 | |
| .type abi_test_clobber_r11, %function | |
| .globl abi_test_clobber_r11 | |
| .hidden abi_test_clobber_r11 | |
| .align 4 | |
| abi_test_clobber_r11: | |
| mov r11, #0 | |
| bx lr | |
| .size abi_test_clobber_r11,.-abi_test_clobber_r11 | |
| .type abi_test_clobber_r12, %function | |
| .globl abi_test_clobber_r12 | |
| .hidden abi_test_clobber_r12 | |
| .align 4 | |
| abi_test_clobber_r12: | |
| mov r12, #0 | |
| bx lr | |
| .size abi_test_clobber_r12,.-abi_test_clobber_r12 | |
| .type abi_test_clobber_d0, %function | |
| .globl abi_test_clobber_d0 | |
| .hidden abi_test_clobber_d0 | |
| .align 4 | |
| abi_test_clobber_d0: | |
| mov r0, #0 | |
| vmov s0, r0 | |
| vmov s1, r0 | |
| bx lr | |
| .size abi_test_clobber_d0,.-abi_test_clobber_d0 | |
| .type abi_test_clobber_d1, %function | |
| .globl abi_test_clobber_d1 | |
| .hidden abi_test_clobber_d1 | |
| .align 4 | |
| abi_test_clobber_d1: | |
| mov r0, #0 | |
| vmov s2, r0 | |
| vmov s3, r0 | |
| bx lr | |
| .size abi_test_clobber_d1,.-abi_test_clobber_d1 | |
| .type abi_test_clobber_d2, %function | |
| .globl abi_test_clobber_d2 | |
| .hidden abi_test_clobber_d2 | |
| .align 4 | |
| abi_test_clobber_d2: | |
| mov r0, #0 | |
| vmov s4, r0 | |
| vmov s5, r0 | |
| bx lr | |
| .size abi_test_clobber_d2,.-abi_test_clobber_d2 | |
| .type abi_test_clobber_d3, %function | |
| .globl abi_test_clobber_d3 | |
| .hidden abi_test_clobber_d3 | |
| .align 4 | |
| abi_test_clobber_d3: | |
| mov r0, #0 | |
| vmov s6, r0 | |
| vmov s7, r0 | |
| bx lr | |
| .size abi_test_clobber_d3,.-abi_test_clobber_d3 | |
| .type abi_test_clobber_d4, %function | |
| .globl abi_test_clobber_d4 | |
| .hidden abi_test_clobber_d4 | |
| .align 4 | |
| abi_test_clobber_d4: | |
| mov r0, #0 | |
| vmov s8, r0 | |
| vmov s9, r0 | |
| bx lr | |
| .size abi_test_clobber_d4,.-abi_test_clobber_d4 | |
| .type abi_test_clobber_d5, %function | |
| .globl abi_test_clobber_d5 | |
| .hidden abi_test_clobber_d5 | |
| .align 4 | |
| abi_test_clobber_d5: | |
| mov r0, #0 | |
| vmov s10, r0 | |
| vmov s11, r0 | |
| bx lr | |
| .size abi_test_clobber_d5,.-abi_test_clobber_d5 | |
| .type abi_test_clobber_d6, %function | |
| .globl abi_test_clobber_d6 | |
| .hidden abi_test_clobber_d6 | |
| .align 4 | |
| abi_test_clobber_d6: | |
| mov r0, #0 | |
| vmov s12, r0 | |
| vmov s13, r0 | |
| bx lr | |
| .size abi_test_clobber_d6,.-abi_test_clobber_d6 | |
| .type abi_test_clobber_d7, %function | |
| .globl abi_test_clobber_d7 | |
| .hidden abi_test_clobber_d7 | |
| .align 4 | |
| abi_test_clobber_d7: | |
| mov r0, #0 | |
| vmov s14, r0 | |
| vmov s15, r0 | |
| bx lr | |
| .size abi_test_clobber_d7,.-abi_test_clobber_d7 | |
| .type abi_test_clobber_d8, %function | |
| .globl abi_test_clobber_d8 | |
| .hidden abi_test_clobber_d8 | |
| .align 4 | |
| abi_test_clobber_d8: | |
| mov r0, #0 | |
| vmov s16, r0 | |
| vmov s17, r0 | |
| bx lr | |
| .size abi_test_clobber_d8,.-abi_test_clobber_d8 | |
| .type abi_test_clobber_d9, %function | |
| .globl abi_test_clobber_d9 | |
| .hidden abi_test_clobber_d9 | |
| .align 4 | |
| abi_test_clobber_d9: | |
| mov r0, #0 | |
| vmov s18, r0 | |
| vmov s19, r0 | |
| bx lr | |
| .size abi_test_clobber_d9,.-abi_test_clobber_d9 | |
| .type abi_test_clobber_d10, %function | |
| .globl abi_test_clobber_d10 | |
| .hidden abi_test_clobber_d10 | |
| .align 4 | |
| abi_test_clobber_d10: | |
| mov r0, #0 | |
| vmov s20, r0 | |
| vmov s21, r0 | |
| bx lr | |
| .size abi_test_clobber_d10,.-abi_test_clobber_d10 | |
| .type abi_test_clobber_d11, %function | |
| .globl abi_test_clobber_d11 | |
| .hidden abi_test_clobber_d11 | |
| .align 4 | |
| abi_test_clobber_d11: | |
| mov r0, #0 | |
| vmov s22, r0 | |
| vmov s23, r0 | |
| bx lr | |
| .size abi_test_clobber_d11,.-abi_test_clobber_d11 | |
| .type abi_test_clobber_d12, %function | |
| .globl abi_test_clobber_d12 | |
| .hidden abi_test_clobber_d12 | |
| .align 4 | |
| abi_test_clobber_d12: | |
| mov r0, #0 | |
| vmov s24, r0 | |
| vmov s25, r0 | |
| bx lr | |
| .size abi_test_clobber_d12,.-abi_test_clobber_d12 | |
| .type abi_test_clobber_d13, %function | |
| .globl abi_test_clobber_d13 | |
| .hidden abi_test_clobber_d13 | |
| .align 4 | |
| abi_test_clobber_d13: | |
| mov r0, #0 | |
| vmov s26, r0 | |
| vmov s27, r0 | |
| bx lr | |
| .size abi_test_clobber_d13,.-abi_test_clobber_d13 | |
| .type abi_test_clobber_d14, %function | |
| .globl abi_test_clobber_d14 | |
| .hidden abi_test_clobber_d14 | |
| .align 4 | |
| abi_test_clobber_d14: | |
| mov r0, #0 | |
| vmov s28, r0 | |
| vmov s29, r0 | |
| bx lr | |
| .size abi_test_clobber_d14,.-abi_test_clobber_d14 | |
| .type abi_test_clobber_d15, %function | |
| .globl abi_test_clobber_d15 | |
| .hidden abi_test_clobber_d15 | |
| .align 4 | |
| abi_test_clobber_d15: | |
| mov r0, #0 | |
| vmov s30, r0 | |
| vmov s31, r0 | |
| bx lr | |
| .size abi_test_clobber_d15,.-abi_test_clobber_d15 | |
| #endif // !OPENSSL_NO_ASM && defined(OPENSSL_ARM) && defined(__ELF__) |