hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp
この関数では, スタックフレーム全体(Lmonitors, Lesp, SP)を引き下げて新しい BasicObjectLock 用の領域を確保する. もし既にスタックフレーム内にデータがある場合は(= stack_is_empty 引数が false の場合は), フレーム内のデータをずらす処理も行う.
// add a InterpMonitorElem to stack (see frame_sparc.hpp)
void InterpreterMacroAssembler::add_monitor_to_stack( bool stack_is_empty,
Register Rtemp,
Register Rtemp2 ) {
{- -------------------------------------------
(1) コード生成:
「SP, Lesp, Lmonitors をずらす」
---------------------------------------- -}
Register Rlimit = Lmonitors;
const jint delta = frame::interpreter_frame_monitor_size() * wordSize;
assert( (delta & LongAlignmentMask) == 0,
"sizeof BasicObjectLock must be even number of doublewords");
sub( SP, delta, SP);
sub( Lesp, delta, Lesp);
sub( Lmonitors, delta, Lmonitors);
{- -------------------------------------------
(1) コード生成: (ただし, 引数でスタックが空だと指定されている場合 (= stack_is_empty が true の場合) には, 不要なので生成しない)
「モニター領域を拡張するために, フレーム内の全データをずらす」
---------------------------------------- -}
if (!stack_is_empty) {
// must copy stack contents down
Label start_copying, next;
// untested("monitor stack expansion");
compute_stack_base(Rtemp);
ba( false, start_copying );
delayed()->cmp( Rtemp, Rlimit); // done? duplicated below
// note: must copy from low memory upwards
// On entry to loop,
// Rtemp points to new base of stack, Lesp points to new end of stack (1 past TOS)
// Loop mutates Rtemp
bind( next);
st_ptr(Rtemp2, Rtemp, 0);
inc(Rtemp, wordSize);
cmp(Rtemp, Rlimit); // are we done? (duplicated above)
bind( start_copying );
brx( notEqual, true, pn, next );
delayed()->ld_ptr( Rtemp, delta, Rtemp2 );
// done copying stack
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.