src/cpu/x86/vm/c1_Runtime1_x86.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
*** old/src/cpu/x86/vm/c1_Runtime1_x86.cpp Thu Apr 24 15:52:59 2014
--- new/src/cpu/x86/vm/c1_Runtime1_x86.cpp Thu Apr 24 15:52:59 2014
*** 46,56 ****
--- 46,56 ----
// Implementation of StubAssembler
int StubAssembler::call_RT(Register oop_result1, Register metadata_result, address entry, int args_size) {
// setup registers
const Register thread = NOT_LP64(rdi) LP64_ONLY(r15_thread); // is callee-saved register (Visual C++ calling conventions)
! assert(!(oop_result1->is_valid() || metadata_result->is_valid()) || oop_result1 != metadata_result, "registers must be different");
! assert(!(oop_result1.is_valid() || metadata_result.is_valid()) || oop_result1 != metadata_result, "registers must be different");
assert(oop_result1 != thread && metadata_result != thread, "registers must be different");
assert(args_size >= 0, "illegal args_size");
bool align_stack = false;
#ifdef _LP64
// At a method handle call, the stack may not be properly aligned
*** 108,121 ****
--- 108,121 ----
cmpptr(Address(thread, Thread::pending_exception_offset()), (int32_t)NULL_WORD);
jcc(Assembler::equal, L);
// exception pending => remove activation and forward to exception handler
movptr(rax, Address(thread, Thread::pending_exception_offset()));
// make sure that the vm_results are cleared
! if (oop_result1->is_valid()) {
! if (oop_result1.is_valid()) {
movptr(Address(thread, JavaThread::vm_result_offset()), NULL_WORD);
}
! if (metadata_result->is_valid()) {
! if (metadata_result.is_valid()) {
movptr(Address(thread, JavaThread::vm_result_2_offset()), NULL_WORD);
}
if (frame_size() == no_frame_size) {
leave();
jump(RuntimeAddress(StubRoutines::forward_exception_entry()));
*** 125,138 ****
--- 125,138 ----
jump(RuntimeAddress(Runtime1::entry_for(Runtime1::forward_exception_id)));
}
bind(L);
}
// get oop results if there are any and reset the values in the thread
! if (oop_result1->is_valid()) {
! if (oop_result1.is_valid()) {
get_vm_result(oop_result1, thread);
}
! if (metadata_result->is_valid()) {
! if (metadata_result.is_valid()) {
get_vm_result_2(metadata_result, thread);
}
return call_offset;
}
*** 326,367 ****
--- 326,367 ----
sasm->set_frame_size(frame_size_in_slots / VMRegImpl::slots_per_word );
// record saved value locations in an OopMap
// locations are offsets from sp after runtime call; num_rt_args is number of arguments in call, including thread
OopMap* map = new OopMap(frame_size_in_slots, 0);
! map->set_callee_saved(VMRegImpl::stack2reg(rax_off + num_rt_args), rax->as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(rcx_off + num_rt_args), rcx->as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(rdx_off + num_rt_args), rdx->as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(rbx_off + num_rt_args), rbx->as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(rsi_off + num_rt_args), rsi->as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(rdi_off + num_rt_args), rdi->as_VMReg());
#ifdef _LP64
! map->set_callee_saved(VMRegImpl::stack2reg(r8_off + num_rt_args), r8->as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(r9_off + num_rt_args), r9->as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(r10_off + num_rt_args), r10->as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(r11_off + num_rt_args), r11->as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(r12_off + num_rt_args), r12->as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(r13_off + num_rt_args), r13->as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(r14_off + num_rt_args), r14->as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(r15_off + num_rt_args), r15->as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(rax_off + num_rt_args), rax.as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(rcx_off + num_rt_args), rcx.as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(rdx_off + num_rt_args), rdx.as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(rbx_off + num_rt_args), rbx.as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(rsi_off + num_rt_args), rsi.as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(rdi_off + num_rt_args), rdi.as_VMReg());
+ #ifdef _LP64
! map->set_callee_saved(VMRegImpl::stack2reg(r8_off + num_rt_args), r8.as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(r9_off + num_rt_args), r9.as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(r10_off + num_rt_args), r10.as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(r11_off + num_rt_args), r11.as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(r12_off + num_rt_args), r12.as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(r13_off + num_rt_args), r13.as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(r14_off + num_rt_args), r14.as_VMReg());
! map->set_callee_saved(VMRegImpl::stack2reg(r15_off + num_rt_args), r15.as_VMReg());
// This is stupid but needed.
! map->set_callee_saved(VMRegImpl::stack2reg(raxH_off + num_rt_args), rax->as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(rcxH_off + num_rt_args), rcx->as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(rdxH_off + num_rt_args), rdx->as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(rbxH_off + num_rt_args), rbx->as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(rsiH_off + num_rt_args), rsi->as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(rdiH_off + num_rt_args), rdi->as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(r8H_off + num_rt_args), r8->as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(r9H_off + num_rt_args), r9->as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(r10H_off + num_rt_args), r10->as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(r11H_off + num_rt_args), r11->as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(r12H_off + num_rt_args), r12->as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(r13H_off + num_rt_args), r13->as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(r14H_off + num_rt_args), r14->as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(r15H_off + num_rt_args), r15->as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(raxH_off + num_rt_args), rax.as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(rcxH_off + num_rt_args), rcx.as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(rdxH_off + num_rt_args), rdx.as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(rbxH_off + num_rt_args), rbx.as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(rsiH_off + num_rt_args), rsi.as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(rdiH_off + num_rt_args), rdi.as_VMReg()->next());
+
! map->set_callee_saved(VMRegImpl::stack2reg(r8H_off + num_rt_args), r8.as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(r9H_off + num_rt_args), r9.as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(r10H_off + num_rt_args), r10.as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(r11H_off + num_rt_args), r11.as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(r12H_off + num_rt_args), r12.as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(r13H_off + num_rt_args), r13.as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(r14H_off + num_rt_args), r14.as_VMReg()->next());
! map->set_callee_saved(VMRegImpl::stack2reg(r15H_off + num_rt_args), r15.as_VMReg()->next());
#endif // _LP64
if (save_fpu_registers) {
if (UseSSE < 2) {
int fpu_off = float_regs_as_doubles_off;
*** 378,388 ****
--- 378,388 ----
}
if (UseSSE >= 2) {
int xmm_off = xmm_regs_as_doubles_off;
for (int n = 0; n < FrameMap::nof_xmm_regs; n++) {
! VMReg xmm_name_0 = as_XMMRegister(n)->as_VMReg();
! VMReg xmm_name_0 = as_XMMRegister(n).as_VMReg();
map->set_callee_saved(VMRegImpl::stack2reg(xmm_off + num_rt_args), xmm_name_0);
// %%% This is really a waste but we'll keep things as they were for now
if (true) {
map->set_callee_saved(VMRegImpl::stack2reg(xmm_off + 1 + num_rt_args), xmm_name_0->next());
}
*** 391,401 ****
--- 391,401 ----
assert(xmm_off == float_regs_as_doubles_off, "incorrect number of xmm registers");
} else if (UseSSE == 1) {
int xmm_off = xmm_regs_as_doubles_off;
for (int n = 0; n < FrameMap::nof_xmm_regs; n++) {
! VMReg xmm_name_0 = as_XMMRegister(n)->as_VMReg();
! VMReg xmm_name_0 = as_XMMRegister(n).as_VMReg();
map->set_callee_saved(VMRegImpl::stack2reg(xmm_off + num_rt_args), xmm_name_0);
xmm_off += 2;
}
assert(xmm_off == float_regs_as_doubles_off, "incorrect number of xmm registers");
}
src/cpu/x86/vm/c1_Runtime1_x86.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File