< prev index next >

src/cpu/x86/vm/interp_masm_x86.cpp

Print this page




  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "interp_masm_x86.hpp"
  27 #include "interpreter/interpreter.hpp"
  28 #include "interpreter/interpreterRuntime.hpp"
  29 #include "logging/log.hpp"
  30 #include "memory/vtBuffer.hpp"
  31 #include "oops/arrayOop.hpp"
  32 #include "oops/markOop.hpp"
  33 #include "oops/methodData.hpp"
  34 #include "oops/method.hpp"

  35 #include "prims/jvmtiExport.hpp"
  36 #include "prims/jvmtiThreadState.hpp"
  37 #include "runtime/basicLock.hpp"
  38 #include "runtime/biasedLocking.hpp"
  39 #include "runtime/sharedRuntime.hpp"
  40 #include "runtime/thread.inline.hpp"
  41 
  42 // Implementation of InterpreterMacroAssembler
  43 
  44 void InterpreterMacroAssembler::jump_to_entry(address entry) {
  45   assert(entry, "Entry must have been generated by now");
  46   jump(RuntimeAddress(entry));
  47 }
  48 
  49 void InterpreterMacroAssembler::profile_obj_type(Register obj, const Address& mdo_addr) {
  50   Label update, next, none;
  51 
  52   verify_oop(obj);
  53 
  54   testptr(obj, obj);


1111 
1112     NOT_LP64(get_thread(rthread);)
1113 
1114     cmpl(Address(rthread, JavaThread::stack_guard_state_offset()), JavaThread::stack_guard_enabled);
1115     jcc(Assembler::equal, no_reserved_zone_enabling);
1116 
1117     cmpptr(rbx, Address(rthread, JavaThread::reserved_stack_activation_offset()));
1118     jcc(Assembler::lessEqual, no_reserved_zone_enabling);
1119 
1120     call_VM_leaf(
1121       CAST_FROM_FN_PTR(address, SharedRuntime::enable_stack_reserved_zone), rthread);
1122     push(rthread);
1123     call_VM(noreg, CAST_FROM_FN_PTR(address,
1124                    InterpreterRuntime::throw_delayed_StackOverflowError));
1125     should_not_reach_here();
1126 
1127     bind(no_reserved_zone_enabling);
1128   }
1129   if (load_values) {
1130     // We are returning a value type, load its fields into registers

1131     super_call_VM_leaf(StubRoutines::load_value_type_fields_in_regs());



1132 










1133     // call above kills the value in rbx. Reload it.
1134     movptr(rbx, Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize));
1135   }
1136   leave();                           // remove frame anchor
1137   pop(ret_addr);                     // get return address
1138   mov(rsp, rbx);                     // set sp to sender sp
1139 }
1140 
1141 void InterpreterMacroAssembler::get_method_counters(Register method,
1142                                                     Register mcs, Label& skip) {
1143   Label has_counters;
1144   movptr(mcs, Address(method, Method::method_counters_offset()));
1145   testptr(mcs, mcs);
1146   jcc(Assembler::notZero, has_counters);
1147   call_VM(noreg, CAST_FROM_FN_PTR(address,
1148           InterpreterRuntime::build_method_counters), method);
1149   movptr(mcs, Address(method,Method::method_counters_offset()));
1150   testptr(mcs, mcs);
1151   jcc(Assembler::zero, skip); // No MethodCounters allocated, OutOfMemory
1152   bind(has_counters);




  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "interp_masm_x86.hpp"
  27 #include "interpreter/interpreter.hpp"
  28 #include "interpreter/interpreterRuntime.hpp"
  29 #include "logging/log.hpp"
  30 #include "memory/vtBuffer.hpp"
  31 #include "oops/arrayOop.hpp"
  32 #include "oops/markOop.hpp"
  33 #include "oops/methodData.hpp"
  34 #include "oops/method.hpp"
  35 #include "oops/valueKlass.hpp"
  36 #include "prims/jvmtiExport.hpp"
  37 #include "prims/jvmtiThreadState.hpp"
  38 #include "runtime/basicLock.hpp"
  39 #include "runtime/biasedLocking.hpp"
  40 #include "runtime/sharedRuntime.hpp"
  41 #include "runtime/thread.inline.hpp"
  42 
  43 // Implementation of InterpreterMacroAssembler
  44 
  45 void InterpreterMacroAssembler::jump_to_entry(address entry) {
  46   assert(entry, "Entry must have been generated by now");
  47   jump(RuntimeAddress(entry));
  48 }
  49 
  50 void InterpreterMacroAssembler::profile_obj_type(Register obj, const Address& mdo_addr) {
  51   Label update, next, none;
  52 
  53   verify_oop(obj);
  54 
  55   testptr(obj, obj);


1112 
1113     NOT_LP64(get_thread(rthread);)
1114 
1115     cmpl(Address(rthread, JavaThread::stack_guard_state_offset()), JavaThread::stack_guard_enabled);
1116     jcc(Assembler::equal, no_reserved_zone_enabling);
1117 
1118     cmpptr(rbx, Address(rthread, JavaThread::reserved_stack_activation_offset()));
1119     jcc(Assembler::lessEqual, no_reserved_zone_enabling);
1120 
1121     call_VM_leaf(
1122       CAST_FROM_FN_PTR(address, SharedRuntime::enable_stack_reserved_zone), rthread);
1123     push(rthread);
1124     call_VM(noreg, CAST_FROM_FN_PTR(address,
1125                    InterpreterRuntime::throw_delayed_StackOverflowError));
1126     should_not_reach_here();
1127 
1128     bind(no_reserved_zone_enabling);
1129   }
1130   if (load_values) {
1131     // We are returning a value type, load its fields into registers
1132 #ifndef _LP64
1133     super_call_VM_leaf(StubRoutines::load_value_type_fields_in_regs());
1134 #else
1135     load_klass(rdi, rax);
1136     movptr(rdi, Address(rdi, ValueKlass::unpack_handler_offset()));
1137 
1138     Label skip;
1139     testptr(rdi, rdi);
1140     jcc(Assembler::equal, skip);
1141 
1142     // Load fields from a buffered value with a value class specific
1143     // handler
1144     call(rdi);
1145 
1146     bind(skip);
1147 #endif
1148     // call above kills the value in rbx. Reload it.
1149     movptr(rbx, Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize));
1150   }
1151   leave();                           // remove frame anchor
1152   pop(ret_addr);                     // get return address
1153   mov(rsp, rbx);                     // set sp to sender sp
1154 }
1155 
1156 void InterpreterMacroAssembler::get_method_counters(Register method,
1157                                                     Register mcs, Label& skip) {
1158   Label has_counters;
1159   movptr(mcs, Address(method, Method::method_counters_offset()));
1160   testptr(mcs, mcs);
1161   jcc(Assembler::notZero, has_counters);
1162   call_VM(noreg, CAST_FROM_FN_PTR(address,
1163           InterpreterRuntime::build_method_counters), method);
1164   movptr(mcs, Address(method,Method::method_counters_offset()));
1165   testptr(mcs, mcs);
1166   jcc(Assembler::zero, skip); // No MethodCounters allocated, OutOfMemory
1167   bind(has_counters);


< prev index next >