Top


定義場所(file name)

hotspot/src/cpu/sparc/vm/assembler_sparc.cpp

名前(function name)

void MacroAssembler::biased_locking_exit (Address mark_addr, Register temp_reg, Label& done,
                                          bool allow_delay_slot_filling) {

本体部(body)

  {- -------------------------------------------
  (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.