Top


定義場所(file name)

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

名前(function name)

address TemplateInterpreterGenerator::generate_result_handler_for(
        BasicType type) {

本体部(body)

  {- -------------------------------------------
  (1) (ここからが生成するコードの始まり)
      ---------------------------------------- -}

      address entry = __ pc();

  {- -------------------------------------------
  (1) コード生成:
      引数で指定された型に応じて, 適切なコードを生成する.
      (ここの処理でやることは, 主に値の bit 幅をそろえるのが目的)

      * T_BOOLEAN
       「rax が非ゼロなら rax に 1 をセットする. 0 なら 0 のままとする.
         (See: MacroAssembler::c2bool())」
      * T_CHAR   
       「rax の下位 16bit(符号無し) 分だけを rax にセットする.
         (movzwl でコピーするだけ)」
      * T_BYTE   
       「rax の下位 8bit(符号あり) 分だけを rax にセットする.
         (See: MacroAssembler::sign_extend_byte())」
      * T_SHORT  
       「rax の下位 16bit(符号あり) 分だけを rax にセットする.
         (See: MacroAssembler::sign_extend_short())」
      * T_INT    
       「何もしない」
      * T_LONG   
       「何もしない」
      * T_VOID   
       「何もしない」
      * T_FLOAT  
       「何もしない」
      * T_DOUBLE 
       「何もしない」
      * T_OBJECT 
       「フレーム中の frame::interpreter_frame_oop_temp_offset 野市に待避していた値を I0(= Itos_i) にロードする.」
      ---------------------------------------- -}

      switch (type) {
      case T_BOOLEAN: __ c2bool(rax);            break;
      case T_CHAR   : __ movzwl(rax, rax);       break;
      case T_BYTE   : __ sign_extend_byte(rax);  break;
      case T_SHORT  : __ sign_extend_short(rax); break;
      case T_INT    : /* nothing to do */        break;
      case T_LONG   : /* nothing to do */        break;
      case T_VOID   : /* nothing to do */        break;
      case T_FLOAT  : /* nothing to do */        break;
      case T_DOUBLE : /* nothing to do */        break;
      case T_OBJECT :
        // retrieve result from frame
        __ movptr(rax, Address(rbp, frame::interpreter_frame_oop_temp_offset*wordSize));
        // and verify it
        __ verify_oop(rax);
        break;
      default       : ShouldNotReachHere();
      }

  {- -------------------------------------------
  (1) コード生成:
      「リターン」
      ---------------------------------------- -}

      __ ret(0);                                   // return from result handler

  {- -------------------------------------------
  (1) 以上で生成したコードの先頭アドレスをリターン.
      ---------------------------------------- -}

      return entry;
    }

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