1099 //
1100 // F0 [TOP_IJAVA_FRAME_ABI] = frame::z_top_ijava_frame_abi_size \
1101 // [operand stack] = max_stack | = top_frame_size
1102 // [IJAVA_STATE] = frame::z_ijava_state_size /
1103
1104 // sp_after_resize = Z_esp - delta
1105 //
1106 // delta = PARENT_IJAVA_FRAME_ABI + (locals_count - params_count)
1107
1108 __ add2reg(sp_after_resize, (Interpreter::stackElementSize) - (frame::z_parent_ijava_frame_abi_size), Z_esp);
1109 __ z_sllg(Z_R0_scratch, local_count, LogBytesPerWord); // Params have already been subtracted from local_count.
1110 __ z_slgr(sp_after_resize, Z_R0_scratch);
1111
1112 // top_frame_size = TOP_IJAVA_FRAME_ABI + max_stack + size of interpreter state
1113 __ add2reg(top_frame_size,
1114 frame::z_top_ijava_frame_abi_size +
1115 frame::z_ijava_state_size +
1116 frame::interpreter_frame_monitor_size() * wordSize,
1117 max_stack);
1118
1119 // Check if there's room for the new frame...
1120 Register frame_size = max_stack; // Reuse the regiser for max_stack.
1121 __ z_lgr(frame_size, Z_SP);
1122 __ z_sgr(frame_size, sp_after_resize);
1123 __ z_agr(frame_size, top_frame_size);
1124 generate_stack_overflow_check(frame_size, fp/*tmp1*/);
1125
1126 DEBUG_ONLY(__ z_cg(Z_R14, _z_abi16(return_pc), Z_SP));
1127 __ asm_assert_eq("killed Z_R14", 0);
1128 __ resize_frame_absolute(sp_after_resize, fp, true);
1129 __ save_return_pc(Z_R14);
1130
1131 // ... and push the new frame F0.
1132 __ push_frame(top_frame_size, fp, true /*copy_sp*/, false);
1133 }
1134
1135 //=============================================================================
1136 // Initialize the new frame F0: initialize interpreter state.
1137
1138 {
1139 // locals
1140 const Register local_addr = Z_ARG4;
1141
1142 BLOCK_COMMENT("generate_fixed_frame: initialize interpreter state {");
1143
1144 #ifdef ASSERT
|
1099 //
1100 // F0 [TOP_IJAVA_FRAME_ABI] = frame::z_top_ijava_frame_abi_size \
1101 // [operand stack] = max_stack | = top_frame_size
1102 // [IJAVA_STATE] = frame::z_ijava_state_size /
1103
1104 // sp_after_resize = Z_esp - delta
1105 //
1106 // delta = PARENT_IJAVA_FRAME_ABI + (locals_count - params_count)
1107
1108 __ add2reg(sp_after_resize, (Interpreter::stackElementSize) - (frame::z_parent_ijava_frame_abi_size), Z_esp);
1109 __ z_sllg(Z_R0_scratch, local_count, LogBytesPerWord); // Params have already been subtracted from local_count.
1110 __ z_slgr(sp_after_resize, Z_R0_scratch);
1111
1112 // top_frame_size = TOP_IJAVA_FRAME_ABI + max_stack + size of interpreter state
1113 __ add2reg(top_frame_size,
1114 frame::z_top_ijava_frame_abi_size +
1115 frame::z_ijava_state_size +
1116 frame::interpreter_frame_monitor_size() * wordSize,
1117 max_stack);
1118
1119 if (!native_call) {
1120 // Stack overflow check.
1121 // Native calls don't need the stack size check since they have no
1122 // expression stack and the arguments are already on the stack and
1123 // we only add a handful of words to the stack.
1124 Register frame_size = max_stack; // Reuse the regiser for max_stack.
1125 __ z_lgr(frame_size, Z_SP);
1126 __ z_sgr(frame_size, sp_after_resize);
1127 __ z_agr(frame_size, top_frame_size);
1128 generate_stack_overflow_check(frame_size, fp/*tmp1*/);
1129 }
1130
1131 DEBUG_ONLY(__ z_cg(Z_R14, _z_abi16(return_pc), Z_SP));
1132 __ asm_assert_eq("killed Z_R14", 0);
1133 __ resize_frame_absolute(sp_after_resize, fp, true);
1134 __ save_return_pc(Z_R14);
1135
1136 // ... and push the new frame F0.
1137 __ push_frame(top_frame_size, fp, true /*copy_sp*/, false);
1138 }
1139
1140 //=============================================================================
1141 // Initialize the new frame F0: initialize interpreter state.
1142
1143 {
1144 // locals
1145 const Register local_addr = Z_ARG4;
1146
1147 BLOCK_COMMENT("generate_fixed_frame: initialize interpreter state {");
1148
1149 #ifdef ASSERT
|