1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
/*
* Copyright (C) 2019 Intel Corporation. All rights reserved.
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
*/
.text
.align 2
#ifndef BH_PLATFORM_DARWIN
.globl invokeNative
.type invokeNative, @function
invokeNative:
#else
.globl _invokeNative
_invokeNative:
#endif /* end of BH_PLATFORM_DARWIN */
push %ebp
movl %esp, %ebp
movl 16(%ebp), %ecx /* ecx = argc */
leal 2(%ecx), %edx /* edx = ecx + 2 (count return address and saved ebp) */
andl $3, %edx /* edx = edx % 4 */
jz stack_aligned /* if edx == 0, stack is already 16 bytes aligned */
leal -16(%esp, %edx, 4), %esp /* esp = esp - 16 + edx * 4 */
stack_aligned:
test %ecx, %ecx
jz skip_push_args /* if ecx == 0, skip pushing arguments */
movl 12(%ebp), %edx /* edx = argv */
leal -4(%edx,%ecx,4), %edx /* edx = edx + ecx * 4 - 4 */
subl %esp, %edx /* edx = edx - esp */
1:
push 0(%esp,%edx)
loop 1b /* loop ecx counts */
skip_push_args:
movl 8(%ebp), %edx /* edx = func_ptr */
call *%edx
leave
ret
|