trampoline-armv4.S 9.0 KB

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