Mercurial > hg > truffle
comparison src/cpu/x86/vm/templateInterpreter_x86_32.cpp @ 1295:3cf667df43ef
6919934: JSR 292 needs to support x86 C1
Summary: This implements JSR 292 support for C1 x86.
Reviewed-by: never, jrose, kvn
author | twisti |
---|---|
date | Tue, 09 Mar 2010 20:16:19 +0100 |
parents | ddb7834449d0 |
children | 2338d41fbd81 |
comparison
equal
deleted
inserted
replaced
1293:51db1e4b379d | 1295:3cf667df43ef |
---|---|
1548 // Exceptions | 1548 // Exceptions |
1549 | 1549 |
1550 void TemplateInterpreterGenerator::generate_throw_exception() { | 1550 void TemplateInterpreterGenerator::generate_throw_exception() { |
1551 // Entry point in previous activation (i.e., if the caller was interpreted) | 1551 // Entry point in previous activation (i.e., if the caller was interpreted) |
1552 Interpreter::_rethrow_exception_entry = __ pc(); | 1552 Interpreter::_rethrow_exception_entry = __ pc(); |
1553 const Register thread = rcx; | |
1553 | 1554 |
1554 // Restore sp to interpreter_frame_last_sp even though we are going | 1555 // Restore sp to interpreter_frame_last_sp even though we are going |
1555 // to empty the expression stack for the exception processing. | 1556 // to empty the expression stack for the exception processing. |
1556 __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), NULL_WORD); | 1557 __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), NULL_WORD); |
1557 // rax,: exception | 1558 // rax,: exception |
1596 __ empty_expression_stack(); | 1597 __ empty_expression_stack(); |
1597 __ empty_FPU_stack(); | 1598 __ empty_FPU_stack(); |
1598 // Set the popframe_processing bit in pending_popframe_condition indicating that we are | 1599 // Set the popframe_processing bit in pending_popframe_condition indicating that we are |
1599 // currently handling popframe, so that call_VMs that may happen later do not trigger new | 1600 // currently handling popframe, so that call_VMs that may happen later do not trigger new |
1600 // popframe handling cycles. | 1601 // popframe handling cycles. |
1601 __ get_thread(rcx); | 1602 __ get_thread(thread); |
1602 __ movl(rdx, Address(rcx, JavaThread::popframe_condition_offset())); | 1603 __ movl(rdx, Address(thread, JavaThread::popframe_condition_offset())); |
1603 __ orl(rdx, JavaThread::popframe_processing_bit); | 1604 __ orl(rdx, JavaThread::popframe_processing_bit); |
1604 __ movl(Address(rcx, JavaThread::popframe_condition_offset()), rdx); | 1605 __ movl(Address(thread, JavaThread::popframe_condition_offset()), rdx); |
1605 | 1606 |
1606 { | 1607 { |
1607 // Check to see whether we are returning to a deoptimized frame. | 1608 // Check to see whether we are returning to a deoptimized frame. |
1608 // (The PopFrame call ensures that the caller of the popped frame is | 1609 // (The PopFrame call ensures that the caller of the popped frame is |
1609 // either interpreted or compiled and deoptimizes it if compiled.) | 1610 // either interpreted or compiled and deoptimizes it if compiled.) |
1627 __ shlptr(rax, Interpreter::logStackElementSize()); | 1628 __ shlptr(rax, Interpreter::logStackElementSize()); |
1628 __ restore_locals(); | 1629 __ restore_locals(); |
1629 __ subptr(rdi, rax); | 1630 __ subptr(rdi, rax); |
1630 __ addptr(rdi, wordSize); | 1631 __ addptr(rdi, wordSize); |
1631 // Save these arguments | 1632 // Save these arguments |
1632 __ get_thread(rcx); | 1633 __ get_thread(thread); |
1633 __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, Deoptimization::popframe_preserve_args), rcx, rax, rdi); | 1634 __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, Deoptimization::popframe_preserve_args), thread, rax, rdi); |
1634 | 1635 |
1635 __ remove_activation(vtos, rdx, | 1636 __ remove_activation(vtos, rdx, |
1636 /* throw_monitor_exception */ false, | 1637 /* throw_monitor_exception */ false, |
1637 /* install_monitor_exception */ false, | 1638 /* install_monitor_exception */ false, |
1638 /* notify_jvmdi */ false); | 1639 /* notify_jvmdi */ false); |
1639 | 1640 |
1640 // Inform deoptimization that it is responsible for restoring these arguments | 1641 // Inform deoptimization that it is responsible for restoring these arguments |
1641 __ get_thread(rcx); | 1642 __ get_thread(thread); |
1642 __ movl(Address(rcx, JavaThread::popframe_condition_offset()), JavaThread::popframe_force_deopt_reexecution_bit); | 1643 __ movl(Address(thread, JavaThread::popframe_condition_offset()), JavaThread::popframe_force_deopt_reexecution_bit); |
1643 | 1644 |
1644 // Continue in deoptimization handler | 1645 // Continue in deoptimization handler |
1645 __ jmp(rdx); | 1646 __ jmp(rdx); |
1646 | 1647 |
1647 __ bind(caller_not_deoptimized); | 1648 __ bind(caller_not_deoptimized); |
1663 // maintain this kind of invariant all the time we call a small | 1664 // maintain this kind of invariant all the time we call a small |
1664 // fixup routine to move the mutated arguments onto the top of our | 1665 // fixup routine to move the mutated arguments onto the top of our |
1665 // expression stack if necessary. | 1666 // expression stack if necessary. |
1666 __ mov(rax, rsp); | 1667 __ mov(rax, rsp); |
1667 __ movptr(rbx, Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize)); | 1668 __ movptr(rbx, Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize)); |
1668 __ get_thread(rcx); | 1669 __ get_thread(thread); |
1669 // PC must point into interpreter here | 1670 // PC must point into interpreter here |
1670 __ set_last_Java_frame(rcx, noreg, rbp, __ pc()); | 1671 __ set_last_Java_frame(thread, noreg, rbp, __ pc()); |
1671 __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::popframe_move_outgoing_args), rcx, rax, rbx); | 1672 __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::popframe_move_outgoing_args), thread, rax, rbx); |
1672 __ get_thread(rcx); | 1673 __ get_thread(thread); |
1673 __ reset_last_Java_frame(rcx, true, true); | 1674 __ reset_last_Java_frame(thread, true, true); |
1674 // Restore the last_sp and null it out | 1675 // Restore the last_sp and null it out |
1675 __ movptr(rsp, Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize)); | 1676 __ movptr(rsp, Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize)); |
1676 __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), NULL_WORD); | 1677 __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), NULL_WORD); |
1677 | 1678 |
1678 __ restore_bcp(); | 1679 __ restore_bcp(); |
1682 if (ProfileInterpreter) { | 1683 if (ProfileInterpreter) { |
1683 __ set_method_data_pointer_for_bcp(); | 1684 __ set_method_data_pointer_for_bcp(); |
1684 } | 1685 } |
1685 | 1686 |
1686 // Clear the popframe condition flag | 1687 // Clear the popframe condition flag |
1687 __ get_thread(rcx); | 1688 __ get_thread(thread); |
1688 __ movl(Address(rcx, JavaThread::popframe_condition_offset()), JavaThread::popframe_inactive); | 1689 __ movl(Address(thread, JavaThread::popframe_condition_offset()), JavaThread::popframe_inactive); |
1689 | 1690 |
1690 __ dispatch_next(vtos); | 1691 __ dispatch_next(vtos); |
1691 // end of PopFrame support | 1692 // end of PopFrame support |
1692 | 1693 |
1693 Interpreter::_remove_activation_entry = __ pc(); | 1694 Interpreter::_remove_activation_entry = __ pc(); |
1694 | 1695 |
1695 // preserve exception over this code sequence | 1696 // preserve exception over this code sequence |
1696 __ pop_ptr(rax); | 1697 __ pop_ptr(rax); |
1697 __ get_thread(rcx); | 1698 __ get_thread(thread); |
1698 __ movptr(Address(rcx, JavaThread::vm_result_offset()), rax); | 1699 __ movptr(Address(thread, JavaThread::vm_result_offset()), rax); |
1699 // remove the activation (without doing throws on illegalMonitorExceptions) | 1700 // remove the activation (without doing throws on illegalMonitorExceptions) |
1700 __ remove_activation(vtos, rdx, false, true, false); | 1701 __ remove_activation(vtos, rdx, false, true, false); |
1701 // restore exception | 1702 // restore exception |
1702 __ get_thread(rcx); | 1703 __ get_thread(thread); |
1703 __ movptr(rax, Address(rcx, JavaThread::vm_result_offset())); | 1704 __ movptr(rax, Address(thread, JavaThread::vm_result_offset())); |
1704 __ movptr(Address(rcx, JavaThread::vm_result_offset()), NULL_WORD); | 1705 __ movptr(Address(thread, JavaThread::vm_result_offset()), NULL_WORD); |
1705 __ verify_oop(rax); | 1706 __ verify_oop(rax); |
1706 | 1707 |
1707 // Inbetween activations - previous activation type unknown yet | 1708 // Inbetween activations - previous activation type unknown yet |
1708 // compute continuation point - the continuation point expects | 1709 // compute continuation point - the continuation point expects |
1709 // the following registers set up: | 1710 // the following registers set up: |
1710 // | 1711 // |
1711 // rax,: exception | 1712 // rax: exception |
1712 // rdx: return address/pc that threw exception | 1713 // rdx: return address/pc that threw exception |
1713 // rsp: expression stack of caller | 1714 // rsp: expression stack of caller |
1714 // rbp,: rbp, of caller | 1715 // rbp: rbp, of caller |
1715 __ push(rax); // save exception | 1716 __ push(rax); // save exception |
1716 __ push(rdx); // save return address | 1717 __ push(rdx); // save return address |
1717 __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::exception_handler_for_return_address), rdx); | 1718 __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::exception_handler_for_return_address), thread, rdx); |
1718 __ mov(rbx, rax); // save exception handler | 1719 __ mov(rbx, rax); // save exception handler |
1719 __ pop(rdx); // restore return address | 1720 __ pop(rdx); // restore return address |
1720 __ pop(rax); // restore exception | 1721 __ pop(rax); // restore exception |
1721 // Note that an "issuing PC" is actually the next PC after the call | 1722 // Note that an "issuing PC" is actually the next PC after the call |
1722 __ jmp(rbx); // jump to exception handler of caller | 1723 __ jmp(rbx); // jump to exception handler of caller |
1726 // | 1727 // |
1727 // JVMTI ForceEarlyReturn support | 1728 // JVMTI ForceEarlyReturn support |
1728 // | 1729 // |
1729 address TemplateInterpreterGenerator::generate_earlyret_entry_for(TosState state) { | 1730 address TemplateInterpreterGenerator::generate_earlyret_entry_for(TosState state) { |
1730 address entry = __ pc(); | 1731 address entry = __ pc(); |
1732 const Register thread = rcx; | |
1731 | 1733 |
1732 __ restore_bcp(); | 1734 __ restore_bcp(); |
1733 __ restore_locals(); | 1735 __ restore_locals(); |
1734 __ empty_expression_stack(); | 1736 __ empty_expression_stack(); |
1735 __ empty_FPU_stack(); | 1737 __ empty_FPU_stack(); |
1736 __ load_earlyret_value(state); | 1738 __ load_earlyret_value(state); |
1737 | 1739 |
1738 __ get_thread(rcx); | 1740 __ get_thread(thread); |
1739 __ movptr(rcx, Address(rcx, JavaThread::jvmti_thread_state_offset())); | 1741 __ movptr(rcx, Address(thread, JavaThread::jvmti_thread_state_offset())); |
1740 const Address cond_addr(rcx, JvmtiThreadState::earlyret_state_offset()); | 1742 const Address cond_addr(rcx, JvmtiThreadState::earlyret_state_offset()); |
1741 | 1743 |
1742 // Clear the earlyret state | 1744 // Clear the earlyret state |
1743 __ movl(cond_addr, JvmtiThreadState::earlyret_inactive); | 1745 __ movl(cond_addr, JvmtiThreadState::earlyret_inactive); |
1744 | 1746 |