Mercurial > hg > truffle
comparison src/cpu/x86/vm/methodHandles_x86.cpp @ 6790:2cb2f30450c7
7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
Reviewed-by: kvn, jrose, bdelsart
author | twisti |
---|---|
date | Mon, 17 Sep 2012 12:57:58 -0700 |
parents | 75f33eecc1b3 |
children | 65d07d9ee446 |
comparison
equal
deleted
inserted
replaced
6749:a6fe94b9759f | 6790:2cb2f30450c7 |
---|---|
325 assert_different_registers(temp1, rcx, rdx); | 325 assert_different_registers(temp1, rcx, rdx); |
326 assert_different_registers(temp2, rcx, rdx); | 326 assert_different_registers(temp2, rcx, rdx); |
327 assert_different_registers(temp3, rcx, rdx); | 327 assert_different_registers(temp3, rcx, rdx); |
328 } | 328 } |
329 #endif | 329 #endif |
330 else { | |
331 assert_different_registers(temp1, temp2, temp3, saved_last_sp_register()); // don't trash lastSP | |
332 } | |
330 assert_different_registers(temp1, temp2, temp3, receiver_reg); | 333 assert_different_registers(temp1, temp2, temp3, receiver_reg); |
331 assert_different_registers(temp1, temp2, temp3, member_reg); | 334 assert_different_registers(temp1, temp2, temp3, member_reg); |
332 if (!for_compiler_entry) | |
333 assert_different_registers(temp1, temp2, temp3, saved_last_sp_register()); // don't trash lastSP | |
334 | 335 |
335 if (iid == vmIntrinsics::_invokeBasic) { | 336 if (iid == vmIntrinsics::_invokeBasic) { |
336 // indirect through MH.form.vmentry.vmtarget | 337 // indirect through MH.form.vmentry.vmtarget |
337 jump_to_lambda_form(_masm, receiver_reg, rbx_method, temp1, for_compiler_entry); | 338 jump_to_lambda_form(_masm, receiver_reg, rbx_method, temp1, for_compiler_entry); |
338 | 339 |
390 // member_reg - MemberName that was the trailing argument | 391 // member_reg - MemberName that was the trailing argument |
391 // temp1_recv_klass - klass of stacked receiver, if needed | 392 // temp1_recv_klass - klass of stacked receiver, if needed |
392 // rsi/r13 - interpreter linkage (if interpreted) | 393 // rsi/r13 - interpreter linkage (if interpreted) |
393 // rcx, rdx, rsi, rdi, r8, r8 - compiler arguments (if compiled) | 394 // rcx, rdx, rsi, rdi, r8, r8 - compiler arguments (if compiled) |
394 | 395 |
395 bool method_is_live = false; | 396 Label L_incompatible_class_change_error; |
396 switch (iid) { | 397 switch (iid) { |
397 case vmIntrinsics::_linkToSpecial: | 398 case vmIntrinsics::_linkToSpecial: |
398 if (VerifyMethodHandles) { | 399 if (VerifyMethodHandles) { |
399 verify_ref_kind(_masm, JVM_REF_invokeSpecial, member_reg, temp3); | 400 verify_ref_kind(_masm, JVM_REF_invokeSpecial, member_reg, temp3); |
400 } | 401 } |
401 __ movptr(rbx_method, member_vmtarget); | 402 __ movptr(rbx_method, member_vmtarget); |
402 method_is_live = true; | |
403 break; | 403 break; |
404 | 404 |
405 case vmIntrinsics::_linkToStatic: | 405 case vmIntrinsics::_linkToStatic: |
406 if (VerifyMethodHandles) { | 406 if (VerifyMethodHandles) { |
407 verify_ref_kind(_masm, JVM_REF_invokeStatic, member_reg, temp3); | 407 verify_ref_kind(_masm, JVM_REF_invokeStatic, member_reg, temp3); |
408 } | 408 } |
409 __ movptr(rbx_method, member_vmtarget); | 409 __ movptr(rbx_method, member_vmtarget); |
410 method_is_live = true; | |
411 break; | 410 break; |
412 | 411 |
413 case vmIntrinsics::_linkToVirtual: | 412 case vmIntrinsics::_linkToVirtual: |
414 { | 413 { |
415 // same as TemplateTable::invokevirtual, | 414 // same as TemplateTable::invokevirtual, |
434 // Note: The verifier invariants allow us to ignore MemberName.clazz and vmtarget | 433 // Note: The verifier invariants allow us to ignore MemberName.clazz and vmtarget |
435 // at this point. And VerifyMethodHandles has already checked clazz, if needed. | 434 // at this point. And VerifyMethodHandles has already checked clazz, if needed. |
436 | 435 |
437 // get target Method* & entry point | 436 // get target Method* & entry point |
438 __ lookup_virtual_method(temp1_recv_klass, temp2_index, rbx_method); | 437 __ lookup_virtual_method(temp1_recv_klass, temp2_index, rbx_method); |
439 method_is_live = true; | |
440 break; | 438 break; |
441 } | 439 } |
442 | 440 |
443 case vmIntrinsics::_linkToInterface: | 441 case vmIntrinsics::_linkToInterface: |
444 { | 442 { |
462 __ STOP("invalid vtable index for MH.invokeInterface"); | 460 __ STOP("invalid vtable index for MH.invokeInterface"); |
463 __ bind(L); | 461 __ bind(L); |
464 } | 462 } |
465 | 463 |
466 // given intf, index, and recv klass, dispatch to the implementation method | 464 // given intf, index, and recv klass, dispatch to the implementation method |
467 Label L_no_such_interface; | |
468 __ lookup_interface_method(temp1_recv_klass, temp3_intf, | 465 __ lookup_interface_method(temp1_recv_klass, temp3_intf, |
469 // note: next two args must be the same: | 466 // note: next two args must be the same: |
470 rbx_index, rbx_method, | 467 rbx_index, rbx_method, |
471 temp2, | 468 temp2, |
472 L_no_such_interface); | 469 L_incompatible_class_change_error); |
473 | 470 break; |
474 __ verify_method_ptr(rbx_method); | 471 } |
475 jump_from_method_handle(_masm, rbx_method, temp2, for_compiler_entry); | 472 |
476 __ hlt(); | 473 default: |
477 | 474 fatal(err_msg_res("unexpected intrinsic %d: %s", iid, vmIntrinsics::name_at(iid))); |
478 __ bind(L_no_such_interface); | 475 break; |
476 } | |
477 | |
478 // Live at this point: | |
479 // rbx_method | |
480 // rsi/r13 (if interpreted) | |
481 | |
482 // After figuring out which concrete method to call, jump into it. | |
483 // Note that this works in the interpreter with no data motion. | |
484 // But the compiled version will require that rcx_recv be shifted out. | |
485 __ verify_method_ptr(rbx_method); | |
486 jump_from_method_handle(_masm, rbx_method, temp1, for_compiler_entry); | |
487 | |
488 if (iid == vmIntrinsics::_linkToInterface) { | |
489 __ bind(L_incompatible_class_change_error); | |
479 __ jump(RuntimeAddress(StubRoutines::throw_IncompatibleClassChangeError_entry())); | 490 __ jump(RuntimeAddress(StubRoutines::throw_IncompatibleClassChangeError_entry())); |
480 break; | |
481 } | |
482 | |
483 default: | |
484 fatal(err_msg("unexpected intrinsic %d: %s", iid, vmIntrinsics::name_at(iid))); | |
485 break; | |
486 } | |
487 | |
488 if (method_is_live) { | |
489 // live at this point: rbx_method, rsi/r13 (if interpreted) | |
490 | |
491 // After figuring out which concrete method to call, jump into it. | |
492 // Note that this works in the interpreter with no data motion. | |
493 // But the compiled version will require that rcx_recv be shifted out. | |
494 __ verify_method_ptr(rbx_method); | |
495 jump_from_method_handle(_masm, rbx_method, temp1, for_compiler_entry); | |
496 } | 491 } |
497 } | 492 } |
498 } | 493 } |
499 | 494 |
500 #ifndef PRODUCT | 495 #ifndef PRODUCT |