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