hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp
changeset 15943 d830a939d985
parent 15482 470d0b0c09f1
child 17000 11bf92e571a2
equal deleted inserted replaced
15924:d01b3a588e24 15943:d830a939d985
  1579                                            int caller_actual_parameters,
  1579                                            int caller_actual_parameters,
  1580                                            int callee_param_count,
  1580                                            int callee_param_count,
  1581                                            int callee_local_count,
  1581                                            int callee_local_count,
  1582                                            frame* caller,
  1582                                            frame* caller,
  1583                                            frame* interpreter_frame,
  1583                                            frame* interpreter_frame,
  1584                                            bool is_top_frame) {
  1584                                            bool is_top_frame,
       
  1585                                            bool is_bottom_frame) {
  1585   // Note: This calculation must exactly parallel the frame setup
  1586   // Note: This calculation must exactly parallel the frame setup
  1586   // in InterpreterGenerator::generate_fixed_frame.
  1587   // in InterpreterGenerator::generate_fixed_frame.
  1587   // If f!=NULL, set up the following variables:
  1588   // If f!=NULL, set up the following variables:
  1588   //   - Lmethod
  1589   //   - Lmethod
  1589   //   - Llocals
  1590   //   - Llocals
  1662       int parm_words  = caller_actual_parameters * Interpreter::stackElementWords;
  1663       int parm_words  = caller_actual_parameters * Interpreter::stackElementWords;
  1663       locals = Lesp_ptr + parm_words;
  1664       locals = Lesp_ptr + parm_words;
  1664       int delta = local_words - parm_words;
  1665       int delta = local_words - parm_words;
  1665       int computed_sp_adjustment = (delta > 0) ? round_to(delta, WordsPerLong) : 0;
  1666       int computed_sp_adjustment = (delta > 0) ? round_to(delta, WordsPerLong) : 0;
  1666       *interpreter_frame->register_addr(I5_savedSP)    = (intptr_t) (fp + computed_sp_adjustment) - STACK_BIAS;
  1667       *interpreter_frame->register_addr(I5_savedSP)    = (intptr_t) (fp + computed_sp_adjustment) - STACK_BIAS;
       
  1668       if (!is_bottom_frame) {
       
  1669         // Llast_SP is set below for the current frame to SP (with the
       
  1670         // extra space for the callee's locals). Here we adjust
       
  1671         // Llast_SP for the caller's frame, removing the extra space
       
  1672         // for the current method's locals.
       
  1673         *caller->register_addr(Llast_SP) = *interpreter_frame->register_addr(I5_savedSP);
       
  1674       } else {
       
  1675         assert(*caller->register_addr(Llast_SP) >= *interpreter_frame->register_addr(I5_savedSP), "strange Llast_SP");
       
  1676       }
  1667     } else {
  1677     } else {
  1668       assert(caller->is_compiled_frame() || caller->is_entry_frame(), "only possible cases");
  1678       assert(caller->is_compiled_frame() || caller->is_entry_frame(), "only possible cases");
  1669       // Don't have Lesp available; lay out locals block in the caller
  1679       // Don't have Lesp available; lay out locals block in the caller
  1670       // adjacent to the register window save area.
  1680       // adjacent to the register window save area.
  1671       //
  1681       //