comparison src/cpu/sparc/vm/templateTable_sparc.cpp @ 10108:9500809ceead

Merge
author jiangli
date Thu, 18 Apr 2013 17:00:16 -0400
parents f2e682ef3156 aeaca88565e6
children 63e44cdabb91 46c544b8fbfc
comparison
equal deleted inserted replaced
10104:cbf8c8c25bbe 10108:9500809ceead
1609 } 1609 }
1610 1610
1611 // Normal (non-jsr) branch handling 1611 // Normal (non-jsr) branch handling
1612 1612
1613 // Save the current Lbcp 1613 // Save the current Lbcp
1614 const Register O0_cur_bcp = O0; 1614 const Register l_cur_bcp = Lscratch;
1615 __ mov( Lbcp, O0_cur_bcp ); 1615 __ mov( Lbcp, l_cur_bcp );
1616
1617 1616
1618 bool increment_invocation_counter_for_backward_branches = UseCompiler && UseLoopCounter; 1617 bool increment_invocation_counter_for_backward_branches = UseCompiler && UseLoopCounter;
1619 if ( increment_invocation_counter_for_backward_branches ) { 1618 if ( increment_invocation_counter_for_backward_branches ) {
1620 Label Lforward; 1619 Label Lforward;
1621 // check branch direction 1620 // check branch direction
1622 __ br( Assembler::positive, false, Assembler::pn, Lforward ); 1621 __ br( Assembler::positive, false, Assembler::pn, Lforward );
1623 // Bump bytecode pointer by displacement (take the branch) 1622 // Bump bytecode pointer by displacement (take the branch)
1624 __ delayed()->add( O1_disp, Lbcp, Lbcp ); // add to bc addr 1623 __ delayed()->add( O1_disp, Lbcp, Lbcp ); // add to bc addr
1624
1625 const Register Rcounters = G3_scratch;
1626 __ get_method_counters(Lmethod, Rcounters, Lforward);
1625 1627
1626 if (TieredCompilation) { 1628 if (TieredCompilation) {
1627 Label Lno_mdo, Loverflow; 1629 Label Lno_mdo, Loverflow;
1628 int increment = InvocationCounter::count_increment; 1630 int increment = InvocationCounter::count_increment;
1629 int mask = ((1 << Tier0BackedgeNotifyFreqLog) - 1) << InvocationCounter::count_shift; 1631 int mask = ((1 << Tier0BackedgeNotifyFreqLog) - 1) << InvocationCounter::count_shift;
1633 __ br_null_short(G4_scratch, Assembler::pn, Lno_mdo); 1635 __ br_null_short(G4_scratch, Assembler::pn, Lno_mdo);
1634 1636
1635 // Increment backedge counter in the MDO 1637 // Increment backedge counter in the MDO
1636 Address mdo_backedge_counter(G4_scratch, in_bytes(MethodData::backedge_counter_offset()) + 1638 Address mdo_backedge_counter(G4_scratch, in_bytes(MethodData::backedge_counter_offset()) +
1637 in_bytes(InvocationCounter::counter_offset())); 1639 in_bytes(InvocationCounter::counter_offset()));
1638 __ increment_mask_and_jump(mdo_backedge_counter, increment, mask, G3_scratch, Lscratch, 1640 __ increment_mask_and_jump(mdo_backedge_counter, increment, mask, G3_scratch, O0,
1639 Assembler::notZero, &Lforward); 1641 Assembler::notZero, &Lforward);
1640 __ ba_short(Loverflow); 1642 __ ba_short(Loverflow);
1641 } 1643 }
1642 1644
1643 // If there's no MDO, increment counter in Method* 1645 // If there's no MDO, increment counter in MethodCounters*
1644 __ bind(Lno_mdo); 1646 __ bind(Lno_mdo);
1645 Address backedge_counter(Lmethod, in_bytes(Method::backedge_counter_offset()) + 1647 Address backedge_counter(Rcounters,
1646 in_bytes(InvocationCounter::counter_offset())); 1648 in_bytes(MethodCounters::backedge_counter_offset()) +
1647 __ increment_mask_and_jump(backedge_counter, increment, mask, G3_scratch, Lscratch, 1649 in_bytes(InvocationCounter::counter_offset()));
1650 __ increment_mask_and_jump(backedge_counter, increment, mask, G4_scratch, O0,
1648 Assembler::notZero, &Lforward); 1651 Assembler::notZero, &Lforward);
1649 __ bind(Loverflow); 1652 __ bind(Loverflow);
1650 1653
1651 // notify point for loop, pass branch bytecode 1654 // notify point for loop, pass branch bytecode
1652 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::frequency_counter_overflow), O0_cur_bcp); 1655 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::frequency_counter_overflow), l_cur_bcp);
1653 1656
1654 // Was an OSR adapter generated? 1657 // Was an OSR adapter generated?
1655 // O0 = osr nmethod 1658 // O0 = osr nmethod
1656 __ br_null_short(O0, Assembler::pn, Lforward); 1659 __ br_null_short(O0, Assembler::pn, Lforward);
1657 1660
1684 __ delayed()->nop(); 1687 __ delayed()->nop();
1685 1688
1686 } else { 1689 } else {
1687 // Update Backedge branch separately from invocations 1690 // Update Backedge branch separately from invocations
1688 const Register G4_invoke_ctr = G4; 1691 const Register G4_invoke_ctr = G4;
1689 __ increment_backedge_counter(G4_invoke_ctr, G1_scratch); 1692 __ increment_backedge_counter(Rcounters, G4_invoke_ctr, G1_scratch);
1690 if (ProfileInterpreter) { 1693 if (ProfileInterpreter) {
1691 __ test_invocation_counter_for_mdp(G4_invoke_ctr, G3_scratch, Lforward); 1694 __ test_invocation_counter_for_mdp(G4_invoke_ctr, G3_scratch, Lforward);
1692 if (UseOnStackReplacement) { 1695 if (UseOnStackReplacement) {
1693 __ test_backedge_count_for_osr(O2_bumped_count, O0_cur_bcp, G3_scratch); 1696 __ test_backedge_count_for_osr(O2_bumped_count, l_cur_bcp, G3_scratch);
1694 } 1697 }
1695 } else { 1698 } else {
1696 if (UseOnStackReplacement) { 1699 if (UseOnStackReplacement) {
1697 __ test_backedge_count_for_osr(G4_invoke_ctr, O0_cur_bcp, G3_scratch); 1700 __ test_backedge_count_for_osr(G4_invoke_ctr, l_cur_bcp, G3_scratch);
1698 } 1701 }
1699 } 1702 }
1700 } 1703 }
1701 1704
1702 __ bind(Lforward); 1705 __ bind(Lforward);