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);
|