| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- /*
- * 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 */
- /* rdi - function ptr */
- /* rsi - argv */
- /* rdx - n_stacks */
- push %rbp
- mov %rsp, %rbp
- mov %rdx, %r10
- mov %rsp, %r11 /* Check that stack is aligned on */
- and $8, %r11 /* 16 bytes. This code may be removed */
- je check_stack_succ /* when we are sure that compiler always */
- int3 /* calls us with aligned stack */
- check_stack_succ:
- mov %r10, %r11 /* Align stack on 16 bytes before pushing */
- and $1, %r11 /* stack arguments in case we have an odd */
- shl $3, %r11 /* number of stack arguments */
- sub %r11, %rsp
- /* store memory args */
- movq %rdi, %r11 /* func ptr */
- movq %r10, %rcx /* counter */
- lea 128+48-8(%rsi,%rcx,8), %r10
- sub %rsp, %r10
- cmpq $0, %rcx
- je push_args_end
- push_args:
- push 0(%rsp,%r10)
- loop push_args
- push_args_end:
- /* fill all fp args */
- movdqu 0x00(%rsi), %xmm0
- movdqu 0x10(%rsi), %xmm1
- movdqu 0x20(%rsi), %xmm2
- movdqu 0x30(%rsi), %xmm3
- movdqu 0x40(%rsi), %xmm4
- movdqu 0x50(%rsi), %xmm5
- movdqu 0x60(%rsi), %xmm6
- movdqu 0x70(%rsi), %xmm7
- /* fill all int args */
- movq 0x80(%rsi), %rdi
- movq 0x90(%rsi), %rdx
- movq 0x98(%rsi), %rcx
- movq 0xa0(%rsi), %r8
- movq 0xa8(%rsi), %r9
- movq 0x88(%rsi), %rsi
- call *%r11
- leave
- ret
|