3287 |
3287 |
3288 load_invoke_cp_cache_entry(byte_no, G5_callsite, noreg, Rret, |
3288 load_invoke_cp_cache_entry(byte_no, G5_callsite, noreg, Rret, |
3289 /*virtual*/ false, /*vfinal*/ false, /*indy*/ true); |
3289 /*virtual*/ false, /*vfinal*/ false, /*indy*/ true); |
3290 __ mov(SP, O5_savedSP); // record SP that we wanted the callee to restore |
3290 __ mov(SP, O5_savedSP); // record SP that we wanted the callee to restore |
3291 |
3291 |
3292 __ verify_oop(G5_callsite); |
|
3293 |
|
3294 // profile this call |
3292 // profile this call |
3295 __ profile_call(O4); |
3293 __ profile_call(O4); |
3296 |
3294 |
3297 // get return address |
3295 // get return address |
3298 AddressLiteral table(Interpreter::return_5_addrs_by_index_table()); |
3296 AddressLiteral table(Interpreter::return_5_addrs_by_index_table()); |
3301 // Make sure we don't need to mask Rret for tosBits after the above shift |
3299 // Make sure we don't need to mask Rret for tosBits after the above shift |
3302 ConstantPoolCacheEntry::verify_tosBits(); |
3300 ConstantPoolCacheEntry::verify_tosBits(); |
3303 __ sll(Rret, LogBytesPerWord, Rret); |
3301 __ sll(Rret, LogBytesPerWord, Rret); |
3304 __ ld_ptr(Rtemp, Rret, Rret); // get return address |
3302 __ ld_ptr(Rtemp, Rret, Rret); // get return address |
3305 |
3303 |
|
3304 __ verify_oop(G5_callsite); |
3306 __ load_heap_oop(G5_callsite, __ delayed_value(java_lang_invoke_CallSite::target_offset_in_bytes, Rscratch), G3_method_handle); |
3305 __ load_heap_oop(G5_callsite, __ delayed_value(java_lang_invoke_CallSite::target_offset_in_bytes, Rscratch), G3_method_handle); |
3307 __ null_check(G3_method_handle); |
3306 __ null_check(G3_method_handle); |
|
3307 __ verify_oop(G3_method_handle); |
3308 |
3308 |
3309 // Adjust Rret first so Llast_SP can be same as Rret |
3309 // Adjust Rret first so Llast_SP can be same as Rret |
3310 __ add(Rret, -frame::pc_return_offset, O7); |
3310 __ add(Rret, -frame::pc_return_offset, O7); |
3311 __ add(Lesp, BytesPerWord, Gargs); // setup parameter pointer |
3311 __ add(Lesp, BytesPerWord, Gargs); // setup parameter pointer |
3312 __ jump_to_method_handle_entry(G3_method_handle, Rtemp, /* emit_delayed_nop */ false); |
3312 __ jump_to_method_handle_entry(G3_method_handle, Rtemp, /* emit_delayed_nop */ false); |