< prev index next >

src/cpu/x86/vm/macroAssembler_x86.cpp

Print this page
rev 8802 : G1 performance improvements: card batching, joining, sorting, prefetching and write barrier fence elision and simplification based on a global syncrhonization using handshakes piggybacking on thread-local safepoints.
rev 8804 : Further JPRT improvements


4206   shrptr(tmp, HeapRegion::LogOfHRGrainBytes);
4207   jcc(Assembler::equal, done);
4208 
4209   // crosses regions, storing NULL?
4210 
4211   cmpptr(new_val, (int32_t) NULL_WORD);
4212   jcc(Assembler::equal, done);
4213 
4214   // storing region crossing non-NULL, is card already dirty?
4215 
4216   const Register card_addr = tmp;
4217   const Register cardtable = tmp2;
4218 
4219   movptr(card_addr, store_addr);
4220   shrptr(card_addr, CardTableModRefBS::card_shift);
4221   // Do not use ExternalAddress to load 'byte_map_base', since 'byte_map_base' is NOT
4222   // a valid address and therefore is not properly handled by the relocation code.
4223   movptr(cardtable, (intptr_t)ct->byte_map_base);
4224   addptr(card_addr, cardtable);
4225 




4226   cmpb(Address(card_addr, 0), (int)G1SATBCardTableModRefBS::g1_young_card_val());
4227   jcc(Assembler::equal, done);
4228 
4229   membar(Assembler::Membar_mask_bits(Assembler::StoreLoad));
4230   cmpb(Address(card_addr, 0), (int)CardTableModRefBS::dirty_card_val());
4231   jcc(Assembler::equal, done);
4232 
4233 
4234   // storing a region crossing, non-NULL oop, card is clean.
4235   // dirty card and log.
4236 
4237   movb(Address(card_addr, 0), (int)CardTableModRefBS::dirty_card_val());
4238 
4239   cmpl(queue_index, 0);
4240   jcc(Assembler::equal, runtime);
4241   subl(queue_index, wordSize);
4242   movptr(tmp2, buffer);
4243 #ifdef _LP64
4244   movslq(rscratch1, queue_index);
4245   addq(tmp2, rscratch1);
4246   movq(Address(tmp2, 0), card_addr);
4247 #else
4248   addl(tmp2, queue_index);
4249   movl(Address(tmp2, 0), card_addr);
4250 #endif
4251   jmp(done);
4252 




4206   shrptr(tmp, HeapRegion::LogOfHRGrainBytes);
4207   jcc(Assembler::equal, done);
4208 
4209   // crosses regions, storing NULL?
4210 
4211   cmpptr(new_val, (int32_t) NULL_WORD);
4212   jcc(Assembler::equal, done);
4213 
4214   // storing region crossing non-NULL, is card already dirty?
4215 
4216   const Register card_addr = tmp;
4217   const Register cardtable = tmp2;
4218 
4219   movptr(card_addr, store_addr);
4220   shrptr(card_addr, CardTableModRefBS::card_shift);
4221   // Do not use ExternalAddress to load 'byte_map_base', since 'byte_map_base' is NOT
4222   // a valid address and therefore is not properly handled by the relocation code.
4223   movptr(cardtable, (intptr_t)ct->byte_map_base);
4224   addptr(card_addr, cardtable);
4225 
4226   if (G1ElideMembar) {
4227     cmpb(Address(card_addr, 0), (int)CardTableModRefBS::clean_card_val());
4228     jcc(Assembler::notEqual, done);
4229   } else {
4230     cmpb(Address(card_addr, 0), (int)G1SATBCardTableModRefBS::g1_young_card_val());
4231     jcc(Assembler::equal, done);
4232 
4233     membar(Assembler::Membar_mask_bits(Assembler::StoreLoad));
4234     cmpb(Address(card_addr, 0), (int)CardTableModRefBS::dirty_card_val());
4235     jcc(Assembler::equal, done);
4236   }
4237 
4238   // storing a region crossing, non-NULL oop, card is clean.
4239   // dirty card and log.
4240 
4241   movb(Address(card_addr, 0), (int)CardTableModRefBS::dirty_card_val());
4242 
4243   cmpl(queue_index, 0);
4244   jcc(Assembler::equal, runtime);
4245   subl(queue_index, wordSize);
4246   movptr(tmp2, buffer);
4247 #ifdef _LP64
4248   movslq(rscratch1, queue_index);
4249   addq(tmp2, rscratch1);
4250   movq(Address(tmp2, 0), card_addr);
4251 #else
4252   addl(tmp2, queue_index);
4253   movl(Address(tmp2, 0), card_addr);
4254 #endif
4255   jmp(done);
4256 


< prev index next >