Top


定義場所(file name)

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

名前(function name)

void TemplateTable::ret() {

本体部(body)

  {- -------------------------------------------
  (1) (assert) (See: TemplateTable::transition())
      ---------------------------------------- -}

      transition(vtos, vtos);

  {- -------------------------------------------
  (1) コード生成:
      「リターン先の bci を Otos_i レジスタにロードする」
      ---------------------------------------- -}

      locals_index(G3_scratch);
      __ access_local_returnAddress(G3_scratch, Otos_i);
      // Otos_i contains the bci, compute the bcp from that

  {- -------------------------------------------
  (1) (デバッグ用の処理) (#ifdef ASSERT 時にのみ実行)
      コード生成: (デバッグ用の処理)
      ---------------------------------------- -}

    #ifdef _LP64
    #ifdef ASSERT
      // jsr result was labeled as an 'itos' not an 'atos' because we cannot GC
      // the result.  The return address (really a BCI) was stored with an
      // 'astore' because JVM specs claim it's a pointer-sized thing.  Hence in
      // the 64-bit build the 32-bit BCI is actually in the low bits of a 64-bit
      // loaded value.
      { Label zzz ;
         __ set (65536, G3_scratch) ;
         __ cmp (Otos_i, G3_scratch) ;
         __ bp( Assembler::lessEqualUnsigned, false, Assembler::xcc, Assembler::pn, zzz);
         __ delayed()->nop();
         __ stop("BCI is in the wrong register half?");
         __ bind (zzz) ;
      }
    #endif
    #endif

  {- -------------------------------------------
  (1) コード生成: (JIT コンパイラ用のプロファイル情報の取得) (See: [here](no2935fdD.html) for details)
      ---------------------------------------- -}

      __ profile_ret(vtos, Otos_i, G4_scratch);

  {- -------------------------------------------
  (1) コード生成:
      「Otos_i にロード済みの bci 値を (実行メソッドのバイトコードの先頭アドレスに加えることで) bcp に変換し, 
        結果を Lbcp レジスタにセットする」
      ---------------------------------------- -}

      __ ld_ptr(Lmethod, methodOopDesc::const_offset(), G3_scratch);
      __ add(G3_scratch, Otos_i, G3_scratch);
      __ add(G3_scratch, in_bytes(constMethodOopDesc::codes_offset()), Lbcp);

  {- -------------------------------------------
  (1) コード生成:
      「dispatch_next() が生成するコードで, 
        次のバイトコードに対応するテンプレートへとジャンプする」
      ---------------------------------------- -}

      __ dispatch_next(vtos);
    }

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