840 { // G4: previous value of memory
841 BarrierSet* bs = Universe::heap()->barrier_set();
842 if (bs->kind() != BarrierSet::G1SATBCTLogging) {
843 __ save_frame(0);
844 __ set((int)id, O1);
845 __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), I0);
846 __ should_not_reach_here();
847 break;
848 }
849
850 __ set_info("g1_pre_barrier_slow_id", dont_gc_arguments);
851
852 Register pre_val = G4;
853 Register tmp = G1_scratch;
854 Register tmp2 = G3_scratch;
855
856 Label refill, restart;
857 bool with_frame = false; // I don't know if we can do with-frame.
858 int satb_q_index_byte_offset =
859 in_bytes(JavaThread::satb_mark_queue_offset() +
860 PtrQueue::byte_offset_of_index());
861 int satb_q_buf_byte_offset =
862 in_bytes(JavaThread::satb_mark_queue_offset() +
863 PtrQueue::byte_offset_of_buf());
864
865 __ bind(restart);
866 // Load the index into the SATB buffer. PtrQueue::_index is a
867 // size_t so ld_ptr is appropriate
868 __ ld_ptr(G2_thread, satb_q_index_byte_offset, tmp);
869
870 // index == 0?
871 __ cmp_and_brx_short(tmp, G0, Assembler::equal, Assembler::pn, refill);
872
873 __ ld_ptr(G2_thread, satb_q_buf_byte_offset, tmp2);
874 __ sub(tmp, oopSize, tmp);
875
876 __ st_ptr(pre_val, tmp2, tmp); // [_buf + index] := <address_of_card>
877 // Use return-from-leaf
878 __ retl();
879 __ delayed()->st_ptr(tmp, G2_thread, satb_q_index_byte_offset);
880
881 __ bind(refill);
882 __ save_frame(0);
883
884 __ mov(pre_val, L0);
885 __ mov(tmp, L1);
886 __ mov(tmp2, L2);
944 __ retl();
945 __ delayed()->nop();
946
947 // Not dirty.
948 __ bind(not_already_dirty);
949
950 // Get cardtable + tmp into a reg by itself
951 __ add(addr, cardtable, tmp2);
952
953 // First, dirty it.
954 __ stb(G0, tmp2, 0); // [cardPtr] := 0 (i.e., dirty).
955
956 Register tmp3 = cardtable;
957 Register tmp4 = tmp;
958
959 // these registers are now dead
960 addr = cardtable = tmp = noreg;
961
962 int dirty_card_q_index_byte_offset =
963 in_bytes(JavaThread::dirty_card_queue_offset() +
964 PtrQueue::byte_offset_of_index());
965 int dirty_card_q_buf_byte_offset =
966 in_bytes(JavaThread::dirty_card_queue_offset() +
967 PtrQueue::byte_offset_of_buf());
968
969 __ bind(restart);
970
971 // Get the index into the update buffer. PtrQueue::_index is
972 // a size_t so ld_ptr is appropriate here.
973 __ ld_ptr(G2_thread, dirty_card_q_index_byte_offset, tmp3);
974
975 // index == 0?
976 __ cmp_and_brx_short(tmp3, G0, Assembler::equal, Assembler::pn, refill);
977
978 __ ld_ptr(G2_thread, dirty_card_q_buf_byte_offset, tmp4);
979 __ sub(tmp3, oopSize, tmp3);
980
981 __ st_ptr(tmp2, tmp4, tmp3); // [_buf + index] := <address_of_card>
982 // Use return-from-leaf
983 __ retl();
984 __ delayed()->st_ptr(tmp3, G2_thread, dirty_card_q_index_byte_offset);
985
986 __ bind(refill);
987 __ save_frame(0);
988
989 __ mov(tmp2, L0);
990 __ mov(tmp3, L1);
991 __ mov(tmp4, L2);
|
840 { // G4: previous value of memory
841 BarrierSet* bs = Universe::heap()->barrier_set();
842 if (bs->kind() != BarrierSet::G1SATBCTLogging) {
843 __ save_frame(0);
844 __ set((int)id, O1);
845 __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), I0);
846 __ should_not_reach_here();
847 break;
848 }
849
850 __ set_info("g1_pre_barrier_slow_id", dont_gc_arguments);
851
852 Register pre_val = G4;
853 Register tmp = G1_scratch;
854 Register tmp2 = G3_scratch;
855
856 Label refill, restart;
857 bool with_frame = false; // I don't know if we can do with-frame.
858 int satb_q_index_byte_offset =
859 in_bytes(JavaThread::satb_mark_queue_offset() +
860 SATBMarkQueue::byte_offset_of_index());
861 int satb_q_buf_byte_offset =
862 in_bytes(JavaThread::satb_mark_queue_offset() +
863 SATBMarkQueue::byte_offset_of_buf());
864
865 __ bind(restart);
866 // Load the index into the SATB buffer. SATBMarkQueue::_index is a
867 // size_t so ld_ptr is appropriate
868 __ ld_ptr(G2_thread, satb_q_index_byte_offset, tmp);
869
870 // index == 0?
871 __ cmp_and_brx_short(tmp, G0, Assembler::equal, Assembler::pn, refill);
872
873 __ ld_ptr(G2_thread, satb_q_buf_byte_offset, tmp2);
874 __ sub(tmp, oopSize, tmp);
875
876 __ st_ptr(pre_val, tmp2, tmp); // [_buf + index] := <address_of_card>
877 // Use return-from-leaf
878 __ retl();
879 __ delayed()->st_ptr(tmp, G2_thread, satb_q_index_byte_offset);
880
881 __ bind(refill);
882 __ save_frame(0);
883
884 __ mov(pre_val, L0);
885 __ mov(tmp, L1);
886 __ mov(tmp2, L2);
944 __ retl();
945 __ delayed()->nop();
946
947 // Not dirty.
948 __ bind(not_already_dirty);
949
950 // Get cardtable + tmp into a reg by itself
951 __ add(addr, cardtable, tmp2);
952
953 // First, dirty it.
954 __ stb(G0, tmp2, 0); // [cardPtr] := 0 (i.e., dirty).
955
956 Register tmp3 = cardtable;
957 Register tmp4 = tmp;
958
959 // these registers are now dead
960 addr = cardtable = tmp = noreg;
961
962 int dirty_card_q_index_byte_offset =
963 in_bytes(JavaThread::dirty_card_queue_offset() +
964 DirtyCardQueue::byte_offset_of_index());
965 int dirty_card_q_buf_byte_offset =
966 in_bytes(JavaThread::dirty_card_queue_offset() +
967 DirtyCardQueue::byte_offset_of_buf());
968
969 __ bind(restart);
970
971 // Get the index into the update buffer. DirtyCardQueue::_index is
972 // a size_t so ld_ptr is appropriate here.
973 __ ld_ptr(G2_thread, dirty_card_q_index_byte_offset, tmp3);
974
975 // index == 0?
976 __ cmp_and_brx_short(tmp3, G0, Assembler::equal, Assembler::pn, refill);
977
978 __ ld_ptr(G2_thread, dirty_card_q_buf_byte_offset, tmp4);
979 __ sub(tmp3, oopSize, tmp3);
980
981 __ st_ptr(tmp2, tmp4, tmp3); // [_buf + index] := <address_of_card>
982 // Use return-from-leaf
983 __ retl();
984 __ delayed()->st_ptr(tmp3, G2_thread, dirty_card_q_index_byte_offset);
985
986 __ bind(refill);
987 __ save_frame(0);
988
989 __ mov(tmp2, L0);
990 __ mov(tmp3, L1);
991 __ mov(tmp4, L2);
|