comparison src/cpu/x86/vm/c1_Runtime1_x86.cpp @ 1579:e9ff18c4ace7

Merge
author jrose
date Wed, 02 Jun 2010 22:45:42 -0700
parents c18cbe5936b8 87fc6aca31ab
children 126ea7725993
comparison
equal deleted inserted replaced
1562:dfe27f03244a 1579:e9ff18c4ace7
780 __ pop(exception_pc); 780 __ pop(exception_pc);
781 781
782 // Restore SP from BP if the exception PC is a MethodHandle call site. 782 // Restore SP from BP if the exception PC is a MethodHandle call site.
783 NOT_LP64(__ get_thread(thread);) 783 NOT_LP64(__ get_thread(thread);)
784 __ cmpl(Address(thread, JavaThread::is_method_handle_return_offset()), 0); 784 __ cmpl(Address(thread, JavaThread::is_method_handle_return_offset()), 0);
785 __ cmovptr(Assembler::notEqual, rsp, rbp); 785 __ cmovptr(Assembler::notEqual, rsp, rbp_mh_SP_save);
786 786
787 // continue at exception handler (return address removed) 787 // continue at exception handler (return address removed)
788 // note: do *not* remove arguments when unwinding the 788 // note: do *not* remove arguments when unwinding the
789 // activation since the caller assumes having 789 // activation since the caller assumes having
790 // all arguments on the stack when entering the 790 // all arguments on the stack when entering the
1579 __ movptr(rax, (int)id); 1579 __ movptr(rax, (int)id);
1580 __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), rax); 1580 __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), rax);
1581 __ should_not_reach_here(); 1581 __ should_not_reach_here();
1582 break; 1582 break;
1583 } 1583 }
1584
1585 __ push(rax); 1584 __ push(rax);
1586 __ push(rdx); 1585 __ push(rdx);
1587 1586
1588 const Register pre_val = rax; 1587 const Register pre_val = rax;
1589 const Register thread = NOT_LP64(rax) LP64_ONLY(r15_thread); 1588 const Register thread = NOT_LP64(rax) LP64_ONLY(r15_thread);
1603 Label done; 1602 Label done;
1604 Label runtime; 1603 Label runtime;
1605 1604
1606 // Can we store original value in the thread's buffer? 1605 // Can we store original value in the thread's buffer?
1607 1606
1608 LP64_ONLY(__ movslq(tmp, queue_index);) 1607 #ifdef _LP64
1609 #ifdef _LP64 1608 __ movslq(tmp, queue_index);
1610 __ cmpq(tmp, 0); 1609 __ cmpq(tmp, 0);
1611 #else 1610 #else
1612 __ cmpl(queue_index, 0); 1611 __ cmpl(queue_index, 0);
1613 #endif 1612 #endif
1614 __ jcc(Assembler::equal, runtime); 1613 __ jcc(Assembler::equal, runtime);
1626 f.load_argument(0, pre_val); 1625 f.load_argument(0, pre_val);
1627 __ movptr(Address(tmp, 0), pre_val); 1626 __ movptr(Address(tmp, 0), pre_val);
1628 __ jmp(done); 1627 __ jmp(done);
1629 1628
1630 __ bind(runtime); 1629 __ bind(runtime);
1630 __ push(rcx);
1631 #ifdef _LP64
1632 __ push(r8);
1633 __ push(r9);
1634 __ push(r10);
1635 __ push(r11);
1636 # ifndef _WIN64
1637 __ push(rdi);
1638 __ push(rsi);
1639 # endif
1640 #endif
1631 // load the pre-value 1641 // load the pre-value
1632 __ push(rcx);
1633 f.load_argument(0, rcx); 1642 f.load_argument(0, rcx);
1634 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_pre), rcx, thread); 1643 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_pre), rcx, thread);
1644 #ifdef _LP64
1645 # ifndef _WIN64
1646 __ pop(rsi);
1647 __ pop(rdi);
1648 # endif
1649 __ pop(r11);
1650 __ pop(r10);
1651 __ pop(r9);
1652 __ pop(r8);
1653 #endif
1635 __ pop(rcx); 1654 __ pop(rcx);
1636
1637 __ bind(done); 1655 __ bind(done);
1656
1638 __ pop(rdx); 1657 __ pop(rdx);
1639 __ pop(rax); 1658 __ pop(rax);
1640 } 1659 }
1641 break; 1660 break;
1642 1661
1662 PtrQueue::byte_offset_of_index())); 1681 PtrQueue::byte_offset_of_index()));
1663 Address buffer(thread, in_bytes(JavaThread::dirty_card_queue_offset() + 1682 Address buffer(thread, in_bytes(JavaThread::dirty_card_queue_offset() +
1664 PtrQueue::byte_offset_of_buf())); 1683 PtrQueue::byte_offset_of_buf()));
1665 1684
1666 __ push(rax); 1685 __ push(rax);
1667 __ push(rdx); 1686 __ push(rcx);
1668 1687
1669 NOT_LP64(__ get_thread(thread);) 1688 NOT_LP64(__ get_thread(thread);)
1670 ExternalAddress cardtable((address)ct->byte_map_base); 1689 ExternalAddress cardtable((address)ct->byte_map_base);
1671 assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code"); 1690 assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
1672 1691
1673 const Register card_addr = rdx; 1692 const Register card_addr = rcx;
1674 #ifdef _LP64 1693 #ifdef _LP64
1675 const Register tmp = rscratch1; 1694 const Register tmp = rscratch1;
1676 f.load_argument(0, card_addr); 1695 f.load_argument(0, card_addr);
1677 __ shrq(card_addr, CardTableModRefBS::card_shift); 1696 __ shrq(card_addr, CardTableModRefBS::card_shift);
1678 __ lea(tmp, cardtable); 1697 __ lea(tmp, cardtable);
1679 // get the address of the card 1698 // get the address of the card
1680 __ addq(card_addr, tmp); 1699 __ addq(card_addr, tmp);
1681 #else 1700 #else
1682 const Register card_index = rdx; 1701 const Register card_index = rcx;
1683 f.load_argument(0, card_index); 1702 f.load_argument(0, card_index);
1684 __ shrl(card_index, CardTableModRefBS::card_shift); 1703 __ shrl(card_index, CardTableModRefBS::card_shift);
1685 1704
1686 Address index(noreg, card_index, Address::times_1); 1705 Address index(noreg, card_index, Address::times_1);
1687 __ leal(card_addr, __ as_Address(ArrayAddress(cardtable, index))); 1706 __ leal(card_addr, __ as_Address(ArrayAddress(cardtable, index)));
1714 1733
1715 __ pop(rbx); 1734 __ pop(rbx);
1716 __ jmp(done); 1735 __ jmp(done);
1717 1736
1718 __ bind(runtime); 1737 __ bind(runtime);
1719 NOT_LP64(__ push(rcx);) 1738 __ push(rdx);
1739 #ifdef _LP64
1740 __ push(r8);
1741 __ push(r9);
1742 __ push(r10);
1743 __ push(r11);
1744 # ifndef _WIN64
1745 __ push(rdi);
1746 __ push(rsi);
1747 # endif
1748 #endif
1720 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_post), card_addr, thread); 1749 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_post), card_addr, thread);
1721 NOT_LP64(__ pop(rcx);) 1750 #ifdef _LP64
1722 1751 # ifndef _WIN64
1752 __ pop(rsi);
1753 __ pop(rdi);
1754 # endif
1755 __ pop(r11);
1756 __ pop(r10);
1757 __ pop(r9);
1758 __ pop(r8);
1759 #endif
1760 __ pop(rdx);
1723 __ bind(done); 1761 __ bind(done);
1724 __ pop(rdx); 1762
1763 __ pop(rcx);
1725 __ pop(rax); 1764 __ pop(rax);
1726 1765
1727 } 1766 }
1728 break; 1767 break;
1729 #endif // !SERIALGC 1768 #endif // !SERIALGC