mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-10-24 18:01:16 +00:00
* Implement invokeNative asm code for armasm64 assembler on ARM64 Windows * Use more solid wrapper for armasm64 executable Signed-off-by: Hiroshi Hatake <cosmo0920.oucc@gmail.com>
74 lines
2.4 KiB
NASM
74 lines
2.4 KiB
NASM
; Copyright (C) 2019 Intel Corporation. All rights reserved.
|
|
; SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
|
|
AREA |.text|, CODE, READONLY, ALIGN=2
|
|
|
|
EXPORT invokeNative
|
|
|
|
; ------------------------ direct call path ------------------------
|
|
|
|
call_func
|
|
mov x20, x30 ; save x30(lr)
|
|
blr x19
|
|
mov sp, x22 ; restore sp saved before function call
|
|
|
|
return_label
|
|
mov x30, x20 ; restore x30(lr)
|
|
ldp x19, x20, [sp, #0x20]
|
|
ldp x21, x22, [sp, #0x10]
|
|
ldp x23, x24, [sp, #0x0]
|
|
add sp, sp, #0x30
|
|
ret
|
|
|
|
; ------------------------ stack-args path ------------------------
|
|
|
|
handle_stack
|
|
; Reserve aligned stack space for stack arguments and copy them
|
|
mov x23, sp
|
|
bic sp, x23, #15 ; Ensure 16-byte alignment
|
|
lsl x23, x21, #3 ; x23 = nstacks * 8
|
|
add x23, x23, #15
|
|
bic x23, x23, #15
|
|
sub sp, sp, x23
|
|
mov x23, sp
|
|
|
|
copy_loop
|
|
cmp x21, #0
|
|
b.eq call_func ; when done, branch back to call path
|
|
ldr x24, [x20], #8
|
|
str x24, [x23], #8
|
|
sub x21, x21, #1
|
|
b copy_loop
|
|
|
|
; ------------------------ function entry ------------------------
|
|
|
|
invokeNative
|
|
sub sp, sp, #0x30
|
|
stp x19, x20, [sp, #0x20] ; save the registers
|
|
stp x21, x22, [sp, #0x10]
|
|
stp x23, x24, [sp, #0x0]
|
|
|
|
mov x19, x0 ; x19 = function ptr
|
|
mov x20, x1 ; x20 = argv
|
|
mov x21, x2 ; x21 = nstacks
|
|
mov x22, sp ; save the sp before call function
|
|
|
|
; Fill in floating-point registers
|
|
ldp d0, d1, [x20], #16
|
|
ldp d2, d3, [x20], #16
|
|
ldp d4, d5, [x20], #16
|
|
ldp d6, d7, [x20], #16
|
|
|
|
; Fill integer registers
|
|
ldp x0, x1, [x20], #16 ; x0 = argv[8] = exec_env, x1 = argv[9]
|
|
ldp x2, x3, [x20], #16
|
|
ldp x4, x5, [x20], #16
|
|
ldp x6, x7, [x20], #16
|
|
|
|
; Now x20 points to stack args
|
|
cmp x21, #0
|
|
b.ne handle_stack ; backward: there are stack args
|
|
b call_func ; backward: no stack args
|
|
|
|
END
|