hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp
void InterpreterGenerator::generate_counter_overflow(Label* do_continue) {
{- -------------------------------------------
(1) (この時点では, 各レジスタには以下の値が入っているはず)
---------------------------------------- -}
// Asm interpreter on entry
// r14 - locals
// r13 - bcp
// rbx - method
// edx - cpool --- DOES NOT APPEAR TO BE TRUE
// rbp - interpreter frame
// On return (i.e. jump to entry_point) [ back to invocation of interpreter ]
// Everything as it was on entry
// rdx is not restored. Doesn't appear to really be set.
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
const Address size_of_parameters(rbx,
methodOopDesc::size_of_parameters_offset());
{- -------------------------------------------
(1) コード生成:
「InterpreterRuntime::frequency_counter_overflow() を呼び出して JIT コンパイル処理を開始し,
その後, 引数で指定された Lcontinue ラベルにジャンプする.
(なお, ジャンプする直前に, rbx レジスタの値を元に(= methodOop を指すように)戻す処理も行っている)」
(なおコメントによると, InterpreterRuntime::frequency_counter_overflow() は引数を2つ取るとのこと.
第1引数は, thread を示すポインタで call_VM に渡される.
第2引数は, OSR(ループのコンパイル)かどうかを示す.
今回はどちらにも zero を渡している)
(コメントによると, InterpreterRuntime::frequency_counter_overflow() は返値として
JIT 生成されたコードの vep(verified entry point) のアドレスを返す.
あるいは, コンパイルが完了せずにリターンした場合(バックグラウンドで行う場合か失敗した場合)は NULL を返す.)
---------------------------------------- -}
// InterpreterRuntime::frequency_counter_overflow takes two
// arguments, the first (thread) is passed by call_VM, the second
// indicates if the counter overflow occurs at a backwards branch
// (NULL bcp). We pass zero for it. The call returns the address
// of the verified entry point for the method or NULL if the
// compilation did not complete (either went background or bailed
// out).
__ movl(c_rarg1, 0);
__ call_VM(noreg,
CAST_FROM_FN_PTR(address,
InterpreterRuntime::frequency_counter_overflow),
c_rarg1);
__ movptr(rbx, Address(rbp, method_offset)); // restore methodOop
// Preserve invariant that r13/r14 contain bcp/locals of sender frame
// and jump to the interpreted entry.
__ jmp(*do_continue, relocInfo::none);
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.