src/cpu/ppc/vm/templateInterpreter_ppc.cpp

changeset 6723
0bf37f737702
parent 6660
63c5920a038d
child 6876
710a3c8b516e
child 7132
b384ba33c9a0
     1.1 --- a/src/cpu/ppc/vm/templateInterpreter_ppc.cpp	Mon Jun 09 15:42:31 2014 -0700
     1.2 +++ b/src/cpu/ppc/vm/templateInterpreter_ppc.cpp	Tue Apr 01 09:36:49 2014 +0200
     1.3 @@ -1328,21 +1328,42 @@
     1.4  int AbstractInterpreter::size_top_interpreter_activation(Method* method) {
     1.5    const int max_alignment_size = 2;
     1.6    const int abi_scratch = frame::abi_reg_args_size;
     1.7 -  return method->max_locals() + method->max_stack() + frame::interpreter_frame_monitor_size() + max_alignment_size + abi_scratch;
     1.8 +  return method->max_locals() + method->max_stack() +
     1.9 +         frame::interpreter_frame_monitor_size() + max_alignment_size + abi_scratch;
    1.10  }
    1.11  
    1.12 -// Fills a sceletal interpreter frame generated during deoptimizations
    1.13 -// and returns the frame size in slots.
    1.14 +// Returns number of stackElementWords needed for the interpreter frame with the
    1.15 +// given sections.
    1.16 +// This overestimates the stack by one slot in case of alignments.
    1.17 +int AbstractInterpreter::size_activation(int max_stack,
    1.18 +                                         int temps,
    1.19 +                                         int extra_args,
    1.20 +                                         int monitors,
    1.21 +                                         int callee_params,
    1.22 +                                         int callee_locals,
    1.23 +                                         bool is_top_frame) {
    1.24 +  // Note: This calculation must exactly parallel the frame setup
    1.25 +  // in AbstractInterpreterGenerator::generate_method_entry.
    1.26 +  assert(Interpreter::stackElementWords == 1, "sanity");
    1.27 +  const int max_alignment_space = StackAlignmentInBytes / Interpreter::stackElementSize;
    1.28 +  const int abi_scratch = is_top_frame ? (frame::abi_reg_args_size / Interpreter::stackElementSize) :
    1.29 +                                         (frame::abi_minframe_size / Interpreter::stackElementSize);
    1.30 +  const int size =
    1.31 +    max_stack                                                +
    1.32 +    (callee_locals - callee_params)                          +
    1.33 +    monitors * frame::interpreter_frame_monitor_size()       +
    1.34 +    max_alignment_space                                      +
    1.35 +    abi_scratch                                              +
    1.36 +    frame::ijava_state_size / Interpreter::stackElementSize;
    1.37 +
    1.38 +  // Fixed size of an interpreter frame, align to 16-byte.
    1.39 +  return (size & -2);
    1.40 +}
    1.41 +
    1.42 +// Fills a sceletal interpreter frame generated during deoptimizations.
    1.43  //
    1.44  // Parameters:
    1.45  //
    1.46 -// interpreter_frame == NULL:
    1.47 -//   Only calculate the size of an interpreter activation, no actual layout.
    1.48 -//   Note: This calculation must exactly parallel the frame setup
    1.49 -//   in TemplateInterpreter::generate_normal_entry. But it does not
    1.50 -//   account for the SP alignment, that might further enhance the
    1.51 -//   frame size, depending on FP.
    1.52 -//
    1.53  // interpreter_frame != NULL:
    1.54  //   set up the method, locals, and monitors.
    1.55  //   The frame interpreter_frame, if not NULL, is guaranteed to be the
    1.56 @@ -1359,59 +1380,41 @@
    1.57  //   the arguments off advance the esp by dummy popframe_extra_args slots.
    1.58  //   Popping off those will establish the stack layout as it was before the call.
    1.59  //
    1.60 -int AbstractInterpreter::layout_activation(Method* method,
    1.61 -                                           int tempcount,
    1.62 -                                           int popframe_extra_args,
    1.63 -                                           int moncount,
    1.64 -                                           int caller_actual_parameters,
    1.65 -                                           int callee_param_count,
    1.66 -                                           int callee_locals,
    1.67 -                                           frame* caller,
    1.68 -                                           frame* interpreter_frame,
    1.69 -                                           bool is_top_frame,
    1.70 -                                           bool is_bottom_frame) {
    1.71 +void AbstractInterpreter::layout_activation(Method* method,
    1.72 +                                            int tempcount,
    1.73 +                                            int popframe_extra_args,
    1.74 +                                            int moncount,
    1.75 +                                            int caller_actual_parameters,
    1.76 +                                            int callee_param_count,
    1.77 +                                            int callee_locals_count,
    1.78 +                                            frame* caller,
    1.79 +                                            frame* interpreter_frame,
    1.80 +                                            bool is_top_frame,
    1.81 +                                            bool is_bottom_frame) {
    1.82  
    1.83 -  const int max_alignment_space = 2;
    1.84    const int abi_scratch = is_top_frame ? (frame::abi_reg_args_size / Interpreter::stackElementSize) :
    1.85 -                                         (frame::abi_minframe_size / Interpreter::stackElementSize) ;
    1.86 -  const int conservative_framesize_in_slots =
    1.87 -    method->max_stack() + callee_locals - callee_param_count +
    1.88 -    (moncount * frame::interpreter_frame_monitor_size()) + max_alignment_space +
    1.89 -    abi_scratch + frame::ijava_state_size / Interpreter::stackElementSize;
    1.90 +                                         (frame::abi_minframe_size / Interpreter::stackElementSize);
    1.91  
    1.92 -  assert(!is_top_frame || conservative_framesize_in_slots * 8 > frame::abi_reg_args_size + frame::ijava_state_size, "frame too small");
    1.93 +  intptr_t* locals_base  = (caller->is_interpreted_frame()) ?
    1.94 +    caller->interpreter_frame_esp() + caller_actual_parameters :
    1.95 +    caller->sp() + method->max_locals() - 1 + (frame::abi_minframe_size / Interpreter::stackElementSize) ;
    1.96  
    1.97 -  if (interpreter_frame == NULL) {
    1.98 -    // Since we don't know the exact alignment, we return the conservative size.
    1.99 -    return (conservative_framesize_in_slots & -2);
   1.100 -  } else {
   1.101 -    // Now we know our caller, calc the exact frame layout and size.
   1.102 -    intptr_t* locals_base  = (caller->is_interpreted_frame()) ?
   1.103 -      caller->interpreter_frame_esp() + caller_actual_parameters :
   1.104 -      caller->sp() + method->max_locals() - 1 + (frame::abi_minframe_size / Interpreter::stackElementSize) ;
   1.105 +  intptr_t* monitor_base = caller->sp() - frame::ijava_state_size / Interpreter::stackElementSize ;
   1.106 +  intptr_t* monitor      = monitor_base - (moncount * frame::interpreter_frame_monitor_size());
   1.107 +  intptr_t* esp_base     = monitor - 1;
   1.108 +  intptr_t* esp          = esp_base - tempcount - popframe_extra_args;
   1.109 +  intptr_t* sp           = (intptr_t *) (((intptr_t) (esp_base - callee_locals_count + callee_param_count - method->max_stack()- abi_scratch)) & -StackAlignmentInBytes);
   1.110 +  intptr_t* sender_sp    = caller->sp() + (frame::abi_minframe_size - frame::abi_reg_args_size) / Interpreter::stackElementSize;
   1.111 +  intptr_t* top_frame_sp = is_top_frame ? sp : sp + (frame::abi_minframe_size - frame::abi_reg_args_size) / Interpreter::stackElementSize;
   1.112  
   1.113 -    intptr_t* monitor_base = caller->sp() - frame::ijava_state_size / Interpreter::stackElementSize ;
   1.114 -    intptr_t* monitor      = monitor_base - (moncount * frame::interpreter_frame_monitor_size());
   1.115 -    intptr_t* esp_base     = monitor - 1;
   1.116 -    intptr_t* esp          = esp_base - tempcount - popframe_extra_args;
   1.117 -    intptr_t* sp           = (intptr_t *) (((intptr_t) (esp_base- callee_locals + callee_param_count - method->max_stack()- abi_scratch)) & -StackAlignmentInBytes);
   1.118 -    intptr_t* sender_sp    = caller->sp() + (frame::abi_minframe_size - frame::abi_reg_args_size) / Interpreter::stackElementSize;
   1.119 -    intptr_t* top_frame_sp = is_top_frame ? sp : sp + (frame::abi_minframe_size - frame::abi_reg_args_size) / Interpreter::stackElementSize;
   1.120 -
   1.121 -    interpreter_frame->interpreter_frame_set_method(method);
   1.122 -    interpreter_frame->interpreter_frame_set_locals(locals_base);
   1.123 -    interpreter_frame->interpreter_frame_set_cpcache(method->constants()->cache());
   1.124 -    interpreter_frame->interpreter_frame_set_esp(esp);
   1.125 -    interpreter_frame->interpreter_frame_set_monitor_end((BasicObjectLock *)monitor);
   1.126 -    interpreter_frame->interpreter_frame_set_top_frame_sp(top_frame_sp);
   1.127 -    if (!is_bottom_frame) {
   1.128 -      interpreter_frame->interpreter_frame_set_sender_sp(sender_sp);
   1.129 -    }
   1.130 -
   1.131 -    int framesize_in_slots = caller->sp() - sp;
   1.132 -    assert(!is_top_frame ||framesize_in_slots >= (frame::abi_reg_args_size / Interpreter::stackElementSize) + frame::ijava_state_size / Interpreter::stackElementSize, "frame too small");
   1.133 -    assert(framesize_in_slots <= conservative_framesize_in_slots, "exact frame size must be smaller than the convervative size!");
   1.134 -    return framesize_in_slots;
   1.135 +  interpreter_frame->interpreter_frame_set_method(method);
   1.136 +  interpreter_frame->interpreter_frame_set_locals(locals_base);
   1.137 +  interpreter_frame->interpreter_frame_set_cpcache(method->constants()->cache());
   1.138 +  interpreter_frame->interpreter_frame_set_esp(esp);
   1.139 +  interpreter_frame->interpreter_frame_set_monitor_end((BasicObjectLock *)monitor);
   1.140 +  interpreter_frame->interpreter_frame_set_top_frame_sp(top_frame_sp);
   1.141 +  if (!is_bottom_frame) {
   1.142 +    interpreter_frame->interpreter_frame_set_sender_sp(sender_sp);
   1.143    }
   1.144  }
   1.145  

mercurial