99 100 // Set last_sp 101 intptr_t* esp = (intptr_t*) monbot - 102 tempcount*Interpreter::stackElementWords - 103 popframe_extra_args; 104 interpreter_frame->interpreter_frame_set_last_sp(esp); 105 106 // All frames but the initial (oldest) interpreter frame we fill in have 107 // a value for sender_sp that allows walking the stack but isn't 108 // truly correct. Correct the value here. 109 if (extra_locals != 0 && 110 interpreter_frame->sender_sp() == 111 interpreter_frame->interpreter_frame_sender_sp()) { 112 interpreter_frame->set_interpreter_frame_sender_sp(caller->sp() + 113 extra_locals); 114 } 115 *interpreter_frame->interpreter_frame_cache_addr() = 116 method->constants()->cache(); 117 } 118 119 #endif // CC_INTERP | 99 100 // Set last_sp 101 intptr_t* esp = (intptr_t*) monbot - 102 tempcount*Interpreter::stackElementWords - 103 popframe_extra_args; 104 interpreter_frame->interpreter_frame_set_last_sp(esp); 105 106 // All frames but the initial (oldest) interpreter frame we fill in have 107 // a value for sender_sp that allows walking the stack but isn't 108 // truly correct. Correct the value here. 109 if (extra_locals != 0 && 110 interpreter_frame->sender_sp() == 111 interpreter_frame->interpreter_frame_sender_sp()) { 112 interpreter_frame->set_interpreter_frame_sender_sp(caller->sp() + 113 extra_locals); 114 } 115 *interpreter_frame->interpreter_frame_cache_addr() = 116 method->constants()->cache(); 117 } 118 119 #ifndef _LP64 120 int AbstractInterpreter::BasicType_as_index(BasicType type) { 121 int i = 0; 122 switch (type) { 123 case T_BOOLEAN: i = 0; break; 124 case T_CHAR : i = 1; break; 125 case T_BYTE : i = 2; break; 126 case T_SHORT : i = 3; break; 127 case T_INT : // fall through 128 case T_LONG : // fall through 129 case T_VOID : i = 4; break; 130 case T_FLOAT : i = 5; break; // have to treat float and double separately for SSE 131 case T_DOUBLE : i = 6; break; 132 case T_OBJECT : // fall through 133 case T_ARRAY : i = 7; break; 134 default : ShouldNotReachHere(); 135 } 136 assert(0 <= i && i < AbstractInterpreter::number_of_result_handlers, "index out of bounds"); 137 return i; 138 } 139 #else 140 int AbstractInterpreter::BasicType_as_index(BasicType type) { 141 int i = 0; 142 switch (type) { 143 case T_BOOLEAN: i = 0; break; 144 case T_CHAR : i = 1; break; 145 case T_BYTE : i = 2; break; 146 case T_SHORT : i = 3; break; 147 case T_INT : i = 4; break; 148 case T_LONG : i = 5; break; 149 case T_VOID : i = 6; break; 150 case T_FLOAT : i = 7; break; 151 case T_DOUBLE : i = 8; break; 152 case T_OBJECT : i = 9; break; 153 case T_ARRAY : i = 9; break; 154 default : ShouldNotReachHere(); 155 } 156 assert(0 <= i && i < AbstractInterpreter::number_of_result_handlers, 157 "index out of bounds"); 158 return i; 159 } 160 #endif // _LP64 161 162 // These should never be compiled since the interpreter will prefer 163 // the compiled version to the intrinsic version. 164 bool AbstractInterpreter::can_be_compiled(methodHandle m) { 165 switch (method_kind(m)) { 166 case Interpreter::java_lang_math_sin : // fall thru 167 case Interpreter::java_lang_math_cos : // fall thru 168 case Interpreter::java_lang_math_tan : // fall thru 169 case Interpreter::java_lang_math_abs : // fall thru 170 case Interpreter::java_lang_math_log : // fall thru 171 case Interpreter::java_lang_math_log10 : // fall thru 172 case Interpreter::java_lang_math_sqrt : // fall thru 173 case Interpreter::java_lang_math_pow : // fall thru 174 case Interpreter::java_lang_math_exp : 175 return false; 176 default: 177 return true; 178 } 179 } 180 181 // How much stack a method activation needs in words. 182 int AbstractInterpreter::size_top_interpreter_activation(Method* method) { 183 const int entry_size = frame::interpreter_frame_monitor_size(); 184 185 // total overhead size: entry_size + (saved rbp thru expr stack 186 // bottom). be sure to change this if you add/subtract anything 187 // to/from the overhead area 188 const int overhead_size = 189 -(frame::interpreter_frame_initial_sp_offset) + entry_size; 190 191 #ifndef _LP64 192 const int stub_code = 4; // see generate_call_stub 193 #else 194 const int stub_code = frame::entry_frame_after_call_words; 195 #endif 196 197 const int method_stack = (method->max_locals() + method->max_stack()) * 198 Interpreter::stackElementWords; 199 return (overhead_size + method_stack + stub_code); 200 } 201 202 #endif // CC_INTERP |