Skip to content

Commit 7790205

Browse files
zhengxiaolinXRealFYang
authored andcommitted
8278833: riscv: Remove the x3 and x4 register saving logic in register savers
Reviewed-by: yadongwang, fjiang, fyang
1 parent ec881ea commit 7790205

File tree

3 files changed

+37
-35
lines changed

3 files changed

+37
-35
lines changed

src/hotspot/cpu/riscv/c1_Runtime1_riscv.cpp

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ const int float_regs_as_doubles_size_in_slots = pd_nof_fpu_regs_frame_map * 2;
237237
//
238238

239239
enum 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

323323
static 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

341341
void 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
}

src/hotspot/cpu/riscv/macroAssembler_riscv.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1118,18 +1118,19 @@ void MacroAssembler::pop_call_clobbered_registers_except(RegSet exclude) {
11181118
pop_reg(RegSet::of(x7) + RegSet::range(x10, x17) + RegSet::range(x28, x31) - exclude, sp);
11191119
}
11201120

1121-
// Push all the integer registers, except zr(x0) & sp(x2).
1121+
// Push all the integer registers, except zr(x0) & sp(x2) & gp(x3) & tp(x4).
11221122
void MacroAssembler::pusha() {
1123-
push_reg(0xfffffffa, sp);
1123+
push_reg(0xffffffe2, sp);
11241124
}
11251125

1126+
// Pop all the integer registers, except zr(x0) & sp(x2) & gp(x3) & tp(x4).
11261127
void MacroAssembler::popa() {
1127-
pop_reg(0xfffffffa, sp);
1128+
pop_reg(0xffffffe2, sp);
11281129
}
11291130

11301131
void MacroAssembler::push_CPU_state(bool save_vectors, int vector_size_in_bytes) {
1131-
// integer registers, except zr(x0) & ra(x1) & sp(x2)
1132-
push_reg(0xfffffff8, sp);
1132+
// integer registers, except zr(x0) & ra(x1) & sp(x2) & gp(x3) & tp(x4)
1133+
push_reg(0xffffffe0, sp);
11331134

11341135
// float registers
11351136
addi(sp, sp, - 32 * wordSize);
@@ -1164,8 +1165,8 @@ void MacroAssembler::pop_CPU_state(bool restore_vectors, int vector_size_in_byte
11641165
}
11651166
addi(sp, sp, 32 * wordSize);
11661167

1167-
// integer registers, except zr(x0) & ra(x1) & sp(x2)
1168-
pop_reg(0xfffffff8, sp);
1168+
// integer registers, except zr(x0) & ra(x1) & sp(x2) & gp(x3) & tp(x4)
1169+
pop_reg(0xffffffe0, sp);
11691170
}
11701171

11711172
static int patch_offset_in_jal(address branch, int64_t offset) {

src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ class RegisterSaver {
9090
// Offsets into the register save area
9191
// Used by deoptimization when it is managing result register
9292
// values on its own
93-
// gregs:30, float_register:32; except: x1(ra) & x2(sp)
93+
// gregs:28, float_register:32; except: x1(ra) & x2(sp) & gp(x3) & tp(x4)
9494
// |---v0---|<---SP
9595
// |---v1---|save vectors only in generate_handler_blob
9696
// |-- .. --|
@@ -99,9 +99,9 @@ class RegisterSaver {
9999
// |---f1---|
100100
// | .. |
101101
// |---f31--|
102-
// |---zr---|
103-
// |---x3---|
104-
// | x4 |
102+
// |---reserved slot for stack alignment---|
103+
// |---x5---|
104+
// | x6 |
105105
// |---.. --|
106106
// |---x31--|
107107
// |---fp---|
@@ -117,25 +117,25 @@ class RegisterSaver {
117117
#endif
118118
return f0_offset;
119119
}
120-
int x0_offset_in_bytes(void) {
120+
int reserved_slot_offset_in_bytes(void) {
121121
return f0_offset_in_bytes() +
122122
FloatRegisterImpl::max_slots_per_register *
123123
FloatRegisterImpl::number_of_registers *
124124
BytesPerInt;
125125
}
126126

127127
int reg_offset_in_bytes(Register r) {
128-
assert (r->encoding() > 2, "ra and sp not saved");
129-
return x0_offset_in_bytes() + (r->encoding() - 2 /* x1, x2*/) * wordSize;
128+
assert (r->encoding() > 4, "ra, sp, gp and tp not saved");
129+
return reserved_slot_offset_in_bytes() + (r->encoding() - 4 /* x1, x2, x3, x4 */) * wordSize;
130130
}
131131

132132
int freg_offset_in_bytes(FloatRegister f) {
133133
return f0_offset_in_bytes() + f->encoding() * wordSize;
134134
}
135135

136136
int ra_offset_in_bytes(void) {
137-
return x0_offset_in_bytes() +
138-
(RegisterImpl::number_of_registers - 1) *
137+
return reserved_slot_offset_in_bytes() +
138+
(RegisterImpl::number_of_registers - 3) *
139139
RegisterImpl::max_slots_per_register *
140140
BytesPerInt;
141141
}
@@ -190,12 +190,14 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_
190190
oop_map->set_callee_saved(VMRegImpl::stack2reg(sp_offset_in_slots), r->as_VMReg());
191191
}
192192

193-
// ignore zr, ra and sp, being ignored also by push_CPU_state (pushing zr only for stack alignment)
194-
sp_offset_in_slots += RegisterImpl::max_slots_per_register;
195193
step_in_slots = RegisterImpl::max_slots_per_register;
196-
for (int i = 3; i < RegisterImpl::number_of_registers; i++, sp_offset_in_slots += step_in_slots) {
194+
// skip the slot reserved for alignment, see MacroAssembler::push_reg;
195+
// also skip x5 ~ x6 on the stack because they are caller-saved registers.
196+
sp_offset_in_slots += RegisterImpl::max_slots_per_register * 3;
197+
// besides, we ignore x0 ~ x4 because push_CPU_state won't push them on the stack.
198+
for (int i = 7; i < RegisterImpl::number_of_registers; i++, sp_offset_in_slots += step_in_slots) {
197199
Register r = as_Register(i);
198-
if (r != xthread && r != t0 && r != t1) {
200+
if (r != xthread) {
199201
oop_map->set_callee_saved(VMRegImpl::stack2reg(sp_offset_in_slots + additional_frame_slots), r->as_VMReg());
200202
}
201203
}

0 commit comments

Comments
 (0)