(#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.