Top


定義場所(file name)

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

名前(function name)

void MacroAssembler::call_VM_leaf_base(address entry_point, int num_args) {

本体部(body)

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

      Label L, E;

  {- -------------------------------------------
  (1) コード生成: (ただし, Windows 環境でなければ生成しない)
      「rsp を調整しておく」 #TODO    
      ---------------------------------------- -}

    #ifdef _WIN64
      // Windows always allocates space for it's register args
      assert(num_args <= 4, "only register arguments supported");
      subq(rsp,  frame::arg_reg_save_area_bytes);
    #endif

  {- -------------------------------------------
  (1) コード生成:
      「call 命令で, 引数で指定されたエントリポイントを呼び出す.
       (ただし, rsp が alignment にそっていなければ align させてから呼び出す模様. #TODO)」
      ---------------------------------------- -}

      // Align stack if necessary
      testl(rsp, 15);
      jcc(Assembler::zero, L);

      subq(rsp, 8);
      {
        call(RuntimeAddress(entry_point));
      }
      addq(rsp, 8);
      jmp(E);

      bind(L);
      {
        call(RuntimeAddress(entry_point));
      }

      bind(E);

  {- -------------------------------------------
  (1) コード生成: (ただし, Windows 環境でなければ生成しない)
      「rsp の値を元に戻す」
      ---------------------------------------- -}

    #ifdef _WIN64
      // restore stack pointer
      addq(rsp, frame::arg_reg_save_area_bytes);
    #endif

    }

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