749 case monitorexit_nofpu_id: 750 case monitorexit_id: 751 { // G4: lock address 752 // note: really a leaf routine but must setup last java sp 753 // => use call_RT for now (speed can be improved by 754 // doing last java sp setup manually) 755 __ set_info("monitorexit", dont_gc_arguments); 756 757 int save_fpu_registers = (id == monitorexit_id); 758 // make a frame and preserve the caller's caller-save registers 759 OopMap* oop_map = save_live_registers(sasm, save_fpu_registers); 760 761 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, monitorexit), G4); 762 763 oop_maps = new OopMapSet(); 764 oop_maps->add_gc_map(call_offset, oop_map); 765 restore_live_registers(sasm, save_fpu_registers); 766 767 __ ret(); 768 __ delayed()->restore(); 769 770 } 771 break; 772 773 case access_field_patching_id: 774 { __ set_info("access_field_patching", dont_gc_arguments); 775 oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, access_field_patching)); 776 } 777 break; 778 779 case load_klass_patching_id: 780 { __ set_info("load_klass_patching", dont_gc_arguments); 781 oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, move_klass_patching)); 782 } 783 break; 784 785 case dtrace_object_alloc_id: 786 { // O0: object 787 __ set_info("dtrace_object_alloc", dont_gc_arguments); 788 // we can't gc here so skip the oopmap but make sure that all 789 // the live registers get saved. | 749 case monitorexit_nofpu_id: 750 case monitorexit_id: 751 { // G4: lock address 752 // note: really a leaf routine but must setup last java sp 753 // => use call_RT for now (speed can be improved by 754 // doing last java sp setup manually) 755 __ set_info("monitorexit", dont_gc_arguments); 756 757 int save_fpu_registers = (id == monitorexit_id); 758 // make a frame and preserve the caller's caller-save registers 759 OopMap* oop_map = save_live_registers(sasm, save_fpu_registers); 760 761 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, monitorexit), G4); 762 763 oop_maps = new OopMapSet(); 764 oop_maps->add_gc_map(call_offset, oop_map); 765 restore_live_registers(sasm, save_fpu_registers); 766 767 __ ret(); 768 __ delayed()->restore(); 769 } 770 break; 771 772 case deoptimize_id: 773 { 774 __ set_info("deoptimize", dont_gc_arguments); 775 OopMap* oop_map = save_live_registers(sasm); 776 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, deoptimize)); 777 oop_maps = new OopMapSet(); 778 oop_maps->add_gc_map(call_offset, oop_map); 779 restore_live_registers(sasm); 780 DeoptimizationBlob* deopt_blob = SharedRuntime::deopt_blob(); 781 assert(deopt_blob != NULL, "deoptimization blob must have been created"); 782 AddressLiteral dest(deopt_blob->unpack_with_reexecution()); 783 __ jump_to(dest, O0); 784 __ delayed()->restore(); 785 } 786 break; 787 788 case access_field_patching_id: 789 { __ set_info("access_field_patching", dont_gc_arguments); 790 oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, access_field_patching)); 791 } 792 break; 793 794 case load_klass_patching_id: 795 { __ set_info("load_klass_patching", dont_gc_arguments); 796 oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, move_klass_patching)); 797 } 798 break; 799 800 case dtrace_object_alloc_id: 801 { // O0: object 802 __ set_info("dtrace_object_alloc", dont_gc_arguments); 803 // we can't gc here so skip the oopmap but make sure that all 804 // the live registers get saved. |