1693 |
1693 |
1694 if (UseLoopCounter) { |
1694 if (UseLoopCounter) { |
1695 if (ProfileInterpreter) { |
1695 if (ProfileInterpreter) { |
1696 // Out-of-line code to allocate method data oop. |
1696 // Out-of-line code to allocate method data oop. |
1697 __ bind(profile_method); |
1697 __ bind(profile_method); |
1698 __ call_VM(noreg, |
1698 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method)); |
1699 CAST_FROM_FN_PTR(address, |
|
1700 InterpreterRuntime::profile_method), r13); |
|
1701 __ load_unsigned_byte(rbx, Address(r13, 0)); // restore target bytecode |
1699 __ load_unsigned_byte(rbx, Address(r13, 0)); // restore target bytecode |
1702 __ movptr(rcx, Address(rbp, method_offset)); |
1700 __ set_method_data_pointer_for_bcp(); |
1703 __ movptr(rcx, Address(rcx, |
|
1704 in_bytes(methodOopDesc::method_data_offset()))); |
|
1705 __ movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize), |
|
1706 rcx); |
|
1707 __ test_method_data_pointer(rcx, dispatch); |
|
1708 // offset non-null mdp by MDO::data_offset() + IR::profile_method() |
|
1709 __ addptr(rcx, in_bytes(methodDataOopDesc::data_offset())); |
|
1710 __ addptr(rcx, rax); |
|
1711 __ movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize), |
|
1712 rcx); |
|
1713 __ jmp(dispatch); |
1701 __ jmp(dispatch); |
1714 } |
1702 } |
1715 |
1703 |
1716 if (UseOnStackReplacement) { |
1704 if (UseOnStackReplacement) { |
1717 // invocation counter overflow |
1705 // invocation counter overflow |