8350482: [s390x] Relativize esp in interpreter frames

Reviewed-by: lucy, rrich
This commit is contained in:
Amit Kumar 2025-05-15 15:38:56 +00:00
parent 8fcfddb2d2
commit a1c7e494c8
6 changed files with 27 additions and 17 deletions

View File

@ -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);
}

View File

@ -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

View File

@ -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.

View File

@ -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) {

View File

@ -169,7 +169,7 @@ class InterpreterMacroAssembler: public MacroAssembler {
void restore_bcp();
void save_esp();
void save_esp(Register fp = noreg);
void restore_esp();

View File

@ -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);