Skip to content

Commit a082082

Browse files
dbriemannTheRealMDoerr
authored andcommitted
8354650: [PPC64] Try to reduce register definitions
Reviewed-by: mdoerr, sroy
1 parent f7cd3fa commit a082082

File tree

7 files changed

+412
-605
lines changed

7 files changed

+412
-605
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -333,9 +333,9 @@ int SaveLiveRegisters::iterate_over_register_mask(IterationAction action, int of
333333
}
334334
} else if (vm_reg->is_ConditionRegister()) {
335335
// NOP. Conditions registers are covered by save_LR_CR
336-
} else if (vm_reg->is_VectorSRegister()) {
336+
} else if (vm_reg->is_VectorRegister()) {
337337
assert(SuperwordUseVSX, "or should not reach here");
338-
VectorSRegister vs_reg = vm_reg->as_VectorSRegister();
338+
VectorSRegister vs_reg = (vm_reg->as_VectorRegister()).to_vsr();
339339
if (vs_reg->encoding() >= VSR32->encoding() && vs_reg->encoding() <= VSR51->encoding()) {
340340
reg_save_index += (2 + (reg_save_index & 1)); // 2 slots + alignment if needed
341341

src/hotspot/cpu/ppc/ppc.ad

Lines changed: 327 additions & 520 deletions
Large diffs are not rendered by default.

src/hotspot/cpu/ppc/register_ppc.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,7 @@ class VectorRegister {
321321

322322
// accessors
323323
constexpr int encoding() const { assert(is_valid(), "invalid register"); return _encoding; }
324+
inline VMReg as_VMReg() const;
324325

325326
// testers
326327
constexpr bool is_valid() const { return (0 <= _encoding && _encoding < number_of_registers); }
@@ -392,7 +393,6 @@ class VectorSRegister {
392393

393394
// accessors
394395
constexpr int encoding() const { assert(is_valid(), "invalid register"); return _encoding; }
395-
inline VMReg as_VMReg() const;
396396
VectorSRegister successor() const { return VectorSRegister(encoding() + 1); }
397397

398398
// testers
@@ -484,8 +484,8 @@ class ConcreteRegisterImpl : public AbstractRegisterImpl {
484484
enum {
485485
max_gpr = Register::number_of_registers * 2,
486486
max_fpr = max_gpr + FloatRegister::number_of_registers * 2,
487-
max_vsr = max_fpr + VectorSRegister::number_of_registers * 4,
488-
max_cnd = max_vsr + ConditionRegister::number_of_registers,
487+
max_vr = max_fpr + VectorRegister::number_of_registers * 4,
488+
max_cnd = max_vr + ConditionRegister::number_of_registers,
489489
max_spr = max_cnd + SpecialRegister::number_of_registers,
490490
// This number must be large enough to cover REG_COUNT (defined by c2) registers.
491491
// There is no requirement that any ordering here matches any ordering c2 gives

src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp

Lines changed: 70 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -111,13 +111,13 @@ class RegisterSaver {
111111
int_reg,
112112
float_reg,
113113
special_reg,
114-
vs_reg
114+
vec_reg
115115
} RegisterType;
116116

117117
typedef enum {
118118
reg_size = 8,
119119
half_reg_size = reg_size / 2,
120-
vs_reg_size = 16
120+
vec_reg_size = 16
121121
} RegisterConstants;
122122

123123
typedef struct {
@@ -137,8 +137,8 @@ class RegisterSaver {
137137
#define RegisterSaver_LiveSpecialReg(regname) \
138138
{ RegisterSaver::special_reg, regname->encoding(), regname->as_VMReg() }
139139

140-
#define RegisterSaver_LiveVSReg(regname) \
141-
{ RegisterSaver::vs_reg, regname->encoding(), regname->as_VMReg() }
140+
#define RegisterSaver_LiveVecReg(regname) \
141+
{ RegisterSaver::vec_reg, regname->encoding(), regname->as_VMReg() }
142142

143143
static const RegisterSaver::LiveRegType RegisterSaver_LiveRegs[] = {
144144
// Live registers which get spilled to the stack. Register
@@ -220,42 +220,42 @@ static const RegisterSaver::LiveRegType RegisterSaver_LiveRegs[] = {
220220
RegisterSaver_LiveIntReg( R31 ) // must be the last register (see save/restore functions below)
221221
};
222222

223-
static const RegisterSaver::LiveRegType RegisterSaver_LiveVSRegs[] = {
223+
static const RegisterSaver::LiveRegType RegisterSaver_LiveVecRegs[] = {
224224
//
225-
// live vector scalar registers (optional, only these ones are used by C2):
225+
// live vector registers (optional, only these ones are used by C2):
226226
//
227-
RegisterSaver_LiveVSReg( VSR32 ),
228-
RegisterSaver_LiveVSReg( VSR33 ),
229-
RegisterSaver_LiveVSReg( VSR34 ),
230-
RegisterSaver_LiveVSReg( VSR35 ),
231-
RegisterSaver_LiveVSReg( VSR36 ),
232-
RegisterSaver_LiveVSReg( VSR37 ),
233-
RegisterSaver_LiveVSReg( VSR38 ),
234-
RegisterSaver_LiveVSReg( VSR39 ),
235-
RegisterSaver_LiveVSReg( VSR40 ),
236-
RegisterSaver_LiveVSReg( VSR41 ),
237-
RegisterSaver_LiveVSReg( VSR42 ),
238-
RegisterSaver_LiveVSReg( VSR43 ),
239-
RegisterSaver_LiveVSReg( VSR44 ),
240-
RegisterSaver_LiveVSReg( VSR45 ),
241-
RegisterSaver_LiveVSReg( VSR46 ),
242-
RegisterSaver_LiveVSReg( VSR47 ),
243-
RegisterSaver_LiveVSReg( VSR48 ),
244-
RegisterSaver_LiveVSReg( VSR49 ),
245-
RegisterSaver_LiveVSReg( VSR50 ),
246-
RegisterSaver_LiveVSReg( VSR51 ),
247-
RegisterSaver_LiveVSReg( VSR52 ),
248-
RegisterSaver_LiveVSReg( VSR53 ),
249-
RegisterSaver_LiveVSReg( VSR54 ),
250-
RegisterSaver_LiveVSReg( VSR55 ),
251-
RegisterSaver_LiveVSReg( VSR56 ),
252-
RegisterSaver_LiveVSReg( VSR57 ),
253-
RegisterSaver_LiveVSReg( VSR58 ),
254-
RegisterSaver_LiveVSReg( VSR59 ),
255-
RegisterSaver_LiveVSReg( VSR60 ),
256-
RegisterSaver_LiveVSReg( VSR61 ),
257-
RegisterSaver_LiveVSReg( VSR62 ),
258-
RegisterSaver_LiveVSReg( VSR63 )
227+
RegisterSaver_LiveVecReg( VR0 ),
228+
RegisterSaver_LiveVecReg( VR1 ),
229+
RegisterSaver_LiveVecReg( VR2 ),
230+
RegisterSaver_LiveVecReg( VR3 ),
231+
RegisterSaver_LiveVecReg( VR4 ),
232+
RegisterSaver_LiveVecReg( VR5 ),
233+
RegisterSaver_LiveVecReg( VR6 ),
234+
RegisterSaver_LiveVecReg( VR7 ),
235+
RegisterSaver_LiveVecReg( VR8 ),
236+
RegisterSaver_LiveVecReg( VR9 ),
237+
RegisterSaver_LiveVecReg( VR10 ),
238+
RegisterSaver_LiveVecReg( VR11 ),
239+
RegisterSaver_LiveVecReg( VR12 ),
240+
RegisterSaver_LiveVecReg( VR13 ),
241+
RegisterSaver_LiveVecReg( VR14 ),
242+
RegisterSaver_LiveVecReg( VR15 ),
243+
RegisterSaver_LiveVecReg( VR16 ),
244+
RegisterSaver_LiveVecReg( VR17 ),
245+
RegisterSaver_LiveVecReg( VR18 ),
246+
RegisterSaver_LiveVecReg( VR19 ),
247+
RegisterSaver_LiveVecReg( VR20 ),
248+
RegisterSaver_LiveVecReg( VR21 ),
249+
RegisterSaver_LiveVecReg( VR22 ),
250+
RegisterSaver_LiveVecReg( VR23 ),
251+
RegisterSaver_LiveVecReg( VR24 ),
252+
RegisterSaver_LiveVecReg( VR25 ),
253+
RegisterSaver_LiveVecReg( VR26 ),
254+
RegisterSaver_LiveVecReg( VR27 ),
255+
RegisterSaver_LiveVecReg( VR28 ),
256+
RegisterSaver_LiveVecReg( VR29 ),
257+
RegisterSaver_LiveVecReg( VR30 ),
258+
RegisterSaver_LiveVecReg( VR31 )
259259
};
260260

261261

@@ -277,10 +277,10 @@ OopMap* RegisterSaver::push_frame_reg_args_and_save_live_registers(MacroAssemble
277277
// calculate frame size
278278
const int regstosave_num = sizeof(RegisterSaver_LiveRegs) /
279279
sizeof(RegisterSaver::LiveRegType);
280-
const int vsregstosave_num = save_vectors ? (sizeof(RegisterSaver_LiveVSRegs) /
280+
const int vecregstosave_num = save_vectors ? (sizeof(RegisterSaver_LiveVecRegs) /
281281
sizeof(RegisterSaver::LiveRegType))
282282
: 0;
283-
const int register_save_size = regstosave_num * reg_size + vsregstosave_num * vs_reg_size;
283+
const int register_save_size = regstosave_num * reg_size + vecregstosave_num * vec_reg_size;
284284
const int frame_size_in_bytes = align_up(register_save_size, frame::alignment_in_bytes)
285285
+ frame::native_abi_reg_args_size;
286286

@@ -298,8 +298,8 @@ OopMap* RegisterSaver::push_frame_reg_args_and_save_live_registers(MacroAssemble
298298

299299
// Save some registers in the last (non-vector) slots of the new frame so we
300300
// can use them as scratch regs or to determine the return pc.
301-
__ std(R31, frame_size_in_bytes - reg_size - vsregstosave_num * vs_reg_size, R1_SP);
302-
__ std(R30, frame_size_in_bytes - 2*reg_size - vsregstosave_num * vs_reg_size, R1_SP);
301+
__ std(R31, frame_size_in_bytes - reg_size - vecregstosave_num * vec_reg_size, R1_SP);
302+
__ std(R30, frame_size_in_bytes - 2*reg_size - vecregstosave_num * vec_reg_size, R1_SP);
303303

304304
// save the flags
305305
// Do the save_LR by hand and adjust the return pc if requested.
@@ -360,37 +360,37 @@ OopMap* RegisterSaver::push_frame_reg_args_and_save_live_registers(MacroAssemble
360360
// the utilized instructions (PowerArchitecturePPC64).
361361
assert(is_aligned(offset, StackAlignmentInBytes), "should be");
362362
if (PowerArchitecturePPC64 >= 10) {
363-
assert(is_even(vsregstosave_num), "expectation");
364-
for (int i = 0; i < vsregstosave_num; i += 2) {
365-
int reg_num = RegisterSaver_LiveVSRegs[i].reg_num;
366-
assert(RegisterSaver_LiveVSRegs[i + 1].reg_num == reg_num + 1, "or use other instructions!");
363+
assert(is_even(vecregstosave_num), "expectation");
364+
for (int i = 0; i < vecregstosave_num; i += 2) {
365+
int reg_num = RegisterSaver_LiveVecRegs[i].reg_num;
366+
assert(RegisterSaver_LiveVecRegs[i + 1].reg_num == reg_num + 1, "or use other instructions!");
367367

368-
__ stxvp(as_VectorSRegister(reg_num), offset, R1_SP);
368+
__ stxvp(as_VectorRegister(reg_num).to_vsr(), offset, R1_SP);
369369
// Note: The contents were read in the same order (see loadV16_Power9 node in ppc.ad).
370370
if (generate_oop_map) {
371371
map->set_callee_saved(VMRegImpl::stack2reg(offset >> 2),
372-
RegisterSaver_LiveVSRegs[i LITTLE_ENDIAN_ONLY(+1) ].vmreg);
373-
map->set_callee_saved(VMRegImpl::stack2reg((offset + vs_reg_size) >> 2),
374-
RegisterSaver_LiveVSRegs[i BIG_ENDIAN_ONLY(+1) ].vmreg);
372+
RegisterSaver_LiveVecRegs[i LITTLE_ENDIAN_ONLY(+1) ].vmreg);
373+
map->set_callee_saved(VMRegImpl::stack2reg((offset + vec_reg_size) >> 2),
374+
RegisterSaver_LiveVecRegs[i BIG_ENDIAN_ONLY(+1) ].vmreg);
375375
}
376-
offset += (2 * vs_reg_size);
376+
offset += (2 * vec_reg_size);
377377
}
378378
} else {
379-
for (int i = 0; i < vsregstosave_num; i++) {
380-
int reg_num = RegisterSaver_LiveVSRegs[i].reg_num;
379+
for (int i = 0; i < vecregstosave_num; i++) {
380+
int reg_num = RegisterSaver_LiveVecRegs[i].reg_num;
381381

382382
if (PowerArchitecturePPC64 >= 9) {
383-
__ stxv(as_VectorSRegister(reg_num), offset, R1_SP);
383+
__ stxv(as_VectorRegister(reg_num)->to_vsr(), offset, R1_SP);
384384
} else {
385385
__ li(R31, offset);
386-
__ stxvd2x(as_VectorSRegister(reg_num), R31, R1_SP);
386+
__ stxvd2x(as_VectorRegister(reg_num)->to_vsr(), R31, R1_SP);
387387
}
388388
// Note: The contents were read in the same order (see loadV16_Power8 / loadV16_Power9 node in ppc.ad).
389389
if (generate_oop_map) {
390-
VMReg vsr = RegisterSaver_LiveVSRegs[i].vmreg;
390+
VMReg vsr = RegisterSaver_LiveVecRegs[i].vmreg;
391391
map->set_callee_saved(VMRegImpl::stack2reg(offset >> 2), vsr);
392392
}
393-
offset += vs_reg_size;
393+
offset += vec_reg_size;
394394
}
395395
}
396396

@@ -411,10 +411,10 @@ void RegisterSaver::restore_live_registers_and_pop_frame(MacroAssembler* masm,
411411
bool save_vectors) {
412412
const int regstosave_num = sizeof(RegisterSaver_LiveRegs) /
413413
sizeof(RegisterSaver::LiveRegType);
414-
const int vsregstosave_num = save_vectors ? (sizeof(RegisterSaver_LiveVSRegs) /
414+
const int vecregstosave_num = save_vectors ? (sizeof(RegisterSaver_LiveVecRegs) /
415415
sizeof(RegisterSaver::LiveRegType))
416416
: 0;
417-
const int register_save_size = regstosave_num * reg_size + vsregstosave_num * vs_reg_size;
417+
const int register_save_size = regstosave_num * reg_size + vecregstosave_num * vec_reg_size;
418418

419419
const int register_save_offset = frame_size_in_bytes - register_save_size;
420420

@@ -456,26 +456,26 @@ void RegisterSaver::restore_live_registers_and_pop_frame(MacroAssembler* masm,
456456

457457
assert(is_aligned(offset, StackAlignmentInBytes), "should be");
458458
if (PowerArchitecturePPC64 >= 10) {
459-
for (int i = 0; i < vsregstosave_num; i += 2) {
460-
int reg_num = RegisterSaver_LiveVSRegs[i].reg_num;
461-
assert(RegisterSaver_LiveVSRegs[i + 1].reg_num == reg_num + 1, "or use other instructions!");
459+
for (int i = 0; i < vecregstosave_num; i += 2) {
460+
int reg_num = RegisterSaver_LiveVecRegs[i].reg_num;
461+
assert(RegisterSaver_LiveVecRegs[i + 1].reg_num == reg_num + 1, "or use other instructions!");
462462

463-
__ lxvp(as_VectorSRegister(reg_num), offset, R1_SP);
463+
__ lxvp(as_VectorRegister(reg_num).to_vsr(), offset, R1_SP);
464464

465-
offset += (2 * vs_reg_size);
465+
offset += (2 * vec_reg_size);
466466
}
467467
} else {
468-
for (int i = 0; i < vsregstosave_num; i++) {
469-
int reg_num = RegisterSaver_LiveVSRegs[i].reg_num;
468+
for (int i = 0; i < vecregstosave_num; i++) {
469+
int reg_num = RegisterSaver_LiveVecRegs[i].reg_num;
470470

471471
if (PowerArchitecturePPC64 >= 9) {
472-
__ lxv(as_VectorSRegister(reg_num), offset, R1_SP);
472+
__ lxv(as_VectorRegister(reg_num).to_vsr(), offset, R1_SP);
473473
} else {
474474
__ li(R31, offset);
475-
__ lxvd2x(as_VectorSRegister(reg_num), R31, R1_SP);
475+
__ lxvd2x(as_VectorRegister(reg_num).to_vsr(), R31, R1_SP);
476476
}
477477

478-
offset += vs_reg_size;
478+
offset += vec_reg_size;
479479
}
480480
}
481481

@@ -486,7 +486,7 @@ void RegisterSaver::restore_live_registers_and_pop_frame(MacroAssembler* masm,
486486
__ mtlr(R31);
487487

488488
// restore scratch register's value
489-
__ ld(R31, frame_size_in_bytes - reg_size - vsregstosave_num * vs_reg_size, R1_SP);
489+
__ ld(R31, frame_size_in_bytes - reg_size - vecregstosave_num * vec_reg_size, R1_SP);
490490

491491
// pop the frame
492492
__ addi(R1_SP, R1_SP, frame_size_in_bytes);

src/hotspot/cpu/ppc/vmreg_ppc.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ void VMRegImpl::set_regName() {
4747
}
4848

4949
VectorSRegister vsreg = ::as_VectorSRegister(0);
50-
for ( ; i < ConcreteRegisterImpl::max_vsr; ) {
50+
for ( ; i < ConcreteRegisterImpl::max_vr; ) {
5151
regName[i++] = vsreg->name();
5252
regName[i++] = vsreg->name();
5353
regName[i++] = vsreg->name();

src/hotspot/cpu/ppc/vmreg_ppc.hpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,13 @@ inline bool is_FloatRegister() {
3535
value() < ConcreteRegisterImpl::max_fpr;
3636
}
3737

38-
inline bool is_VectorSRegister() {
38+
inline bool is_VectorRegister() {
3939
return value() >= ConcreteRegisterImpl::max_fpr &&
40-
value() < ConcreteRegisterImpl::max_vsr;
40+
value() < ConcreteRegisterImpl::max_vr;
4141
}
4242

4343
inline bool is_ConditionRegister() {
44-
return value() >= ConcreteRegisterImpl::max_vsr &&
44+
return value() >= ConcreteRegisterImpl::max_vr &&
4545
value() < ConcreteRegisterImpl::max_cnd;
4646
}
4747

@@ -60,15 +60,15 @@ inline FloatRegister as_FloatRegister() {
6060
return ::as_FloatRegister((value() - ConcreteRegisterImpl::max_gpr) >> 1);
6161
}
6262

63-
inline VectorSRegister as_VectorSRegister() {
64-
assert(is_VectorSRegister(), "must be");
65-
return ::as_VectorSRegister((value() - ConcreteRegisterImpl::max_fpr) >> 2);
63+
inline VectorRegister as_VectorRegister() {
64+
assert(is_VectorRegister(), "must be");
65+
return ::as_VectorRegister((value() - ConcreteRegisterImpl::max_fpr) >> 2);
6666
}
6767

6868
inline bool is_concrete() {
6969
assert(is_reg(), "must be");
7070
if (is_Register() || is_FloatRegister()) return is_even(value());
71-
if (is_VectorSRegister()) {
71+
if (is_VectorRegister()) {
7272
int base = value() - ConcreteRegisterImpl::max_fpr;
7373
return (base & 3) == 0;
7474
}

src/hotspot/cpu/ppc/vmreg_ppc.inline.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@ inline VMReg FloatRegister::as_VMReg() const {
4040
return VMRegImpl::as_VMReg((encoding() << 1) + ConcreteRegisterImpl::max_gpr);
4141
}
4242

43-
inline VMReg VectorSRegister::as_VMReg() const {
43+
inline VMReg VectorRegister::as_VMReg() const {
4444
// Four halves, multiply by 4.
4545
return VMRegImpl::as_VMReg((encoding() << 2) + ConcreteRegisterImpl::max_fpr);
4646
}
4747

4848
inline VMReg ConditionRegister::as_VMReg() const {
49-
return VMRegImpl::as_VMReg((encoding()) + ConcreteRegisterImpl::max_vsr);
49+
return VMRegImpl::as_VMReg((encoding()) + ConcreteRegisterImpl::max_vr);
5050
}
5151

5252
inline VMReg SpecialRegister::as_VMReg() const {

0 commit comments

Comments
 (0)