hotspot/src/cpu/x86/vm/assembler_x86.cpp
void MacroAssembler::biased_locking_exit(Register obj_reg, Register temp_reg, Label& done) {
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(UseBiasedLocking, "why call this otherwise?");
{- -------------------------------------------
(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.
movptr(temp_reg, Address(obj_reg, oopDesc::mark_offset_in_bytes()));
andptr(temp_reg, markOopDesc::biased_lock_mask_in_place);
cmpptr(temp_reg, markOopDesc::biased_lock_pattern);
jcc(Assembler::equal, done);
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.