3371 #ifdef _LP64
3372 const Register card_addr = tmp;
3373
3374 movq(card_addr, store_addr);
3375 shrq(card_addr, CardTableModRefBS::card_shift);
3376
3377 lea(tmp2, cardtable);
3378
3379 // get the address of the card
3380 addq(card_addr, tmp2);
3381 #else
3382 const Register card_index = tmp;
3383
3384 movl(card_index, store_addr);
3385 shrl(card_index, CardTableModRefBS::card_shift);
3386
3387 Address index(noreg, card_index, Address::times_1);
3388 const Register card_addr = tmp;
3389 lea(card_addr, as_Address(ArrayAddress(cardtable, index)));
3390 #endif
3391 cmpb(Address(card_addr, 0), 0);
3392 jcc(Assembler::equal, done);
3393
3394 // storing a region crossing, non-NULL oop, card is clean.
3395 // dirty card and log.
3396
3397 movb(Address(card_addr, 0), 0);
3398
3399 cmpl(queue_index, 0);
3400 jcc(Assembler::equal, runtime);
3401 subl(queue_index, wordSize);
3402 movptr(tmp2, buffer);
3403 #ifdef _LP64
3404 movslq(rscratch1, queue_index);
3405 addq(tmp2, rscratch1);
3406 movq(Address(tmp2, 0), card_addr);
3407 #else
3408 addl(tmp2, queue_index);
3409 movl(Address(tmp2, 0), card_index);
3410 #endif
3411 jmp(done);
3412
|
3371 #ifdef _LP64
3372 const Register card_addr = tmp;
3373
3374 movq(card_addr, store_addr);
3375 shrq(card_addr, CardTableModRefBS::card_shift);
3376
3377 lea(tmp2, cardtable);
3378
3379 // get the address of the card
3380 addq(card_addr, tmp2);
3381 #else
3382 const Register card_index = tmp;
3383
3384 movl(card_index, store_addr);
3385 shrl(card_index, CardTableModRefBS::card_shift);
3386
3387 Address index(noreg, card_index, Address::times_1);
3388 const Register card_addr = tmp;
3389 lea(card_addr, as_Address(ArrayAddress(cardtable, index)));
3390 #endif
3391 cmpb(Address(card_addr, 0), (int)CardTableModRefBS::g1_young_card_val());
3392 jcc(Assembler::equal, done);
3393
3394 membar(Assembler::Membar_mask_bits(Assembler::StoreLoad));
3395 cmpb(Address(card_addr, 0), (int)CardTableModRefBS::dirty_card_val());
3396 jcc(Assembler::equal, done);
3397
3398
3399 // storing a region crossing, non-NULL oop, card is clean.
3400 // dirty card and log.
3401
3402 movb(Address(card_addr, 0), 0);
3403
3404 cmpl(queue_index, 0);
3405 jcc(Assembler::equal, runtime);
3406 subl(queue_index, wordSize);
3407 movptr(tmp2, buffer);
3408 #ifdef _LP64
3409 movslq(rscratch1, queue_index);
3410 addq(tmp2, rscratch1);
3411 movq(Address(tmp2, 0), card_addr);
3412 #else
3413 addl(tmp2, queue_index);
3414 movl(Address(tmp2, 0), card_index);
3415 #endif
3416 jmp(done);
3417
|