src/cpu/x86/vm/macroAssembler_x86.cpp

Print this page
rev 4973 : imported patch change-yg-card-value.diff
rev 4974 : imported patch conditional-storeload-young.diff
rev 4975 : imported patch refactor-and-sparc.diff


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