comparison src/share/vm/interpreter/templateInterpreter.cpp @ 1059:389049f3f393

6858164: invokedynamic code needs some cleanup (post-6655638) Summary: Fix several crashers, remove needless paths for boxed-style bootstrap method call, refactor & simplify APIs for rewriter constantPoolOop, remove sun.dyn.CallSiteImpl Reviewed-by: kvn
author jrose
date Fri, 30 Oct 2009 16:22:59 -0700
parents 9987d9d5eb0e
children b18963243361
comparison
equal deleted inserted replaced
1058:73a726751507 1059:389049f3f393
176 #ifndef PRODUCT 176 #ifndef PRODUCT
177 EntryPoint TemplateInterpreter::_trace_code; 177 EntryPoint TemplateInterpreter::_trace_code;
178 #endif // !PRODUCT 178 #endif // !PRODUCT
179 EntryPoint TemplateInterpreter::_return_entry[TemplateInterpreter::number_of_return_entries]; 179 EntryPoint TemplateInterpreter::_return_entry[TemplateInterpreter::number_of_return_entries];
180 EntryPoint TemplateInterpreter::_earlyret_entry; 180 EntryPoint TemplateInterpreter::_earlyret_entry;
181 EntryPoint TemplateInterpreter::_return_unbox_entry;
182 EntryPoint TemplateInterpreter::_deopt_entry [TemplateInterpreter::number_of_deopt_entries ]; 181 EntryPoint TemplateInterpreter::_deopt_entry [TemplateInterpreter::number_of_deopt_entries ];
183 EntryPoint TemplateInterpreter::_continuation_entry; 182 EntryPoint TemplateInterpreter::_continuation_entry;
184 EntryPoint TemplateInterpreter::_safept_entry; 183 EntryPoint TemplateInterpreter::_safept_entry;
185 184
186 address TemplateInterpreter::_return_3_addrs_by_index[TemplateInterpreter::number_of_return_addrs]; 185 address TemplateInterpreter::_return_3_addrs_by_index[TemplateInterpreter::number_of_return_addrs];
187 address TemplateInterpreter::_return_5_addrs_by_index[TemplateInterpreter::number_of_return_addrs]; 186 address TemplateInterpreter::_return_5_addrs_by_index[TemplateInterpreter::number_of_return_addrs];
188 address TemplateInterpreter::_return_5_unbox_addrs_by_index[TemplateInterpreter::number_of_return_addrs];
189 187
190 DispatchTable TemplateInterpreter::_active_table; 188 DispatchTable TemplateInterpreter::_active_table;
191 DispatchTable TemplateInterpreter::_normal_table; 189 DispatchTable TemplateInterpreter::_normal_table;
192 DispatchTable TemplateInterpreter::_safept_table; 190 DispatchTable TemplateInterpreter::_safept_table;
193 address TemplateInterpreter::_wentry_point[DispatchTable::length]; 191 address TemplateInterpreter::_wentry_point[DispatchTable::length];
251 generate_return_entry_for(vtos, i) 249 generate_return_entry_for(vtos, i)
252 ); 250 );
253 } 251 }
254 } 252 }
255 253
256 if (EnableInvokeDynamic) {
257 CodeletMark cm(_masm, "unboxing return entry points");
258 Interpreter::_return_unbox_entry =
259 EntryPoint(
260 generate_return_unbox_entry_for(btos, 5),
261 generate_return_unbox_entry_for(ctos, 5),
262 generate_return_unbox_entry_for(stos, 5),
263 generate_return_unbox_entry_for(atos, 5), // cast conversion
264 generate_return_unbox_entry_for(itos, 5),
265 generate_return_unbox_entry_for(ltos, 5),
266 generate_return_unbox_entry_for(ftos, 5),
267 generate_return_unbox_entry_for(dtos, 5),
268 Interpreter::_return_entry[5].entry(vtos) // no unboxing for void
269 );
270 }
271
272 { CodeletMark cm(_masm, "earlyret entry points"); 254 { CodeletMark cm(_masm, "earlyret entry points");
273 Interpreter::_earlyret_entry = 255 Interpreter::_earlyret_entry =
274 EntryPoint( 256 EntryPoint(
275 generate_earlyret_entry_for(btos), 257 generate_earlyret_entry_for(btos),
276 generate_earlyret_entry_for(ctos), 258 generate_earlyret_entry_for(ctos),
317 for (int j = 0; j < number_of_states; j++) { 299 for (int j = 0; j < number_of_states; j++) {
318 const TosState states[] = {btos, ctos, stos, itos, ltos, ftos, dtos, atos, vtos}; 300 const TosState states[] = {btos, ctos, stos, itos, ltos, ftos, dtos, atos, vtos};
319 int index = Interpreter::TosState_as_index(states[j]); 301 int index = Interpreter::TosState_as_index(states[j]);
320 Interpreter::_return_3_addrs_by_index[index] = Interpreter::return_entry(states[j], 3); 302 Interpreter::_return_3_addrs_by_index[index] = Interpreter::return_entry(states[j], 3);
321 Interpreter::_return_5_addrs_by_index[index] = Interpreter::return_entry(states[j], 5); 303 Interpreter::_return_5_addrs_by_index[index] = Interpreter::return_entry(states[j], 5);
322 if (EnableInvokeDynamic)
323 Interpreter::_return_5_unbox_addrs_by_index[index] = Interpreter::return_unbox_entry(states[j], 5);
324 } 304 }
325 305
326 { CodeletMark cm(_masm, "continuation entry points"); 306 { CodeletMark cm(_masm, "continuation entry points");
327 Interpreter::_continuation_entry = 307 Interpreter::_continuation_entry =
328 EntryPoint( 308 EntryPoint(
545 guarantee(0 <= length && length < Interpreter::number_of_return_entries, "illegal length"); 525 guarantee(0 <= length && length < Interpreter::number_of_return_entries, "illegal length");
546 return _return_entry[length].entry(state); 526 return _return_entry[length].entry(state);
547 } 527 }
548 528
549 529
550 address TemplateInterpreter::return_unbox_entry(TosState state, int length) {
551 assert(EnableInvokeDynamic, "");
552 if (state == vtos) {
553 // no unboxing to do, actually
554 return return_entry(state, length);
555 } else {
556 assert(length == 5, "unboxing entries generated for invokedynamic only");
557 return _return_unbox_entry.entry(state);
558 }
559 }
560
561
562 address TemplateInterpreter::deopt_entry(TosState state, int length) { 530 address TemplateInterpreter::deopt_entry(TosState state, int length) {
563 guarantee(0 <= length && length < Interpreter::number_of_deopt_entries, "illegal length"); 531 guarantee(0 <= length && length < Interpreter::number_of_deopt_entries, "illegal length");
564 return _deopt_entry[length].entry(state); 532 return _deopt_entry[length].entry(state);
565 } 533 }
566 534