< prev index next >
src/hotspot/cpu/x86/stubGenerator_x86_64.cpp
Print this page
*** 334,359 ****
BLOCK_COMMENT("call_stub_return_address:");
return_address = __ pc();
// store result depending on type (everything that is not
// T_OBJECT, T_VALUETYPE, T_LONG, T_FLOAT or T_DOUBLE is treated as T_INT)
! __ movptr(c_rarg0, result);
! Label is_long, is_float, is_double, exit;
! __ movl(c_rarg1, result_type);
! __ cmpl(c_rarg1, T_OBJECT);
__ jcc(Assembler::equal, is_long);
! __ cmpl(c_rarg1, T_VALUETYPE);
__ jcc(Assembler::equal, is_long);
! __ cmpl(c_rarg1, T_LONG);
! __ jcc(Assembler::equal, is_long);
! __ cmpl(c_rarg1, T_FLOAT);
__ jcc(Assembler::equal, is_float);
! __ cmpl(c_rarg1, T_DOUBLE);
__ jcc(Assembler::equal, is_double);
// handle T_INT case
! __ movl(Address(c_rarg0, 0), rax);
__ BIND(exit);
// pop parameters
__ lea(rsp, rsp_after_call);
--- 334,359 ----
BLOCK_COMMENT("call_stub_return_address:");
return_address = __ pc();
// store result depending on type (everything that is not
// T_OBJECT, T_VALUETYPE, T_LONG, T_FLOAT or T_DOUBLE is treated as T_INT)
! __ movptr(r13, result);
! Label is_long, is_float, is_double, is_value, exit;
! __ movl(rbx, result_type);
! __ cmpl(rbx, T_OBJECT);
__ jcc(Assembler::equal, is_long);
! __ cmpl(rbx, T_VALUETYPE);
! __ jcc(Assembler::equal, is_value);
! __ cmpl(rbx, T_LONG);
__ jcc(Assembler::equal, is_long);
! __ cmpl(rbx, T_FLOAT);
__ jcc(Assembler::equal, is_float);
! __ cmpl(rbx, T_DOUBLE);
__ jcc(Assembler::equal, is_double);
// handle T_INT case
! __ movl(Address(r13, 0), rax);
__ BIND(exit);
// pop parameters
__ lea(rsp, rsp_after_call);
*** 411,430 ****
__ vzeroupper();
__ pop(rbp);
__ ret(0);
// handle return types different from T_INT
__ BIND(is_long);
! __ movq(Address(c_rarg0, 0), rax);
__ jmp(exit);
__ BIND(is_float);
! __ movflt(Address(c_rarg0, 0), xmm0);
__ jmp(exit);
__ BIND(is_double);
! __ movdbl(Address(c_rarg0, 0), xmm0);
__ jmp(exit);
return start;
}
--- 411,436 ----
__ vzeroupper();
__ pop(rbp);
__ ret(0);
// handle return types different from T_INT
+ __ BIND(is_value);
+ if (ValueTypeReturnedAsFields) {
+ // Handle value type returned as fields
+ __ store_value_type_fields_to_buf(NULL);
+ __ movptr(r13, result);
+ }
__ BIND(is_long);
! __ movq(Address(r13, 0), rax);
__ jmp(exit);
__ BIND(is_float);
! __ movflt(Address(r13, 0), xmm0);
__ jmp(exit);
__ BIND(is_double);
! __ movdbl(Address(r13, 0), xmm0);
__ jmp(exit);
return start;
}
*** 5896,5907 ****
// much more complicated generator structure. See also comment in
// stubRoutines.hpp.
StubRoutines::_forward_exception_entry = generate_forward_exception();
! StubRoutines::_call_stub_entry =
! generate_call_stub(StubRoutines::_call_stub_return_address);
// is referenced by megamorphic call
StubRoutines::_catch_exception_entry = generate_catch_exception();
// atomic calls
--- 5902,5916 ----
// much more complicated generator structure. See also comment in
// stubRoutines.hpp.
StubRoutines::_forward_exception_entry = generate_forward_exception();
! // Generate these first because they are called from other stubs
! 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);
! StubRoutines::_store_value_type_fields_to_buf = generate_return_value_stub(CAST_FROM_FN_PTR(address, SharedRuntime::store_value_type_fields_to_buf), "store_value_type_fields_to_buf", true);
!
! StubRoutines::_call_stub_entry = generate_call_stub(StubRoutines::_call_stub_return_address);
// is referenced by megamorphic call
StubRoutines::_catch_exception_entry = generate_catch_exception();
// atomic calls
*** 5982,5994 ****
}
if (vmIntrinsics::is_intrinsic_available(vmIntrinsics::_dtan)) {
StubRoutines::_dtan = generate_libmTan();
}
}
-
- 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);
- StubRoutines::_store_value_type_fields_to_buf = generate_return_value_stub(CAST_FROM_FN_PTR(address, SharedRuntime::store_value_type_fields_to_buf), "store_value_type_fields_to_buf", true);
}
void generate_all() {
// Generates all stubs and initializes the entry points
--- 5991,6000 ----
< prev index next >