Mercurial > hg > graal-compiler
comparison src/cpu/x86/vm/templateInterpreter_x86_64.cpp @ 18041:52b4284cb496
Merge with jdk8u20-b26
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Wed, 15 Oct 2014 16:02:50 +0200 |
parents | 4062efea018b 0bf37f737702 |
children | be896a1983c0 |
comparison
equal
deleted
inserted
replaced
17606:45d7b2c7029d | 18041:52b4284cb496 |
---|---|
1272 // reset_last_Java_frame | 1272 // reset_last_Java_frame |
1273 __ reset_last_Java_frame(true, true); | 1273 __ reset_last_Java_frame(true, true); |
1274 | 1274 |
1275 // reset handle block | 1275 // reset handle block |
1276 __ movptr(t, Address(r15_thread, JavaThread::active_handles_offset())); | 1276 __ movptr(t, Address(r15_thread, JavaThread::active_handles_offset())); |
1277 __ movptr(Address(t, JNIHandleBlock::top_offset_in_bytes()), (int32_t)NULL_WORD); | 1277 __ movl(Address(t, JNIHandleBlock::top_offset_in_bytes()), (int32_t)NULL_WORD); |
1278 | 1278 |
1279 // If result is an oop unbox and store it in frame where gc will see it | 1279 // If result is an oop unbox and store it in frame where gc will see it |
1280 // and result handler will pick it up | 1280 // and result handler will pick it up |
1281 | 1281 |
1282 { | 1282 { |
1706 | 1706 |
1707 const int stub_code = frame::entry_frame_after_call_words; | 1707 const int stub_code = frame::entry_frame_after_call_words; |
1708 const int method_stack = (method->max_locals() + method->max_stack()) * | 1708 const int method_stack = (method->max_locals() + method->max_stack()) * |
1709 Interpreter::stackElementWords; | 1709 Interpreter::stackElementWords; |
1710 return (overhead_size + method_stack + stub_code); | 1710 return (overhead_size + method_stack + stub_code); |
1711 } | |
1712 | |
1713 int AbstractInterpreter::layout_activation(Method* method, | |
1714 int tempcount, | |
1715 int popframe_extra_args, | |
1716 int moncount, | |
1717 int caller_actual_parameters, | |
1718 int callee_param_count, | |
1719 int callee_locals, | |
1720 frame* caller, | |
1721 frame* interpreter_frame, | |
1722 bool is_top_frame, | |
1723 bool is_bottom_frame) { | |
1724 // Note: This calculation must exactly parallel the frame setup | |
1725 // in AbstractInterpreterGenerator::generate_method_entry. | |
1726 // If interpreter_frame!=NULL, set up the method, locals, and monitors. | |
1727 // The frame interpreter_frame, if not NULL, is guaranteed to be the | |
1728 // right size, as determined by a previous call to this method. | |
1729 // It is also guaranteed to be walkable even though it is in a skeletal state | |
1730 | |
1731 // fixed size of an interpreter frame: | |
1732 int max_locals = method->max_locals() * Interpreter::stackElementWords; | |
1733 int extra_locals = (method->max_locals() - method->size_of_parameters()) * | |
1734 Interpreter::stackElementWords; | |
1735 | |
1736 int overhead = frame::sender_sp_offset - | |
1737 frame::interpreter_frame_initial_sp_offset; | |
1738 // Our locals were accounted for by the caller (or last_frame_adjust | |
1739 // on the transistion) Since the callee parameters already account | |
1740 // for the callee's params we only need to account for the extra | |
1741 // locals. | |
1742 int size = overhead + | |
1743 (callee_locals - callee_param_count)*Interpreter::stackElementWords + | |
1744 moncount * frame::interpreter_frame_monitor_size() + | |
1745 tempcount* Interpreter::stackElementWords + popframe_extra_args; | |
1746 if (interpreter_frame != NULL) { | |
1747 #ifdef ASSERT | |
1748 if (!EnableInvokeDynamic) | |
1749 // @@@ FIXME: Should we correct interpreter_frame_sender_sp in the calling sequences? | |
1750 // Probably, since deoptimization doesn't work yet. | |
1751 assert(caller->unextended_sp() == interpreter_frame->interpreter_frame_sender_sp(), "Frame not properly walkable"); | |
1752 assert(caller->sp() == interpreter_frame->sender_sp(), "Frame not properly walkable(2)"); | |
1753 #endif | |
1754 | |
1755 interpreter_frame->interpreter_frame_set_method(method); | |
1756 // NOTE the difference in using sender_sp and | |
1757 // interpreter_frame_sender_sp interpreter_frame_sender_sp is | |
1758 // the original sp of the caller (the unextended_sp) and | |
1759 // sender_sp is fp+16 XXX | |
1760 intptr_t* locals = interpreter_frame->sender_sp() + max_locals - 1; | |
1761 | |
1762 #ifdef ASSERT | |
1763 if (caller->is_interpreted_frame()) { | |
1764 assert(locals < caller->fp() + frame::interpreter_frame_initial_sp_offset, "bad placement"); | |
1765 } | |
1766 #endif | |
1767 | |
1768 interpreter_frame->interpreter_frame_set_locals(locals); | |
1769 BasicObjectLock* montop = interpreter_frame->interpreter_frame_monitor_begin(); | |
1770 BasicObjectLock* monbot = montop - moncount; | |
1771 interpreter_frame->interpreter_frame_set_monitor_end(monbot); | |
1772 | |
1773 // Set last_sp | |
1774 intptr_t* esp = (intptr_t*) monbot - | |
1775 tempcount*Interpreter::stackElementWords - | |
1776 popframe_extra_args; | |
1777 interpreter_frame->interpreter_frame_set_last_sp(esp); | |
1778 | |
1779 // All frames but the initial (oldest) interpreter frame we fill in have | |
1780 // a value for sender_sp that allows walking the stack but isn't | |
1781 // truly correct. Correct the value here. | |
1782 if (extra_locals != 0 && | |
1783 interpreter_frame->sender_sp() == | |
1784 interpreter_frame->interpreter_frame_sender_sp()) { | |
1785 interpreter_frame->set_interpreter_frame_sender_sp(caller->sp() + | |
1786 extra_locals); | |
1787 } | |
1788 *interpreter_frame->interpreter_frame_cache_addr() = | |
1789 method->constants()->cache(); | |
1790 } | |
1791 return size; | |
1792 } | 1711 } |
1793 | 1712 |
1794 //----------------------------------------------------------------------------- | 1713 //----------------------------------------------------------------------------- |
1795 // Exceptions | 1714 // Exceptions |
1796 | 1715 |