Top


定義場所(file name)

hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp

名前(function name)

void InterpreterGenerator::generate_counter_overflow(Label* do_continue) {

本体部(body)

  {- -------------------------------------------
  (1) (この時点では, 各レジスタには以下の値が入っているはず)
      ---------------------------------------- -}

      // Asm interpreter on entry
      // r14 - locals
      // r13 - bcp
      // rbx - method
      // edx - cpool --- DOES NOT APPEAR TO BE TRUE
      // rbp - interpreter frame

      // On return (i.e. jump to entry_point) [ back to invocation of interpreter ]
      // Everything as it was on entry
      // rdx is not restored. Doesn't appear to really be set.

  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}

      const Address size_of_parameters(rbx,
                                       methodOopDesc::size_of_parameters_offset());

  {- -------------------------------------------
  (1) コード生成:
      「InterpreterRuntime::frequency_counter_overflow() を呼び出して JIT コンパイル処理を開始し,
        その後, 引数で指定された Lcontinue ラベルにジャンプする.
        (なお, ジャンプする直前に, rbx レジスタの値を元に(= methodOop を指すように)戻す処理も行っている)」

       (なおコメントによると, InterpreterRuntime::frequency_counter_overflow() は引数を2つ取るとのこと.
        第1引数は, thread を示すポインタで call_VM に渡される.
        第2引数は, OSR(ループのコンパイル)かどうかを示す.
        今回はどちらにも zero を渡している)

       (コメントによると, InterpreterRuntime::frequency_counter_overflow() は返値として
        JIT 生成されたコードの vep(verified entry point) のアドレスを返す.
        あるいは, コンパイルが完了せずにリターンした場合(バックグラウンドで行う場合か失敗した場合)は NULL を返す.)
      ---------------------------------------- -}

      // InterpreterRuntime::frequency_counter_overflow takes two
      // arguments, the first (thread) is passed by call_VM, the second
      // indicates if the counter overflow occurs at a backwards branch
      // (NULL bcp).  We pass zero for it.  The call returns the address
      // of the verified entry point for the method or NULL if the
      // compilation did not complete (either went background or bailed
      // out).
      __ movl(c_rarg1, 0);
      __ call_VM(noreg,
                 CAST_FROM_FN_PTR(address,
                                  InterpreterRuntime::frequency_counter_overflow),
                 c_rarg1);

      __ movptr(rbx, Address(rbp, method_offset));   // restore methodOop
      // Preserve invariant that r13/r14 contain bcp/locals of sender frame
      // and jump to the interpreted entry.
      __ jmp(*do_continue, relocInfo::none);
    }

This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.