< prev index next >

src/cpu/ppc/vm/macroAssembler_ppc.cpp

Print this page
rev 10742 : Make fields used in lock-free algorithms volatile


2793   stwx(R0, tmp1, tmp2);
2794 }
2795 
2796 
2797 // GC barrier helper macros
2798 
2799 // Write the card table byte if needed.
2800 void MacroAssembler::card_write_barrier_post(Register Rstore_addr, Register Rnew_val, Register Rtmp) {
2801   CardTableModRefBS* bs =
2802     barrier_set_cast<CardTableModRefBS>(Universe::heap()->barrier_set());
2803   assert(bs->kind() == BarrierSet::CardTableForRS ||
2804          bs->kind() == BarrierSet::CardTableExtension, "wrong barrier");
2805 #ifdef ASSERT
2806   cmpdi(CCR0, Rnew_val, 0);
2807   asm_assert_ne("null oop not allowed", 0x321);
2808 #endif
2809   card_table_write(bs->byte_map_base, Rtmp, Rstore_addr);
2810 }
2811 
2812 // Write the card table byte.
2813 void MacroAssembler::card_table_write(jbyte* byte_map_base, Register Rtmp, Register Robj) {
2814   assert_different_registers(Robj, Rtmp, R0);
2815   load_const_optimized(Rtmp, (address)byte_map_base, R0);
2816   srdi(Robj, Robj, CardTableModRefBS::card_shift);
2817   li(R0, 0); // dirty
2818   if (UseConcMarkSweepGC) membar(Assembler::StoreStore);
2819   stbx(R0, Rtmp, Robj);
2820 }
2821 
2822 #if INCLUDE_ALL_GCS
2823 // General G1 pre-barrier generator.
2824 // Goal: record the previous value if it is not null.
2825 void MacroAssembler::g1_write_barrier_pre(Register Robj, RegisterOrConstant offset, Register Rpre_val,
2826                                           Register Rtmp1, Register Rtmp2, bool needs_frame) {
2827   Label runtime, filtered;
2828 
2829   // Is marking active?
2830   if (in_bytes(SATBMarkQueue::byte_width_of_active()) == 4) {
2831     lwz(Rtmp1, in_bytes(JavaThread::satb_mark_queue_offset() + SATBMarkQueue::byte_offset_of_active()), R16_thread);
2832   } else {
2833     guarantee(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1, "Assumption");




2793   stwx(R0, tmp1, tmp2);
2794 }
2795 
2796 
2797 // GC barrier helper macros
2798 
2799 // Write the card table byte if needed.
2800 void MacroAssembler::card_write_barrier_post(Register Rstore_addr, Register Rnew_val, Register Rtmp) {
2801   CardTableModRefBS* bs =
2802     barrier_set_cast<CardTableModRefBS>(Universe::heap()->barrier_set());
2803   assert(bs->kind() == BarrierSet::CardTableForRS ||
2804          bs->kind() == BarrierSet::CardTableExtension, "wrong barrier");
2805 #ifdef ASSERT
2806   cmpdi(CCR0, Rnew_val, 0);
2807   asm_assert_ne("null oop not allowed", 0x321);
2808 #endif
2809   card_table_write(bs->byte_map_base, Rtmp, Rstore_addr);
2810 }
2811 
2812 // Write the card table byte.
2813 void MacroAssembler::card_table_write(volatile jbyte* byte_map_base, Register Rtmp, Register Robj) {
2814   assert_different_registers(Robj, Rtmp, R0);
2815   load_const_optimized(Rtmp, (address)byte_map_base, R0);
2816   srdi(Robj, Robj, CardTableModRefBS::card_shift);
2817   li(R0, 0); // dirty
2818   if (UseConcMarkSweepGC) membar(Assembler::StoreStore);
2819   stbx(R0, Rtmp, Robj);
2820 }
2821 
2822 #if INCLUDE_ALL_GCS
2823 // General G1 pre-barrier generator.
2824 // Goal: record the previous value if it is not null.
2825 void MacroAssembler::g1_write_barrier_pre(Register Robj, RegisterOrConstant offset, Register Rpre_val,
2826                                           Register Rtmp1, Register Rtmp2, bool needs_frame) {
2827   Label runtime, filtered;
2828 
2829   // Is marking active?
2830   if (in_bytes(SATBMarkQueue::byte_width_of_active()) == 4) {
2831     lwz(Rtmp1, in_bytes(JavaThread::satb_mark_queue_offset() + SATBMarkQueue::byte_offset_of_active()), R16_thread);
2832   } else {
2833     guarantee(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1, "Assumption");


< prev index next >