mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-02-06 15:05:19 +00:00
6a7fd3e688
Make sp 8 byte aligned in invokeNative assembly on ARM. Signed-off-by: Huang Qi <huangqi3@xiaomi.com>
92 lines
2.5 KiB
ArmAsm
92 lines
2.5 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 argc
|
|
*/
|
|
|
|
push {r4, r5, r6, r7}
|
|
push {lr}
|
|
sub sp, sp, #4 /* make sp 8 byte aligned */
|
|
mov ip, r0 /* ip = function ptr */
|
|
mov r4, r1 /* r4 = argv */
|
|
mov r5, r2 /* r5 = argc */
|
|
|
|
cmp r5, #1 /* at least one argument required: exec_env */
|
|
blt return
|
|
|
|
mov r6, #0 /* increased stack size */
|
|
|
|
ldr r0, [r4] /* r0 = argv[0] = exec_env */
|
|
add r4, r4, #4 /* r4 += 4 */
|
|
cmp r5, #1
|
|
beq call_func
|
|
|
|
ldr r1, [r4] /* r1 = argv[1] */
|
|
add r4, r4, #4
|
|
cmp r5, #2
|
|
beq call_func
|
|
|
|
ldr r2, [r4] /* r2 = argv[2] */
|
|
add r4, r4, #4
|
|
cmp r5, #3
|
|
beq call_func
|
|
|
|
ldr r3, [r4] /* r3 = argv[3] */
|
|
add r4, r4, #4
|
|
cmp r5, #4
|
|
beq call_func
|
|
|
|
sub r5, r5, #4 /* argc -= 4, now we have r0 ~ r3 */
|
|
|
|
/* Ensure address is 8 byte aligned */
|
|
lsl r6, r5, #2 /* r6 = argc * 4 */
|
|
mov r7, #7
|
|
add r6, r6, r7 /* r6 = (r6 + 7) & ~7 */
|
|
bic r6, r6, r7
|
|
add r6, r6, #4 /* +4 because odd(5) registers are in stack */
|
|
mov r7, sp
|
|
sub r7, r7, r6 /* reserved stack space for left arguments */
|
|
mov sp, r7
|
|
|
|
mov lr, r2 /* save r2 */
|
|
loop_args: /* copy left arguments to stack */
|
|
cmp r5, #0
|
|
beq call_func1
|
|
ldr r2, [r4]
|
|
add r4, r4, #4
|
|
str r2, [r7]
|
|
add r7, r7, #4
|
|
sub r5, r5, #1
|
|
b loop_args
|
|
|
|
call_func1:
|
|
mov r2, lr /* restore r2 */
|
|
|
|
call_func:
|
|
blx ip
|
|
add sp, sp, r6 /* restore sp */
|
|
|
|
return:
|
|
add sp, sp, #4 /* make sp 8 byte aligned */
|
|
pop {r3}
|
|
pop {r4, r5, r6, r7}
|
|
mov lr, r3
|
|
bx lr
|