diff --git a/src/hotspot/cpu/aarch64/templateInterpreterGenerator_aarch64.cpp b/src/hotspot/cpu/aarch64/templateInterpreterGenerator_aarch64.cpp index eeb080d586a..eca8b7f1ca4 100644 --- a/src/hotspot/cpu/aarch64/templateInterpreterGenerator_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/templateInterpreterGenerator_aarch64.cpp @@ -836,9 +836,12 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) { __ stp(r10, rscratch1, Address(sp, 4 * wordSize)); // Move SP out of the way __ mov(sp, rscratch1); - } else { - __ mov(rscratch1, sp); + } else { + // Make sure there is room for the exception oop pushed in case method throws + // an exception (see TemplateInterpreterGenerator::generate_throw_exception()) + __ sub(rscratch1, sp, 2 * wordSize); __ stp(zr, rscratch1, Address(sp, 4 * wordSize)); + __ mov(sp, rscratch1); } } diff --git a/src/hotspot/cpu/riscv/templateInterpreterGenerator_riscv.cpp b/src/hotspot/cpu/riscv/templateInterpreterGenerator_riscv.cpp index 49a2b87c232..213e360c20e 100644 --- a/src/hotspot/cpu/riscv/templateInterpreterGenerator_riscv.cpp +++ b/src/hotspot/cpu/riscv/templateInterpreterGenerator_riscv.cpp @@ -776,8 +776,12 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) { // Move SP out of the way __ mv(sp, t0); } else { - __ sd(sp, Address(sp, 5 * wordSize)); + // Make sure there is room for the exception oop pushed in case method throws + // an exception (see TemplateInterpreterGenerator::generate_throw_exception()) + __ sub(t0, sp, 2 * wordSize); + __ sd(t0, Address(sp, 5 * wordSize)); __ sd(zr, Address(sp, 4 * wordSize)); + __ mv(sp, t0); } }