Skip to content

Commit 7c1e142

Browse files
committed
Use better spill instructions on Power9/10.
1 parent 82880de commit 7c1e142

File tree

3 files changed

+76
-27
lines changed

3 files changed

+76
-27
lines changed

src/hotspot/cpu/ppc/gc/shared/barrierSetAssembler_ppc.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -340,12 +340,21 @@ int SaveLiveRegisters::iterate_over_register_mask(IterationAction action, int of
340340
reg_save_index += 2;
341341

342342
Register spill_addr = R0;
343+
int spill_offset = offset - reg_save_index * BytesPerWord;
343344
if (action == ACTION_SAVE) {
344-
_masm->addi(spill_addr, R1_SP, offset - reg_save_index * BytesPerWord);
345-
_masm->stxvd2x(vs_reg, spill_addr);
345+
if (PowerArchitecturePPC64 >= 9) {
346+
_masm->stxv(vs_reg, spill_offset, R1_SP);
347+
} else {
348+
_masm->addi(spill_addr, R1_SP, spill_offset);
349+
_masm->stxvd2x(vs_reg, spill_addr);
350+
}
346351
} else if (action == ACTION_RESTORE) {
347-
_masm->addi(spill_addr, R1_SP, offset - reg_save_index * BytesPerWord);
348-
_masm->lxvd2x(vs_reg, spill_addr);
352+
if (PowerArchitecturePPC64 >= 9) {
353+
_masm->lxv(vs_reg, spill_offset, R1_SP);
354+
} else {
355+
_masm->addi(spill_addr, R1_SP, spill_offset);
356+
_masm->lxvd2x(vs_reg, spill_addr);
357+
}
349358
} else {
350359
assert(action == ACTION_COUNT_ONLY, "Sanity");
351360
}

src/hotspot/cpu/ppc/ppc.ad

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1818,21 +1818,35 @@ uint MachSpillCopyNode::implementation(C2_MacroAssembler *masm, PhaseRegAlloc *r
18181818
else if (src_lo_rc == rc_vs && dst_lo_rc == rc_stack) {
18191819
VectorSRegister Rsrc = as_VectorSRegister(Matcher::_regEncode[src_lo]);
18201820
int dst_offset = ra_->reg2offset(dst_lo);
1821-
if (masm) {
1822-
__ addi(R0, R1_SP, dst_offset);
1823-
__ stxvd2x(Rsrc, R0);
1821+
if (PowerArchitecturePPC64 >= 9) {
1822+
if (masm) {
1823+
__ stxv(Rsrc, dst_offset, R1_SP);
1824+
}
1825+
size += 4;
1826+
} else {
1827+
if (masm) {
1828+
__ addi(R0, R1_SP, dst_offset);
1829+
__ stxvd2x(Rsrc, R0);
1830+
}
1831+
size += 8;
18241832
}
1825-
size += 8;
18261833
}
18271834
// Memory->VectorSRegister Spill.
18281835
else if (src_lo_rc == rc_stack && dst_lo_rc == rc_vs) {
18291836
VectorSRegister Rdst = as_VectorSRegister(Matcher::_regEncode[dst_lo]);
18301837
int src_offset = ra_->reg2offset(src_lo);
1831-
if (masm) {
1832-
__ addi(R0, R1_SP, src_offset);
1833-
__ lxvd2x(Rdst, R0);
1838+
if (PowerArchitecturePPC64 >= 9) {
1839+
if (masm) {
1840+
__ lxv(Rdst, src_offset, R1_SP);
1841+
}
1842+
size += 4;
1843+
} else {
1844+
if (masm) {
1845+
__ addi(R0, R1_SP, src_offset);
1846+
__ lxvd2x(Rdst, R0);
1847+
}
1848+
size += 8;
18341849
}
1835-
size += 8;
18361850
}
18371851
// VectorSRegister->VectorSRegister.
18381852
else if (src_lo_rc == rc_vs && dst_lo_rc == rc_vs) {

src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -354,18 +354,34 @@ OopMap* RegisterSaver::push_frame_reg_args_and_save_live_registers(MacroAssemble
354354
offset += reg_size;
355355
}
356356

357-
for (int i = 0; i < vsregstosave_num; i++) {
358-
int reg_num = RegisterSaver_LiveVSRegs[i].reg_num;
359-
int reg_type = RegisterSaver_LiveVSRegs[i].reg_type;
357+
if (PowerArchitecturePPC64 >= 10) {
358+
for (int i = 0; i < vsregstosave_num; i += 2) {
359+
int reg_num = RegisterSaver_LiveVSRegs[i].reg_num;
360+
assert(RegisterSaver_LiveVSRegs[i + 1].reg_num == reg_num + 1, "or use other instructions!");
361+
362+
__ stxvp(as_VectorSRegister(reg_num), offset, R1_SP);
363+
364+
if (generate_oop_map) {
365+
map->set_callee_saved(VMRegImpl::stack2reg(offset >> 2),
366+
RegisterSaver_LiveVSRegs[i].vmreg);
367+
map->set_callee_saved(VMRegImpl::stack2reg((offset + vs_reg_size) >> 2),
368+
RegisterSaver_LiveVSRegs[i + 1].vmreg);
369+
}
370+
offset += (2 * vs_reg_size);
371+
}
372+
} else {
373+
for (int i = 0; i < vsregstosave_num; i++) {
374+
int reg_num = RegisterSaver_LiveVSRegs[i].reg_num;
360375

361-
__ li(R30, offset);
362-
__ stxvd2x(as_VectorSRegister(reg_num), R30, R1_SP);
376+
__ li(R31, offset);
377+
__ stxvd2x(as_VectorSRegister(reg_num), R31, R1_SP);
363378

364-
if (generate_oop_map) {
365-
map->set_callee_saved(VMRegImpl::stack2reg(offset>>2),
366-
RegisterSaver_LiveVSRegs[i].vmreg);
379+
if (generate_oop_map) {
380+
map->set_callee_saved(VMRegImpl::stack2reg(offset >> 2),
381+
RegisterSaver_LiveVSRegs[i].vmreg);
382+
}
383+
offset += vs_reg_size;
367384
}
368-
offset += vs_reg_size;
369385
}
370386

371387
assert(offset == frame_size_in_bytes, "consistency check");
@@ -428,14 +444,24 @@ void RegisterSaver::restore_live_registers_and_pop_frame(MacroAssembler* masm,
428444
offset += reg_size;
429445
}
430446

431-
for (int i = 0; i < vsregstosave_num; i++) {
432-
int reg_num = RegisterSaver_LiveVSRegs[i].reg_num;
433-
int reg_type = RegisterSaver_LiveVSRegs[i].reg_type;
447+
if (PowerArchitecturePPC64 >= 10) {
448+
for (int i = 0; i < vsregstosave_num; i += 2) {
449+
int reg_num = RegisterSaver_LiveVSRegs[i].reg_num;
450+
assert(RegisterSaver_LiveVSRegs[i + 1].reg_num == reg_num + 1, "or use other instructions!");
434451

435-
__ li(R31, offset);
436-
__ lxvd2x(as_VectorSRegister(reg_num), R31, R1_SP);
452+
__ lxvp(as_VectorSRegister(reg_num), offset, R1_SP);
437453

438-
offset += vs_reg_size;
454+
offset += (2 * vs_reg_size);
455+
}
456+
} else {
457+
for (int i = 0; i < vsregstosave_num; i++) {
458+
int reg_num = RegisterSaver_LiveVSRegs[i].reg_num;
459+
460+
__ li(R31, offset);
461+
__ lxvd2x(as_VectorSRegister(reg_num), R31, R1_SP);
462+
463+
offset += vs_reg_size;
464+
}
439465
}
440466

441467
assert(offset == frame_size_in_bytes, "consistency check");

0 commit comments

Comments
 (0)