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");
|