786 __ mtlr(R0);
787 __ restore_volatile_gprs(R1_SP, -nbytes_save); // except R0
788 __ b(restart);
789 }
790 break;
791
792 case g1_post_barrier_slow_id:
793 {
794 BarrierSet* bs = Universe::heap()->barrier_set();
795 if (bs->kind() != BarrierSet::G1SATBCTLogging) {
796 goto unimplemented_entry;
797 }
798
799 __ set_info("g1_post_barrier_slow_id", dont_gc_arguments);
800
801 // Using stack slots: spill addr, spill tmp2
802 const int stack_slots = 2;
803 Register tmp = R0;
804 Register addr = R14;
805 Register tmp2 = R15;
806 jbyte* byte_map_base = ((CardTableModRefBS*)bs)->byte_map_base;
807
808 Label restart, refill, ret;
809
810 // Spill
811 __ std(addr, -8, R1_SP);
812 __ std(tmp2, -16, R1_SP);
813
814 __ srdi(addr, R0, CardTableModRefBS::card_shift); // Addr is passed in R0.
815 __ load_const_optimized(/*cardtable*/ tmp2, byte_map_base, tmp);
816 __ add(addr, tmp2, addr);
817 __ lbz(tmp, 0, addr); // tmp := [addr + cardtable]
818
819 // Return if young card.
820 __ cmpwi(CCR0, tmp, G1SATBCardTableModRefBS::g1_young_card_val());
821 __ beq(CCR0, ret);
822
823 // Return if sequential consistent value is already dirty.
824 __ membar(Assembler::StoreLoad);
825 __ lbz(tmp, 0, addr); // tmp := [addr + cardtable]
826
|
786 __ mtlr(R0);
787 __ restore_volatile_gprs(R1_SP, -nbytes_save); // except R0
788 __ b(restart);
789 }
790 break;
791
792 case g1_post_barrier_slow_id:
793 {
794 BarrierSet* bs = Universe::heap()->barrier_set();
795 if (bs->kind() != BarrierSet::G1SATBCTLogging) {
796 goto unimplemented_entry;
797 }
798
799 __ set_info("g1_post_barrier_slow_id", dont_gc_arguments);
800
801 // Using stack slots: spill addr, spill tmp2
802 const int stack_slots = 2;
803 Register tmp = R0;
804 Register addr = R14;
805 Register tmp2 = R15;
806 volatile jbyte* byte_map_base = ((CardTableModRefBS*)bs)->byte_map_base;
807
808 Label restart, refill, ret;
809
810 // Spill
811 __ std(addr, -8, R1_SP);
812 __ std(tmp2, -16, R1_SP);
813
814 __ srdi(addr, R0, CardTableModRefBS::card_shift); // Addr is passed in R0.
815 __ load_const_optimized(/*cardtable*/ tmp2, byte_map_base, tmp);
816 __ add(addr, tmp2, addr);
817 __ lbz(tmp, 0, addr); // tmp := [addr + cardtable]
818
819 // Return if young card.
820 __ cmpwi(CCR0, tmp, G1SATBCardTableModRefBS::g1_young_card_val());
821 __ beq(CCR0, ret);
822
823 // Return if sequential consistent value is already dirty.
824 __ membar(Assembler::StoreLoad);
825 __ lbz(tmp, 0, addr); // tmp := [addr + cardtable]
826
|