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