< prev index next >

src/hotspot/cpu/sparc/c1_Runtime1_sparc.cpp

Print this page




 745         __ set_info("dtrace_object_alloc", dont_gc_arguments);
 746         // we can't gc here so skip the oopmap but make sure that all
 747         // the live registers get saved.
 748         save_live_registers(sasm);
 749 
 750         __ save_thread(L7_thread_cache);
 751         __ call(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc),
 752                 relocInfo::runtime_call_type);
 753         __ delayed()->mov(I0, O0);
 754         __ restore_thread(L7_thread_cache);
 755 
 756         restore_live_registers(sasm);
 757         __ ret();
 758         __ delayed()->restore();
 759       }
 760       break;
 761 
 762 #if INCLUDE_ALL_GCS
 763     case g1_pre_barrier_slow_id:
 764       { // G4: previous value of memory
 765         BarrierSet* bs = Universe::heap()->barrier_set();
 766         if (bs->kind() != BarrierSet::G1BarrierSet) {
 767           __ save_frame(0);
 768           __ set((int)id, O1);
 769           __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), I0);
 770           __ should_not_reach_here();
 771           break;
 772         }
 773 
 774         __ set_info("g1_pre_barrier_slow_id", dont_gc_arguments);
 775 
 776         Register pre_val = G4;
 777         Register tmp  = G1_scratch;
 778         Register tmp2 = G3_scratch;
 779 
 780         Label refill, restart;
 781         int satb_q_active_byte_offset = in_bytes(G1ThreadLocalData::satb_mark_queue_active_offset());
 782         int satb_q_index_byte_offset = in_bytes(G1ThreadLocalData::satb_mark_queue_index_offset());
 783         int satb_q_buf_byte_offset = in_bytes(G1ThreadLocalData::satb_mark_queue_buffer_offset());
 784 
 785         // Is marking still active?


 810         __ delayed()->st_ptr(tmp, G2_thread, satb_q_index_byte_offset);
 811 
 812         __ bind(refill);
 813 
 814         save_live_registers(sasm);
 815 
 816         __ call_VM_leaf(L7_thread_cache,
 817                         CAST_FROM_FN_PTR(address,
 818                                          SATBMarkQueueSet::handle_zero_index_for_thread),
 819                                          G2_thread);
 820 
 821         restore_live_registers(sasm);
 822 
 823         __ br(Assembler::always, /*annul*/false, Assembler::pt, restart);
 824         __ delayed()->restore();
 825       }
 826       break;
 827 
 828     case g1_post_barrier_slow_id:
 829       {
 830         BarrierSet* bs = Universe::heap()->barrier_set();
 831         if (bs->kind() != BarrierSet::G1BarrierSet) {
 832           __ save_frame(0);
 833           __ set((int)id, O1);
 834           __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), I0);
 835           __ should_not_reach_here();
 836           break;
 837         }
 838 
 839         __ set_info("g1_post_barrier_slow_id", dont_gc_arguments);
 840 
 841         Register addr = G4;
 842         Register cardtable = G5;
 843         Register tmp  = G1_scratch;
 844         Register tmp2 = G3_scratch;
 845         jbyte* byte_map_base = ci_card_table_address();
 846 
 847         Label not_already_dirty, restart, refill, young_card;
 848 
 849         __ srlx(addr, CardTable::card_shift, addr);
 850 




 745         __ set_info("dtrace_object_alloc", dont_gc_arguments);
 746         // we can't gc here so skip the oopmap but make sure that all
 747         // the live registers get saved.
 748         save_live_registers(sasm);
 749 
 750         __ save_thread(L7_thread_cache);
 751         __ call(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc),
 752                 relocInfo::runtime_call_type);
 753         __ delayed()->mov(I0, O0);
 754         __ restore_thread(L7_thread_cache);
 755 
 756         restore_live_registers(sasm);
 757         __ ret();
 758         __ delayed()->restore();
 759       }
 760       break;
 761 
 762 #if INCLUDE_ALL_GCS
 763     case g1_pre_barrier_slow_id:
 764       { // G4: previous value of memory
 765         BarrierSet* bs = BarrierSet::barrier_set();
 766         if (bs->kind() != BarrierSet::G1BarrierSet) {
 767           __ save_frame(0);
 768           __ set((int)id, O1);
 769           __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), I0);
 770           __ should_not_reach_here();
 771           break;
 772         }
 773 
 774         __ set_info("g1_pre_barrier_slow_id", dont_gc_arguments);
 775 
 776         Register pre_val = G4;
 777         Register tmp  = G1_scratch;
 778         Register tmp2 = G3_scratch;
 779 
 780         Label refill, restart;
 781         int satb_q_active_byte_offset = in_bytes(G1ThreadLocalData::satb_mark_queue_active_offset());
 782         int satb_q_index_byte_offset = in_bytes(G1ThreadLocalData::satb_mark_queue_index_offset());
 783         int satb_q_buf_byte_offset = in_bytes(G1ThreadLocalData::satb_mark_queue_buffer_offset());
 784 
 785         // Is marking still active?


 810         __ delayed()->st_ptr(tmp, G2_thread, satb_q_index_byte_offset);
 811 
 812         __ bind(refill);
 813 
 814         save_live_registers(sasm);
 815 
 816         __ call_VM_leaf(L7_thread_cache,
 817                         CAST_FROM_FN_PTR(address,
 818                                          SATBMarkQueueSet::handle_zero_index_for_thread),
 819                                          G2_thread);
 820 
 821         restore_live_registers(sasm);
 822 
 823         __ br(Assembler::always, /*annul*/false, Assembler::pt, restart);
 824         __ delayed()->restore();
 825       }
 826       break;
 827 
 828     case g1_post_barrier_slow_id:
 829       {
 830         BarrierSet* bs = BarrierSet::barrier_set();
 831         if (bs->kind() != BarrierSet::G1BarrierSet) {
 832           __ save_frame(0);
 833           __ set((int)id, O1);
 834           __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), I0);
 835           __ should_not_reach_here();
 836           break;
 837         }
 838 
 839         __ set_info("g1_post_barrier_slow_id", dont_gc_arguments);
 840 
 841         Register addr = G4;
 842         Register cardtable = G5;
 843         Register tmp  = G1_scratch;
 844         Register tmp2 = G3_scratch;
 845         jbyte* byte_map_base = ci_card_table_address();
 846 
 847         Label not_already_dirty, restart, refill, young_card;
 848 
 849         __ srlx(addr, CardTable::card_shift, addr);
 850 


< prev index next >