658 ldr(esp, 659 Address(rfp, frame::interpreter_frame_sender_sp_offset * wordSize)); 660 661 if (StackReservedPages > 0) { 662 // testing if reserved zone needs to be re-enabled 663 Label no_reserved_zone_enabling; 664 665 ldr(rscratch1, Address(rthread, JavaThread::reserved_stack_activation_offset())); 666 cmp(esp, rscratch1); 667 br(Assembler::LS, no_reserved_zone_enabling); 668 669 call_VM_leaf( 670 CAST_FROM_FN_PTR(address, SharedRuntime::enable_stack_reserved_zone), rthread); 671 call_VM(noreg, CAST_FROM_FN_PTR(address, 672 InterpreterRuntime::throw_delayed_StackOverflowError)); 673 should_not_reach_here(); 674 675 bind(no_reserved_zone_enabling); 676 } 677 678 // remove frame anchor 679 leave(); 680 // If we're returning to interpreted code we will shortly be 681 // adjusting SP to allow some space for ESP. If we're returning to 682 // compiled code the saved sender SP was saved in sender_sp, so this 683 // restores it. 684 andr(sp, esp, -16); 685 } 686 687 // Lock object 688 // 689 // Args: 690 // c_rarg1: BasicObjectLock to be used for locking 691 // 692 // Kills: 693 // r0 694 // c_rarg0, c_rarg1, c_rarg2, c_rarg3, .. (param regs) 695 // rscratch1, rscratch2 (scratch regs) 696 void InterpreterMacroAssembler::lock_object(Register lock_reg) 697 { | 658 ldr(esp, 659 Address(rfp, frame::interpreter_frame_sender_sp_offset * wordSize)); 660 661 if (StackReservedPages > 0) { 662 // testing if reserved zone needs to be re-enabled 663 Label no_reserved_zone_enabling; 664 665 ldr(rscratch1, Address(rthread, JavaThread::reserved_stack_activation_offset())); 666 cmp(esp, rscratch1); 667 br(Assembler::LS, no_reserved_zone_enabling); 668 669 call_VM_leaf( 670 CAST_FROM_FN_PTR(address, SharedRuntime::enable_stack_reserved_zone), rthread); 671 call_VM(noreg, CAST_FROM_FN_PTR(address, 672 InterpreterRuntime::throw_delayed_StackOverflowError)); 673 should_not_reach_here(); 674 675 bind(no_reserved_zone_enabling); 676 } 677 678 679 if (state == atos && ValueTypeReturnedAsFields) { 680 Label skip; 681 // Test if the return type is a value type 682 ldr(rscratch1, Address(rfp, frame::interpreter_frame_method_offset * wordSize)); 683 ldr(rscratch1, Address(rscratch1, Method::const_offset())); 684 ldrb(rscratch1, Address(rscratch1, ConstMethod::result_type_offset())); 685 cmpw(rscratch1, (u1) T_VALUETYPE); 686 br(Assembler::NE, skip); 687 688 // We are returning a value type, load its fields into registers 689 // Load fields from a buffered value with a value class specific handler 690 691 load_klass(rscratch1 /*dst*/, r0 /*src*/); 692 ldr(rscratch1, Address(rscratch1, InstanceKlass::adr_valueklass_fixed_block_offset())); 693 ldr(rscratch1, Address(rscratch1, ValueKlass::unpack_handler_offset())); 694 cbz(rscratch1, skip); 695 696 blr(rscratch1); 697 698 // call above kills the value in r1. Reload it. 699 ldr(r1, Address(rfp, frame::interpreter_frame_sender_sp_offset * wordSize)); 700 bind(skip); 701 } 702 703 704 // remove frame anchor 705 leave(); 706 // If we're returning to interpreted code we will shortly be 707 // adjusting SP to allow some space for ESP. If we're returning to 708 // compiled code the saved sender SP was saved in sender_sp, so this 709 // restores it. 710 andr(sp, esp, -16); 711 } 712 713 // Lock object 714 // 715 // Args: 716 // c_rarg1: BasicObjectLock to be used for locking 717 // 718 // Kills: 719 // r0 720 // c_rarg0, c_rarg1, c_rarg2, c_rarg3, .. (param regs) 721 // rscratch1, rscratch2 (scratch regs) 722 void InterpreterMacroAssembler::lock_object(Register lock_reg) 723 { |