Top


定義場所(file name)

hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp

説明(description)

この関数では, スタックフレーム全体(Lmonitors, Lesp, SP)を引き下げて新しい BasicObjectLock 用の領域を確保する. もし既にスタックフレーム内にデータがある場合は(= stack_is_empty 引数が false の場合は), フレーム内のデータをずらす処理も行う.

// add a InterpMonitorElem to stack (see frame_sparc.hpp)

名前(function name)

void InterpreterMacroAssembler::add_monitor_to_stack( bool stack_is_empty,
                                                      Register Rtemp,
                                                      Register Rtemp2 ) {

本体部(body)

  {- -------------------------------------------
  (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.