hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp
// Generate a fixed interpreter frame. This is identical setup for
// interpreted methods and for native methods hence the shared code.
//
// Args:
// rax: return address
// rbx: methodOop
// r14: pointer to locals
// r13: sender sp
// rdx: cp cache
void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) {
{- -------------------------------------------
(1) (この関数では, 新しいスタックフレーム内に値を埋めていくコードを生成する.
特に, どんな場合でも存在する共通の部分(固定の部分)を埋めていく)
---------------------------------------- -}
{- -------------------------------------------
(1) コード生成:
「まず, 以下のような値をフレームに埋める.
(リターンアドレス, old rbp, sender sp, ...)
(合わせて, r13(bcp) や rbp の値をセットする処理も行っている)」
---------------------------------------- -}
// initialize fixed part of activation frame
__ push(rax); // save return address
__ enter(); // save old & set new rbp
__ push(r13); // set sender sp
__ push((int)NULL_WORD); // leave last_sp as null
__ movptr(r13, Address(rbx, methodOopDesc::const_offset())); // get constMethodOop
__ lea(r13, Address(r13, constMethodOopDesc::codes_offset())); // get codebase
__ push(rbx); // save methodOop
{- -------------------------------------------
(1) コード生成: (ただし, ProfileInterpreter オプションが指定されていない場合は, 不要なので生成しない)
「次に, mdp(method data pointer) の値を埋めておく.
* もし methodDataOop が生成されていれば, DataLayout へのポインタをセットする.
* まだ methodDataOop が生成されていないメソッドの場合には, NULL をセットしておく.」
---------------------------------------- -}
if (ProfileInterpreter) {
Label method_data_continue;
__ movptr(rdx, Address(rbx, in_bytes(methodOopDesc::method_data_offset())));
__ testptr(rdx, rdx);
__ jcc(Assembler::zero, method_data_continue);
__ addptr(rdx, in_bytes(methodDataOopDesc::data_offset()));
__ bind(method_data_continue);
__ push(rdx); // set the mdp (method data pointer)
} else {
__ push(0);
}
{- -------------------------------------------
(1) コード生成:
「次に, constant pool cache や locals, bcp を埋める」
(なおネイティブメソッドの場合には, bcp の値はないので 0 を埋める)
---------------------------------------- -}
__ movptr(rdx, Address(rbx, methodOopDesc::constants_offset()));
__ movptr(rdx, Address(rdx, constantPoolOopDesc::cache_offset_in_bytes()));
__ push(rdx); // set constant pool cache
__ push(r14); // set locals pointer
if (native_call) {
__ push(0); // no bcp
} else {
__ push(r13); // set bcp
}
{- -------------------------------------------
(1) コード生成:
「最後に, オペランドスタックの底のアドレスを埋める」
---------------------------------------- -}
__ push(0); // reserve word for pointer to expression stack bottom
__ movptr(Address(rsp, 0), rsp); // set expression stack bottom
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.