< prev index next >

src/cpu/ppc/vm/c1_Runtime1_ppc.cpp

Print this page
rev 10742 : Make fields used in lock-free algorithms volatile


 786         __ mtlr(R0);
 787         __ restore_volatile_gprs(R1_SP, -nbytes_save); // except R0
 788         __ b(restart);
 789       }
 790       break;
 791 
 792   case g1_post_barrier_slow_id:
 793     {
 794         BarrierSet* bs = Universe::heap()->barrier_set();
 795         if (bs->kind() != BarrierSet::G1SATBCTLogging) {
 796           goto unimplemented_entry;
 797         }
 798 
 799         __ set_info("g1_post_barrier_slow_id", dont_gc_arguments);
 800 
 801         // Using stack slots: spill addr, spill tmp2
 802         const int stack_slots = 2;
 803         Register tmp = R0;
 804         Register addr = R14;
 805         Register tmp2 = R15;
 806         jbyte* byte_map_base = ((CardTableModRefBS*)bs)->byte_map_base;
 807 
 808         Label restart, refill, ret;
 809 
 810         // Spill
 811         __ std(addr, -8, R1_SP);
 812         __ std(tmp2, -16, R1_SP);
 813 
 814         __ srdi(addr, R0, CardTableModRefBS::card_shift); // Addr is passed in R0.
 815         __ load_const_optimized(/*cardtable*/ tmp2, byte_map_base, tmp);
 816         __ add(addr, tmp2, addr);
 817         __ lbz(tmp, 0, addr); // tmp := [addr + cardtable]
 818 
 819         // Return if young card.
 820         __ cmpwi(CCR0, tmp, G1SATBCardTableModRefBS::g1_young_card_val());
 821         __ beq(CCR0, ret);
 822 
 823         // Return if sequential consistent value is already dirty.
 824         __ membar(Assembler::StoreLoad);
 825         __ lbz(tmp, 0, addr); // tmp := [addr + cardtable]
 826 




 786         __ mtlr(R0);
 787         __ restore_volatile_gprs(R1_SP, -nbytes_save); // except R0
 788         __ b(restart);
 789       }
 790       break;
 791 
 792   case g1_post_barrier_slow_id:
 793     {
 794         BarrierSet* bs = Universe::heap()->barrier_set();
 795         if (bs->kind() != BarrierSet::G1SATBCTLogging) {
 796           goto unimplemented_entry;
 797         }
 798 
 799         __ set_info("g1_post_barrier_slow_id", dont_gc_arguments);
 800 
 801         // Using stack slots: spill addr, spill tmp2
 802         const int stack_slots = 2;
 803         Register tmp = R0;
 804         Register addr = R14;
 805         Register tmp2 = R15;
 806         volatile jbyte* byte_map_base = ((CardTableModRefBS*)bs)->byte_map_base;
 807 
 808         Label restart, refill, ret;
 809 
 810         // Spill
 811         __ std(addr, -8, R1_SP);
 812         __ std(tmp2, -16, R1_SP);
 813 
 814         __ srdi(addr, R0, CardTableModRefBS::card_shift); // Addr is passed in R0.
 815         __ load_const_optimized(/*cardtable*/ tmp2, byte_map_base, tmp);
 816         __ add(addr, tmp2, addr);
 817         __ lbz(tmp, 0, addr); // tmp := [addr + cardtable]
 818 
 819         // Return if young card.
 820         __ cmpwi(CCR0, tmp, G1SATBCardTableModRefBS::g1_young_card_val());
 821         __ beq(CCR0, ret);
 822 
 823         // Return if sequential consistent value is already dirty.
 824         __ membar(Assembler::StoreLoad);
 825         __ lbz(tmp, 0, addr); // tmp := [addr + cardtable]
 826 


< prev index next >