Up Top

Field に関する処理 : フィールドアクセス処理 : Template Interpreter の場合


概要(Summary)

(#Under Construction)

volatile フィールドの場合には, 以下の箇所でメモリバリアが必要になる. ただし, x86 では StoreLoad しか必要ないため "3." の箇所でのみバリアが張られている. SPARC でも実行環境が V9 以降なら同様の箇所にしか張られない.

  1. TemplateTable::getfield_or_static() の最後に LoadLoad & LoadStore バリア
  2. TemplateTable::putfield_or_static() の最初に LoadStore & StoreStore バリア
  3. TemplateTable::putfield_or_static() の最後に StoreLoad バリア (<= x86 版では StoreStore も指定されているが必要ないような...?? #TODO)

備考(Notes)

なお, getstatic 命令や putstatic 命令の場合には書き換えは行われない.

処理の流れ (概要)(Execution Flows : Summary)

sparc の場合

getfield 命令の処理

* 1 回目
  TemplateTable::getfield() が生成するコード
  -> TemplateTable::getfield_or_static() が生成するコード
     -> (1) CPCache entry を取得
            -> TemplateTable::resolve_cache_and_index() が生成するコード
               -> (1) 既に作成済みであれば, それを取得
                      -> InterpreterMacroAssembler::get_cache_and_index_at_bcp() が生成するコード
                  (2) まだ作成されて無かった場合は, 作成処理を行う
                      -> InterpreterRuntime::resolve_get_put()
                         -> (See: here for details)
                  (2) まだ作成されて無かった場合は, ここで取得
                      -> InterpreterMacroAssembler::get_cache_and_index_at_bcp() が生成するコード
   
        (1) CPCache entry の中身を取り出す
            -> TemplateTable::load_field_cp_cache_entry() が生成するコード
   
        (1) ロード処理 (型情報に応じて適切なロードを行う)
   
        (1) getfield 命令の場合 (= getstatic 命令ではない場合) には, 高速版に書き換える
            -> TemplateTable::patch_bytecode() が生成するコード
   
        (1) volatile field だった場合はメモリバリア処理を行う
            -> TemplateTable::volatile_barrier() が生成するコード

* 2 回目 (書き換え後)
  TemplateTable::fast_accessfield() が生成するコード
  -> (1) CPCache entry を取得
         -> InterpreterMacroAssembler::get_cache_and_index_at_bcp() が生成するコード

     (1) CPCache entry の中身を取り出す

     (1) ロード処理 (型情報に応じて適切なロードを行う)
  
     (1) volatile field だった場合はメモリバリア処理を行う
         -> TemplateTable::volatile_barrier() が生成するコード

getstatic 命令の処理

TemplateTable::getstatic() が生成するコード
-> TemplateTable::getfield_or_static() が生成するコード
   -> (同上)

putfield 命令の処理

* 1 回目
  TemplateTable::putfield() が生成するコード
  -> TemplateTable::putfield_or_static() が生成するコード
     -> (1) CPCache entry を取得
            -> TemplateTable::resolve_cache_and_index() が生成するコード
               -> (同上)
   
        (1) CPCache entry の中身を取り出す
            -> TemplateTable::load_field_cp_cache_entry() が生成するコード
   
        (1) volatile field だった場合は (必要に応じて) メモリバリア処理を行う
            -> TemplateTable::volatile_barrier() が生成するコード
   
        (1) ストア処理 (型情報に応じて適切なストアを行う)
   
        (1) putfield 命令の場合 (= putstatic 命令ではない場合) には, 高速版に書き換える
            -> TemplateTable::patch_bytecode() が生成するコード

        (1) volatile field だった場合はメモリバリア処理を行う
            -> TemplateTable::volatile_barrier() が生成するコード

* 2 回目 (書き換え後)
  TemplateTable::fast_storefield() が生成するコード
  -> (1) CPCache entry を取得
         -> InterpreterMacroAssembler::get_cache_and_index_at_bcp() が生成するコード

     (1) volatile field だった場合は (必要に応じて) メモリバリア処理を行う
         -> TemplateTable::volatile_barrier() が生成するコード

     (1) CPCache entry の中身を取り出す

     (1) ストア処理 (型情報に応じて適切なストアを行う)
  
     (1) volatile field だった場合はメモリバリア処理を行う
         -> TemplateTable::volatile_barrier() が生成するコード

putstatic 命令の処理

TemplateTable::putstatic() が生成するコード
-> TemplateTable::putfield_or_static() が生成するコード
   -> (同上)

x86_64 の場合

getfield 命令の処理

* 1 回目
  TemplateTable::getfield() が生成するコード
  -> TemplateTable::getfield_or_static() が生成するコード
     -> (1) CPCache entry を取得
            -> TemplateTable::resolve_cache_and_index() が生成するコード
               -> (1) 既に作成済みであれば, それを取得
                      -> InterpreterMacroAssembler::get_cache_and_index_at_bcp() が生成するコード
                  (2) まだ作成されて無かった場合は, 作成処理を行う
                      -> InterpreterRuntime::resolve_get_put()
                         -> (See: here for details)
                  (2) まだ作成されて無かった場合は, ここで取得
                      -> InterpreterMacroAssembler::get_cache_and_index_at_bcp() が生成するコード
   
        (1) CPCache entry の中身を取り出す
            -> TemplateTable::load_field_cp_cache_entry() が生成するコード
   
        (1) ロード処理 (型情報に応じて適切なロードを行う)
   
        (1) getfield 命令の場合 (= getstatic 命令ではない場合) には, 高速版に書き換える
            -> TemplateTable::patch_bytecode() が生成するコード
   
        (1) (x86 ではメモリバリアは不要なので張っていない)

* 2 回目 (書き換え後)
  TemplateTable::fast_accessfield() が生成するコード
  -> (1) CPCache entry を取得
         -> InterpreterMacroAssembler::get_cache_and_index_at_bcp() が生成するコード

     (1) CPCache entry の中身を取り出す

     (1) ロード処理 (型情報に応じて適切なロードを行う)
  
     (1) (x86 ではメモリバリアは不要なので張っていない)

getstatic 命令の処理

TemplateTable::getstatic() が生成するコード
-> TemplateTable::getfield_or_static() が生成するコード
   -> (同上)

putfield 命令の処理

* 1 回目
  TemplateTable::putfield() が生成するコード
  -> TemplateTable::putfield_or_static() が生成するコード
     -> (1) CPCache entry を取得
            -> TemplateTable::resolve_cache_and_index() が生成するコード
               -> (同上)
   
        (1) CPCache entry の中身を取り出す
            -> TemplateTable::load_field_cp_cache_entry() が生成するコード
   
        (1) (x86 ではメモリバリアは不要なので張っていない)
   
        (1) ストア処理 (型情報に応じて適切なストアを行う)
   
        (1) putfield 命令の場合 (= putstatic 命令ではない場合) には, 高速版に書き換える
            -> TemplateTable::patch_bytecode() が生成するコード

        (1) volatile field だった場合はメモリバリア処理を行う
            -> TemplateTable::volatile_barrier() が生成するコード

* 2 回目 (書き換え後)
  TemplateTable::fast_storefield() が生成するコード
  -> (1) CPCache entry を取得
         -> InterpreterMacroAssembler::get_cache_and_index_at_bcp() が生成するコード

     (1) (x86 ではメモリバリアは不要なので張っていない)

     (1) CPCache entry の中身を取り出す

     (1) ストア処理 (型情報に応じて適切なストアを行う)
  
     (1) volatile field だった場合はメモリバリア処理を行う
         -> TemplateTable::volatile_barrier() が生成するコード

putstatic 命令の処理

TemplateTable::putstatic() が生成するコード
-> TemplateTable::putfield_or_static() が生成するコード
   -> (同上)

処理の流れ (詳細)(Execution Flows : Details)

TemplateTable::getfield() (sparc 版)

See: here for details

TemplateTable::getstatic() (sparc 版)

See: here for details

TemplateTable::getfield_or_static() (sparc 版)

See: here for details

TemplateTable::resolve_cache_and_index() (sparc 版)

(#Under Construction) See: here for details

InterpreterMacroAssembler::get_cache_and_index_at_bcp() (sparc 版)

See: here for details

InterpreterMacroAssembler::get_cache_index_at_bcp() (sparc 版)

See: here for details

TemplateTable::load_field_cp_cache_entry() (sparc 版)

See: here for details

TemplateTable::fast_accessfield() (sparc 版)

See: here for details

TemplateTable::volatile_barrier() (sparc 版)

See: here for details

MacroAssembler::membar() (sparc 版)

See: here for details

TemplateTable::putfield() (sparc 版)

See: here for details

TemplateTable::putstatic() (sparc 版)

See: here for details

TemplateTable::putfield_or_static() (sparc 版)

See: here for details

TemplateTable::fast_storefield() (sparc 版)

See: here for details

TemplateTable::getfield() (x86_64 版)

See: here for details

TemplateTable::getstatic() (x86_64 版)

See: here for details

TemplateTable::getfield_or_static() (x86_64 版)

See: here for details

TemplateTable::fast_accessfield() (x86_64 版)

See: here for details

TemplateTable::resolve_cache_and_index() (x86_64 版)

(#Under Construction) See: here for details

InterpreterMacroAssembler::get_cache_and_index_at_bcp() (x86_64 版)

See: here for details

InterpreterMacroAssembler::get_cache_index_at_bcp() (x86_64 版)

See: here for details

TemplateTable::load_field_cp_cache_entry() (x86_64 版)

See: here for details

TemplateTable::volatile_barrier() (x86_64 版)

See: here for details

MacroAssembler::membar() (x86_64 版)

See: here for details

TemplateTable::putfield() (x86_64 版)

See: here for details

TemplateTable::putstatic() (x86_64 版)

See: here for details

TemplateTable::putfield_or_static() (x86_64 版)

See: here for details

TemplateTable::fast_storefield() (x86_64 版)

See: here for details


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