src/cpu/x86/vm/c1_Runtime1_x86.cpp
Print this page
*** 1579,1589 ****
__ movptr(rax, (int)id);
__ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), rax);
__ should_not_reach_here();
break;
}
-
__ push(rax);
__ push(rdx);
const Register pre_val = rax;
const Register thread = NOT_LP64(rax) LP64_ONLY(r15_thread);
--- 1579,1588 ----
*** 1603,1614 ****
Label done;
Label runtime;
// Can we store original value in the thread's buffer?
- LP64_ONLY(__ movslq(tmp, queue_index);)
#ifdef _LP64
__ cmpq(tmp, 0);
#else
__ cmpl(queue_index, 0);
#endif
__ jcc(Assembler::equal, runtime);
--- 1602,1613 ----
Label done;
Label runtime;
// Can we store original value in the thread's buffer?
#ifdef _LP64
+ __ movslq(tmp, queue_index);
__ cmpq(tmp, 0);
#else
__ cmpl(queue_index, 0);
#endif
__ jcc(Assembler::equal, runtime);
*** 1626,1642 ****
f.load_argument(0, pre_val);
__ movptr(Address(tmp, 0), pre_val);
__ jmp(done);
__ bind(runtime);
- // load the pre-value
__ push(rcx);
f.load_argument(0, rcx);
__ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_pre), rcx, thread);
__ pop(rcx);
-
__ bind(done);
__ pop(rdx);
__ pop(rax);
}
break;
--- 1625,1661 ----
f.load_argument(0, pre_val);
__ movptr(Address(tmp, 0), pre_val);
__ jmp(done);
__ bind(runtime);
__ push(rcx);
+ #ifdef _LP64
+ __ push(r8);
+ __ push(r9);
+ __ push(r10);
+ __ push(r11);
+ # ifndef _WIN64
+ __ push(rdi);
+ __ push(rsi);
+ # endif
+ #endif
+ // load the pre-value
f.load_argument(0, rcx);
__ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_pre), rcx, thread);
+ #ifdef _LP64
+ # ifndef _WIN64
+ __ pop(rsi);
+ __ pop(rdi);
+ # endif
+ __ pop(r11);
+ __ pop(r10);
+ __ pop(r9);
+ __ pop(r8);
+ #endif
__ pop(rcx);
__ bind(done);
+
__ pop(rdx);
__ pop(rax);
}
break;
*** 1662,1687 ****
PtrQueue::byte_offset_of_index()));
Address buffer(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
PtrQueue::byte_offset_of_buf()));
__ push(rax);
! __ push(rdx);
NOT_LP64(__ get_thread(thread);)
ExternalAddress cardtable((address)ct->byte_map_base);
assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
! const Register card_addr = rdx;
#ifdef _LP64
const Register tmp = rscratch1;
f.load_argument(0, card_addr);
__ shrq(card_addr, CardTableModRefBS::card_shift);
__ lea(tmp, cardtable);
// get the address of the card
__ addq(card_addr, tmp);
#else
! const Register card_index = rdx;
f.load_argument(0, card_index);
__ shrl(card_index, CardTableModRefBS::card_shift);
Address index(noreg, card_index, Address::times_1);
__ leal(card_addr, __ as_Address(ArrayAddress(cardtable, index)));
--- 1681,1706 ----
PtrQueue::byte_offset_of_index()));
Address buffer(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
PtrQueue::byte_offset_of_buf()));
__ push(rax);
! __ push(rcx);
NOT_LP64(__ get_thread(thread);)
ExternalAddress cardtable((address)ct->byte_map_base);
assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
! const Register card_addr = rcx;
#ifdef _LP64
const Register tmp = rscratch1;
f.load_argument(0, card_addr);
__ shrq(card_addr, CardTableModRefBS::card_shift);
__ lea(tmp, cardtable);
// get the address of the card
__ addq(card_addr, tmp);
#else
! const Register card_index = rcx;
f.load_argument(0, card_index);
__ shrl(card_index, CardTableModRefBS::card_shift);
Address index(noreg, card_index, Address::times_1);
__ leal(card_addr, __ as_Address(ArrayAddress(cardtable, index)));
*** 1714,1729 ****
__ pop(rbx);
__ jmp(done);
__ bind(runtime);
! NOT_LP64(__ push(rcx);)
__ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_post), card_addr, thread);
! NOT_LP64(__ pop(rcx);)
!
! __ bind(done);
__ pop(rdx);
__ pop(rax);
}
break;
#endif // !SERIALGC
--- 1733,1768 ----
__ pop(rbx);
__ jmp(done);
__ bind(runtime);
! __ push(rdx);
! #ifdef _LP64
! __ push(r8);
! __ push(r9);
! __ push(r10);
! __ push(r11);
! # ifndef _WIN64
! __ push(rdi);
! __ push(rsi);
! # endif
! #endif
__ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_post), card_addr, thread);
! #ifdef _LP64
! # ifndef _WIN64
! __ pop(rsi);
! __ pop(rdi);
! # endif
! __ pop(r11);
! __ pop(r10);
! __ pop(r9);
! __ pop(r8);
! #endif
__ pop(rdx);
+ __ bind(done);
+
+ __ pop(rcx);
__ pop(rax);
}
break;
#endif // !SERIALGC