hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp
void InterpreterMacroAssembler::call_VM_leaf_base(address entry_point,
int number_of_arguments) {
{- -------------------------------------------
(1) (なおコメントによると, r13(bcp) と r14(locals) は callee save であるうえ
leaf だから GC 等も生じないので, 待避復帰する必要は無いとのこと.
というか, むしろしてはいけないとのこと.
caller が一時的に値を待避して別のことに使っているかもしれないので,
ここでさらに待避すると元の値を壊す恐れがある.)
---------------------------------------- -}
// interpreter specific
//
// Note: No need to save/restore bcp & locals (r13 & r14) pointer
// since these are callee saved registers and no blocking/
// GC can happen in leaf calls.
// Further Note: DO NOT save/restore bcp/locals. If a caller has
// already saved them so that it can use esi/edi as temporaries
// then a save/restore here will DESTROY the copy the caller
// saved! There used to be a save_bcp() that only happened in
// the ASSERT path (no restore_bcp). Which caused bizarre failures
// when jvm built with ASSERTs.
#ifdef ASSERT
{
Label L;
cmpptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), (int32_t)NULL_WORD);
jcc(Assembler::equal, L);
stop("InterpreterMacroAssembler::call_VM_leaf_base:"
" last_sp != NULL");
bind(L);
}
#endif
{- -------------------------------------------
(1) コード生成:
「MacroAssembler::call_VM_leaf_base() が生成するコードにより,
引数で指定されたエントリポイントを呼び出す.」
---------------------------------------- -}
// super call
MacroAssembler::call_VM_leaf_base(entry_point, number_of_arguments);
{- -------------------------------------------
(1) (ここには r13/r14 の値をチェックする ASSERT があったが, 上記の理由から今はないとのこと)
---------------------------------------- -}
// interpreter specific
// Used to ASSERT that r13/r14 were equal to frame's bcp/locals
// but since they may not have been saved (and we don't want to
// save thme here (see note above) the assert is invalid.
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.