comparison src/cpu/sparc/vm/methodHandles_sparc.cpp @ 1846:d55217dc206f

6829194: JSR 292 needs to support compressed oops Reviewed-by: kvn, jrose
author twisti
date Mon, 11 Oct 2010 04:18:58 -0700
parents e9ff18c4ace7
children 5beba6174298
comparison
equal deleted inserted replaced
1845:a222fcfba398 1846:d55217dc206f
88 __ ld_ptr(Address(tem, *pchase), G5_method_type); 88 __ ld_ptr(Address(tem, *pchase), G5_method_type);
89 } 89 }
90 } 90 }
91 91
92 // given the MethodType, find out where the MH argument is buried 92 // given the MethodType, find out where the MH argument is buried
93 __ ld_ptr(Address(G5_method_type, __ delayed_value(java_dyn_MethodType::form_offset_in_bytes, O1_scratch)), O0_argslot); 93 __ load_heap_oop(Address(G5_method_type, __ delayed_value(java_dyn_MethodType::form_offset_in_bytes, O1_scratch)), O0_argslot);
94 __ ldsw( Address(O0_argslot, __ delayed_value(java_dyn_MethodTypeForm::vmslots_offset_in_bytes, O1_scratch)), O0_argslot); 94 __ ldsw( Address(O0_argslot, __ delayed_value(java_dyn_MethodTypeForm::vmslots_offset_in_bytes, O1_scratch)), O0_argslot);
95 __ ld_ptr(__ argument_address(O0_argslot), G3_method_handle); 95 __ ld_ptr(__ argument_address(O0_argslot), G3_method_handle);
96 96
97 __ check_method_handle_type(G5_method_type, G3_method_handle, O1_scratch, wrong_method_type); 97 __ check_method_handle_type(G5_method_type, G3_method_handle, O1_scratch, wrong_method_type);
98 __ jump_to_method_handle_entry(G3_method_handle, O1_scratch); 98 __ jump_to_method_handle_entry(G3_method_handle, O1_scratch);
99 99
346 __ nop(); // empty stubs make SG sick 346 __ nop(); // empty stubs make SG sick
347 return; 347 return;
348 } 348 }
349 349
350 address interp_entry = __ pc(); 350 address interp_entry = __ pc();
351 if (UseCompressedOops) __ unimplemented("UseCompressedOops");
352 351
353 #ifndef PRODUCT 352 #ifndef PRODUCT
354 if (TraceMethodHandles) { 353 if (TraceMethodHandles) {
355 // save: Gargs, O5_savedSP 354 // save: Gargs, O5_savedSP
356 __ save(SP, -16*wordSize, SP); 355 __ save(SP, -16*wordSize, SP);
411 break; 410 break;
412 411
413 case _invokestatic_mh: 412 case _invokestatic_mh:
414 case _invokespecial_mh: 413 case _invokespecial_mh:
415 { 414 {
416 __ ld_ptr(G3_mh_vmtarget, G5_method); // target is a methodOop 415 __ load_heap_oop(G3_mh_vmtarget, G5_method); // target is a methodOop
417 __ verify_oop(G5_method); 416 __ verify_oop(G5_method);
418 // Same as TemplateTable::invokestatic or invokespecial, 417 // Same as TemplateTable::invokestatic or invokespecial,
419 // minus the CP setup and profiling: 418 // minus the CP setup and profiling:
420 if (ek == _invokespecial_mh) { 419 if (ek == _invokespecial_mh) {
421 // Must load & check the first argument before entering the target method. 420 // Must load & check the first argument before entering the target method.
466 { 465 {
467 // Same as TemplateTable::invokeinterface, 466 // Same as TemplateTable::invokeinterface,
468 // minus the CP setup and profiling: 467 // minus the CP setup and profiling:
469 __ load_method_handle_vmslots(O0_argslot, G3_method_handle, O1_scratch); 468 __ load_method_handle_vmslots(O0_argslot, G3_method_handle, O1_scratch);
470 Register O1_intf = O1_scratch; 469 Register O1_intf = O1_scratch;
471 __ ld_ptr(G3_mh_vmtarget, O1_intf); 470 __ load_heap_oop(G3_mh_vmtarget, O1_intf);
472 __ ldsw(G3_dmh_vmindex, G5_index); 471 __ ldsw(G3_dmh_vmindex, G5_index);
473 __ ld_ptr(__ argument_address(O0_argslot, -1), G3_method_handle); 472 __ ld_ptr(__ argument_address(O0_argslot, -1), G3_method_handle);
474 __ null_check(G3_method_handle, oopDesc::klass_offset_in_bytes()); 473 __ null_check(G3_method_handle, oopDesc::klass_offset_in_bytes());
475 474
476 // Get receiver klass: 475 // Get receiver klass:
521 __ add(Gargs, __ argument_offset(O0_argslot), O0_argslot); 520 __ add(Gargs, __ argument_offset(O0_argslot), O0_argslot);
522 521
523 insert_arg_slots(_masm, arg_slots * stack_move_unit(), arg_mask, O0_argslot, O1_scratch, O2_scratch, G5_index); 522 insert_arg_slots(_masm, arg_slots * stack_move_unit(), arg_mask, O0_argslot, O1_scratch, O2_scratch, G5_index);
524 523
525 // Store bound argument into the new stack slot: 524 // Store bound argument into the new stack slot:
526 __ ld_ptr(G3_bmh_argument, O1_scratch); 525 __ load_heap_oop(G3_bmh_argument, O1_scratch);
527 if (arg_type == T_OBJECT) { 526 if (arg_type == T_OBJECT) {
528 __ st_ptr(O1_scratch, Address(O0_argslot, 0)); 527 __ st_ptr(O1_scratch, Address(O0_argslot, 0));
529 } else { 528 } else {
530 Address prim_value_addr(O1_scratch, java_lang_boxing_object::value_offset_in_bytes(arg_type)); 529 Address prim_value_addr(O1_scratch, java_lang_boxing_object::value_offset_in_bytes(arg_type));
531 __ load_sized_value(prim_value_addr, O2_scratch, type2aelembytes(arg_type), is_signed_subword_type(arg_type)); 530 __ load_sized_value(prim_value_addr, O2_scratch, type2aelembytes(arg_type), is_signed_subword_type(arg_type));
539 __ st_ptr( O2_scratch, Address(O0_argslot, 0)); 538 __ st_ptr( O2_scratch, Address(O0_argslot, 0));
540 } 539 }
541 } 540 }
542 541
543 if (direct_to_method) { 542 if (direct_to_method) {
544 __ ld_ptr(G3_mh_vmtarget, G5_method); // target is a methodOop 543 __ load_heap_oop(G3_mh_vmtarget, G5_method); // target is a methodOop
545 __ verify_oop(G5_method); 544 __ verify_oop(G5_method);
546 __ jump_indirect_to(G5_method_fie, O1_scratch); 545 __ jump_indirect_to(G5_method_fie, O1_scratch);
547 __ delayed()->nop(); 546 __ delayed()->nop();
548 } else { 547 } else {
549 __ ld_ptr(G3_mh_vmtarget, G3_method_handle); // target is a methodOop 548 __ load_heap_oop(G3_mh_vmtarget, G3_method_handle); // target is a methodOop
550 __ verify_oop(G3_method_handle); 549 __ verify_oop(G3_method_handle);
551 __ jump_to_method_handle_entry(G3_method_handle, O1_scratch); 550 __ jump_to_method_handle_entry(G3_method_handle, O1_scratch);
552 } 551 }
553 } 552 }
554 break; 553 break;
555 554
556 case _adapter_retype_only: 555 case _adapter_retype_only:
557 case _adapter_retype_raw: 556 case _adapter_retype_raw:
558 // Immediately jump to the next MH layer: 557 // Immediately jump to the next MH layer:
559 __ ld_ptr(G3_mh_vmtarget, G3_method_handle); 558 __ load_heap_oop(G3_mh_vmtarget, G3_method_handle);
560 __ jump_to_method_handle_entry(G3_method_handle, O1_scratch); 559 __ jump_to_method_handle_entry(G3_method_handle, O1_scratch);
561 // This is OK when all parameter types widen. 560 // This is OK when all parameter types widen.
562 // It is also OK when a return type narrows. 561 // It is also OK when a return type narrows.
563 break; 562 break;
564 563
570 // Check a reference argument before jumping to the next layer of MH: 569 // Check a reference argument before jumping to the next layer of MH:
571 __ ldsw(G3_amh_vmargslot, O0_argslot); 570 __ ldsw(G3_amh_vmargslot, O0_argslot);
572 Address vmarg = __ argument_address(O0_argslot); 571 Address vmarg = __ argument_address(O0_argslot);
573 572
574 // What class are we casting to? 573 // What class are we casting to?
575 __ ld_ptr(G3_amh_argument, G5_klass); // This is a Class object! 574 __ load_heap_oop(G3_amh_argument, G5_klass); // This is a Class object!
576 __ ld_ptr(Address(G5_klass, java_lang_Class::klass_offset_in_bytes()), G5_klass); 575 __ load_heap_oop(Address(G5_klass, java_lang_Class::klass_offset_in_bytes()), G5_klass);
577 576
578 Label done; 577 Label done;
579 __ ld_ptr(vmarg, O1_scratch); 578 __ ld_ptr(vmarg, O1_scratch);
580 __ tst(O1_scratch); 579 __ tst(O1_scratch);
581 __ brx(Assembler::zero, false, Assembler::pn, done); // No cast if null. 580 __ brx(Assembler::zero, false, Assembler::pn, done); // No cast if null.
588 // - G3_method_handle: adapter method handle 587 // - G3_method_handle: adapter method handle
589 __ check_klass_subtype(O1_scratch, G5_klass, O0_argslot, O2_scratch, done); 588 __ check_klass_subtype(O1_scratch, G5_klass, O0_argslot, O2_scratch, done);
590 589
591 // If we get here, the type check failed! 590 // If we get here, the type check failed!
592 __ ldsw(G3_amh_vmargslot, O0_argslot); // reload argslot field 591 __ ldsw(G3_amh_vmargslot, O0_argslot); // reload argslot field
593 __ ld_ptr(G3_amh_argument, O3_scratch); // required class 592 __ load_heap_oop(G3_amh_argument, O3_scratch); // required class
594 __ ld_ptr(vmarg, O2_scratch); // bad object 593 __ ld_ptr(vmarg, O2_scratch); // bad object
595 __ jump_to(AddressLiteral(from_interpreted_entry(_raise_exception)), O0_argslot); 594 __ jump_to(AddressLiteral(from_interpreted_entry(_raise_exception)), O0_argslot);
596 __ delayed()->mov(Bytecodes::_checkcast, O1_scratch); // who is complaining? 595 __ delayed()->mov(Bytecodes::_checkcast, O1_scratch); // who is complaining?
597 596
598 __ bind(done); 597 __ bind(done);
599 // Get the new MH: 598 // Get the new MH:
600 __ ld_ptr(G3_mh_vmtarget, G3_method_handle); 599 __ load_heap_oop(G3_mh_vmtarget, G3_method_handle);
601 __ jump_to_method_handle_entry(G3_method_handle, O1_scratch); 600 __ jump_to_method_handle_entry(G3_method_handle, O1_scratch);
602 } 601 }
603 break; 602 break;
604 603
605 case _adapter_prim_to_prim: 604 case _adapter_prim_to_prim:
674 673
675 __ bind(done); 674 __ bind(done);
676 __ st(O1_scratch, vmarg); 675 __ st(O1_scratch, vmarg);
677 676
678 // Get the new MH: 677 // Get the new MH:
679 __ ld_ptr(G3_mh_vmtarget, G3_method_handle); 678 __ load_heap_oop(G3_mh_vmtarget, G3_method_handle);
680 __ jump_to_method_handle_entry(G3_method_handle, O1_scratch); 679 __ jump_to_method_handle_entry(G3_method_handle, O1_scratch);
681 } 680 }
682 break; 681 break;
683 682
684 case _adapter_opt_i2l: // optimized subcase of adapt_prim_to_prim 683 case _adapter_opt_i2l: // optimized subcase of adapt_prim_to_prim
719 break; 718 break;
720 default: 719 default:
721 ShouldNotReachHere(); 720 ShouldNotReachHere();
722 } 721 }
723 722
724 __ ld_ptr(G3_mh_vmtarget, G3_method_handle); 723 __ load_heap_oop(G3_mh_vmtarget, G3_method_handle);
725 __ jump_to_method_handle_entry(G3_method_handle, O1_scratch); 724 __ jump_to_method_handle_entry(G3_method_handle, O1_scratch);
726 } 725 }
727 break; 726 break;
728 727
729 case _adapter_opt_f2d: // optimized subcase of adapt_prim_to_prim 728 case _adapter_opt_f2d: // optimized subcase of adapt_prim_to_prim
849 case 8 : __ stx(O2_scratch, Address(O1_destslot, 0)); break; 848 case 8 : __ stx(O2_scratch, Address(O1_destslot, 0)); break;
850 default: ShouldNotReachHere(); 849 default: ShouldNotReachHere();
851 } 850 }
852 } 851 }
853 852
854 __ ld_ptr(G3_mh_vmtarget, G3_method_handle); 853 __ load_heap_oop(G3_mh_vmtarget, G3_method_handle);
855 __ jump_to_method_handle_entry(G3_method_handle, O1_scratch); 854 __ jump_to_method_handle_entry(G3_method_handle, O1_scratch);
856 } 855 }
857 break; 856 break;
858 857
859 case _adapter_dup_args: 858 case _adapter_dup_args:
893 __ add(O2_newarg, wordSize, O2_newarg); 892 __ add(O2_newarg, wordSize, O2_newarg);
894 __ cmp(O2_newarg, O1_oldarg); 893 __ cmp(O2_newarg, O1_oldarg);
895 __ brx(Assembler::less, false, Assembler::pt, loop); 894 __ brx(Assembler::less, false, Assembler::pt, loop);
896 __ delayed()->nop(); // FILLME 895 __ delayed()->nop(); // FILLME
897 896
898 __ ld_ptr(G3_mh_vmtarget, G3_method_handle); 897 __ load_heap_oop(G3_mh_vmtarget, G3_method_handle);
899 __ jump_to_method_handle_entry(G3_method_handle, O1_scratch); 898 __ jump_to_method_handle_entry(G3_method_handle, O1_scratch);
900 } 899 }
901 break; 900 break;
902 901
903 case _adapter_drop_args: 902 case _adapter_drop_args:
911 __ ldsw(G3_amh_conversion, G5_stack_move); 910 __ ldsw(G3_amh_conversion, G5_stack_move);
912 __ sra(G5_stack_move, CONV_STACK_MOVE_SHIFT, G5_stack_move); 911 __ sra(G5_stack_move, CONV_STACK_MOVE_SHIFT, G5_stack_move);
913 912
914 remove_arg_slots(_masm, G5_stack_move, O0_argslot, O1_scratch, O2_scratch, O3_scratch); 913 remove_arg_slots(_masm, G5_stack_move, O0_argslot, O1_scratch, O2_scratch, O3_scratch);
915 914
916 __ ld_ptr(G3_mh_vmtarget, G3_method_handle); 915 __ load_heap_oop(G3_mh_vmtarget, G3_method_handle);
917 __ jump_to_method_handle_entry(G3_method_handle, O1_scratch); 916 __ jump_to_method_handle_entry(G3_method_handle, O1_scratch);
918 } 917 }
919 break; 918 break;
920 919
921 case _adapter_collect_args: 920 case _adapter_collect_args: