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