684 __ set_info("throw_array_store_exception", dont_gc_arguments);
685 oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_array_store_exception), true);
686 }
687 break;
688
689 case throw_class_cast_exception_id:
690 {
691 // G4: object
692 __ set_info("throw_class_cast_exception", dont_gc_arguments);
693 oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_class_cast_exception), true);
694 }
695 break;
696
697 case throw_incompatible_class_change_error_id:
698 {
699 __ set_info("throw_incompatible_class_cast_exception", dont_gc_arguments);
700 oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_incompatible_class_change_error), false);
701 }
702 break;
703
704 case slow_subtype_check_id:
705 { // Support for uint StubRoutine::partial_subtype_check( Klass sub, Klass super );
706 // Arguments :
707 //
708 // ret : G3
709 // sub : G3, argument, destroyed
710 // super: G1, argument, not changed
711 // raddr: O7, blown by call
712 Label miss;
713
714 __ save_frame(0); // Blow no registers!
715
716 __ check_klass_subtype_slow_path(G3, G1, L0, L1, L2, L4, NULL, &miss);
717
718 __ mov(1, G3);
719 __ ret(); // Result in G5 is 'true'
720 __ delayed()->restore(); // free copy or add can go here
721
722 __ bind(miss);
723 __ mov(0, G3);
|
684 __ set_info("throw_array_store_exception", dont_gc_arguments);
685 oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_array_store_exception), true);
686 }
687 break;
688
689 case throw_class_cast_exception_id:
690 {
691 // G4: object
692 __ set_info("throw_class_cast_exception", dont_gc_arguments);
693 oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_class_cast_exception), true);
694 }
695 break;
696
697 case throw_incompatible_class_change_error_id:
698 {
699 __ set_info("throw_incompatible_class_cast_exception", dont_gc_arguments);
700 oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_incompatible_class_change_error), false);
701 }
702 break;
703
704 case invalidate_profile_inlining_id:
705 {
706 OopMap* oop_map = save_live_registers(sasm);
707
708 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, invalidate_profile_inlining), G4, G5);
709
710 oop_maps = new OopMapSet();
711 oop_maps->add_gc_map(call_offset, oop_map);
712
713 DeoptimizationBlob* deopt_blob = SharedRuntime::deopt_blob();
714 assert(deopt_blob != NULL, "deoptimization blob must have been created");
715 restore_live_registers(sasm);
716 __ restore();
717 // Invalid inlining is detected before the body of the
718 // inlinined method is executed so we need deoptimization to
719 // trigger "re-execution" of the method call.
720 __ br(Assembler::always, false, Assembler::pt, deopt_blob->unpack_with_reexecution(), relocInfo::runtime_call_type);
721 __ delayed()->nop();
722 }
723 break;
724
725 case slow_subtype_check_id:
726 { // Support for uint StubRoutine::partial_subtype_check( Klass sub, Klass super );
727 // Arguments :
728 //
729 // ret : G3
730 // sub : G3, argument, destroyed
731 // super: G1, argument, not changed
732 // raddr: O7, blown by call
733 Label miss;
734
735 __ save_frame(0); // Blow no registers!
736
737 __ check_klass_subtype_slow_path(G3, G1, L0, L1, L2, L4, NULL, &miss);
738
739 __ mov(1, G3);
740 __ ret(); // Result in G5 is 'true'
741 __ delayed()->restore(); // free copy or add can go here
742
743 __ bind(miss);
744 __ mov(0, G3);
|