1686 __ pop(rsi);
1687 __ pop(rdi);
1688 # endif
1689 __ pop(r11);
1690 __ pop(r10);
1691 __ pop(r9);
1692 __ pop(r8);
1693 #endif
1694 __ pop(rcx);
1695 __ bind(done);
1696
1697 __ pop(rdx);
1698 __ pop(rax);
1699 }
1700 break;
1701
1702 case g1_post_barrier_slow_id:
1703 {
1704 StubFrame f(sasm, "g1_post_barrier", dont_gc_arguments);
1705
1706
1707 // arg0: store_address
1708 Address store_addr(rbp, 2*BytesPerWord);
1709
1710 BarrierSet* bs = Universe::heap()->barrier_set();
1711 CardTableModRefBS* ct = (CardTableModRefBS*)bs;
1712 assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
1713
1714 Label done;
1715 Label runtime;
1716
1717 // At this point we know new_value is non-NULL and the new_value crosses regions.
1718 // Must check to see if card is already dirty
1719
1720 const Register thread = NOT_LP64(rax) LP64_ONLY(r15_thread);
1721
1722 Address queue_index(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
1723 PtrQueue::byte_offset_of_index()));
1724 Address buffer(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
1725 PtrQueue::byte_offset_of_buf()));
1726
1727 __ push(rax);
1728 __ push(rcx);
1729
1730 const Register cardtable = rax;
|
1686 __ pop(rsi);
1687 __ pop(rdi);
1688 # endif
1689 __ pop(r11);
1690 __ pop(r10);
1691 __ pop(r9);
1692 __ pop(r8);
1693 #endif
1694 __ pop(rcx);
1695 __ bind(done);
1696
1697 __ pop(rdx);
1698 __ pop(rax);
1699 }
1700 break;
1701
1702 case g1_post_barrier_slow_id:
1703 {
1704 StubFrame f(sasm, "g1_post_barrier", dont_gc_arguments);
1705
1706 BarrierSet* bs = Universe::heap()->barrier_set();
1707 if (bs->kind() != BarrierSet::G1SATBCT &&
1708 bs->kind() != BarrierSet::G1SATBCTLogging) {
1709 __ movptr(rax, (int)id);
1710 __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), rax);
1711 __ should_not_reach_here();
1712 break;
1713 }
1714
1715 // arg0: store_address
1716 Address store_addr(rbp, 2*BytesPerWord);
1717
1718 CardTableModRefBS* ct = (CardTableModRefBS*)bs;
1719 assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
1720
1721 Label done;
1722 Label runtime;
1723
1724 // At this point we know new_value is non-NULL and the new_value crosses regions.
1725 // Must check to see if card is already dirty
1726
1727 const Register thread = NOT_LP64(rax) LP64_ONLY(r15_thread);
1728
1729 Address queue_index(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
1730 PtrQueue::byte_offset_of_index()));
1731 Address buffer(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
1732 PtrQueue::byte_offset_of_buf()));
1733
1734 __ push(rax);
1735 __ push(rcx);
1736
1737 const Register cardtable = rax;
|