2019-09-10 02:23:46 +00:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2019 Intel Corporation. All rights reserved.
|
2019-11-11 23:45:21 +00:00
|
|
|
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
2019-09-10 02:23:46 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
.text
|
|
|
|
.align 2
|
|
|
|
.globl invokeNative
|
|
|
|
.ent invokeNative
|
|
|
|
.type invokeNative, @function
|
|
|
|
|
|
|
|
/**
|
|
|
|
* On function entry parameters:
|
2019-09-23 02:52:39 +00:00
|
|
|
* $4 = func_ptr
|
|
|
|
* $5 = args
|
|
|
|
* $6 = arg_num
|
2019-09-10 02:23:46 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
invokeNative:
|
|
|
|
.frame $fp, 8, $0
|
|
|
|
.mask 0x00000000, 0
|
|
|
|
.fmask 0x00000000, 0
|
|
|
|
|
|
|
|
/* Fixed part of frame */
|
|
|
|
subu $sp, 8
|
|
|
|
|
|
|
|
/* save registers */
|
|
|
|
sw $31, 4($sp)
|
|
|
|
sw $fp, 0($sp)
|
|
|
|
|
|
|
|
/* set frame pointer to bottom of fixed frame */
|
|
|
|
move $fp, $sp
|
|
|
|
|
|
|
|
/* allocate enough stack space */
|
2019-09-23 02:52:39 +00:00
|
|
|
sll $11, $6, 2 /* $11 == arg_num * 4 */
|
2019-09-10 02:23:46 +00:00
|
|
|
subu $sp, $11
|
|
|
|
|
|
|
|
/* make 8-byte aligned */
|
2019-09-23 02:52:39 +00:00
|
|
|
and $sp, ~7
|
2019-09-10 02:23:46 +00:00
|
|
|
|
|
|
|
move $9, $sp
|
2019-09-23 02:52:39 +00:00
|
|
|
move $25, $4 /* $25 = func_ptr */
|
2019-09-10 02:23:46 +00:00
|
|
|
|
|
|
|
push_args:
|
2019-09-23 02:52:39 +00:00
|
|
|
beq $6, 0, done /* arg_num == 0 ? */
|
|
|
|
lw $8, 0($5) /* $8 = *args */
|
|
|
|
sw $8, 0($9) /* store $8 to stack */
|
|
|
|
addu $5, 4 /* args++ */
|
|
|
|
addu $9, 4 /* sp++ */
|
|
|
|
subu $6, 1 /* arg_num-- */
|
2019-09-10 02:23:46 +00:00
|
|
|
j push_args
|
|
|
|
|
|
|
|
done:
|
|
|
|
lw $4, 0($sp) /* Load $4..$7 from stack */
|
|
|
|
lw $5, 4($sp)
|
|
|
|
lw $6, 8($sp)
|
|
|
|
lw $7, 12($sp)
|
|
|
|
ldc1 $f12, 0($sp) /* Load $f12, $f13, $f14, $f15 */
|
|
|
|
ldc1 $f14, 8($sp)
|
|
|
|
|
|
|
|
jalr $25 /* call function */
|
|
|
|
|
|
|
|
nop
|
|
|
|
|
|
|
|
/* restore saved registers */
|
|
|
|
move $sp, $fp
|
|
|
|
lw $31, 4($sp)
|
|
|
|
lw $fp, 0($sp)
|
|
|
|
|
|
|
|
/* pop frame */
|
|
|
|
addu $sp, $sp, 8
|
|
|
|
|
|
|
|
j $31
|
|
|
|
.end invokeNative
|