hotspot/src/cpu/x86/vm/assembler_x86.cpp
void MacroAssembler::call_VM_helper(Register oop_result, address entry_point, int number_of_arguments, bool check_exceptions) {
{- -------------------------------------------
(1) コード生成:
「last_Java_sp の値を計算し, rax レジスタに入れておく.」
(なお, last_Java_pc を last_Java_sp[-1] で取得できるようにするため,
MacroAssembler::call_VM_helper() を呼び出す前に
各 MacroAssembler::call_VM() 内では call 命令でリターンアドレスをスタック上に積んでいる.
そのため, 64 bit モードでは現在の rsp の値に wordSize 足したものを last_Java_sp としている.
32bit 版では, そのリターンアドレスの後ろに引数が積まれるため、
引数分も加えたアドレスを last_Java_sp としている.)
---------------------------------------- -}
// Calculate the value for last_Java_sp
// somewhat subtle. call_VM does an intermediate call
// which places a return address on the stack just under the
// stack pointer as the user finsihed with it. This allows
// use to retrieve last_Java_pc from last_Java_sp[-1].
// On 32bit we then have to push additional args on the stack to accomplish
// the actual requested call. On 64bit call_VM only can use register args
// so the only extra space is the return address that call_VM created.
// This hopefully explains the calculations here.
#ifdef _LP64
// We've pushed one address, correct last_Java_sp
lea(rax, Address(rsp, wordSize));
#else
lea(rax, Address(rsp, (1 + number_of_arguments) * wordSize));
#endif // LP64
{- -------------------------------------------
(1) コード生成:
「call_VM_base() が生成するコードにより, 指定のエントリポイントの呼び出しを行う.
(MacroAssembler::call_VM_base(), またはサブクラスでオーバーライドしたメソッドが呼ばれる)」
---------------------------------------- -}
call_VM_base(oop_result, noreg, rax, entry_point, number_of_arguments, check_exceptions);
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.