hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp
void TemplateTable::load_invoke_cp_cache_entry(int byte_no,
Register method,
Register itable_index,
Register flags,
bool is_invokevirtual,
bool is_invokevfinal, /*unused*/
bool is_invokedynamic) {
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
// setup registers
const Register cache = rcx;
const Register index = rdx;
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert_different_registers(method, flags);
assert_different_registers(method, cache, index);
assert_different_registers(itable_index, flags);
assert_different_registers(itable_index, cache, index);
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
// determine constant pool cache field offsets
const int method_offset = in_bytes(
constantPoolCacheOopDesc::base_offset() +
(is_invokevirtual
? ConstantPoolCacheEntry::f2_offset()
: ConstantPoolCacheEntry::f1_offset()));
const int flags_offset = in_bytes(constantPoolCacheOopDesc::base_offset() +
ConstantPoolCacheEntry::flags_offset());
// access constant pool cache fields
const int index_offset = in_bytes(constantPoolCacheOopDesc::base_offset() +
ConstantPoolCacheEntry::f2_offset());
{- -------------------------------------------
(1) コード生成:
「対応する CPCache entry をロードした後 (ロード先は Rcache),
引数の Rmethod で指定されたレジスタに, CPCache entry の f1 または f2 フィールドの値をロード(??? #TODO)」
(invokevirtual の場合には f2 フィールド, そうでない場合には f1 フィールドをロード)
(なお, 引数の byte_no が...の場合には, ...#TODO)
---------------------------------------- -}
if (byte_no == f1_oop) {
// Resolved f1_oop goes directly into 'method' register.
assert(is_invokedynamic, "");
resolve_cache_and_index(byte_no, method, cache, index, sizeof(u4));
} else {
resolve_cache_and_index(byte_no, noreg, cache, index, sizeof(u2));
__ movptr(method, Address(cache, index, Address::times_ptr, method_offset));
}
{- -------------------------------------------
(1) コード生成: (ただし, 引数の itable_index が noreg の場合には生成しない)
「引数の itable_index で指定されたレジスタに, CPCache entry の f2 フィールドの値をロード」
---------------------------------------- -}
if (itable_index != noreg) {
__ movptr(itable_index, Address(cache, index, Address::times_ptr, index_offset));
}
{- -------------------------------------------
(1) コード生成:
「引数の flags で指定されたレジスタに, CPCache entry の flags フィールドの値をロード」
---------------------------------------- -}
__ movl(flags, Address(cache, index, Address::times_ptr, flags_offset));
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.