@@ -290,10 +290,12 @@ static OopMap* save_live_registers(StubAssembler* sasm,
290290 bool save_fpu_registers = true ) {
291291 __ block_comment (" save_live_registers" );
292292
293- // integer registers except zr & ra & tp & sp
293+ // integer registers except zr & ra & tp & sp & rx. 4 is due to alignment.
294294 __ addi_d (SP, SP, -(32 - 4 + 32 ) * wordSize);
295295
296- for (int i = 4 ; i < 32 ; i++)
296+ for (int i = 4 ; i < 21 ; i++)
297+ __ st_d (as_Register (i), Address (SP, (32 + i - 4 ) * wordSize));
298+ for (int i = 22 ; i < 32 ; i++)
297299 __ st_d (as_Register (i), Address (SP, (32 + i - 4 ) * wordSize));
298300
299301 if (save_fpu_registers) {
@@ -310,7 +312,9 @@ static void restore_live_registers(StubAssembler* sasm, bool restore_fpu_registe
310312 __ fld_d (as_FloatRegister (i), Address (SP, i * wordSize));
311313 }
312314
313- for (int i = 4 ; i < 32 ; i++)
315+ for (int i = 4 ; i < 21 ; i++)
316+ __ ld_d (as_Register (i), Address (SP, (32 + i - 4 ) * wordSize));
317+ for (int i = 22 ; i < 32 ; i++)
314318 __ ld_d (as_Register (i), Address (SP, (32 + i - 4 ) * wordSize));
315319
316320 __ addi_d (SP, SP, (32 - 4 + 32 ) * wordSize);
@@ -322,7 +326,9 @@ static void restore_live_registers_except_a0(StubAssembler* sasm, bool restore_f
322326 __ fld_d (as_FloatRegister (i), Address (SP, i * wordSize));
323327 }
324328
325- for (int i = 5 ; i < 32 ; i++)
329+ for (int i = 5 ; i < 21 ; i++)
330+ __ ld_d (as_Register (i), Address (SP, (32 + i - 4 ) * wordSize));
331+ for (int i = 22 ; i < 32 ; i++)
326332 __ ld_d (as_Register (i), Address (SP, (32 + i - 4 ) * wordSize));
327333
328334 __ addi_d (SP, SP, (32 - 4 + 32 ) * wordSize);
0 commit comments