< prev index next >

src/cpu/x86/vm/methodHandles_x86.cpp

Print this page
rev 13993 : [mq]: refactor-acmp.patch


 170   __ load_heap_oop(method_temp, Address(recv, NONZERO(java_lang_invoke_MethodHandle::form_offset_in_bytes())));
 171   oopDesc::bs()->interpreter_read_barrier(_masm, method_temp);
 172   __ verify_oop(method_temp);
 173   __ load_heap_oop(method_temp, Address(method_temp, NONZERO(java_lang_invoke_LambdaForm::vmentry_offset_in_bytes())));
 174   oopDesc::bs()->interpreter_read_barrier(_masm, method_temp);
 175   __ verify_oop(method_temp);
 176   __ load_heap_oop(method_temp, Address(method_temp, NONZERO(java_lang_invoke_MemberName::method_offset_in_bytes())));
 177   oopDesc::bs()->interpreter_read_barrier(_masm, method_temp);
 178   __ verify_oop(method_temp);
 179   __ movptr(method_temp, Address(method_temp, NONZERO(java_lang_invoke_ResolvedMethodName::vmtarget_offset_in_bytes())));
 180 
 181   if (VerifyMethodHandles && !for_compiler_entry) {
 182     // make sure recv is already on stack
 183     __ movptr(temp2, Address(method_temp, Method::const_offset()));
 184     __ load_sized_value(temp2,
 185                         Address(temp2, ConstMethod::size_of_parameters_offset()),
 186                         sizeof(u2), /*is_signed*/ false);
 187     // assert(sizeof(u2) == sizeof(Method::_size_of_parameters), "");
 188     __ movptr(temp2, __ argument_address(temp2, -1));
 189     Label L;
 190     __ cmpptr(recv, temp2);
 191     oopDesc::bs()->asm_acmp_barrier(_masm, recv, temp2);
 192     __ jcc(Assembler::equal, L);
 193     __ movptr(rax, temp2);
 194     __ STOP("receiver not on stack");
 195     __ BIND(L);
 196   }
 197 
 198   jump_from_method_handle(_masm, method_temp, temp2, for_compiler_entry);
 199   BLOCK_COMMENT("} jump_to_lambda_form");
 200 }
 201 
 202 
 203 // Code generation
 204 address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler* _masm,
 205                                                                 vmIntrinsics::ID iid) {
 206   const bool not_for_compiler_entry = false;  // this is the interpreter entry
 207   assert(is_signature_polymorphic(iid), "expected invoke iid");
 208   if (iid == vmIntrinsics::_invokeGeneric ||
 209       iid == vmIntrinsics::_compiledLambdaForm) {
 210     // Perhaps surprisingly, the symbolic references visible to Java are not directly used.
 211     // They are linked to Java-generated adapters via MethodHandleNatives.linkMethod.




 170   __ load_heap_oop(method_temp, Address(recv, NONZERO(java_lang_invoke_MethodHandle::form_offset_in_bytes())));
 171   oopDesc::bs()->interpreter_read_barrier(_masm, method_temp);
 172   __ verify_oop(method_temp);
 173   __ load_heap_oop(method_temp, Address(method_temp, NONZERO(java_lang_invoke_LambdaForm::vmentry_offset_in_bytes())));
 174   oopDesc::bs()->interpreter_read_barrier(_masm, method_temp);
 175   __ verify_oop(method_temp);
 176   __ load_heap_oop(method_temp, Address(method_temp, NONZERO(java_lang_invoke_MemberName::method_offset_in_bytes())));
 177   oopDesc::bs()->interpreter_read_barrier(_masm, method_temp);
 178   __ verify_oop(method_temp);
 179   __ movptr(method_temp, Address(method_temp, NONZERO(java_lang_invoke_ResolvedMethodName::vmtarget_offset_in_bytes())));
 180 
 181   if (VerifyMethodHandles && !for_compiler_entry) {
 182     // make sure recv is already on stack
 183     __ movptr(temp2, Address(method_temp, Method::const_offset()));
 184     __ load_sized_value(temp2,
 185                         Address(temp2, ConstMethod::size_of_parameters_offset()),
 186                         sizeof(u2), /*is_signed*/ false);
 187     // assert(sizeof(u2) == sizeof(Method::_size_of_parameters), "");
 188     __ movptr(temp2, __ argument_address(temp2, -1));
 189     Label L;
 190     __ cmpoopptr(recv, temp2);

 191     __ jcc(Assembler::equal, L);
 192     __ movptr(rax, temp2);
 193     __ STOP("receiver not on stack");
 194     __ BIND(L);
 195   }
 196 
 197   jump_from_method_handle(_masm, method_temp, temp2, for_compiler_entry);
 198   BLOCK_COMMENT("} jump_to_lambda_form");
 199 }
 200 
 201 
 202 // Code generation
 203 address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler* _masm,
 204                                                                 vmIntrinsics::ID iid) {
 205   const bool not_for_compiler_entry = false;  // this is the interpreter entry
 206   assert(is_signature_polymorphic(iid), "expected invoke iid");
 207   if (iid == vmIntrinsics::_invokeGeneric ||
 208       iid == vmIntrinsics::_compiledLambdaForm) {
 209     // Perhaps surprisingly, the symbolic references visible to Java are not directly used.
 210     // They are linked to Java-generated adapters via MethodHandleNatives.linkMethod.


< prev index next >