hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp
void InterpreterMacroAssembler::get_cache_and_index_at_bcp(Register cache,
Register index,
int bcp_offset,
size_t index_size) {
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(cache != index, "must use different registers");
{- -------------------------------------------
(1) コード生成:
「InterpreterMacroAssembler::get_cache_index_at_bcp() が生成したコードで,
現在箇所のバイトコードが参照している index を取得する (これは, バイトコード命令中に埋め込まれている情報を取ってくるだけ).
その後, それをシフトし, index 引数で指定されたレジスタに格納する.
また, ConstantPoolCache のアドレスをスタックフレーム上からロードし,
(これはスタックフレーム中の frame::interpreter_frame_cache_offset の位置にある)
cache 引数で指定されたレジスタに格納する.」
---------------------------------------- -}
get_cache_index_at_bcp(index, bcp_offset, index_size);
movptr(cache, Address(rbp, frame::interpreter_frame_cache_offset * wordSize));
assert(sizeof(ConstantPoolCacheEntry) == 4 * wordSize, "adjust code below");
// convert from field index to ConstantPoolCacheEntry index
shll(index, 2);
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.