# HG changeset patch # User aoqi # Date 1537351250 -28800 # Node ID c30fb4ef0275ddd7420a9e964535c3402e5063ff # Parent 43893ee8d3dca680c55861f418229b7834cc6969 #7557 removed redundant get_thread to save interpreter code size diff -r 43893ee8d3dc -r c30fb4ef0275 src/cpu/mips/vm/interp_masm_mips_64.cpp --- a/src/cpu/mips/vm/interp_masm_mips_64.cpp Wed Sep 19 17:44:09 2018 +0800 +++ b/src/cpu/mips/vm/interp_masm_mips_64.cpp Wed Sep 19 18:00:50 2018 +0800 @@ -182,31 +182,36 @@ // don't want to reenter. // This method is only called just after the call into the vm in // call_VM_base, so the arg registers are available. - Register pop_cond = java_thread; - // Not clear if any other register is available... - lw(pop_cond, java_thread, in_bytes(JavaThread::popframe_condition_offset())); - andi(AT, pop_cond, JavaThread::popframe_pending_bit); + // Not clear if any other register is available, so load AT twice + assert(AT != java_thread, "check"); + lw(AT, java_thread, in_bytes(JavaThread::popframe_condition_offset())); + andi(AT, AT, JavaThread::popframe_pending_bit); beq(AT, R0, L); - delayed()->andi(AT, pop_cond, JavaThread::popframe_processing_bit); + delayed()->nop(); + + lw(AT, java_thread, in_bytes(JavaThread::popframe_condition_offset())); + andi(AT, AT, JavaThread::popframe_processing_bit); bne(AT, R0, L); delayed()->nop(); - get_thread(java_thread); call_VM_leaf(CAST_FROM_FN_PTR(address, Interpreter::remove_activation_preserving_args_entry)); jr(V0); delayed()->nop(); bind(L); - get_thread(java_thread); } } void InterpreterMacroAssembler::load_earlyret_value(TosState state) { - //T8, thread - get_thread(T8); - ld_ptr(T8, T8,in_bytes(JavaThread::jvmti_thread_state_offset())); - const Address tos_addr (T8, in_bytes(JvmtiThreadState::earlyret_tos_offset())); - const Address oop_addr (T8, in_bytes(JvmtiThreadState::earlyret_oop_offset())); - const Address val_addr (T8, in_bytes(JvmtiThreadState::earlyret_value_offset())); + Register thread = T8; +#ifndef OPT_THREAD + get_thread(thread); +#else + move(T8, TREG); +#endif + ld_ptr(thread, thread, in_bytes(JavaThread::jvmti_thread_state_offset())); + const Address tos_addr (thread, in_bytes(JvmtiThreadState::earlyret_tos_offset())); + const Address oop_addr (thread, in_bytes(JvmtiThreadState::earlyret_oop_offset())); + const Address val_addr (thread, in_bytes(JvmtiThreadState::earlyret_value_offset())); //V0, oop_addr,V1,val_addr switch (state) { case atos: @@ -225,10 +230,10 @@ lw(V0, val_addr); break; case ftos: - lwc1(F0,T8, in_bytes(JvmtiThreadState::earlyret_value_offset())); + lwc1(F0, thread, in_bytes(JvmtiThreadState::earlyret_value_offset())); break; case dtos: - ldc1(F0,T8, in_bytes(JvmtiThreadState::earlyret_value_offset())); + ldc1(F0, thread, in_bytes(JvmtiThreadState::earlyret_value_offset())); break; case vtos: /* nothing to do */ break; default : ShouldNotReachHere(); @@ -236,7 +241,7 @@ // Clean up tos value in the thread object move(AT, (int)ilgl); sw(AT, tos_addr); - sw(R0,T8, in_bytes(JvmtiThreadState::earlyret_value_offset())); + sw(R0, thread, in_bytes(JvmtiThreadState::earlyret_value_offset())); } @@ -245,8 +250,10 @@ Label L; Register tmp = T9; - ld_ptr(AT,java_thread, in_bytes(JavaThread::jvmti_thread_state_offset())); - beq(AT,R0,L); + assert(java_thread != AT, "check"); + assert(java_thread != tmp, "check"); + ld_ptr(AT, java_thread, in_bytes(JavaThread::jvmti_thread_state_offset())); + beq(AT, R0, L); delayed()->nop(); // Initiate earlyret handling only if it is not already being processed. @@ -256,18 +263,16 @@ move(tmp, JvmtiThreadState::earlyret_pending); bne(tmp, AT, L); delayed()->nop(); - get_thread(java_thread); // Call Interpreter::remove_activation_early_entry() to get the address of the // same-named entrypoint in the generated interpreter code. - ld_ptr(tmp,java_thread, in_bytes(JavaThread::jvmti_thread_state_offset())); - lw(AT,tmp, in_bytes(JvmtiThreadState::earlyret_tos_offset())); + ld_ptr(tmp, java_thread, in_bytes(JavaThread::jvmti_thread_state_offset())); + lw(AT, tmp, in_bytes(JvmtiThreadState::earlyret_tos_offset())); move(A0, AT); call_VM_leaf(CAST_FROM_FN_PTR(address, Interpreter::remove_activation_early_entry), A0); jr(V0); delayed()->nop(); bind(L); - get_thread(java_thread); } } @@ -2045,7 +2050,11 @@ Register tempreg = T0; if (JvmtiExport::can_post_interpreter_events()) { Label L; +#ifndef OPT_THREAD get_thread(AT); +#else + move(AT, TREG); +#endif lw(tempreg, AT, in_bytes(JavaThread::interp_only_mode_offset())); beq(tempreg, R0, L); delayed()->nop(); @@ -2074,8 +2083,11 @@ Register tempreg = T0; if (mode == NotifyJVMTI && JvmtiExport::can_post_interpreter_events()) { Label skip; - //lw(tempreg, in_bytes(JavaThread::interp_only_mode_offset()), Rthread); +#ifndef OPT_THREAD get_thread(AT); +#else + move(AT, TREG); +#endif lw(tempreg, AT, in_bytes(JavaThread::interp_only_mode_offset())); beq(tempreg, R0, skip); delayed()->nop();