679 __ dispatch_next(state, step);
680 } else {
681 __ jump_to_entry(continuation, R11_scratch1);
682 }
683
684 return entry;
685 }
686
687 address TemplateInterpreterGenerator::generate_safept_entry_for(TosState state, address runtime_entry) {
688 address entry = __ pc();
689
690 __ push(state);
691 __ push_cont_fastpath();
692 __ call_VM(noreg, runtime_entry);
693 __ pop_cont_fastpath();
694 __ dispatch_via(vtos, Interpreter::_normal_table.table_for(vtos));
695
696 return entry;
697 }
698
699 // Helpers for commoning out cases in the various type of method entries.
700
701 // Increment invocation count & check for overflow.
702 //
703 // Note: checking for negative value instead of overflow
704 // so we have a 'sticky' overflow test.
705 //
706 void TemplateInterpreterGenerator::generate_counter_incr(Label* overflow) {
707 // Note: In tiered we increment either counters in method or in MDO depending if we're profiling or not.
708 Register Rscratch1 = R11_scratch1;
709 Register Rscratch2 = R12_scratch2;
710 Register R3_counters = R3_ARG1;
711 Label done;
712
713 const int increment = InvocationCounter::count_increment;
714 Label no_mdo;
715 if (ProfileInterpreter) {
716 const Register Rmdo = R3_counters;
717 __ ld(Rmdo, in_bytes(Method::method_data_offset()), R19_method);
718 __ cmpdi(CCR0, Rmdo, 0);
|
679 __ dispatch_next(state, step);
680 } else {
681 __ jump_to_entry(continuation, R11_scratch1);
682 }
683
684 return entry;
685 }
686
687 address TemplateInterpreterGenerator::generate_safept_entry_for(TosState state, address runtime_entry) {
688 address entry = __ pc();
689
690 __ push(state);
691 __ push_cont_fastpath();
692 __ call_VM(noreg, runtime_entry);
693 __ pop_cont_fastpath();
694 __ dispatch_via(vtos, Interpreter::_normal_table.table_for(vtos));
695
696 return entry;
697 }
698
699 address TemplateInterpreterGenerator::generate_cont_resume_interpreter_adapter() {
700 return nullptr;
701 }
702
703
704 // Helpers for commoning out cases in the various type of method entries.
705
706 // Increment invocation count & check for overflow.
707 //
708 // Note: checking for negative value instead of overflow
709 // so we have a 'sticky' overflow test.
710 //
711 void TemplateInterpreterGenerator::generate_counter_incr(Label* overflow) {
712 // Note: In tiered we increment either counters in method or in MDO depending if we're profiling or not.
713 Register Rscratch1 = R11_scratch1;
714 Register Rscratch2 = R12_scratch2;
715 Register R3_counters = R3_ARG1;
716 Label done;
717
718 const int increment = InvocationCounter::count_increment;
719 Label no_mdo;
720 if (ProfileInterpreter) {
721 const Register Rmdo = R3_counters;
722 __ ld(Rmdo, in_bytes(Method::method_data_offset()), R19_method);
723 __ cmpdi(CCR0, Rmdo, 0);
|