< prev index next >

src/cpu/ppc/vm/templateInterpreter_ppc.cpp

Print this page
rev 7507 : 8066964: ppc64: argument and return type profiling, fix problem with popframe

*** 89,99 **** // exception happened. __ empty_expression_stack(); // Thread will be loaded to R3_ARG1. // Target class oop is in register R5_ARG3 by convention! ! __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_ClassCastException_verbose, R17_tos, R5_ARG3)); // Above call must not return here since exception pending. DEBUG_ONLY(__ should_not_reach_here();) return entry; } #endif --- 89,99 ---- // exception happened. __ empty_expression_stack(); // Thread will be loaded to R3_ARG1. // Target class oop is in register R5_ARG3 by convention! ! __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_ClassCastException_verbose), R17_tos, R5_ARG3); // Above call must not return here since exception pending. DEBUG_ONLY(__ should_not_reach_here();) return entry; } #endif
*** 170,179 **** --- 170,183 ---- __ resize_frame_absolute(R12_scratch2, R11_scratch1, R0); // Compiled code destroys templateTableBase, reload. __ load_const_optimized(R25_templateTableBase, (address)Interpreter::dispatch_table((TosState)0), R12_scratch2); + if (state == atos) { + __ profile_return_type(R3_RET, R11_scratch1, R12_scratch2); + } + const Register cache = R11_scratch1; const Register size = R12_scratch2; __ get_cache_and_index_at_bcp(cache, 1, index_size); // Get least significant byte of 64 bit value:
*** 1187,1196 **** --- 1191,1204 ---- // This flag has two effects, one is to force an unwind in the topmost // interpreter frame and not perform an unlock while doing so. __ li(R0, 1); __ stb(R0, in_bytes(JavaThread::do_not_unlock_if_synchronized_offset()), R16_thread); } + + // Argument and return type profiling. + __ profile_parameters_type(R3_ARG1, R4_ARG2, R5_ARG3, R6_ARG4); + // Increment invocation counter and check for overflow. if (inc_counter) { generate_counter_incr(&invocation_counter_overflow, &profile_method, &profile_method_continue); }
*** 1467,1476 **** --- 1475,1486 ---- __ restore_interpreter_state(R11_scratch1); __ ld(R12_scratch2, _ijava_state_neg(top_frame_sp), R11_scratch1); __ resize_frame_absolute(R12_scratch2, R11_scratch1, R0); if (ProfileInterpreter) { __ set_method_data_pointer_for_bcp(); + __ ld(R11_scratch1, 0, R1_SP); + __ std(R28_mdx, _ijava_state_neg(mdx), R11_scratch1); } #if INCLUDE_JVMTI Label L_done; __ lbz(R11_scratch1, 0, R14_bcp);
*** 1478,1494 **** __ bne(CCR0, L_done); // The member name argument must be restored if _invokestatic is re-executed after a PopFrame call. // Detect such a case in the InterpreterRuntime function and return the member name argument, or NULL. __ ld(R4_ARG2, 0, R18_locals); ! __ call_VM(R11_scratch1, CAST_FROM_FN_PTR(address, InterpreterRuntime::member_name_arg_or_null), ! R4_ARG2, R19_method, R14_bcp); ! ! __ cmpdi(CCR0, R11_scratch1, 0); __ beq(CCR0, L_done); ! ! __ std(R11_scratch1, wordSize, R15_esp); __ bind(L_done); #endif // INCLUDE_JVMTI __ dispatch_next(vtos); } // end of JVMTI PopFrame support --- 1488,1502 ---- __ bne(CCR0, L_done); // The member name argument must be restored if _invokestatic is re-executed after a PopFrame call. // Detect such a case in the InterpreterRuntime function and return the member name argument, or NULL. __ ld(R4_ARG2, 0, R18_locals); ! __ MacroAssembler::call_VM(R4_ARG2, CAST_FROM_FN_PTR(address, InterpreterRuntime::member_name_arg_or_null), R4_ARG2, R19_method, R14_bcp, false); ! __ restore_interpreter_state(R11_scratch1, /*bcp_and_mdx_only*/ true); ! __ cmpdi(CCR0, R4_ARG2, 0); __ beq(CCR0, L_done); ! __ std(R4_ARG2, wordSize, R15_esp); __ bind(L_done); #endif // INCLUDE_JVMTI __ dispatch_next(vtos); } // end of JVMTI PopFrame support
< prev index next >