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
|