src/cpu/x86/vm/macroAssembler_x86.cpp

Print this page
rev 5363 : imported patch filtering.diff


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