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