662 oop_maps = new OopMapSet(); 663 OopMap* oop_map = save_live_registers(sasm); 664 __ mov(Oexception->after_save(), Oexception); 665 __ mov(Oissuing_pc->after_save(), Oissuing_pc); 666 generate_handle_exception(sasm, oop_maps, oop_map); 667 } 668 break; 669 670 case unwind_exception_id: 671 { 672 // O0: exception 673 // I7: address of call to this method 674 675 __ set_info("unwind_exception", dont_gc_arguments); 676 __ mov(Oexception, Oexception->after_save()); 677 __ add(I7, frame::pc_return_offset, Oissuing_pc->after_save()); 678 679 __ call_VM_leaf(L7_thread_cache, CAST_FROM_FN_PTR(address, SharedRuntime::exception_handler_for_return_address), 680 G2_thread, Oissuing_pc->after_save()); 681 __ verify_not_null_oop(Oexception->after_save()); 682 __ jmp(O0, 0); 683 __ delayed()->restore(); 684 } 685 break; 686 687 case throw_array_store_exception_id: 688 { 689 __ set_info("throw_array_store_exception", dont_gc_arguments); 690 oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_array_store_exception), false); 691 } 692 break; 693 694 case throw_class_cast_exception_id: 695 { 696 // G4: object 697 __ set_info("throw_class_cast_exception", dont_gc_arguments); 698 oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_class_cast_exception), true); 699 } 700 break; 701 702 case throw_incompatible_class_change_error_id: 703 { | 662 oop_maps = new OopMapSet(); 663 OopMap* oop_map = save_live_registers(sasm); 664 __ mov(Oexception->after_save(), Oexception); 665 __ mov(Oissuing_pc->after_save(), Oissuing_pc); 666 generate_handle_exception(sasm, oop_maps, oop_map); 667 } 668 break; 669 670 case unwind_exception_id: 671 { 672 // O0: exception 673 // I7: address of call to this method 674 675 __ set_info("unwind_exception", dont_gc_arguments); 676 __ mov(Oexception, Oexception->after_save()); 677 __ add(I7, frame::pc_return_offset, Oissuing_pc->after_save()); 678 679 __ call_VM_leaf(L7_thread_cache, CAST_FROM_FN_PTR(address, SharedRuntime::exception_handler_for_return_address), 680 G2_thread, Oissuing_pc->after_save()); 681 __ verify_not_null_oop(Oexception->after_save()); 682 683 // Restore SP from L7 if the exception PC is a MethodHandle call site. 684 __ mov(O0, G5); // Save the target address. 685 __ lduw(Address(G2_thread, JavaThread::is_method_handle_return_offset()), L0); 686 __ tst(L0); // Condition codes are preserved over the restore. 687 __ restore(); 688 689 __ jmp(G5, 0); 690 __ delayed()->movcc(Assembler::notZero, false, Assembler::icc, L7_mh_SP_save, SP); // Restore SP if required. 691 } 692 break; 693 694 case throw_array_store_exception_id: 695 { 696 __ set_info("throw_array_store_exception", dont_gc_arguments); 697 oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_array_store_exception), false); 698 } 699 break; 700 701 case throw_class_cast_exception_id: 702 { 703 // G4: object 704 __ set_info("throw_class_cast_exception", dont_gc_arguments); 705 oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_class_cast_exception), true); 706 } 707 break; 708 709 case throw_incompatible_class_change_error_id: 710 { |