2702 #endif
2703 }
2704
2705 #if defined(COMPILER1) || defined(COMPILER2)
2706 // Frame generation for deopt and uncommon trap blobs.
2707 static void push_skeleton_frame(MacroAssembler* masm, bool deopt,
2708 /* Read */
2709 Register unroll_block_reg,
2710 /* Update */
2711 Register frame_sizes_reg,
2712 Register number_of_frames_reg,
2713 Register pcs_reg,
2714 /* Invalidate */
2715 Register frame_size_reg,
2716 Register pc_reg) {
2717
2718 __ ld(pc_reg, 0, pcs_reg);
2719 __ ld(frame_size_reg, 0, frame_sizes_reg);
2720 __ std(pc_reg, _abi(lr), R1_SP);
2721 __ push_frame(frame_size_reg, R0/*tmp*/);
2722 #ifdef ASSERT
2723 __ load_const_optimized(pc_reg, 0x5afe);
2724 __ std(pc_reg, _ijava_state_neg(ijava_reserved), R1_SP);
2725 #endif
2726 __ std(R1_SP, _ijava_state_neg(sender_sp), R1_SP);
2727 __ addi(number_of_frames_reg, number_of_frames_reg, -1);
2728 __ addi(frame_sizes_reg, frame_sizes_reg, wordSize);
2729 __ addi(pcs_reg, pcs_reg, wordSize);
2730 }
2731
2732 // Loop through the UnrollBlock info and create new frames.
2733 static void push_skeleton_frames(MacroAssembler* masm, bool deopt,
2734 /* read */
2735 Register unroll_block_reg,
2736 /* invalidate */
2737 Register frame_sizes_reg,
2738 Register number_of_frames_reg,
2739 Register pcs_reg,
2740 Register frame_size_reg,
2741 Register pc_reg) {
2742 Label loop;
2743
2744 // _number_of_frames is of type int (deoptimization.hpp)
2745 __ lwa(number_of_frames_reg,
2778 Deoptimization::UnrollBlock::caller_adjustment_offset_in_bytes(),
2779 unroll_block_reg);
2780 __ neg(R11_scratch1, R11_scratch1);
2781
2782 // R11_scratch1 contains size of locals for frame resizing.
2783 // R12_scratch2 contains top frame's lr.
2784
2785 // Resize frame by complete frame size prevents TOC from being
2786 // overwritten by locals. A more stack space saving way would be
2787 // to copy the TOC to its location in the new abi.
2788 __ addi(R11_scratch1, R11_scratch1, - frame::parent_ijava_frame_abi_size);
2789
2790 // now, resize the frame
2791 __ resize_frame(R11_scratch1, pc_reg/*tmp*/);
2792
2793 // In the case where we have resized a c2i frame above, the optional
2794 // alignment below the locals has size 32 (why?).
2795 __ std(R12_scratch2, _abi(lr), R1_SP);
2796
2797 // Initialize initial_caller_sp.
2798 #ifdef ASSERT
2799 __ load_const_optimized(pc_reg, 0x5afe);
2800 __ std(pc_reg, _ijava_state_neg(ijava_reserved), R1_SP);
2801 #endif
2802 __ std(frame_size_reg, _ijava_state_neg(sender_sp), R1_SP);
2803
2804 #ifdef ASSERT
2805 // Make sure that there is at least one entry in the array.
2806 __ cmpdi(CCR0, number_of_frames_reg, 0);
2807 __ asm_assert_ne("array_size must be > 0", 0x205);
2808 #endif
2809
2810 // Now push the new interpreter frames.
2811 //
2812 __ bind(loop);
2813 // Allocate a new frame, fill in the pc.
2814 push_skeleton_frame(masm, deopt,
2815 unroll_block_reg,
2816 frame_sizes_reg,
2817 number_of_frames_reg,
2818 pcs_reg,
2819 frame_size_reg,
2820 pc_reg);
2821 __ cmpdi(CCR0, number_of_frames_reg, 0);
|
2702 #endif
2703 }
2704
2705 #if defined(COMPILER1) || defined(COMPILER2)
2706 // Frame generation for deopt and uncommon trap blobs.
2707 static void push_skeleton_frame(MacroAssembler* masm, bool deopt,
2708 /* Read */
2709 Register unroll_block_reg,
2710 /* Update */
2711 Register frame_sizes_reg,
2712 Register number_of_frames_reg,
2713 Register pcs_reg,
2714 /* Invalidate */
2715 Register frame_size_reg,
2716 Register pc_reg) {
2717
2718 __ ld(pc_reg, 0, pcs_reg);
2719 __ ld(frame_size_reg, 0, frame_sizes_reg);
2720 __ std(pc_reg, _abi(lr), R1_SP);
2721 __ push_frame(frame_size_reg, R0/*tmp*/);
2722 __ std(R1_SP, _ijava_state_neg(sender_sp), R1_SP);
2723 __ addi(number_of_frames_reg, number_of_frames_reg, -1);
2724 __ addi(frame_sizes_reg, frame_sizes_reg, wordSize);
2725 __ addi(pcs_reg, pcs_reg, wordSize);
2726 }
2727
2728 // Loop through the UnrollBlock info and create new frames.
2729 static void push_skeleton_frames(MacroAssembler* masm, bool deopt,
2730 /* read */
2731 Register unroll_block_reg,
2732 /* invalidate */
2733 Register frame_sizes_reg,
2734 Register number_of_frames_reg,
2735 Register pcs_reg,
2736 Register frame_size_reg,
2737 Register pc_reg) {
2738 Label loop;
2739
2740 // _number_of_frames is of type int (deoptimization.hpp)
2741 __ lwa(number_of_frames_reg,
2774 Deoptimization::UnrollBlock::caller_adjustment_offset_in_bytes(),
2775 unroll_block_reg);
2776 __ neg(R11_scratch1, R11_scratch1);
2777
2778 // R11_scratch1 contains size of locals for frame resizing.
2779 // R12_scratch2 contains top frame's lr.
2780
2781 // Resize frame by complete frame size prevents TOC from being
2782 // overwritten by locals. A more stack space saving way would be
2783 // to copy the TOC to its location in the new abi.
2784 __ addi(R11_scratch1, R11_scratch1, - frame::parent_ijava_frame_abi_size);
2785
2786 // now, resize the frame
2787 __ resize_frame(R11_scratch1, pc_reg/*tmp*/);
2788
2789 // In the case where we have resized a c2i frame above, the optional
2790 // alignment below the locals has size 32 (why?).
2791 __ std(R12_scratch2, _abi(lr), R1_SP);
2792
2793 // Initialize initial_caller_sp.
2794 __ std(frame_size_reg, _ijava_state_neg(sender_sp), R1_SP);
2795
2796 #ifdef ASSERT
2797 // Make sure that there is at least one entry in the array.
2798 __ cmpdi(CCR0, number_of_frames_reg, 0);
2799 __ asm_assert_ne("array_size must be > 0", 0x205);
2800 #endif
2801
2802 // Now push the new interpreter frames.
2803 //
2804 __ bind(loop);
2805 // Allocate a new frame, fill in the pc.
2806 push_skeleton_frame(masm, deopt,
2807 unroll_block_reg,
2808 frame_sizes_reg,
2809 number_of_frames_reg,
2810 pcs_reg,
2811 frame_size_reg,
2812 pc_reg);
2813 __ cmpdi(CCR0, number_of_frames_reg, 0);
|