wasm-micro-runtime/core/iwasm/common/arch/invokeNative_arc.s
Wenyong Huang db695fada4
Implement XIP feature and enable ARC target support (#694)
Implement XIP (Execution In Place) feature for AOT mode to enable running the AOT code inside AOT file directly, without memory mapping the executable memory for AOT code and applying relocations for text section. Developer can use wamrc with "--enable-indirect-mode --disable-llvm-intrinsics" flags to generate the AOT file and run iwasm with "--xip" flag. Known issues: there might still be some relocations in the text section which access the ".rodata" like sections.

And also enable ARC target support for both interpreter mode and AOT mode.

Signed-off-by: Wenyong Huang <wenyong.huang@intel.com>
2021-08-12 17:44:39 +08:00

70 lines
2.2 KiB
ArmAsm

/*
* 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 */
/*
* Arguments passed in:
* r0: function ptr
* r1: argv
* r2: nstacks
* ARC ABI:
* r0-r7: function arguments, caller-saved
* r8-r12: temp registers, caller-saved
*/
push_s blink /* push return addr */
st.aw fp, [sp, -4] /* push fp */
mov fp, sp /* fp = sp */
mov r8, r0 /* r8 = func_ptr */
mov r9, r1 /* r9 = argv */
mov r10, r2 /* r10 = nstacks */
ld r0, [r9, 0] /* r0 = argv[0] */
ld r1, [r9, 4] /* r1 = argv[1] */
ld r2, [r9, 8] /* r2 = argv[2] */
ld r3, [r9, 12] /* r3 = argv[3] */
ld r4, [r9, 16] /* r4 = argv[4] */
ld r5, [r9, 20] /* r5 = argv[5] */
ld r6, [r9, 24] /* r6 = argv[6] */
ld r7, [r9, 28] /* r7 = argv[7] */
add r9, r9, 32 /* r9 = stack_args */
breq r10, 0, call_func /* if (r10 == 0) goto call_func */
asl r11, r10, 2 /* r11 = nstacks * 4 */
sub sp, sp, r11 /* sp = sp - nstacks * 4 */
and sp, sp, ~7 /* make sp 8-byte aligned */
mov r11, sp /* r11 = sp */
loop_stack_args:
breq r10, 0, call_func /* if (r10 == 0) goto call_func */
ld r12, [r9] /* r12 = stack_args[i] */
st r12, [r11] /* stack[i] = r12 */
add r9, r9, 4 /* r9 = r9 + 4 */
add r11, r11, 4 /* r11 = r11 + 4 */
sub r10, r10, 1 /* r10 = r10 + 1 */
j loop_stack_args
call_func:
jl [r8] /* call function */
mov sp, fp /* sp = fp */
ld.ab fp, [sp, 4] /* pop fp */
pop_s blink /* pop return addr */
j_s [blink] /* ret */
nop_s