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 |