Top


定義場所(file name)

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

説明(description)

// Generate a fixed interpreter frame. This is identical setup for
// interpreted methods and for native methods hence the shared code.
//
// Args:
//      rax: return address
//      rbx: methodOop
//      r14: pointer to locals
//      r13: sender sp
//      rdx: cp cache

名前(function name)

void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) {

本体部(body)

  {- -------------------------------------------
  (1) (この関数では, 新しいスタックフレーム内に値を埋めていくコードを生成する.
       特に, どんな場合でも存在する共通の部分(固定の部分)を埋めていく)
      ---------------------------------------- -}

  {- -------------------------------------------
  (1) コード生成:
      「まず, 以下のような値をフレームに埋める.
        (リターンアドレス, old rbp, sender sp, ...)

        (合わせて, r13(bcp) や rbp の値をセットする処理も行っている)」
      ---------------------------------------- -}

      // initialize fixed part of activation frame
      __ push(rax);        // save return address
      __ enter();          // save old & set new rbp
      __ push(r13);        // set sender sp
      __ push((int)NULL_WORD); // leave last_sp as null
      __ movptr(r13, Address(rbx, methodOopDesc::const_offset()));      // get constMethodOop
      __ lea(r13, Address(r13, constMethodOopDesc::codes_offset())); // get codebase
      __ push(rbx);        // save methodOop

  {- -------------------------------------------
  (1) コード生成: (ただし, ProfileInterpreter オプションが指定されていない場合は, 不要なので生成しない)
      「次に, mdp(method data pointer) の値を埋めておく.
        * もし methodDataOop が生成されていれば, DataLayout へのポインタをセットする.
        * まだ methodDataOop が生成されていないメソッドの場合には, NULL をセットしておく.」
      ---------------------------------------- -}

      if (ProfileInterpreter) {
        Label method_data_continue;
        __ movptr(rdx, Address(rbx, in_bytes(methodOopDesc::method_data_offset())));
        __ testptr(rdx, rdx);
        __ jcc(Assembler::zero, method_data_continue);
        __ addptr(rdx, in_bytes(methodDataOopDesc::data_offset()));
        __ bind(method_data_continue);
        __ push(rdx);      // set the mdp (method data pointer)
      } else {
        __ push(0);
      }

  {- -------------------------------------------
  (1) コード生成: 
      「次に, constant pool cache や locals, bcp を埋める」

      (なおネイティブメソッドの場合には, bcp の値はないので 0 を埋める)
      ---------------------------------------- -}

      __ movptr(rdx, Address(rbx, methodOopDesc::constants_offset()));
      __ movptr(rdx, Address(rdx, constantPoolOopDesc::cache_offset_in_bytes()));
      __ push(rdx); // set constant pool cache
      __ push(r14); // set locals pointer
      if (native_call) {
        __ push(0); // no bcp
      } else {
        __ push(r13); // set bcp
      }

  {- -------------------------------------------
  (1) コード生成: 
      「最後に, オペランドスタックの底のアドレスを埋める」
      ---------------------------------------- -}

      __ push(0); // reserve word for pointer to expression stack bottom
      __ movptr(Address(rsp, 0), rsp); // set expression stack bottom
    }

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