< prev index next >

src/cpu/s390/vm/templateInterpreterGenerator_s390.cpp

Print this page
rev 12483 : 8172049: [s390] Implement "JEP 270: Reserved Stack Areas for Critical Sections".


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


< prev index next >