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