896 { |
896 { |
897 CardTableModRefBS* ct = barrier_set_cast<CardTableModRefBS>(bs); |
897 CardTableModRefBS* ct = barrier_set_cast<CardTableModRefBS>(bs); |
898 assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code"); |
898 assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code"); |
899 assert_different_registers(addr, count, tmp); |
899 assert_different_registers(addr, count, tmp); |
900 |
900 |
901 Label L_loop; |
901 Label L_loop, L_done; |
|
902 |
|
903 __ cmp_and_br_short(count, 0, Assembler::equal, Assembler::pt, L_done); // zero count - nothing to do |
902 |
904 |
903 __ sll_ptr(count, LogBytesPerHeapOop, count); |
905 __ sll_ptr(count, LogBytesPerHeapOop, count); |
904 __ sub(count, BytesPerHeapOop, count); |
906 __ sub(count, BytesPerHeapOop, count); |
905 __ add(count, addr, count); |
907 __ add(count, addr, count); |
906 // Use two shifts to clear out those low order two bits! (Cannot opt. into 1.) |
908 // Use two shifts to clear out those low order two bits! (Cannot opt. into 1.) |
912 __ BIND(L_loop); |
914 __ BIND(L_loop); |
913 __ stb(G0, tmp, addr); |
915 __ stb(G0, tmp, addr); |
914 __ subcc(count, 1, count); |
916 __ subcc(count, 1, count); |
915 __ brx(Assembler::greaterEqual, false, Assembler::pt, L_loop); |
917 __ brx(Assembler::greaterEqual, false, Assembler::pt, L_loop); |
916 __ delayed()->add(addr, 1, addr); |
918 __ delayed()->add(addr, 1, addr); |
|
919 __ BIND(L_done); |
917 } |
920 } |
918 break; |
921 break; |
919 case BarrierSet::ModRef: |
922 case BarrierSet::ModRef: |
920 break; |
923 break; |
921 default: |
924 default: |