22 * |
22 * |
23 */ |
23 */ |
24 |
24 |
25 #include "precompiled.hpp" |
25 #include "precompiled.hpp" |
26 #include "asm/macroAssembler.inline.hpp" |
26 #include "asm/macroAssembler.inline.hpp" |
|
27 #include "gc/shared/cardTable.hpp" |
|
28 #include "gc/shared/cardTableModRefBS.hpp" |
27 #include "interpreter/interpreter.hpp" |
29 #include "interpreter/interpreter.hpp" |
28 #include "nativeInst_sparc.hpp" |
30 #include "nativeInst_sparc.hpp" |
29 #include "oops/instanceOop.hpp" |
31 #include "oops/instanceOop.hpp" |
30 #include "oops/method.hpp" |
32 #include "oops/method.hpp" |
31 #include "oops/objArrayKlass.hpp" |
33 #include "oops/objArrayKlass.hpp" |
906 __ call(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_post)); |
906 __ call(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_post)); |
907 __ delayed()->mov(count->after_save(), O1); |
907 __ delayed()->mov(count->after_save(), O1); |
908 __ restore(); |
908 __ restore(); |
909 } |
909 } |
910 break; |
910 break; |
911 case BarrierSet::CardTableForRS: |
911 case BarrierSet::CardTableModRef: |
912 case BarrierSet::CardTableExtension: |
|
913 { |
912 { |
914 CardTableModRefBS* ct = barrier_set_cast<CardTableModRefBS>(bs); |
913 CardTableModRefBS* ctbs = barrier_set_cast<CardTableModRefBS>(bs); |
915 assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code"); |
914 CardTable* ct = ctbs->card_table(); |
|
915 assert(sizeof(*ct->byte_map_base()) == sizeof(jbyte), "adjust this code"); |
916 assert_different_registers(addr, count, tmp); |
916 assert_different_registers(addr, count, tmp); |
917 |
917 |
918 Label L_loop, L_done; |
918 Label L_loop, L_done; |
919 |
919 |
920 __ cmp_and_br_short(count, 0, Assembler::equal, Assembler::pt, L_done); // zero count - nothing to do |
920 __ cmp_and_br_short(count, 0, Assembler::equal, Assembler::pt, L_done); // zero count - nothing to do |
921 |
921 |
922 __ sll_ptr(count, LogBytesPerHeapOop, count); |
922 __ sll_ptr(count, LogBytesPerHeapOop, count); |
923 __ sub(count, BytesPerHeapOop, count); |
923 __ sub(count, BytesPerHeapOop, count); |
924 __ add(count, addr, count); |
924 __ add(count, addr, count); |
925 // Use two shifts to clear out those low order two bits! (Cannot opt. into 1.) |
925 // Use two shifts to clear out those low order two bits! (Cannot opt. into 1.) |
926 __ srl_ptr(addr, CardTableModRefBS::card_shift, addr); |
926 __ srl_ptr(addr, CardTable::card_shift, addr); |
927 __ srl_ptr(count, CardTableModRefBS::card_shift, count); |
927 __ srl_ptr(count, CardTable::card_shift, count); |
928 __ sub(count, addr, count); |
928 __ sub(count, addr, count); |
929 AddressLiteral rs(ct->byte_map_base); |
929 AddressLiteral rs(ct->byte_map_base()); |
930 __ set(rs, tmp); |
930 __ set(rs, tmp); |
931 __ BIND(L_loop); |
931 __ BIND(L_loop); |
932 __ stb(G0, tmp, addr); |
932 __ stb(G0, tmp, addr); |
933 __ subcc(count, 1, count); |
933 __ subcc(count, 1, count); |
934 __ brx(Assembler::greaterEqual, false, Assembler::pt, L_loop); |
934 __ brx(Assembler::greaterEqual, false, Assembler::pt, L_loop); |