< prev index next >

src/hotspot/cpu/x86/stubGenerator_x86_64.cpp

Print this page


5911     // check for pending exceptions
5912     Label pending;
5913     __ cmpptr(Address(r15_thread, Thread::pending_exception_offset()), (int32_t)NULL_WORD);
5914     __ jcc(Assembler::notEqual, pending);
5915 
5916     if (has_res) {
5917       __ get_vm_result(rax, r15_thread);
5918     }
5919 
5920     __ ret(0);
5921 
5922     __ bind(pending);
5923 
5924     __ movptr(rax, Address(r15_thread, Thread::pending_exception_offset()));
5925     __ jump(RuntimeAddress(StubRoutines::forward_exception_entry()));
5926 
5927     // -------------
5928     // make sure all code is generated
5929     masm->flush();
5930 
5931     // The caller may not know the register mapping of the fields of the returned value
5932     // object, so it won't generate a valid oopmap for the call site. Hence, we can't
5933     // do InterfaceSupport::verify_stack().
5934     RuntimeStub* stub = RuntimeStub::new_runtime_stub(name, &buffer, frame_complete, frame_size_in_words, oop_maps, false,
5935                                                       /*can_verify_stack =*/false);
5936     return stub->entry_point();
5937   }
5938 
5939   // Initialization
5940   void generate_initial() {
5941     // Generates all stubs and initializes the entry points
5942 
5943     // This platform-specific settings are needed by generate_call_stub()
5944     create_control_words();
5945 
5946     // entry points that exist in all platforms Note: This is code
5947     // that could be shared among different platforms - however the
5948     // benefit seems to be smaller than the disadvantage of having a
5949     // much more complicated generator structure. See also comment in
5950     // stubRoutines.hpp.
5951 
5952     StubRoutines::_forward_exception_entry = generate_forward_exception();
5953 
5954     // Generate these first because they are called from other stubs
5955     StubRoutines::_load_value_type_fields_in_regs = generate_return_value_stub(CAST_FROM_FN_PTR(address, SharedRuntime::load_value_type_fields_in_regs), "load_value_type_fields_in_regs", false);




5911     // check for pending exceptions
5912     Label pending;
5913     __ cmpptr(Address(r15_thread, Thread::pending_exception_offset()), (int32_t)NULL_WORD);
5914     __ jcc(Assembler::notEqual, pending);
5915 
5916     if (has_res) {
5917       __ get_vm_result(rax, r15_thread);
5918     }
5919 
5920     __ ret(0);
5921 
5922     __ bind(pending);
5923 
5924     __ movptr(rax, Address(r15_thread, Thread::pending_exception_offset()));
5925     __ jump(RuntimeAddress(StubRoutines::forward_exception_entry()));
5926 
5927     // -------------
5928     // make sure all code is generated
5929     masm->flush();
5930 
5931     RuntimeStub* stub = RuntimeStub::new_runtime_stub(name, &buffer, frame_complete, frame_size_in_words, oop_maps, false);




5932     return stub->entry_point();
5933   }
5934 
5935   // Initialization
5936   void generate_initial() {
5937     // Generates all stubs and initializes the entry points
5938 
5939     // This platform-specific settings are needed by generate_call_stub()
5940     create_control_words();
5941 
5942     // entry points that exist in all platforms Note: This is code
5943     // that could be shared among different platforms - however the
5944     // benefit seems to be smaller than the disadvantage of having a
5945     // much more complicated generator structure. See also comment in
5946     // stubRoutines.hpp.
5947 
5948     StubRoutines::_forward_exception_entry = generate_forward_exception();
5949 
5950     // Generate these first because they are called from other stubs
5951     StubRoutines::_load_value_type_fields_in_regs = generate_return_value_stub(CAST_FROM_FN_PTR(address, SharedRuntime::load_value_type_fields_in_regs), "load_value_type_fields_in_regs", false);


< prev index next >