Skip to content

Commit ba7d18d

Browse files
committed
8237776: Shenandoah: Wrong result with Lucene test
Reviewed-by: rkennke, zgu, shade
1 parent 9ec5da0 commit ba7d18d

File tree

1 file changed

+22
-0
lines changed

1 file changed

+22
-0
lines changed

src/hotspot/cpu/x86/gc/shenandoah/shenandoahBarrierSetAssembler_x86.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,19 @@ void ShenandoahBarrierSetAssembler::load_at(MacroAssembler* masm, DecoratorSet d
512512
// 3: apply keep-alive barrier if needed
513513
if (ShenandoahBarrierSet::need_keep_alive_barrier(decorators, type)) {
514514
__ push_IU_state();
515+
// That path can be reached from the c2i adapter with live fp
516+
// arguments in registers.
517+
LP64_ONLY(assert(Argument::n_float_register_parameters_j == 8, "8 fp registers to save at java call"));
518+
__ subptr(rsp, 64);
519+
__ movdbl(Address(rsp, 0), xmm0);
520+
__ movdbl(Address(rsp, 8), xmm1);
521+
__ movdbl(Address(rsp, 16), xmm2);
522+
__ movdbl(Address(rsp, 24), xmm3);
523+
__ movdbl(Address(rsp, 32), xmm4);
524+
__ movdbl(Address(rsp, 40), xmm5);
525+
__ movdbl(Address(rsp, 48), xmm6);
526+
__ movdbl(Address(rsp, 56), xmm7);
527+
515528
Register thread = NOT_LP64(tmp_thread) LP64_ONLY(r15_thread);
516529
assert_different_registers(dst, tmp1, tmp_thread);
517530
if (!thread->is_valid()) {
@@ -527,6 +540,15 @@ void ShenandoahBarrierSetAssembler::load_at(MacroAssembler* masm, DecoratorSet d
527540
tmp1 /* tmp */,
528541
true /* tosca_live */,
529542
true /* expand_call */);
543+
__ movdbl(xmm0, Address(rsp, 0));
544+
__ movdbl(xmm1, Address(rsp, 8));
545+
__ movdbl(xmm2, Address(rsp, 16));
546+
__ movdbl(xmm3, Address(rsp, 24));
547+
__ movdbl(xmm4, Address(rsp, 32));
548+
__ movdbl(xmm5, Address(rsp, 40));
549+
__ movdbl(xmm6, Address(rsp, 48));
550+
__ movdbl(xmm7, Address(rsp, 56));
551+
__ addptr(rsp, 64);
530552
__ pop_IU_state();
531553
}
532554
}

0 commit comments

Comments
 (0)