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(__APPLE__) 7.syntax unified 8 9 10 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 21.globl _abi_test_trampoline 22.private_extern _abi_test_trampoline 23.align 4 24_abi_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. 43Lstack_args_loop: 44 ldr r6, [r2], #4 45 cmp r2, r5 46 str r6, [r4], #4 47 bne Lstack_args_loop 48 49Lstack_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 71Larg_r3: 72 ldr r3, [lr, #12] @ argv[3] 73Larg_r2: 74 ldr r2, [lr, #8] @ argv[2] 75Larg_r1: 76 ldr r1, [lr, #4] @ argv[1] 77Larg_r0: 78 ldr r0, [lr] @ argv[0] 79Largs_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 104 105.globl _abi_test_clobber_r0 106.private_extern _abi_test_clobber_r0 107.align 4 108_abi_test_clobber_r0: 109 mov r0, #0 110 bx lr 111 112 113.globl _abi_test_clobber_r1 114.private_extern _abi_test_clobber_r1 115.align 4 116_abi_test_clobber_r1: 117 mov r1, #0 118 bx lr 119 120 121.globl _abi_test_clobber_r2 122.private_extern _abi_test_clobber_r2 123.align 4 124_abi_test_clobber_r2: 125 mov r2, #0 126 bx lr 127 128 129.globl _abi_test_clobber_r3 130.private_extern _abi_test_clobber_r3 131.align 4 132_abi_test_clobber_r3: 133 mov r3, #0 134 bx lr 135 136 137.globl _abi_test_clobber_r4 138.private_extern _abi_test_clobber_r4 139.align 4 140_abi_test_clobber_r4: 141 mov r4, #0 142 bx lr 143 144 145.globl _abi_test_clobber_r5 146.private_extern _abi_test_clobber_r5 147.align 4 148_abi_test_clobber_r5: 149 mov r5, #0 150 bx lr 151 152 153.globl _abi_test_clobber_r6 154.private_extern _abi_test_clobber_r6 155.align 4 156_abi_test_clobber_r6: 157 mov r6, #0 158 bx lr 159 160 161.globl _abi_test_clobber_r7 162.private_extern _abi_test_clobber_r7 163.align 4 164_abi_test_clobber_r7: 165 mov r7, #0 166 bx lr 167 168 169.globl _abi_test_clobber_r8 170.private_extern _abi_test_clobber_r8 171.align 4 172_abi_test_clobber_r8: 173 mov r8, #0 174 bx lr 175 176 177.globl _abi_test_clobber_r9 178.private_extern _abi_test_clobber_r9 179.align 4 180_abi_test_clobber_r9: 181 mov r9, #0 182 bx lr 183 184 185.globl _abi_test_clobber_r10 186.private_extern _abi_test_clobber_r10 187.align 4 188_abi_test_clobber_r10: 189 mov r10, #0 190 bx lr 191 192 193.globl _abi_test_clobber_r11 194.private_extern _abi_test_clobber_r11 195.align 4 196_abi_test_clobber_r11: 197 mov r11, #0 198 bx lr 199 200 201.globl _abi_test_clobber_r12 202.private_extern _abi_test_clobber_r12 203.align 4 204_abi_test_clobber_r12: 205 mov r12, #0 206 bx lr 207 208 209.globl _abi_test_clobber_d0 210.private_extern _abi_test_clobber_d0 211.align 4 212_abi_test_clobber_d0: 213 mov r0, #0 214 vmov s0, r0 215 vmov s1, r0 216 bx lr 217 218 219.globl _abi_test_clobber_d1 220.private_extern _abi_test_clobber_d1 221.align 4 222_abi_test_clobber_d1: 223 mov r0, #0 224 vmov s2, r0 225 vmov s3, r0 226 bx lr 227 228 229.globl _abi_test_clobber_d2 230.private_extern _abi_test_clobber_d2 231.align 4 232_abi_test_clobber_d2: 233 mov r0, #0 234 vmov s4, r0 235 vmov s5, r0 236 bx lr 237 238 239.globl _abi_test_clobber_d3 240.private_extern _abi_test_clobber_d3 241.align 4 242_abi_test_clobber_d3: 243 mov r0, #0 244 vmov s6, r0 245 vmov s7, r0 246 bx lr 247 248 249.globl _abi_test_clobber_d4 250.private_extern _abi_test_clobber_d4 251.align 4 252_abi_test_clobber_d4: 253 mov r0, #0 254 vmov s8, r0 255 vmov s9, r0 256 bx lr 257 258 259.globl _abi_test_clobber_d5 260.private_extern _abi_test_clobber_d5 261.align 4 262_abi_test_clobber_d5: 263 mov r0, #0 264 vmov s10, r0 265 vmov s11, r0 266 bx lr 267 268 269.globl _abi_test_clobber_d6 270.private_extern _abi_test_clobber_d6 271.align 4 272_abi_test_clobber_d6: 273 mov r0, #0 274 vmov s12, r0 275 vmov s13, r0 276 bx lr 277 278 279.globl _abi_test_clobber_d7 280.private_extern _abi_test_clobber_d7 281.align 4 282_abi_test_clobber_d7: 283 mov r0, #0 284 vmov s14, r0 285 vmov s15, r0 286 bx lr 287 288 289.globl _abi_test_clobber_d8 290.private_extern _abi_test_clobber_d8 291.align 4 292_abi_test_clobber_d8: 293 mov r0, #0 294 vmov s16, r0 295 vmov s17, r0 296 bx lr 297 298 299.globl _abi_test_clobber_d9 300.private_extern _abi_test_clobber_d9 301.align 4 302_abi_test_clobber_d9: 303 mov r0, #0 304 vmov s18, r0 305 vmov s19, r0 306 bx lr 307 308 309.globl _abi_test_clobber_d10 310.private_extern _abi_test_clobber_d10 311.align 4 312_abi_test_clobber_d10: 313 mov r0, #0 314 vmov s20, r0 315 vmov s21, r0 316 bx lr 317 318 319.globl _abi_test_clobber_d11 320.private_extern _abi_test_clobber_d11 321.align 4 322_abi_test_clobber_d11: 323 mov r0, #0 324 vmov s22, r0 325 vmov s23, r0 326 bx lr 327 328 329.globl _abi_test_clobber_d12 330.private_extern _abi_test_clobber_d12 331.align 4 332_abi_test_clobber_d12: 333 mov r0, #0 334 vmov s24, r0 335 vmov s25, r0 336 bx lr 337 338 339.globl _abi_test_clobber_d13 340.private_extern _abi_test_clobber_d13 341.align 4 342_abi_test_clobber_d13: 343 mov r0, #0 344 vmov s26, r0 345 vmov s27, r0 346 bx lr 347 348 349.globl _abi_test_clobber_d14 350.private_extern _abi_test_clobber_d14 351.align 4 352_abi_test_clobber_d14: 353 mov r0, #0 354 vmov s28, r0 355 vmov s29, r0 356 bx lr 357 358 359.globl _abi_test_clobber_d15 360.private_extern _abi_test_clobber_d15 361.align 4 362_abi_test_clobber_d15: 363 mov r0, #0 364 vmov s30, r0 365 vmov s31, r0 366 bx lr 367 368#endif // !OPENSSL_NO_ASM && defined(OPENSSL_ARM) && defined(__APPLE__) 369