hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp
changeset 7889 02144432d0e1
parent 7397 5b173b4ca846
child 8883 5569135acca3
equal deleted inserted replaced
7888:1be03febacc2 7889:02144432d0e1
     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() {