Skip to content

Commit 1c56072

Browse files
Srinivas Vamsi ParasaSandhya Viswanathan
authored andcommitted
8360775: Fix Shenandoah GC test failures when APX is enabled
Reviewed-by: sviswanathan, jbhateja, epeter
1 parent f153e41 commit 1c56072

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

src/hotspot/cpu/x86/assembler_x86.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15761,6 +15761,8 @@ void Assembler::pusha_uncached() { // 64bit
1576115761
// Push pair of original stack pointer along with remaining registers
1576215762
// at 16B aligned boundary.
1576315763
push2p(rax, r31);
15764+
// Restore the original contents of RAX register.
15765+
movq(rax, Address(rax));
1576415766
push2p(r30, r29);
1576515767
push2p(r28, r27);
1576615768
push2p(r26, r25);

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

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm,
353353

354354
// The rest is saved with the optimized path
355355

356-
uint num_saved_regs = 4 + (dst != rax ? 1 : 0) + 4;
356+
uint num_saved_regs = 4 + (dst != rax ? 1 : 0) + 4 + (UseAPX ? 16 : 0);
357357
__ subptr(rsp, num_saved_regs * wordSize);
358358
uint slot = num_saved_regs;
359359
if (dst != rax) {
@@ -367,6 +367,25 @@ void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm,
367367
__ movptr(Address(rsp, (--slot) * wordSize), r9);
368368
__ movptr(Address(rsp, (--slot) * wordSize), r10);
369369
__ movptr(Address(rsp, (--slot) * wordSize), r11);
370+
// Save APX extended registers r16–r31 if enabled
371+
if (UseAPX) {
372+
__ movptr(Address(rsp, (--slot) * wordSize), r16);
373+
__ movptr(Address(rsp, (--slot) * wordSize), r17);
374+
__ movptr(Address(rsp, (--slot) * wordSize), r18);
375+
__ movptr(Address(rsp, (--slot) * wordSize), r19);
376+
__ movptr(Address(rsp, (--slot) * wordSize), r20);
377+
__ movptr(Address(rsp, (--slot) * wordSize), r21);
378+
__ movptr(Address(rsp, (--slot) * wordSize), r22);
379+
__ movptr(Address(rsp, (--slot) * wordSize), r23);
380+
__ movptr(Address(rsp, (--slot) * wordSize), r24);
381+
__ movptr(Address(rsp, (--slot) * wordSize), r25);
382+
__ movptr(Address(rsp, (--slot) * wordSize), r26);
383+
__ movptr(Address(rsp, (--slot) * wordSize), r27);
384+
__ movptr(Address(rsp, (--slot) * wordSize), r28);
385+
__ movptr(Address(rsp, (--slot) * wordSize), r29);
386+
__ movptr(Address(rsp, (--slot) * wordSize), r30);
387+
__ movptr(Address(rsp, (--slot) * wordSize), r31);
388+
}
370389
// r12-r15 are callee saved in all calling conventions
371390
assert(slot == 0, "must use all slots");
372391

@@ -398,6 +417,25 @@ void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm,
398417
__ super_call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_phantom), arg0, arg1);
399418
}
400419

420+
// Restore APX extended registers r31–r16 if previously saved
421+
if (UseAPX) {
422+
__ movptr(r31, Address(rsp, (slot++) * wordSize));
423+
__ movptr(r30, Address(rsp, (slot++) * wordSize));
424+
__ movptr(r29, Address(rsp, (slot++) * wordSize));
425+
__ movptr(r28, Address(rsp, (slot++) * wordSize));
426+
__ movptr(r27, Address(rsp, (slot++) * wordSize));
427+
__ movptr(r26, Address(rsp, (slot++) * wordSize));
428+
__ movptr(r25, Address(rsp, (slot++) * wordSize));
429+
__ movptr(r24, Address(rsp, (slot++) * wordSize));
430+
__ movptr(r23, Address(rsp, (slot++) * wordSize));
431+
__ movptr(r22, Address(rsp, (slot++) * wordSize));
432+
__ movptr(r21, Address(rsp, (slot++) * wordSize));
433+
__ movptr(r20, Address(rsp, (slot++) * wordSize));
434+
__ movptr(r19, Address(rsp, (slot++) * wordSize));
435+
__ movptr(r18, Address(rsp, (slot++) * wordSize));
436+
__ movptr(r17, Address(rsp, (slot++) * wordSize));
437+
__ movptr(r16, Address(rsp, (slot++) * wordSize));
438+
}
401439
__ movptr(r11, Address(rsp, (slot++) * wordSize));
402440
__ movptr(r10, Address(rsp, (slot++) * wordSize));
403441
__ movptr(r9, Address(rsp, (slot++) * wordSize));

0 commit comments

Comments
 (0)