Top


定義場所(file name)

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

名前(function name)

void InterpreterMacroAssembler::test_invocation_counter_for_mdp(Register invocation_count,
                                                                Register Rtmp,
                                                                Label &profile_continue) {

本体部(body)

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