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