1 /* |
1 /* |
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
817 |
817 |
818 |
818 |
819 // Set the method data pointer for the current bcp. |
819 // Set the method data pointer for the current bcp. |
820 void InterpreterMacroAssembler::set_method_data_pointer_for_bcp() { |
820 void InterpreterMacroAssembler::set_method_data_pointer_for_bcp() { |
821 assert(ProfileInterpreter, "must be profiling interpreter"); |
821 assert(ProfileInterpreter, "must be profiling interpreter"); |
822 Label zero_continue; |
822 Label set_mdp; |
823 push(rax); |
823 push(rax); |
824 push(rbx); |
824 push(rbx); |
825 |
825 |
826 get_method(rbx); |
826 get_method(rbx); |
827 // Test MDO to avoid the call if it is NULL. |
827 // Test MDO to avoid the call if it is NULL. |
828 movptr(rax, Address(rbx, in_bytes(methodOopDesc::method_data_offset()))); |
828 movptr(rax, Address(rbx, in_bytes(methodOopDesc::method_data_offset()))); |
829 testptr(rax, rax); |
829 testptr(rax, rax); |
830 jcc(Assembler::zero, zero_continue); |
830 jcc(Assembler::zero, set_mdp); |
831 |
|
832 // rbx,: method |
831 // rbx,: method |
833 // rsi: bcp |
832 // rsi: bcp |
834 call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::bcp_to_di), rbx, rsi); |
833 call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::bcp_to_di), rbx, rsi); |
835 // rax,: mdi |
834 // rax,: mdi |
836 |
835 // mdo is guaranteed to be non-zero here, we checked for it before the call. |
837 movptr(rbx, Address(rbx, in_bytes(methodOopDesc::method_data_offset()))); |
836 movptr(rbx, Address(rbx, in_bytes(methodOopDesc::method_data_offset()))); |
838 testptr(rbx, rbx); |
|
839 jcc(Assembler::zero, zero_continue); |
|
840 addptr(rbx, in_bytes(methodDataOopDesc::data_offset())); |
837 addptr(rbx, in_bytes(methodDataOopDesc::data_offset())); |
841 addptr(rbx, rax); |
838 addptr(rax, rbx); |
842 movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize), rbx); |
839 bind(set_mdp); |
843 |
840 movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize), rax); |
844 bind(zero_continue); |
|
845 pop(rbx); |
841 pop(rbx); |
846 pop(rax); |
842 pop(rax); |
847 } |
843 } |
848 |
844 |
849 void InterpreterMacroAssembler::verify_method_data_pointer() { |
845 void InterpreterMacroAssembler::verify_method_data_pointer() { |