Skip to content

Commit b7e3b3b

Browse files
authored
Update (2022.09.16)
27686: Fix encoding of Assembler::amadd_d 27605: C1: Skip RX in register saver
1 parent 896b64e commit b7e3b3b

File tree

2 files changed

+11
-5
lines changed

2 files changed

+11
-5
lines changed

src/hotspot/cpu/loongarch/assembler_loongarch.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2097,7 +2097,7 @@ class Assembler : public AbstractAssembler {
20972097
void amswap_w (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amswap_w_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
20982098
void amswap_d (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amswap_d_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
20992099
void amadd_w (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amadd_w_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
2100-
void amadd_d (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amadd_d_op, (int)rk->encoding(), (int)rj->encoding(), (int)rj->encoding())); }
2100+
void amadd_d (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amadd_d_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
21012101
void amand_w (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amand_w_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
21022102
void amand_d (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amand_d_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }
21032103
void amor_w (Register rd, Register rk, Register rj) { assert_different_registers(rd, rj); assert_different_registers(rd, rk); emit_int32(insn_RRR(amor_w_op, (int)rk->encoding(), (int)rj->encoding(), (int)rd->encoding())); }

src/hotspot/cpu/loongarch/c1_Runtime1_loongarch_64.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)