hotspot/src/cpu/sparc/vm/assembler_sparc.cpp
void MacroAssembler::biased_locking_exit (Address mark_addr, Register temp_reg, Label& done,
bool allow_delay_slot_filling) {
{- -------------------------------------------
(1) コード生成:
「mark フィールドを取得し,
markOopDesc::biased_lock_mask_in_place でマスクして(= 下位3bit だけを取り出して),
markOopDesc::biased_lock_pattern と同じかどうかを確認する.
同じであれば done ラベルに分岐 (同じでなければこのままフォールスルー)」
(なお, thread ID を確認しなくてよいのは以下の理由による.
* インタープリタが既に検査しているはずである
* ロックしている間に revoke された場合は rebias されず stack-lock になる)
---------------------------------------- -}
// Check for biased locking unlock case, which is a no-op
// Note: we do not have to check the thread ID for two reasons.
// First, the interpreter checks for IllegalMonitorStateException at
// a higher level. Second, if the bias was revoked while we held the
// lock, the object could not be rebiased toward another thread, so
// the bias bit would be clear.
ld_ptr(mark_addr, temp_reg);
and3(temp_reg, markOopDesc::biased_lock_mask_in_place, temp_reg);
cmp(temp_reg, markOopDesc::biased_lock_pattern);
brx(Assembler::equal, allow_delay_slot_filling, Assembler::pt, done);
delayed();
{- -------------------------------------------
(1) コード生成:
「引数の allow_delay_slot_filling が false であれば, delay slot を nop で埋めておく.」
---------------------------------------- -}
if (!allow_delay_slot_filling) {
nop();
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.