hotspot/src/cpu/x86/vm/interpreter_x86_64.cpp
// Empty method, generate a very fast return.
address InterpreterGenerator::generate_empty_entry(void) {
{- -------------------------------------------
(1) (生成したコードが実行される時点では, レジスタには以下の値が入っているはず)
---------------------------------------- -}
// rbx: methodOop
// r13: sender sp must set sp to this value on return
{- -------------------------------------------
(1) UseFastEmptyMethods オプションが指定されていない場合には, 特にすることはない.
単に NULL をリターンするだけ.
---------------------------------------- -}
if (!UseFastEmptyMethods) {
return NULL;
}
{- -------------------------------------------
(1) (ここからが生成するコードの始まり)
---------------------------------------- -}
address entry_point = __ pc();
{- -------------------------------------------
(1) コード生成:
「Safepoint 処理中かどうかをチェックする (= SafepointSynchronize::address_of_state を確認).
もし Safepoint 停止の要求が出ていれば, slow_path ラベルにジャンプして停止処理を行う.」
---------------------------------------- -}
// If we need a safepoint check, generate full interpreter entry.
Label slow_path;
__ cmp32(ExternalAddress(SafepointSynchronize::address_of_state()),
SafepointSynchronize::_not_synchronized);
__ jcc(Assembler::notEqual, slow_path);
{- -------------------------------------------
(1) コード生成:
「Safepoint 停止要求が出ていなければ, 単にリターンするだけ.
(あわせて, SP を r13 の値に復帰させておく)」
---------------------------------------- -}
// do nothing for empty methods (do not even increment invocation counter)
// Code: _return
// _return
// return w/o popping parameters
__ pop(rax);
__ mov(rsp, r13);
__ jmp(rax);
{- -------------------------------------------
(1) コード生成:
「Safepoint 停止要求が出ていた場合には,
InterpreterGenerator::generate_normal_entry() が生成する通常パスにフォールバック」
---------------------------------------- -}
__ bind(slow_path);
(void) generate_normal_entry(false);
{- -------------------------------------------
(1) 以上で生成したコードの先頭アドレスをリターン.
---------------------------------------- -}
return entry_point;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.