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");