< prev index next >
src/cpu/aarch64/vm/c1_Runtime1_aarch64.cpp
Print this page
*** 1146,1158 ****
}
break;
#if INCLUDE_ALL_GCS
- // Registers to be saved around calls to g1_wb_pre or g1_wb_post
- #define G1_SAVE_REGS (RegSet::range(r0, r18) - RegSet::of(rscratch1, rscratch2))
-
case g1_pre_barrier_slow_id:
{
StubFrame f(sasm, "g1_pre_barrier", dont_gc_arguments);
// arg0 : previous value of memory
--- 1146,1155 ----
*** 1190,1203 ****
f.load_argument(0, rscratch2);
__ str(rscratch2, Address(tmp, 0));
__ b(done);
__ bind(runtime);
! __ push(G1_SAVE_REGS, sp);
f.load_argument(0, pre_val);
__ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_pre), pre_val, thread);
! __ pop(G1_SAVE_REGS, sp);
__ bind(done);
}
break;
case g1_post_barrier_slow_id:
{
--- 1187,1200 ----
f.load_argument(0, rscratch2);
__ str(rscratch2, Address(tmp, 0));
__ b(done);
__ bind(runtime);
! __ push_call_clobbered_registers();
f.load_argument(0, pre_val);
__ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_pre), pre_val, thread);
! __ pop_call_clobbered_registers();
__ bind(done);
}
break;
case g1_post_barrier_slow_id:
{
*** 1221,1269 ****
Address queue_index(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
DirtyCardQueue::byte_offset_of_index()));
Address buffer(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
DirtyCardQueue::byte_offset_of_buf()));
! const Register card_addr = rscratch2;
! ExternalAddress cardtable((address) ct->byte_map_base);
!
! f.load_argument(0, card_addr);
! __ lsr(card_addr, card_addr, CardTableModRefBS::card_shift);
! unsigned long offset;
! __ adrp(rscratch1, cardtable, offset);
! __ add(card_addr, card_addr, rscratch1);
! __ ldrb(rscratch1, Address(card_addr, offset));
__ cmpw(rscratch1, (int)G1SATBCardTableModRefBS::g1_young_card_val());
__ br(Assembler::EQ, done);
assert((int)CardTableModRefBS::dirty_card_val() == 0, "must be 0");
__ membar(Assembler::StoreLoad);
! __ ldrb(rscratch1, Address(card_addr, offset));
__ cbzw(rscratch1, done);
// storing region crossing non-NULL, card is clean.
// dirty card and log.
! __ strb(zr, Address(card_addr, offset));
__ ldr(rscratch1, queue_index);
__ cbz(rscratch1, runtime);
__ sub(rscratch1, rscratch1, wordSize);
__ str(rscratch1, queue_index);
! const Register buffer_addr = r0;
- __ push(RegSet::of(r0, r1), sp);
__ ldr(buffer_addr, buffer);
__ str(card_addr, Address(buffer_addr, rscratch1));
- __ pop(RegSet::of(r0, r1), sp);
__ b(done);
__ bind(runtime);
! __ push(G1_SAVE_REGS, sp);
__ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_post), card_addr, thread);
! __ pop(G1_SAVE_REGS, sp);
__ bind(done);
}
break;
#endif
--- 1218,1270 ----
Address queue_index(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
DirtyCardQueue::byte_offset_of_index()));
Address buffer(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
DirtyCardQueue::byte_offset_of_buf()));
! const Register card_offset = rscratch2;
! // LR is free here, so we can use it to hold the byte_map_base.
! const Register byte_map_base = lr;
!
! assert_different_registers(card_offset, byte_map_base, rscratch1);
!
! f.load_argument(0, card_offset);
! __ lsr(card_offset, card_offset, CardTableModRefBS::card_shift);
! __ load_byte_map_base(byte_map_base);
! __ ldrb(rscratch1, Address(byte_map_base, card_offset));
__ cmpw(rscratch1, (int)G1SATBCardTableModRefBS::g1_young_card_val());
__ br(Assembler::EQ, done);
assert((int)CardTableModRefBS::dirty_card_val() == 0, "must be 0");
__ membar(Assembler::StoreLoad);
! __ ldrb(rscratch1, Address(byte_map_base, card_offset));
__ cbzw(rscratch1, done);
// storing region crossing non-NULL, card is clean.
// dirty card and log.
! __ strb(zr, Address(byte_map_base, card_offset));
!
! // Convert card offset into an address in card_addr
! Register card_addr = card_offset;
! __ add(card_addr, byte_map_base, card_addr);
__ ldr(rscratch1, queue_index);
__ cbz(rscratch1, runtime);
__ sub(rscratch1, rscratch1, wordSize);
__ str(rscratch1, queue_index);
! // Reuse LR to hold buffer_addr
! const Register buffer_addr = lr;
__ ldr(buffer_addr, buffer);
__ str(card_addr, Address(buffer_addr, rscratch1));
__ b(done);
__ bind(runtime);
! __ push_call_clobbered_registers();
__ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_post), card_addr, thread);
! __ pop_call_clobbered_registers();
__ bind(done);
}
break;
#endif
< prev index next >