diff --git a/src/hotspot/cpu/s390/abstractInterpreter_s390.cpp b/src/hotspot/cpu/s390/abstractInterpreter_s390.cpp index e815542a51e..96990f0ce94 100644 --- a/src/hotspot/cpu/s390/abstractInterpreter_s390.cpp +++ b/src/hotspot/cpu/s390/abstractInterpreter_s390.cpp @@ -176,7 +176,7 @@ void AbstractInterpreter::layout_activation(Method* method, intptr_t* monitor_base = (intptr_t*)((address)interpreter_frame->fp() - frame::z_ijava_state_size); intptr_t* monitor = monitor_base - (moncount * frame::interpreter_frame_monitor_size()); intptr_t* operand_stack_base = monitor; - intptr_t* tos = operand_stack_base - tempcount - popframe_extra_args; + intptr_t* esp = operand_stack_base - tempcount - popframe_extra_args - 1; intptr_t* top_frame_sp = operand_stack_base - method->max_stack() - frame::z_top_ijava_frame_abi_size / Interpreter::stackElementSize; intptr_t* sender_sp; @@ -206,7 +206,7 @@ void AbstractInterpreter::layout_activation(Method* method, interpreter_frame->interpreter_frame_set_locals(locals_base); interpreter_frame->interpreter_frame_set_monitor_end((BasicObjectLock *)monitor); *interpreter_frame->interpreter_frame_cache_addr() = method->constants()->cache(); - interpreter_frame->interpreter_frame_set_tos_address(tos); + interpreter_frame->interpreter_frame_set_esp(esp); if (!is_bottom_frame) { interpreter_frame->interpreter_frame_set_sender_sp(sender_sp); } diff --git a/src/hotspot/cpu/s390/frame_s390.hpp b/src/hotspot/cpu/s390/frame_s390.hpp index ab15e75bc5b..537a3ce5bcc 100644 --- a/src/hotspot/cpu/s390/frame_s390.hpp +++ b/src/hotspot/cpu/s390/frame_s390.hpp @@ -498,12 +498,12 @@ inline z_ijava_state* ijava_state() const; - // Where z_ijava_state.esp is saved. - inline intptr_t** interpreter_frame_esp_addr() const; - public: + + inline intptr_t* interpreter_frame_esp() const; + // Where z_ijava_state.esp is saved. + inline void interpreter_frame_set_esp(intptr_t* esp); inline intptr_t* interpreter_frame_top_frame_sp(); - inline void interpreter_frame_set_tos_address(intptr_t* x); inline void interpreter_frame_set_top_frame_sp(intptr_t* top_frame_sp); inline void interpreter_frame_set_sender_sp(intptr_t* sender_sp); #ifdef ASSERT diff --git a/src/hotspot/cpu/s390/frame_s390.inline.hpp b/src/hotspot/cpu/s390/frame_s390.inline.hpp index 59e23af7f48..5512bed5688 100644 --- a/src/hotspot/cpu/s390/frame_s390.inline.hpp +++ b/src/hotspot/cpu/s390/frame_s390.inline.hpp @@ -226,18 +226,20 @@ inline void frame::interpreter_frame_set_magic() { } #endif +inline intptr_t* frame::interpreter_frame_esp() const { + return (intptr_t*) at_relative(_z_ijava_idx(esp)); +} + // Where z_ijava_state.esp is saved. -inline intptr_t** frame::interpreter_frame_esp_addr() const { - return (intptr_t**) &(ijava_state()->esp); +inline void frame::interpreter_frame_set_esp(intptr_t* esp) { + assert(is_interpreted_frame(), "interpreted frame expected"); + // set relativized esp + ijava_state()->esp = (intptr_t) (esp - fp()); } // top of expression stack (lowest address) inline intptr_t* frame::interpreter_frame_tos_address() const { - return *interpreter_frame_esp_addr() + 1; -} - -inline void frame::interpreter_frame_set_tos_address(intptr_t* x) { - *interpreter_frame_esp_addr() = x - 1; + return interpreter_frame_esp() + Interpreter::stackElementWords; } // Stack slot needed for native calls and GC. diff --git a/src/hotspot/cpu/s390/interp_masm_s390.cpp b/src/hotspot/cpu/s390/interp_masm_s390.cpp index aac130ea66e..b384b24d49b 100644 --- a/src/hotspot/cpu/s390/interp_masm_s390.cpp +++ b/src/hotspot/cpu/s390/interp_masm_s390.cpp @@ -665,13 +665,20 @@ void InterpreterMacroAssembler::restore_bcp() { z_lg(Z_bcp, Address(Z_fp, _z_ijava_state_neg(bcp))); } -void InterpreterMacroAssembler::save_esp() { - z_stg(Z_esp, Address(Z_fp, _z_ijava_state_neg(esp))); +void InterpreterMacroAssembler::save_esp(Register fp) { + if (fp == noreg) { + fp = Z_fp; + } + z_sgrk(Z_R0, Z_esp, fp); + z_srag(Z_R0, Z_R0, Interpreter::logStackElementSize); + z_stg(Z_R0, Address(fp, _z_ijava_state_neg(esp))); } void InterpreterMacroAssembler::restore_esp() { asm_assert_ijava_state_magic(Z_esp); z_lg(Z_esp, Address(Z_fp, _z_ijava_state_neg(esp))); + z_slag(Z_esp, Z_esp, Interpreter::logStackElementSize); + z_agr(Z_esp, Z_fp); } void InterpreterMacroAssembler::get_monitors(Register reg) { diff --git a/src/hotspot/cpu/s390/interp_masm_s390.hpp b/src/hotspot/cpu/s390/interp_masm_s390.hpp index 2473463219c..94ad63b16c6 100644 --- a/src/hotspot/cpu/s390/interp_masm_s390.hpp +++ b/src/hotspot/cpu/s390/interp_masm_s390.hpp @@ -169,7 +169,7 @@ class InterpreterMacroAssembler: public MacroAssembler { void restore_bcp(); - void save_esp(); + void save_esp(Register fp = noreg); void restore_esp(); diff --git a/src/hotspot/cpu/s390/templateInterpreterGenerator_s390.cpp b/src/hotspot/cpu/s390/templateInterpreterGenerator_s390.cpp index c3c99d7297d..c953ab38713 100644 --- a/src/hotspot/cpu/s390/templateInterpreterGenerator_s390.cpp +++ b/src/hotspot/cpu/s390/templateInterpreterGenerator_s390.cpp @@ -1180,7 +1180,8 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) { __ z_stg(Z_R0, _z_ijava_state_neg(monitors), fp); __ add2reg(Z_esp, -Interpreter::stackElementSize); - __ z_stg(Z_esp, _z_ijava_state_neg(esp), fp); + + __ save_esp(fp); // z_ijava_state->cpoolCache = Z_R1_scratch (see load above); __ z_stg(Z_R1_scratch, _z_ijava_state_neg(cpoolCache), fp);