@@ -237,7 +237,7 @@ const int float_regs_as_doubles_size_in_slots = pd_nof_fpu_regs_frame_map * 2;
237237//
238238
239239enum reg_save_layout {
240- reg_save_frame_size = 32 /* float */ + 32 /* integer */
240+ reg_save_frame_size = 32 /* float */ + 30 /* integer excluding x3, x4 */
241241};
242242
243243// Save off registers which might be killed by calls into the runtime.
@@ -262,7 +262,7 @@ static OopMap* generate_oop_map(StubAssembler* sasm, bool save_fpu_registers) {
262262 // in c1_FrameMap_riscv.cpp for detail.
263263 const static Register caller_save_cpu_regs[FrameMap::max_nof_caller_save_cpu_regs] = {x7, x10, x11, x12,
264264 x13, x14, x15, x16, x17,
265- x28, x29, x30, x31};
265+ x28, x29, x30, x31};
266266 for (int i = 0 ; i < FrameMap::max_nof_caller_save_cpu_regs; i++) {
267267 Register r = caller_save_cpu_regs[i];
268268 int sp_offset = cpu_reg_save_offsets[r->encoding ()];
@@ -286,8 +286,8 @@ static OopMap* save_live_registers(StubAssembler* sasm,
286286 bool save_fpu_registers = true ) {
287287 __ block_comment (" save_live_registers" );
288288
289- // if the number of pushed regs is odd, zr will be added
290- __ push_reg (RegSet::range (x3 , x31), sp); // integer registers except ra(x1) & sp(x2)
289+ // if the number of pushed regs is odd, one slot will be reserved for alignment
290+ __ push_reg (RegSet::range (x5 , x31), sp); // integer registers except ra(x1) & sp(x2) & gp(x3) & tp(x4 )
291291
292292 if (save_fpu_registers) {
293293 // float registers
@@ -296,7 +296,7 @@ static OopMap* save_live_registers(StubAssembler* sasm,
296296 __ fsd (as_FloatRegister (i), Address (sp, i * wordSize));
297297 }
298298 } else {
299- // we define reg_save_layout = 64 as the fixed frame size,
299+ // we define reg_save_layout = 62 as the fixed frame size,
300300 // we should also sub 32 * wordSize to sp when save_fpu_registers == false
301301 __ addi (sp, sp, -32 * wordSize);
302302 }
@@ -316,8 +316,8 @@ static void restore_live_registers(StubAssembler* sasm, bool restore_fpu_registe
316316 __ addi (sp, sp, 32 * wordSize);
317317 }
318318
319- // if the number of popped regs is odd, zr will be added
320- __ pop_reg (RegSet::range (x3 , x31), sp); // integer registers except ra(x1) & sp(x2)
319+ // if the number of popped regs is odd, the reserved slot for alignment will be removed
320+ __ pop_reg (RegSet::range (x5 , x31), sp); // integer registers except ra(x1) & sp(x2) & gp(x3) & tp(x4 )
321321}
322322
323323static void restore_live_registers_except_r10 (StubAssembler* sasm, bool restore_fpu_registers = true ) {
@@ -332,10 +332,10 @@ static void restore_live_registers_except_r10(StubAssembler* sasm, bool restore_
332332 __ addi (sp, sp, 32 * wordSize);
333333 }
334334
335- // if the number of popped regs is odd, zr will be added
336- // integer registers except ra(x1) & sp(x2) & x10
337- __ pop_reg (RegSet::range (x3 , x9), sp); // pop zr, x3 ~ x9
338- __ pop_reg (RegSet::range (x11, x31), sp); // pop x10 ~ x31, x10 will be loaded to zr
335+ // pop integer registers except ra(x1) & sp(x2) & gp(x3) & tp(x4) & x10
336+ // there is one reserved slot for alignment on the stack in save_live_registers().
337+ __ pop_reg (RegSet::range (x5 , x9), sp); // pop x5 ~ x9 with the reserved slot for alignment
338+ __ pop_reg (RegSet::range (x11, x31), sp); // pop x11 ~ x31; x10 will be automatically skipped here
339339}
340340
341341void Runtime1::initialize_pd () {
@@ -349,11 +349,10 @@ void Runtime1::initialize_pd() {
349349 sp_offset += step;
350350 }
351351
352- // we save x0, x3 ~ x31, except x1, x2
353- cpu_reg_save_offsets[0 ] = sp_offset;
352+ // a slot reserved for stack 16-byte alignment, see MacroAssembler::push_reg
354353 sp_offset += step;
355- // 3 : loop starts from x3
356- for (i = 3 ; i < FrameMap::nof_cpu_regs; i++) {
354+ // we save x5 ~ x31, except x0 ~ x4 : loop starts from x5
355+ for (i = 5 ; i < FrameMap::nof_cpu_regs; i++) {
357356 cpu_reg_save_offsets[i] = sp_offset;
358357 sp_offset += step;
359358 }
0 commit comments