< prev index next >

src/cpu/sparc/vm/c1_Runtime1_sparc.cpp

Print this page
rev 9388 : [mq]: qfield_refs


 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);


< prev index next >