hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp
void InterpreterMacroAssembler::test_invocation_counter_for_mdp(Register invocation_count,
Register Rtmp,
Label &profile_continue) {
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(ProfileInterpreter, "must be profiling interpreter");
{- -------------------------------------------
(1) (この関数が生成するコードは,
カウンタ値が監視対象になる閾値より低い場合, 及び
InterpreterRuntime::profile_method() を呼び出して methodDataOopDesc を作成した場合には,
引数で指定された profile_continue ラベルに分岐する)
(なお, そうでない場合(= 既に methodDataOopDesc を作成済みの場合)にはフォールスルーする)
---------------------------------------- -}
// Control will flow to "profile_continue" if the counter is less than the
// limit or if we call profile_method()
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
Label done;
{- -------------------------------------------
(1) コード生成:
「既に methodDataOopDesc が作成済みの場合 (ImethodDataPtr レジスタが空ではない場合) には,
done ラベルに分岐.」
---------------------------------------- -}
// if no method data exists, and the counter is high enough, make one
#ifdef _LP64
bpr(Assembler::rc_nz, false, Assembler::pn, ImethodDataPtr, done);
#else
tst(ImethodDataPtr);
br(Assembler::notZero, false, Assembler::pn, done);
#endif
{- -------------------------------------------
(1) コード生成:
「まだ invocation counter 値が監視対象になる閾値を超えていない場合は,
(methodDataOopDesc を作成する必要は無いので) profile_continue ラベルに分岐.」
---------------------------------------- -}
// Test to see if we should create a method data oop
AddressLiteral profile_limit((address) &InvocationCounter::InterpreterProfileLimit);
#ifdef _LP64
delayed()->nop();
sethi(profile_limit, Rtmp);
#else
delayed()->sethi(profile_limit, Rtmp);
#endif
ld(Rtmp, profile_limit.low10(), Rtmp);
cmp(invocation_count, Rtmp);
br(Assembler::lessUnsigned, false, Assembler::pn, profile_continue);
delayed()->nop();
{- -------------------------------------------
(1) コード生成:
「InterpreterRuntime::profile_method() を呼び出して,
新しい methodDataOop オブジェクトを methodOop 内にセットする.
その後, 引数で指定された profile_continue ラベルに分岐.」
---------------------------------------- -}
// Build it now.
call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method));
set_method_data_pointer_for_bcp();
ba(false, profile_continue);
delayed()->nop();
{- -------------------------------------------
(1) コード生成:
「(ここが done ラベルの位置)」
---------------------------------------- -}
bind(done);
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.