1.1 --- a/src/cpu/x86/vm/methodHandles_x86.cpp Thu Jul 14 15:39:40 2011 -0700 1.2 +++ b/src/cpu/x86/vm/methodHandles_x86.cpp Fri Jul 15 15:35:50 2011 -0700 1.3 @@ -546,6 +546,28 @@ 1.4 } 1.5 #endif //ASSERT 1.6 1.7 +void MethodHandles::jump_from_method_handle(MacroAssembler* _masm, Register method, Register temp) { 1.8 + if (JvmtiExport::can_post_interpreter_events()) { 1.9 + Label run_compiled_code; 1.10 + // JVMTI events, such as single-stepping, are implemented partly by avoiding running 1.11 + // compiled code in threads for which the event is enabled. Check here for 1.12 + // interp_only_mode if these events CAN be enabled. 1.13 +#ifdef _LP64 1.14 + Register rthread = r15_thread; 1.15 +#else 1.16 + Register rthread = temp; 1.17 + __ get_thread(rthread); 1.18 +#endif 1.19 + // interp_only is an int, on little endian it is sufficient to test the byte only 1.20 + // Is a cmpl faster? 1.21 + __ cmpb(Address(rthread, JavaThread::interp_only_mode_offset()), 0); 1.22 + __ jccb(Assembler::zero, run_compiled_code); 1.23 + __ jmp(Address(method, methodOopDesc::interpreter_entry_offset())); 1.24 + __ bind(run_compiled_code); 1.25 + } 1.26 + __ jmp(Address(method, methodOopDesc::from_interpreted_offset())); 1.27 +} 1.28 + 1.29 // Code generation 1.30 address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler* _masm) { 1.31 // rbx: methodOop 1.32 @@ -1120,9 +1142,6 @@ 1.33 guarantee(java_lang_invoke_MethodHandle::vmentry_offset_in_bytes() != 0, "must have offsets"); 1.34 1.35 // some handy addresses 1.36 - Address rbx_method_fie( rbx, methodOopDesc::from_interpreted_offset() ); 1.37 - Address rbx_method_fce( rbx, methodOopDesc::from_compiled_offset() ); 1.38 - 1.39 Address rcx_mh_vmtarget( rcx_recv, java_lang_invoke_MethodHandle::vmtarget_offset_in_bytes() ); 1.40 Address rcx_dmh_vmindex( rcx_recv, java_lang_invoke_DirectMethodHandle::vmindex_offset_in_bytes() ); 1.41 1.42 @@ -1163,8 +1182,8 @@ 1.43 assert(raise_exception_method(), "must be set"); 1.44 assert(raise_exception_method()->from_compiled_entry(), "method must be linked"); 1.45 1.46 - const Register rdi_pc = rax; 1.47 - __ pop(rdi_pc); // caller PC 1.48 + const Register rax_pc = rax; 1.49 + __ pop(rax_pc); // caller PC 1.50 __ mov(rsp, saved_last_sp); // cut the stack back to where the caller started 1.51 1.52 Register rbx_method = rbx_temp; 1.53 @@ -1172,11 +1191,15 @@ 1.54 1.55 const int jobject_oop_offset = 0; 1.56 __ movptr(rbx_method, Address(rbx_method, jobject_oop_offset)); // dereference the jobject 1.57 - __ verify_oop(rbx_method); 1.58 1.59 - NOT_LP64(__ push(rarg2_required)); 1.60 - __ push(rdi_pc); // restore caller PC 1.61 - __ jmp(rbx_method_fce); // jump to compiled entry 1.62 + __ movptr(rsi, rsp); 1.63 + __ subptr(rsp, 3 * wordSize); 1.64 + __ push(rax_pc); // restore caller PC 1.65 + 1.66 + __ movptr(__ argument_address(constant(2)), rarg0_code); 1.67 + __ movptr(__ argument_address(constant(1)), rarg1_actual); 1.68 + __ movptr(__ argument_address(constant(0)), rarg2_required); 1.69 + jump_from_method_handle(_masm, rbx_method, rax); 1.70 } 1.71 break; 1.72 1.73 @@ -1195,7 +1218,7 @@ 1.74 __ null_check(rcx_recv); 1.75 __ verify_oop(rcx_recv); 1.76 } 1.77 - __ jmp(rbx_method_fie); 1.78 + jump_from_method_handle(_masm, rbx_method, rax); 1.79 } 1.80 break; 1.81 1.82 @@ -1228,7 +1251,7 @@ 1.83 __ movptr(rbx_method, vtable_entry_addr); 1.84 1.85 __ verify_oop(rbx_method); 1.86 - __ jmp(rbx_method_fie); 1.87 + jump_from_method_handle(_masm, rbx_method, rax); 1.88 } 1.89 break; 1.90 1.91 @@ -1263,7 +1286,7 @@ 1.92 no_such_interface); 1.93 1.94 __ verify_oop(rbx_method); 1.95 - __ jmp(rbx_method_fie); 1.96 + jump_from_method_handle(_masm, rbx_method, rax); 1.97 __ hlt(); 1.98 1.99 __ bind(no_such_interface); 1.100 @@ -1311,7 +1334,7 @@ 1.101 Register rbx_method = rbx_temp; 1.102 __ load_heap_oop(rbx_method, rcx_mh_vmtarget); 1.103 __ verify_oop(rbx_method); 1.104 - __ jmp(rbx_method_fie); 1.105 + jump_from_method_handle(_masm, rbx_method, rax); 1.106 } else { 1.107 __ load_heap_oop(rcx_recv, rcx_mh_vmtarget); 1.108 __ verify_oop(rcx_recv);