(#Under Construction)
volatile フィールドの場合には, 以下の箇所でメモリバリアが必要になる. ただし, x86 では StoreLoad しか必要ないため "3." の箇所でのみバリアが張られている. SPARC でも実行環境が V9 以降なら同様の箇所にしか張られない.
まだ CPCache のエントリが作られていない場合は, TemplateTable::resolve_cache_and_index() が生成するコード内でエントリを作る処理が行われる.
getfield 命令および putfield 命令の場合は, 初回の実行時にそれぞれ Bytecodes::fast?getfield や Bytecodes::fast?putfield への書き換えを行う (See: here for details). そのため, 二回目以降の実行は少し速くなる.
なお, getstatic 命令や putstatic 命令の場合には書き換えは行われない.
* 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() が生成するコード
TemplateTable::getstatic() が生成するコード -> TemplateTable::getfield_or_static() が生成するコード -> (同上)
* 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() が生成するコード
TemplateTable::putstatic() が生成するコード -> TemplateTable::putfield_or_static() が生成するコード -> (同上)
* 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 ではメモリバリアは不要なので張っていない)
TemplateTable::getstatic() が生成するコード -> TemplateTable::getfield_or_static() が生成するコード -> (同上)
* 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() が生成するコード
TemplateTable::putstatic() が生成するコード -> TemplateTable::putfield_or_static() が生成するコード -> (同上)
See: here for details
See: here for details
See: here for details
(#Under Construction) See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
(#Under Construction) See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.