Mercurial > hg > graal-compiler
comparison src/share/vm/interpreter/templateInterpreter.cpp @ 13086:096c224171c4
Merge with http://hg.openjdk.java.net/hsx/hsx25/hotspot/
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Wed, 20 Nov 2013 00:10:38 +0100 |
parents | 359f7e70ae7f bd3237e0e18d |
children | 4062efea018b |
comparison
equal
deleted
inserted
replaced
12782:92b7ec34ddfa | 13086:096c224171c4 |
---|---|
182 EntryPoint TemplateInterpreter::_earlyret_entry; | 182 EntryPoint TemplateInterpreter::_earlyret_entry; |
183 EntryPoint TemplateInterpreter::_deopt_entry [TemplateInterpreter::number_of_deopt_entries ]; | 183 EntryPoint TemplateInterpreter::_deopt_entry [TemplateInterpreter::number_of_deopt_entries ]; |
184 EntryPoint TemplateInterpreter::_continuation_entry; | 184 EntryPoint TemplateInterpreter::_continuation_entry; |
185 EntryPoint TemplateInterpreter::_safept_entry; | 185 EntryPoint TemplateInterpreter::_safept_entry; |
186 | 186 |
187 address TemplateInterpreter::_return_3_addrs_by_index[TemplateInterpreter::number_of_return_addrs]; | 187 address TemplateInterpreter::_invoke_return_entry[TemplateInterpreter::number_of_return_addrs]; |
188 address TemplateInterpreter::_return_5_addrs_by_index[TemplateInterpreter::number_of_return_addrs]; | 188 address TemplateInterpreter::_invokeinterface_return_entry[TemplateInterpreter::number_of_return_addrs]; |
189 address TemplateInterpreter::_invokedynamic_return_entry[TemplateInterpreter::number_of_return_addrs]; | |
189 | 190 |
190 DispatchTable TemplateInterpreter::_active_table; | 191 DispatchTable TemplateInterpreter::_active_table; |
191 DispatchTable TemplateInterpreter::_normal_table; | 192 DispatchTable TemplateInterpreter::_normal_table; |
192 DispatchTable TemplateInterpreter::_safept_table; | 193 DispatchTable TemplateInterpreter::_safept_table; |
193 address TemplateInterpreter::_wentry_point[DispatchTable::length]; | 194 address TemplateInterpreter::_wentry_point[DispatchTable::length]; |
235 ); | 236 ); |
236 } | 237 } |
237 #endif // !PRODUCT | 238 #endif // !PRODUCT |
238 | 239 |
239 { CodeletMark cm(_masm, "return entry points"); | 240 { CodeletMark cm(_masm, "return entry points"); |
241 const int index_size = sizeof(u2); | |
240 for (int i = 0; i < Interpreter::number_of_return_entries; i++) { | 242 for (int i = 0; i < Interpreter::number_of_return_entries; i++) { |
241 Interpreter::_return_entry[i] = | 243 Interpreter::_return_entry[i] = |
242 EntryPoint( | 244 EntryPoint( |
243 generate_return_entry_for(itos, i), | 245 generate_return_entry_for(itos, i, index_size), |
244 generate_return_entry_for(itos, i), | 246 generate_return_entry_for(itos, i, index_size), |
245 generate_return_entry_for(itos, i), | 247 generate_return_entry_for(itos, i, index_size), |
246 generate_return_entry_for(atos, i), | 248 generate_return_entry_for(atos, i, index_size), |
247 generate_return_entry_for(itos, i), | 249 generate_return_entry_for(itos, i, index_size), |
248 generate_return_entry_for(ltos, i), | 250 generate_return_entry_for(ltos, i, index_size), |
249 generate_return_entry_for(ftos, i), | 251 generate_return_entry_for(ftos, i, index_size), |
250 generate_return_entry_for(dtos, i), | 252 generate_return_entry_for(dtos, i, index_size), |
251 generate_return_entry_for(vtos, i) | 253 generate_return_entry_for(vtos, i, index_size) |
252 ); | 254 ); |
255 } | |
256 } | |
257 | |
258 { CodeletMark cm(_masm, "invoke return entry points"); | |
259 const TosState states[] = {itos, itos, itos, itos, ltos, ftos, dtos, atos, vtos}; | |
260 const int invoke_length = Bytecodes::length_for(Bytecodes::_invokestatic); | |
261 const int invokeinterface_length = Bytecodes::length_for(Bytecodes::_invokeinterface); | |
262 const int invokedynamic_length = Bytecodes::length_for(Bytecodes::_invokedynamic); | |
263 | |
264 for (int i = 0; i < Interpreter::number_of_return_addrs; i++) { | |
265 TosState state = states[i]; | |
266 Interpreter::_invoke_return_entry[i] = generate_return_entry_for(state, invoke_length, sizeof(u2)); | |
267 Interpreter::_invokeinterface_return_entry[i] = generate_return_entry_for(state, invokeinterface_length, sizeof(u2)); | |
268 Interpreter::_invokedynamic_return_entry[i] = generate_return_entry_for(state, invokedynamic_length, sizeof(u4)); | |
253 } | 269 } |
254 } | 270 } |
255 | 271 |
256 { CodeletMark cm(_masm, "earlyret entry points"); | 272 { CodeletMark cm(_masm, "earlyret entry points"); |
257 Interpreter::_earlyret_entry = | 273 Interpreter::_earlyret_entry = |
294 BasicType type = types[i]; | 310 BasicType type = types[i]; |
295 if (!is_generated[Interpreter::BasicType_as_index(type)]++) { | 311 if (!is_generated[Interpreter::BasicType_as_index(type)]++) { |
296 Interpreter::_native_abi_to_tosca[Interpreter::BasicType_as_index(type)] = generate_result_handler_for(type); | 312 Interpreter::_native_abi_to_tosca[Interpreter::BasicType_as_index(type)] = generate_result_handler_for(type); |
297 } | 313 } |
298 } | 314 } |
299 } | |
300 | |
301 for (int j = 0; j < number_of_states; j++) { | |
302 const TosState states[] = {btos, ctos, stos, itos, ltos, ftos, dtos, atos, vtos}; | |
303 int index = Interpreter::TosState_as_index(states[j]); | |
304 Interpreter::_return_3_addrs_by_index[index] = Interpreter::return_entry(states[j], 3); | |
305 Interpreter::_return_5_addrs_by_index[index] = Interpreter::return_entry(states[j], 5); | |
306 } | 315 } |
307 | 316 |
308 { CodeletMark cm(_masm, "continuation entry points"); | 317 { CodeletMark cm(_masm, "continuation entry points"); |
309 Interpreter::_continuation_entry = | 318 Interpreter::_continuation_entry = |
310 EntryPoint( | 319 EntryPoint( |
535 } | 544 } |
536 | 545 |
537 //------------------------------------------------------------------------------------------------------------------------ | 546 //------------------------------------------------------------------------------------------------------------------------ |
538 // Entry points | 547 // Entry points |
539 | 548 |
540 address TemplateInterpreter::return_entry(TosState state, int length) { | 549 /** |
550 * Returns the return entry table for the given invoke bytecode. | |
551 */ | |
552 address* TemplateInterpreter::invoke_return_entry_table_for(Bytecodes::Code code) { | |
553 switch (code) { | |
554 case Bytecodes::_invokestatic: | |
555 case Bytecodes::_invokespecial: | |
556 case Bytecodes::_invokevirtual: | |
557 case Bytecodes::_invokehandle: | |
558 return Interpreter::invoke_return_entry_table(); | |
559 case Bytecodes::_invokeinterface: | |
560 return Interpreter::invokeinterface_return_entry_table(); | |
561 case Bytecodes::_invokedynamic: | |
562 return Interpreter::invokedynamic_return_entry_table(); | |
563 default: | |
564 fatal(err_msg("invalid bytecode: %s", Bytecodes::name(code))); | |
565 return NULL; | |
566 } | |
567 } | |
568 | |
569 /** | |
570 * Returns the return entry address for the given top-of-stack state and bytecode. | |
571 */ | |
572 address TemplateInterpreter::return_entry(TosState state, int length, Bytecodes::Code code) { | |
541 guarantee(0 <= length && length < Interpreter::number_of_return_entries, "illegal length"); | 573 guarantee(0 <= length && length < Interpreter::number_of_return_entries, "illegal length"); |
542 return _return_entry[length].entry(state); | 574 const int index = TosState_as_index(state); |
575 switch (code) { | |
576 case Bytecodes::_invokestatic: | |
577 case Bytecodes::_invokespecial: | |
578 case Bytecodes::_invokevirtual: | |
579 case Bytecodes::_invokehandle: | |
580 return _invoke_return_entry[index]; | |
581 case Bytecodes::_invokeinterface: | |
582 return _invokeinterface_return_entry[index]; | |
583 case Bytecodes::_invokedynamic: | |
584 return _invokedynamic_return_entry[index]; | |
585 default: | |
586 assert(!Bytecodes::is_invoke(code), err_msg("invoke instructions should be handled separately: %s", Bytecodes::name(code))); | |
587 return _return_entry[length].entry(state); | |
588 } | |
543 } | 589 } |
544 | 590 |
545 | 591 |
546 address TemplateInterpreter::deopt_entry(TosState state, int length) { | 592 address TemplateInterpreter::deopt_entry(TosState state, int length) { |
547 guarantee(0 <= length && length < Interpreter::number_of_deopt_entries, "illegal length"); | 593 guarantee(0 <= length && length < Interpreter::number_of_deopt_entries, "illegal length"); |