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