hotspot/src/cpu/x86/vm/assembler_x86.cpp
void MacroAssembler::call_VM_leaf_base(address entry_point, int num_args) {
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
Label L, E;
{- -------------------------------------------
(1) コード生成: (ただし, Windows 環境でなければ生成しない)
「rsp を調整しておく」 #TODO
---------------------------------------- -}
#ifdef _WIN64
// Windows always allocates space for it's register args
assert(num_args <= 4, "only register arguments supported");
subq(rsp, frame::arg_reg_save_area_bytes);
#endif
{- -------------------------------------------
(1) コード生成:
「call 命令で, 引数で指定されたエントリポイントを呼び出す.
(ただし, rsp が alignment にそっていなければ align させてから呼び出す模様. #TODO)」
---------------------------------------- -}
// Align stack if necessary
testl(rsp, 15);
jcc(Assembler::zero, L);
subq(rsp, 8);
{
call(RuntimeAddress(entry_point));
}
addq(rsp, 8);
jmp(E);
bind(L);
{
call(RuntimeAddress(entry_point));
}
bind(E);
{- -------------------------------------------
(1) コード生成: (ただし, Windows 環境でなければ生成しない)
「rsp の値を元に戻す」
---------------------------------------- -}
#ifdef _WIN64
// restore stack pointer
addq(rsp, frame::arg_reg_save_area_bytes);
#endif
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.