hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp
changeset 24018 77b156916bab
parent 23844 0c29a324ae14
child 24322 c2978d1578e3
equal deleted inserted replaced
24016:2927072ed5fb 24018:77b156916bab
  1562   // Save space for one monitor to get into the interpreted method in case
  1562   // Save space for one monitor to get into the interpreted method in case
  1563   // the method is synchronized
  1563   // the method is synchronized
  1564   int monitor_size    = method->is_synchronized() ?
  1564   int monitor_size    = method->is_synchronized() ?
  1565                                 1*frame::interpreter_frame_monitor_size() : 0;
  1565                                 1*frame::interpreter_frame_monitor_size() : 0;
  1566   return size_activation_helper(method->max_locals(), method->max_stack(),
  1566   return size_activation_helper(method->max_locals(), method->max_stack(),
  1567                                  monitor_size) + call_stub_size;
  1567                                 monitor_size) + call_stub_size;
  1568 }
  1568 }
  1569 
  1569 
  1570 int AbstractInterpreter::layout_activation(Method* method,
  1570 int AbstractInterpreter::size_activation(int max_stack,
  1571                                            int tempcount,
  1571                                          int temps,
  1572                                            int popframe_extra_args,
  1572                                          int extra_args,
  1573                                            int moncount,
  1573                                          int monitors,
  1574                                            int caller_actual_parameters,
  1574                                          int callee_params,
  1575                                            int callee_param_count,
  1575                                          int callee_locals,
  1576                                            int callee_local_count,
  1576                                          bool is_top_frame) {
  1577                                            frame* caller,
       
  1578                                            frame* interpreter_frame,
       
  1579                                            bool is_top_frame,
       
  1580                                            bool is_bottom_frame) {
       
  1581   // Note: This calculation must exactly parallel the frame setup
  1577   // Note: This calculation must exactly parallel the frame setup
  1582   // in InterpreterGenerator::generate_fixed_frame.
  1578   // in InterpreterGenerator::generate_fixed_frame.
  1583   // If f!=NULL, set up the following variables:
  1579 
  1584   //   - Lmethod
  1580   int monitor_size           = monitors * frame::interpreter_frame_monitor_size();
  1585   //   - Llocals
       
  1586   //   - Lmonitors (to the indicated number of monitors)
       
  1587   //   - Lesp (to the indicated number of temps)
       
  1588   // The frame f (if not NULL) on entry is a description of the caller of the frame
       
  1589   // we are about to layout. We are guaranteed that we will be able to fill in a
       
  1590   // new interpreter frame as its callee (i.e. the stack space is allocated and
       
  1591   // the amount was determined by an earlier call to this method with f == NULL).
       
  1592   // On return f (if not NULL) while describe the interpreter frame we just layed out.
       
  1593 
       
  1594   int monitor_size           = moncount * frame::interpreter_frame_monitor_size();
       
  1595   int rounded_vm_local_words = round_to(frame::interpreter_frame_vm_local_words,WordsPerLong);
       
  1596 
  1581 
  1597   assert(monitor_size == round_to(monitor_size, WordsPerLong), "must align");
  1582   assert(monitor_size == round_to(monitor_size, WordsPerLong), "must align");
       
  1583 
  1598   //
  1584   //
  1599   // Note: if you look closely this appears to be doing something much different
  1585   // Note: if you look closely this appears to be doing something much different
  1600   // than generate_fixed_frame. What is happening is this. On sparc we have to do
  1586   // than generate_fixed_frame. What is happening is this. On sparc we have to do
  1601   // this dance with interpreter_sp_adjustment because the window save area would
  1587   // this dance with interpreter_sp_adjustment because the window save area would
  1602   // appear just below the bottom (tos) of the caller's java expression stack. Because
  1588   // appear just below the bottom (tos) of the caller's java expression stack. Because
  1617   // this code aware of what the interactions are when that initial caller fram was an osr or
  1603   // this code aware of what the interactions are when that initial caller fram was an osr or
  1618   // other adapter frame. deoptimization is complicated enough and  hard enough to debug that
  1604   // other adapter frame. deoptimization is complicated enough and  hard enough to debug that
  1619   // there is no sense in messing working code.
  1605   // there is no sense in messing working code.
  1620   //
  1606   //
  1621 
  1607 
  1622   int rounded_cls = round_to((callee_local_count - callee_param_count), WordsPerLong);
  1608   int rounded_cls = round_to((callee_locals - callee_params), WordsPerLong);
  1623   assert(rounded_cls == round_to(rounded_cls, WordsPerLong), "must align");
  1609   assert(rounded_cls == round_to(rounded_cls, WordsPerLong), "must align");
  1624 
  1610 
  1625   int raw_frame_size = size_activation_helper(rounded_cls, method->max_stack(),
  1611   int raw_frame_size = size_activation_helper(rounded_cls, max_stack, monitor_size);
  1626                                               monitor_size);
  1612 
  1627 
  1613   return raw_frame_size;
  1628   if (interpreter_frame != NULL) {
  1614 }
  1629     // The skeleton frame must already look like an interpreter frame
  1615 
  1630     // even if not fully filled out.
  1616 void AbstractInterpreter::layout_activation(Method* method,
  1631     assert(interpreter_frame->is_interpreted_frame(), "Must be interpreted frame");
  1617                                             int tempcount,
  1632 
  1618                                             int popframe_extra_args,
  1633     intptr_t* fp = interpreter_frame->fp();
  1619                                             int moncount,
  1634 
  1620                                             int caller_actual_parameters,
  1635     JavaThread* thread = JavaThread::current();
  1621                                             int callee_param_count,
  1636     RegisterMap map(thread, false);
  1622                                             int callee_local_count,
  1637     // More verification that skeleton frame is properly walkable
  1623                                             frame* caller,
  1638     assert(fp == caller->sp(), "fp must match");
  1624                                             frame* interpreter_frame,
  1639 
  1625                                             bool is_top_frame,
  1640     intptr_t* montop     = fp - rounded_vm_local_words;
  1626                                             bool is_bottom_frame) {
  1641 
  1627   // Set up the following variables:
  1642     // preallocate monitors (cf. __ add_monitor_to_stack)
  1628   //   - Lmethod
  1643     intptr_t* monitors = montop - monitor_size;
  1629   //   - Llocals
  1644 
  1630   //   - Lmonitors (to the indicated number of monitors)
  1645     // preallocate stack space
  1631   //   - Lesp (to the indicated number of temps)
  1646     intptr_t*  esp = monitors - 1 -
  1632   // The frame caller on entry is a description of the caller of the
  1647                      (tempcount * Interpreter::stackElementWords) -
  1633   // frame we are about to layout. We are guaranteed that we will be
  1648                      popframe_extra_args;
  1634   // able to fill in a new interpreter frame as its callee (i.e. the
  1649 
  1635   // stack space is allocated and the amount was determined by an
  1650     int local_words = method->max_locals() * Interpreter::stackElementWords;
  1636   // earlier call to the size_activation() method).  On return caller
  1651     NEEDS_CLEANUP;
  1637   // while describe the interpreter frame we just layed out.
  1652     intptr_t* locals;
  1638 
  1653     if (caller->is_interpreted_frame()) {
  1639   // The skeleton frame must already look like an interpreter frame
  1654       // Can force the locals area to end up properly overlapping the top of the expression stack.
  1640   // even if not fully filled out.
  1655       intptr_t* Lesp_ptr = caller->interpreter_frame_tos_address() - 1;
  1641   assert(interpreter_frame->is_interpreted_frame(), "Must be interpreted frame");
  1656       // Note that this computation means we replace size_of_parameters() values from the caller
  1642 
  1657       // interpreter frame's expression stack with our argument locals
  1643   int rounded_vm_local_words = round_to(frame::interpreter_frame_vm_local_words,WordsPerLong);
  1658       int parm_words  = caller_actual_parameters * Interpreter::stackElementWords;
  1644   int monitor_size           = moncount * frame::interpreter_frame_monitor_size();
  1659       locals = Lesp_ptr + parm_words;
  1645   assert(monitor_size == round_to(monitor_size, WordsPerLong), "must align");
  1660       int delta = local_words - parm_words;
  1646 
  1661       int computed_sp_adjustment = (delta > 0) ? round_to(delta, WordsPerLong) : 0;
  1647   intptr_t* fp = interpreter_frame->fp();
  1662       *interpreter_frame->register_addr(I5_savedSP)    = (intptr_t) (fp + computed_sp_adjustment) - STACK_BIAS;
  1648 
  1663       if (!is_bottom_frame) {
  1649   JavaThread* thread = JavaThread::current();
  1664         // Llast_SP is set below for the current frame to SP (with the
  1650   RegisterMap map(thread, false);
  1665         // extra space for the callee's locals). Here we adjust
  1651   // More verification that skeleton frame is properly walkable
  1666         // Llast_SP for the caller's frame, removing the extra space
  1652   assert(fp == caller->sp(), "fp must match");
  1667         // for the current method's locals.
  1653 
  1668         *caller->register_addr(Llast_SP) = *interpreter_frame->register_addr(I5_savedSP);
  1654   intptr_t* montop     = fp - rounded_vm_local_words;
  1669       } else {
  1655 
  1670         assert(*caller->register_addr(Llast_SP) >= *interpreter_frame->register_addr(I5_savedSP), "strange Llast_SP");
  1656   // preallocate monitors (cf. __ add_monitor_to_stack)
  1671       }
  1657   intptr_t* monitors = montop - monitor_size;
       
  1658 
       
  1659   // preallocate stack space
       
  1660   intptr_t*  esp = monitors - 1 -
       
  1661     (tempcount * Interpreter::stackElementWords) -
       
  1662     popframe_extra_args;
       
  1663 
       
  1664   int local_words = method->max_locals() * Interpreter::stackElementWords;
       
  1665   NEEDS_CLEANUP;
       
  1666   intptr_t* locals;
       
  1667   if (caller->is_interpreted_frame()) {
       
  1668     // Can force the locals area to end up properly overlapping the top of the expression stack.
       
  1669     intptr_t* Lesp_ptr = caller->interpreter_frame_tos_address() - 1;
       
  1670     // Note that this computation means we replace size_of_parameters() values from the caller
       
  1671     // interpreter frame's expression stack with our argument locals
       
  1672     int parm_words  = caller_actual_parameters * Interpreter::stackElementWords;
       
  1673     locals = Lesp_ptr + parm_words;
       
  1674     int delta = local_words - parm_words;
       
  1675     int computed_sp_adjustment = (delta > 0) ? round_to(delta, WordsPerLong) : 0;
       
  1676     *interpreter_frame->register_addr(I5_savedSP)    = (intptr_t) (fp + computed_sp_adjustment) - STACK_BIAS;
       
  1677     if (!is_bottom_frame) {
       
  1678       // Llast_SP is set below for the current frame to SP (with the
       
  1679       // extra space for the callee's locals). Here we adjust
       
  1680       // Llast_SP for the caller's frame, removing the extra space
       
  1681       // for the current method's locals.
       
  1682       *caller->register_addr(Llast_SP) = *interpreter_frame->register_addr(I5_savedSP);
  1672     } else {
  1683     } else {
  1673       assert(caller->is_compiled_frame() || caller->is_entry_frame(), "only possible cases");
  1684       assert(*caller->register_addr(Llast_SP) >= *interpreter_frame->register_addr(I5_savedSP), "strange Llast_SP");
  1674       // Don't have Lesp available; lay out locals block in the caller
  1685     }
  1675       // adjacent to the register window save area.
  1686   } else {
  1676       //
  1687     assert(caller->is_compiled_frame() || caller->is_entry_frame(), "only possible cases");
  1677       // Compiled frames do not allocate a varargs area which is why this if
  1688     // Don't have Lesp available; lay out locals block in the caller
  1678       // statement is needed.
  1689     // adjacent to the register window save area.
  1679       //
  1690     //
  1680       if (caller->is_compiled_frame()) {
  1691     // Compiled frames do not allocate a varargs area which is why this if
  1681         locals = fp + frame::register_save_words + local_words - 1;
  1692     // statement is needed.
  1682       } else {
  1693     //
  1683         locals = fp + frame::memory_parameter_word_sp_offset + local_words - 1;
  1694     if (caller->is_compiled_frame()) {
  1684       }
  1695       locals = fp + frame::register_save_words + local_words - 1;
  1685       if (!caller->is_entry_frame()) {
  1696     } else {
  1686         // Caller wants his own SP back
  1697       locals = fp + frame::memory_parameter_word_sp_offset + local_words - 1;
  1687         int caller_frame_size = caller->cb()->frame_size();
  1698     }
  1688         *interpreter_frame->register_addr(I5_savedSP) = (intptr_t)(caller->fp() - caller_frame_size) - STACK_BIAS;
  1699     if (!caller->is_entry_frame()) {
       
  1700       // Caller wants his own SP back
       
  1701       int caller_frame_size = caller->cb()->frame_size();
       
  1702       *interpreter_frame->register_addr(I5_savedSP) = (intptr_t)(caller->fp() - caller_frame_size) - STACK_BIAS;
       
  1703     }
       
  1704   }
       
  1705   if (TraceDeoptimization) {
       
  1706     if (caller->is_entry_frame()) {
       
  1707       // make sure I5_savedSP and the entry frames notion of saved SP
       
  1708       // agree.  This assertion duplicate a check in entry frame code
       
  1709       // but catches the failure earlier.
       
  1710       assert(*caller->register_addr(Lscratch) == *interpreter_frame->register_addr(I5_savedSP),
       
  1711              "would change callers SP");
       
  1712     }
       
  1713     if (caller->is_entry_frame()) {
       
  1714       tty->print("entry ");
       
  1715     }
       
  1716     if (caller->is_compiled_frame()) {
       
  1717       tty->print("compiled ");
       
  1718       if (caller->is_deoptimized_frame()) {
       
  1719         tty->print("(deopt) ");
  1689       }
  1720       }
  1690     }
  1721     }
  1691     if (TraceDeoptimization) {
  1722     if (caller->is_interpreted_frame()) {
  1692       if (caller->is_entry_frame()) {
  1723       tty->print("interpreted ");
  1693         // make sure I5_savedSP and the entry frames notion of saved SP
       
  1694         // agree.  This assertion duplicate a check in entry frame code
       
  1695         // but catches the failure earlier.
       
  1696         assert(*caller->register_addr(Lscratch) == *interpreter_frame->register_addr(I5_savedSP),
       
  1697                "would change callers SP");
       
  1698       }
       
  1699       if (caller->is_entry_frame()) {
       
  1700         tty->print("entry ");
       
  1701       }
       
  1702       if (caller->is_compiled_frame()) {
       
  1703         tty->print("compiled ");
       
  1704         if (caller->is_deoptimized_frame()) {
       
  1705           tty->print("(deopt) ");
       
  1706         }
       
  1707       }
       
  1708       if (caller->is_interpreted_frame()) {
       
  1709         tty->print("interpreted ");
       
  1710       }
       
  1711       tty->print_cr("caller fp=0x%x sp=0x%x", caller->fp(), caller->sp());
       
  1712       tty->print_cr("save area = 0x%x, 0x%x", caller->sp(), caller->sp() + 16);
       
  1713       tty->print_cr("save area = 0x%x, 0x%x", caller->fp(), caller->fp() + 16);
       
  1714       tty->print_cr("interpreter fp=0x%x sp=0x%x", interpreter_frame->fp(), interpreter_frame->sp());
       
  1715       tty->print_cr("save area = 0x%x, 0x%x", interpreter_frame->sp(), interpreter_frame->sp() + 16);
       
  1716       tty->print_cr("save area = 0x%x, 0x%x", interpreter_frame->fp(), interpreter_frame->fp() + 16);
       
  1717       tty->print_cr("Llocals = 0x%x", locals);
       
  1718       tty->print_cr("Lesp = 0x%x", esp);
       
  1719       tty->print_cr("Lmonitors = 0x%x", monitors);
       
  1720     }
  1724     }
  1721 
  1725     tty->print_cr("caller fp=0x%x sp=0x%x", caller->fp(), caller->sp());
  1722     if (method->max_locals() > 0) {
  1726     tty->print_cr("save area = 0x%x, 0x%x", caller->sp(), caller->sp() + 16);
  1723       assert(locals < caller->sp() || locals >= (caller->sp() + 16), "locals in save area");
  1727     tty->print_cr("save area = 0x%x, 0x%x", caller->fp(), caller->fp() + 16);
  1724       assert(locals < caller->fp() || locals > (caller->fp() + 16), "locals in save area");
  1728     tty->print_cr("interpreter fp=0x%x sp=0x%x", interpreter_frame->fp(), interpreter_frame->sp());
  1725       assert(locals < interpreter_frame->sp() || locals > (interpreter_frame->sp() + 16), "locals in save area");
  1729     tty->print_cr("save area = 0x%x, 0x%x", interpreter_frame->sp(), interpreter_frame->sp() + 16);
  1726       assert(locals < interpreter_frame->fp() || locals >= (interpreter_frame->fp() + 16), "locals in save area");
  1730     tty->print_cr("save area = 0x%x, 0x%x", interpreter_frame->fp(), interpreter_frame->fp() + 16);
  1727     }
  1731     tty->print_cr("Llocals = 0x%x", locals);
       
  1732     tty->print_cr("Lesp = 0x%x", esp);
       
  1733     tty->print_cr("Lmonitors = 0x%x", monitors);
       
  1734   }
       
  1735 
       
  1736   if (method->max_locals() > 0) {
       
  1737     assert(locals < caller->sp() || locals >= (caller->sp() + 16), "locals in save area");
       
  1738     assert(locals < caller->fp() || locals > (caller->fp() + 16), "locals in save area");
       
  1739     assert(locals < interpreter_frame->sp() || locals > (interpreter_frame->sp() + 16), "locals in save area");
       
  1740     assert(locals < interpreter_frame->fp() || locals >= (interpreter_frame->fp() + 16), "locals in save area");
       
  1741   }
  1728 #ifdef _LP64
  1742 #ifdef _LP64
  1729     assert(*interpreter_frame->register_addr(I5_savedSP) & 1, "must be odd");
  1743   assert(*interpreter_frame->register_addr(I5_savedSP) & 1, "must be odd");
  1730 #endif
  1744 #endif
  1731 
  1745 
  1732     *interpreter_frame->register_addr(Lmethod)     = (intptr_t) method;
  1746   *interpreter_frame->register_addr(Lmethod)     = (intptr_t) method;
  1733     *interpreter_frame->register_addr(Llocals)     = (intptr_t) locals;
  1747   *interpreter_frame->register_addr(Llocals)     = (intptr_t) locals;
  1734     *interpreter_frame->register_addr(Lmonitors)   = (intptr_t) monitors;
  1748   *interpreter_frame->register_addr(Lmonitors)   = (intptr_t) monitors;
  1735     *interpreter_frame->register_addr(Lesp)        = (intptr_t) esp;
  1749   *interpreter_frame->register_addr(Lesp)        = (intptr_t) esp;
  1736     // Llast_SP will be same as SP as there is no adapter space
  1750   // Llast_SP will be same as SP as there is no adapter space
  1737     *interpreter_frame->register_addr(Llast_SP)    = (intptr_t) interpreter_frame->sp() - STACK_BIAS;
  1751   *interpreter_frame->register_addr(Llast_SP)    = (intptr_t) interpreter_frame->sp() - STACK_BIAS;
  1738     *interpreter_frame->register_addr(LcpoolCache) = (intptr_t) method->constants()->cache();
  1752   *interpreter_frame->register_addr(LcpoolCache) = (intptr_t) method->constants()->cache();
  1739 #ifdef FAST_DISPATCH
  1753 #ifdef FAST_DISPATCH
  1740     *interpreter_frame->register_addr(IdispatchTables) = (intptr_t) Interpreter::dispatch_table();
  1754   *interpreter_frame->register_addr(IdispatchTables) = (intptr_t) Interpreter::dispatch_table();
  1741 #endif
  1755 #endif
  1742 
  1756 
  1743 
  1757 
  1744 #ifdef ASSERT
  1758 #ifdef ASSERT
  1745     BasicObjectLock* mp = (BasicObjectLock*)monitors;
  1759   BasicObjectLock* mp = (BasicObjectLock*)monitors;
  1746 
  1760 
  1747     assert(interpreter_frame->interpreter_frame_method() == method, "method matches");
  1761   assert(interpreter_frame->interpreter_frame_method() == method, "method matches");
  1748     assert(interpreter_frame->interpreter_frame_local_at(9) == (intptr_t *)((intptr_t)locals - (9 * Interpreter::stackElementSize)), "locals match");
  1762   assert(interpreter_frame->interpreter_frame_local_at(9) == (intptr_t *)((intptr_t)locals - (9 * Interpreter::stackElementSize)), "locals match");
  1749     assert(interpreter_frame->interpreter_frame_monitor_end()   == mp, "monitor_end matches");
  1763   assert(interpreter_frame->interpreter_frame_monitor_end()   == mp, "monitor_end matches");
  1750     assert(((intptr_t *)interpreter_frame->interpreter_frame_monitor_begin()) == ((intptr_t *)mp)+monitor_size, "monitor_begin matches");
  1764   assert(((intptr_t *)interpreter_frame->interpreter_frame_monitor_begin()) == ((intptr_t *)mp)+monitor_size, "monitor_begin matches");
  1751     assert(interpreter_frame->interpreter_frame_tos_address()-1 == esp, "esp matches");
  1765   assert(interpreter_frame->interpreter_frame_tos_address()-1 == esp, "esp matches");
  1752 
  1766 
  1753     // check bounds
  1767   // check bounds
  1754     intptr_t* lo = interpreter_frame->sp() + (frame::memory_parameter_word_sp_offset - 1);
  1768   intptr_t* lo = interpreter_frame->sp() + (frame::memory_parameter_word_sp_offset - 1);
  1755     intptr_t* hi = interpreter_frame->fp() - rounded_vm_local_words;
  1769   intptr_t* hi = interpreter_frame->fp() - rounded_vm_local_words;
  1756     assert(lo < monitors && montop <= hi, "monitors in bounds");
  1770   assert(lo < monitors && montop <= hi, "monitors in bounds");
  1757     assert(lo <= esp && esp < monitors, "esp in bounds");
  1771   assert(lo <= esp && esp < monitors, "esp in bounds");
  1758 #endif // ASSERT
  1772 #endif // ASSERT
  1759   }
       
  1760 
       
  1761   return raw_frame_size;
       
  1762 }
  1773 }
  1763 
  1774 
  1764 //----------------------------------------------------------------------------------------------------
  1775 //----------------------------------------------------------------------------------------------------
  1765 // Exceptions
  1776 // Exceptions
  1766 void TemplateInterpreterGenerator::generate_throw_exception() {
  1777 void TemplateInterpreterGenerator::generate_throw_exception() {