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