comparison src/cpu/x86/vm/c1_Runtime1_x86.cpp @ 13451:02f27ecb4f3a

Merge with http://hg.openjdk.java.net/hsx/hsx25/hotspot/
author Doug Simon <doug.simon@oracle.com>
date Wed, 18 Dec 2013 00:00:24 +0100
parents 096c224171c4 61746b5f0ed3
children d8041d695d19
comparison
equal deleted inserted replaced
13371:4db09b7304da 13451:02f27ecb4f3a
1717 // arg0: store_address 1717 // arg0: store_address
1718 Address store_addr(rbp, 2*BytesPerWord); 1718 Address store_addr(rbp, 2*BytesPerWord);
1719 1719
1720 BarrierSet* bs = Universe::heap()->barrier_set(); 1720 BarrierSet* bs = Universe::heap()->barrier_set();
1721 CardTableModRefBS* ct = (CardTableModRefBS*)bs; 1721 CardTableModRefBS* ct = (CardTableModRefBS*)bs;
1722 assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
1723
1722 Label done; 1724 Label done;
1723 Label runtime; 1725 Label runtime;
1724 1726
1725 // At this point we know new_value is non-NULL and the new_value crosses regsion. 1727 // At this point we know new_value is non-NULL and the new_value crosses regions.
1726 // Must check to see if card is already dirty 1728 // Must check to see if card is already dirty
1727 1729
1728 const Register thread = NOT_LP64(rax) LP64_ONLY(r15_thread); 1730 const Register thread = NOT_LP64(rax) LP64_ONLY(r15_thread);
1729 1731
1730 Address queue_index(thread, in_bytes(JavaThread::dirty_card_queue_offset() + 1732 Address queue_index(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
1733 PtrQueue::byte_offset_of_buf())); 1735 PtrQueue::byte_offset_of_buf()));
1734 1736
1735 __ push(rax); 1737 __ push(rax);
1736 __ push(rcx); 1738 __ push(rcx);
1737 1739
1740 const Register cardtable = rax;
1741 const Register card_addr = rcx;
1742
1743 f.load_argument(0, card_addr);
1744 __ shrptr(card_addr, CardTableModRefBS::card_shift);
1745 // Do not use ExternalAddress to load 'byte_map_base', since 'byte_map_base' is NOT
1746 // a valid address and therefore is not properly handled by the relocation code.
1747 __ movptr(cardtable, (intptr_t)ct->byte_map_base);
1748 __ addptr(card_addr, cardtable);
1749
1738 NOT_LP64(__ get_thread(thread);) 1750 NOT_LP64(__ get_thread(thread);)
1739 ExternalAddress cardtable((address)ct->byte_map_base);
1740 assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
1741
1742 const Register card_addr = rcx;
1743 #ifdef _LP64
1744 const Register tmp = rscratch1;
1745 f.load_argument(0, card_addr);
1746 __ shrq(card_addr, CardTableModRefBS::card_shift);
1747 __ lea(tmp, cardtable);
1748 // get the address of the card
1749 __ addq(card_addr, tmp);
1750 #else
1751 const Register card_index = rcx;
1752 f.load_argument(0, card_index);
1753 __ shrl(card_index, CardTableModRefBS::card_shift);
1754
1755 Address index(noreg, card_index, Address::times_1);
1756 __ leal(card_addr, __ as_Address(ArrayAddress(cardtable, index)));
1757 #endif
1758 1751
1759 __ cmpb(Address(card_addr, 0), (int)G1SATBCardTableModRefBS::g1_young_card_val()); 1752 __ cmpb(Address(card_addr, 0), (int)G1SATBCardTableModRefBS::g1_young_card_val());
1760 __ jcc(Assembler::equal, done); 1753 __ jcc(Assembler::equal, done);
1761 1754
1762 __ membar(Assembler::Membar_mask_bits(Assembler::StoreLoad)); 1755 __ membar(Assembler::Membar_mask_bits(Assembler::StoreLoad));