< prev index next >
src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.cpp
Print this page
rev 59971 : 8250588: Shenandoah: LRB needs to save/restore fp registers for runtime call
*** 44,53 ****
--- 44,77 ----
#define __ masm->
address ShenandoahBarrierSetAssembler::_shenandoah_lrb = NULL;
+ static void save_xmm_registers(MacroAssembler* masm) {
+ __ subptr(rsp, 64);
+ __ movdbl(Address(rsp, 0), xmm0);
+ __ movdbl(Address(rsp, 8), xmm1);
+ __ movdbl(Address(rsp, 16), xmm2);
+ __ movdbl(Address(rsp, 24), xmm3);
+ __ movdbl(Address(rsp, 32), xmm4);
+ __ movdbl(Address(rsp, 40), xmm5);
+ __ movdbl(Address(rsp, 48), xmm6);
+ __ movdbl(Address(rsp, 56), xmm7);
+ }
+
+ static void restore_xmm_registers(MacroAssembler* masm) {
+ __ movdbl(xmm0, Address(rsp, 0));
+ __ movdbl(xmm1, Address(rsp, 8));
+ __ movdbl(xmm2, Address(rsp, 16));
+ __ movdbl(xmm3, Address(rsp, 24));
+ __ movdbl(xmm4, Address(rsp, 32));
+ __ movdbl(xmm5, Address(rsp, 40));
+ __ movdbl(xmm6, Address(rsp, 48));
+ __ movdbl(xmm7, Address(rsp, 56));
+ __ addptr(rsp, 64);
+ }
+
void ShenandoahBarrierSetAssembler::arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
Register src, Register dst, Register count) {
bool dest_uninitialized = (decorators & IS_DEST_UNINITIALIZED) != 0;
*** 288,298 ****
--- 312,324 ----
// we can clobber it, since it is outgoing register
__ lea(src_addr, src);
}
+ save_xmm_registers(masm);
__ call(RuntimeAddress(CAST_FROM_FN_PTR(address, ShenandoahBarrierSetAssembler::shenandoah_lrb())));
+ restore_xmm_registers(masm);
if (need_addr_setup) {
if (dst != rax) {
__ movptr(dst, rax);
__ pop(rax);
*** 366,376 ****
--- 392,405 ----
__ push(r15);
#endif
assert_different_registers(dst, rsi);
__ lea(rsi, src);
+
+ save_xmm_registers(masm);
__ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_native), dst, rsi);
+ restore_xmm_registers(masm);
#ifdef _LP64
__ pop(r15);
__ pop(r14);
__ pop(r13);
*** 512,530 ****
if (ShenandoahBarrierSet::need_keep_alive_barrier(decorators, type)) {
__ push_IU_state();
// That path can be reached from the c2i adapter with live fp
// arguments in registers.
LP64_ONLY(assert(Argument::n_float_register_parameters_j == 8, "8 fp registers to save at java call"));
! __ subptr(rsp, 64);
! __ movdbl(Address(rsp, 0), xmm0);
! __ movdbl(Address(rsp, 8), xmm1);
! __ movdbl(Address(rsp, 16), xmm2);
! __ movdbl(Address(rsp, 24), xmm3);
! __ movdbl(Address(rsp, 32), xmm4);
! __ movdbl(Address(rsp, 40), xmm5);
! __ movdbl(Address(rsp, 48), xmm6);
! __ movdbl(Address(rsp, 56), xmm7);
Register thread = NOT_LP64(tmp_thread) LP64_ONLY(r15_thread);
assert_different_registers(dst, tmp1, tmp_thread);
if (!thread->is_valid()) {
thread = rdx;
--- 541,551 ----
if (ShenandoahBarrierSet::need_keep_alive_barrier(decorators, type)) {
__ push_IU_state();
// That path can be reached from the c2i adapter with live fp
// arguments in registers.
LP64_ONLY(assert(Argument::n_float_register_parameters_j == 8, "8 fp registers to save at java call"));
! save_xmm_registers(masm);
Register thread = NOT_LP64(tmp_thread) LP64_ONLY(r15_thread);
assert_different_registers(dst, tmp1, tmp_thread);
if (!thread->is_valid()) {
thread = rdx;
*** 537,555 ****
dst /* pre_val */,
thread /* thread */,
tmp1 /* tmp */,
true /* tosca_live */,
true /* expand_call */);
! __ movdbl(xmm0, Address(rsp, 0));
! __ movdbl(xmm1, Address(rsp, 8));
! __ movdbl(xmm2, Address(rsp, 16));
! __ movdbl(xmm3, Address(rsp, 24));
! __ movdbl(xmm4, Address(rsp, 32));
! __ movdbl(xmm5, Address(rsp, 40));
! __ movdbl(xmm6, Address(rsp, 48));
! __ movdbl(xmm7, Address(rsp, 56));
! __ addptr(rsp, 64);
__ pop_IU_state();
}
}
void ShenandoahBarrierSetAssembler::store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
--- 558,568 ----
dst /* pre_val */,
thread /* thread */,
tmp1 /* tmp */,
true /* tosca_live */,
true /* expand_call */);
! restore_xmm_registers(masm);
__ pop_IU_state();
}
}
void ShenandoahBarrierSetAssembler::store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
< prev index next >