@@ -512,6 +512,19 @@ void ShenandoahBarrierSetAssembler::load_at(MacroAssembler* masm, DecoratorSet d
512
512
// 3: apply keep-alive barrier if needed
513
513
if (ShenandoahBarrierSet::need_keep_alive_barrier (decorators, type)) {
514
514
__ 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
+
515
528
Register thread = NOT_LP64 (tmp_thread) LP64_ONLY (r15_thread);
516
529
assert_different_registers (dst, tmp1, tmp_thread);
517
530
if (!thread->is_valid ()) {
@@ -527,6 +540,15 @@ void ShenandoahBarrierSetAssembler::load_at(MacroAssembler* masm, DecoratorSet d
527
540
tmp1 /* tmp */ ,
528
541
true /* tosca_live */ ,
529
542
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 );
530
552
__ pop_IU_state ();
531
553
}
532
554
}
0 commit comments