8293566: RISC-V: Clean up push and pop registers

Reviewed-by: fyang, shade
This commit is contained in:
Feilong Jiang 2022-09-13 01:07:04 +00:00 committed by Fei Yang
parent 526eb54fc3
commit 68645ebffb
5 changed files with 45 additions and 50 deletions

@ -262,12 +262,12 @@ public:
// Save registers
__ push_reg(_gp_regs, sp);
__ push_fp(_fp_regs, sp);
__ push_vp(_vp_regs, sp);
__ push_v(_vp_regs, sp);
}
~ZSaveLiveRegisters() {
// Restore registers
__ pop_vp(_vp_regs, sp);
__ pop_v(_vp_regs, sp);
__ pop_fp(_fp_regs, sp);
__ pop_reg(_gp_regs, sp);
}

@ -915,7 +915,7 @@ void InterpreterMacroAssembler::test_method_data_pointer(Register mdp,
void InterpreterMacroAssembler::set_method_data_pointer_for_bcp() {
assert(ProfileInterpreter, "must be profiling interpreter");
Label set_mdp;
push_reg(0xc00, sp); // save x10, x11
push_reg(RegSet::of(x10, x11), sp); // save x10, x11
// Test MDO to avoid the call if it is NULL.
ld(x10, Address(xmethod, in_bytes(Method::method_data_offset())));
@ -928,7 +928,7 @@ void InterpreterMacroAssembler::set_method_data_pointer_for_bcp() {
add(x10, x11, x10);
sd(x10, Address(fp, frame::interpreter_frame_mdp_offset * wordSize));
bind(set_mdp);
pop_reg(0xc00, sp);
pop_reg(RegSet::of(x10, x11), sp);
}
void InterpreterMacroAssembler::verify_method_data_pointer() {

@ -946,7 +946,7 @@ int MacroAssembler::bitset_to_regs(unsigned int bitset, unsigned char* regs) {
return count;
}
// Push lots of registers in the bit set supplied. Don't push sp.
// Push integer registers in the bitset supplied. Don't push sp.
// Return the number of words pushed
int MacroAssembler::push_reg(unsigned int bitset, Register stack) {
DEBUG_ONLY(int words_pushed = 0;)
@ -958,11 +958,11 @@ int MacroAssembler::push_reg(unsigned int bitset, Register stack) {
int offset = is_even(count) ? 0 : wordSize;
if (count) {
addi(stack, stack, - count * wordSize - offset);
addi(stack, stack, -count * wordSize - offset);
}
for (int i = count - 1; i >= 0; i--) {
sd(as_Register(regs[i]), Address(stack, (count - 1 - i) * wordSize + offset));
DEBUG_ONLY(words_pushed ++;)
DEBUG_ONLY(words_pushed++;)
}
assert(words_pushed == count, "oops, pushed != count");
@ -981,7 +981,7 @@ int MacroAssembler::pop_reg(unsigned int bitset, Register stack) {
for (int i = count - 1; i >= 0; i--) {
ld(as_Register(regs[i]), Address(stack, (count - 1 - i) * wordSize + offset));
DEBUG_ONLY(words_popped ++;)
DEBUG_ONLY(words_popped++;)
}
if (count) {
@ -992,11 +992,11 @@ int MacroAssembler::pop_reg(unsigned int bitset, Register stack) {
return count;
}
// Push float registers in the bitset, except sp.
// Return the number of heapwords pushed.
// Push floating-point registers in the bitset supplied.
// Return the number of words pushed
int MacroAssembler::push_fp(unsigned int bitset, Register stack) {
CompressibleRegion cr(this);
int words_pushed = 0;
DEBUG_ONLY(int words_pushed = 0;)
unsigned char regs[32];
int count = bitset_to_regs(bitset, regs);
int push_slots = count + (count & 1);
@ -1007,23 +1007,24 @@ int MacroAssembler::push_fp(unsigned int bitset, Register stack) {
for (int i = count - 1; i >= 0; i--) {
fsd(as_FloatRegister(regs[i]), Address(stack, (push_slots - 1 - i) * wordSize));
words_pushed++;
DEBUG_ONLY(words_pushed++;)
}
assert(words_pushed == count, "oops, pushed(%d) != count(%d)", words_pushed, count);
return count;
}
int MacroAssembler::pop_fp(unsigned int bitset, Register stack) {
CompressibleRegion cr(this);
int words_popped = 0;
DEBUG_ONLY(int words_popped = 0;)
unsigned char regs[32];
int count = bitset_to_regs(bitset, regs);
int pop_slots = count + (count & 1);
for (int i = count - 1; i >= 0; i--) {
fld(as_FloatRegister(regs[i]), Address(stack, (pop_slots - 1 - i) * wordSize));
words_popped++;
DEBUG_ONLY(words_popped++;)
}
if (count) {
@ -1031,23 +1032,20 @@ int MacroAssembler::pop_fp(unsigned int bitset, Register stack) {
}
assert(words_popped == count, "oops, popped(%d) != count(%d)", words_popped, count);
return count;
}
#ifdef COMPILER2
int MacroAssembler::push_vp(unsigned int bitset, Register stack) {
// Push vector registers in the bitset supplied.
// Return the number of words pushed
int MacroAssembler::push_v(unsigned int bitset, Register stack) {
CompressibleRegion cr(this);
int vector_size_in_bytes = Matcher::scalable_vector_reg_size(T_BYTE);
// Scan bitset to accumulate register pairs
unsigned char regs[32];
int count = 0;
for (int reg = 31; reg >= 0; reg--) {
if ((1U << 31) & bitset) {
regs[count++] = reg;
}
bitset <<= 1;
}
int count = bitset_to_regs(bitset, regs);
for (int i = 0; i < count; i++) {
sub(stack, stack, vector_size_in_bytes);
@ -1057,19 +1055,13 @@ int MacroAssembler::push_vp(unsigned int bitset, Register stack) {
return count * vector_size_in_bytes / wordSize;
}
int MacroAssembler::pop_vp(unsigned int bitset, Register stack) {
int MacroAssembler::pop_v(unsigned int bitset, Register stack) {
CompressibleRegion cr(this);
int vector_size_in_bytes = Matcher::scalable_vector_reg_size(T_BYTE);
// Scan bitset to accumulate register pairs
unsigned char regs[32];
int count = 0;
for (int reg = 31; reg >= 0; reg--) {
if ((1U << 31) & bitset) {
regs[count++] = reg;
}
bitset <<= 1;
}
int count = bitset_to_regs(bitset, regs);
for (int i = count - 1; i >= 0; i--) {
vl1r_v(as_VectorRegister(regs[i]), stack);
@ -1090,7 +1082,7 @@ void MacroAssembler::push_call_clobbered_registers_except(RegSet exclude) {
int offset = 0;
for (int i = 0; i < 32; i++) {
if (i <= f7->encoding() || i >= f28->encoding() || (i >= f10->encoding() && i <= f17->encoding())) {
fsd(as_FloatRegister(i), Address(sp, wordSize * (offset ++)));
fsd(as_FloatRegister(i), Address(sp, wordSize * (offset++)));
}
}
}
@ -1100,7 +1092,7 @@ void MacroAssembler::pop_call_clobbered_registers_except(RegSet exclude) {
int offset = 0;
for (int i = 0; i < 32; i++) {
if (i <= f7->encoding() || i >= f28->encoding() || (i >= f10->encoding() && i <= f17->encoding())) {
fld(as_FloatRegister(i), Address(sp, wordSize * (offset ++)));
fld(as_FloatRegister(i), Address(sp, wordSize * (offset++)));
}
}
addi(sp, sp, wordSize * 20);
@ -1111,7 +1103,7 @@ void MacroAssembler::pop_call_clobbered_registers_except(RegSet exclude) {
void MacroAssembler::push_CPU_state(bool save_vectors, int vector_size_in_bytes) {
CompressibleRegion cr(this);
// integer registers, except zr(x0) & ra(x1) & sp(x2) & gp(x3) & tp(x4)
push_reg(0xffffffe0, sp);
push_reg(RegSet::range(x5, x31), sp);
// float registers
addi(sp, sp, - 32 * wordSize);
@ -1148,7 +1140,7 @@ void MacroAssembler::pop_CPU_state(bool restore_vectors, int vector_size_in_byte
addi(sp, sp, 32 * wordSize);
// integer registers, except zr(x0) & ra(x1) & sp(x2) & gp(x3) & tp(x4)
pop_reg(0xffffffe0, sp);
pop_reg(RegSet::range(x5, x31), sp);
}
static int patch_offset_in_jal(address branch, int64_t offset) {

@ -473,17 +473,26 @@ class MacroAssembler: public Assembler {
void double_blt(FloatRegister Rs1, FloatRegister Rs2, Label &l, bool is_far = false, bool is_unordered = false);
void double_bgt(FloatRegister Rs1, FloatRegister Rs2, Label &l, bool is_far = false, bool is_unordered = false);
void push_reg(RegSet regs, Register stack) { if (regs.bits()) { push_reg(regs.bits(), stack); } }
void pop_reg(RegSet regs, Register stack) { if (regs.bits()) { pop_reg(regs.bits(), stack); } }
private:
int push_reg(unsigned int bitset, Register stack);
int pop_reg(unsigned int bitset, Register stack);
int push_fp(unsigned int bitset, Register stack);
int pop_fp(unsigned int bitset, Register stack);
#ifdef COMPILER2
int push_v(unsigned int bitset, Register stack);
int pop_v(unsigned int bitset, Register stack);
#endif // COMPILER2
public:
void push_reg(Register Rs);
void pop_reg(Register Rd);
int push_reg(unsigned int bitset, Register stack);
int pop_reg(unsigned int bitset, Register stack);
void push_reg(RegSet regs, Register stack) { if (regs.bits()) push_reg(regs.bits(), stack); }
void pop_reg(RegSet regs, Register stack) { if (regs.bits()) pop_reg(regs.bits(), stack); }
void push_fp(FloatRegSet regs, Register stack) { if (regs.bits()) push_fp(regs.bits(), stack); }
void pop_fp(FloatRegSet regs, Register stack) { if (regs.bits()) pop_fp(regs.bits(), stack); }
void pop_fp(FloatRegSet regs, Register stack) { if (regs.bits()) pop_fp(regs.bits(), stack); }
#ifdef COMPILER2
void push_vp(VectorRegSet regs, Register stack) { if (regs.bits()) push_vp(regs.bits(), stack); }
void pop_vp(VectorRegSet regs, Register stack) { if (regs.bits()) pop_vp(regs.bits(), stack); }
void push_v(VectorRegSet regs, Register stack) { if (regs.bits()) push_v(regs.bits(), stack); }
void pop_v(VectorRegSet regs, Register stack) { if (regs.bits()) pop_v(regs.bits(), stack); }
#endif // COMPILER2
// Push and pop everything that might be clobbered by a native
@ -783,12 +792,6 @@ class MacroAssembler: public Assembler {
// if [src1 < src2], dst = -1;
void cmp_l2i(Register dst, Register src1, Register src2, Register tmp = t0);
int push_fp(unsigned int bitset, Register stack);
int pop_fp(unsigned int bitset, Register stack);
int push_vp(unsigned int bitset, Register stack);
int pop_vp(unsigned int bitset, Register stack);
// vext
void vmnot_m(VectorRegister vd, VectorRegister vs);
void vncvt_x_x_w(VectorRegister vd, VectorRegister vs, VectorMask vm = unmasked);

@ -599,7 +599,7 @@ class StubGenerator: public StubCodeGenerator {
Label exit, error;
__ push_reg(0x3000, sp); // save c_rarg2 and c_rarg3
__ push_reg(RegSet::of(c_rarg2, c_rarg3), sp); // save c_rarg2 and c_rarg3
__ la(c_rarg2, ExternalAddress((address) StubRoutines::verify_oop_count_addr()));
__ ld(c_rarg3, Address(c_rarg2));
@ -635,12 +635,12 @@ class StubGenerator: public StubCodeGenerator {
// return if everything seems ok
__ bind(exit);
__ pop_reg(0x3000, sp); // pop c_rarg2 and c_rarg3
__ pop_reg(RegSet::of(c_rarg2, c_rarg3), sp); // pop c_rarg2 and c_rarg3
__ ret();
// handle errors
__ bind(error);
__ pop_reg(0x3000, sp); // pop c_rarg2 and c_rarg3
__ pop_reg(RegSet::of(c_rarg2, c_rarg3), sp); // pop c_rarg2 and c_rarg3
__ push_reg(RegSet::range(x0, x31), sp);
// debug(char* msg, int64_t pc, int64_t regs[])