711 case BarrierSet::G1SATBCTLogging:
712 {
713 __ pusha(); // push registers
714 __ call_VM_leaf(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_post),
715 start, count);
716 __ popa();
717 }
718 break;
719
720 case BarrierSet::CardTableForRS:
721 case BarrierSet::CardTableExtension:
722 {
723 CardTableModRefBS* ct = barrier_set_cast<CardTableModRefBS>(bs);
724 assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
725
726 Label L_loop;
727 const Register end = count; // elements count; end == start+count-1
728 assert_different_registers(start, end);
729
730 __ lea(end, Address(start, count, Address::times_ptr, -wordSize));
731 __ shrptr(start, CardTableModRefBS::card_shift);
732 __ shrptr(end, CardTableModRefBS::card_shift);
733 __ subptr(end, start); // end --> count
734 __ BIND(L_loop);
735 intptr_t disp = (intptr_t) ct->byte_map_base;
736 Address cardtable(start, count, Address::times_1, disp);
737 __ movb(cardtable, 0);
738 __ decrement(count);
739 __ jcc(Assembler::greaterEqual, L_loop);
740 }
741 break;
742 case BarrierSet::ModRef:
743 break;
744 default :
745 ShouldNotReachHere();
746
747 }
748 }
749
750
751 // Copy 64 bytes chunks
752 //
|
711 case BarrierSet::G1SATBCTLogging:
712 {
713 __ pusha(); // push registers
714 __ call_VM_leaf(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_post),
715 start, count);
716 __ popa();
717 }
718 break;
719
720 case BarrierSet::CardTableForRS:
721 case BarrierSet::CardTableExtension:
722 {
723 CardTableModRefBS* ct = barrier_set_cast<CardTableModRefBS>(bs);
724 assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
725
726 Label L_loop;
727 const Register end = count; // elements count; end == start+count-1
728 assert_different_registers(start, end);
729
730 __ lea(end, Address(start, count, Address::times_ptr, -wordSize));
731 __ shrptr(start, CardTable::card_shift);
732 __ shrptr(end, CardTable::card_shift);
733 __ subptr(end, start); // end --> count
734 __ BIND(L_loop);
735 intptr_t disp = (intptr_t) ct->byte_map_base;
736 Address cardtable(start, count, Address::times_1, disp);
737 __ movb(cardtable, 0);
738 __ decrement(count);
739 __ jcc(Assembler::greaterEqual, L_loop);
740 }
741 break;
742 case BarrierSet::ModRef:
743 break;
744 default :
745 ShouldNotReachHere();
746
747 }
748 }
749
750
751 // Copy 64 bytes chunks
752 //
|