Mercurial > hg > graal-jvmci-8
comparison src/share/vm/interpreter/templateInterpreter.cpp @ 726:be93aad57795
6655646: dynamic languages need dynamically linked call sites
Summary: invokedynamic instruction (JSR 292 RI)
Reviewed-by: twisti, never
author | jrose |
---|---|
date | Tue, 21 Apr 2009 23:21:04 -0700 |
parents | e5b0439ef4ae |
children | 9987d9d5eb0e |
comparison
equal
deleted
inserted
replaced
725:928912ce8438 | 726:be93aad57795 |
---|---|
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; | |
181 EntryPoint TemplateInterpreter::_deopt_entry [TemplateInterpreter::number_of_deopt_entries ]; | 182 EntryPoint TemplateInterpreter::_deopt_entry [TemplateInterpreter::number_of_deopt_entries ]; |
182 EntryPoint TemplateInterpreter::_continuation_entry; | 183 EntryPoint TemplateInterpreter::_continuation_entry; |
183 EntryPoint TemplateInterpreter::_safept_entry; | 184 EntryPoint TemplateInterpreter::_safept_entry; |
184 | 185 |
185 address TemplateInterpreter::_return_3_addrs_by_index[TemplateInterpreter::number_of_return_addrs]; | 186 address TemplateInterpreter::_return_3_addrs_by_index[TemplateInterpreter::number_of_return_addrs]; |
186 address TemplateInterpreter::_return_5_addrs_by_index[TemplateInterpreter::number_of_return_addrs]; | 187 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]; | |
187 | 189 |
188 DispatchTable TemplateInterpreter::_active_table; | 190 DispatchTable TemplateInterpreter::_active_table; |
189 DispatchTable TemplateInterpreter::_normal_table; | 191 DispatchTable TemplateInterpreter::_normal_table; |
190 DispatchTable TemplateInterpreter::_safept_table; | 192 DispatchTable TemplateInterpreter::_safept_table; |
191 address TemplateInterpreter::_wentry_point[DispatchTable::length]; | 193 address TemplateInterpreter::_wentry_point[DispatchTable::length]; |
249 generate_return_entry_for(vtos, i) | 251 generate_return_entry_for(vtos, i) |
250 ); | 252 ); |
251 } | 253 } |
252 } | 254 } |
253 | 255 |
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 | |
254 { CodeletMark cm(_masm, "earlyret entry points"); | 272 { CodeletMark cm(_masm, "earlyret entry points"); |
255 Interpreter::_earlyret_entry = | 273 Interpreter::_earlyret_entry = |
256 EntryPoint( | 274 EntryPoint( |
257 generate_earlyret_entry_for(btos), | 275 generate_earlyret_entry_for(btos), |
258 generate_earlyret_entry_for(ctos), | 276 generate_earlyret_entry_for(ctos), |
296 } | 314 } |
297 } | 315 } |
298 | 316 |
299 for (int j = 0; j < number_of_states; j++) { | 317 for (int j = 0; j < number_of_states; j++) { |
300 const TosState states[] = {btos, ctos, stos, itos, ltos, ftos, dtos, atos, vtos}; | 318 const TosState states[] = {btos, ctos, stos, itos, ltos, ftos, dtos, atos, vtos}; |
301 Interpreter::_return_3_addrs_by_index[Interpreter::TosState_as_index(states[j])] = Interpreter::return_entry(states[j], 3); | 319 int index = Interpreter::TosState_as_index(states[j]); |
302 Interpreter::_return_5_addrs_by_index[Interpreter::TosState_as_index(states[j])] = Interpreter::return_entry(states[j], 5); | 320 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); | |
322 if (EnableInvokeDynamic) | |
323 Interpreter::_return_5_unbox_addrs_by_index[index] = Interpreter::return_unbox_entry(states[j], 5); | |
303 } | 324 } |
304 | 325 |
305 { CodeletMark cm(_masm, "continuation entry points"); | 326 { CodeletMark cm(_masm, "continuation entry points"); |
306 Interpreter::_continuation_entry = | 327 Interpreter::_continuation_entry = |
307 EntryPoint( | 328 EntryPoint( |
524 guarantee(0 <= length && length < Interpreter::number_of_return_entries, "illegal length"); | 545 guarantee(0 <= length && length < Interpreter::number_of_return_entries, "illegal length"); |
525 return _return_entry[length].entry(state); | 546 return _return_entry[length].entry(state); |
526 } | 547 } |
527 | 548 |
528 | 549 |
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 | |
529 address TemplateInterpreter::deopt_entry(TosState state, int length) { | 562 address TemplateInterpreter::deopt_entry(TosState state, int length) { |
530 guarantee(0 <= length && length < Interpreter::number_of_deopt_entries, "illegal length"); | 563 guarantee(0 <= length && length < Interpreter::number_of_deopt_entries, "illegal length"); |
531 return _deopt_entry[length].entry(state); | 564 return _deopt_entry[length].entry(state); |
532 } | 565 } |
533 | 566 |