8274795: AArch64: avoid spilling and restoring r18 in macro assembler

Reviewed-by: aph
This commit is contained in:
Bernhard Urban-Forster 2021-10-14 16:58:14 +00:00 committed by Andrew Haley
parent 40d69f0c41
commit ede3f4e94c
3 changed files with 12 additions and 17 deletions

@ -1855,15 +1855,6 @@ void MacroAssembler::increment(Address dst, int value)
str(rscratch1, dst);
}
void MacroAssembler::pusha() {
push(0x7fffffff, sp);
}
void MacroAssembler::popa() {
pop(0x7fffffff, sp);
}
// Push lots of registers in the bit set supplied. Don't push sp.
// Return the number of words pushed
int MacroAssembler::push(unsigned int bitset, Register stack) {
@ -2505,7 +2496,7 @@ void MacroAssembler::pop_call_clobbered_registers_except(RegSet exclude) {
void MacroAssembler::push_CPU_state(bool save_vectors, bool use_sve,
int sve_vector_size_in_bytes) {
push(0x3fffffff, sp); // integer registers except lr & sp
push(RegSet::range(r0, r29), sp); // integer registers except lr & sp
if (save_vectors && use_sve && sve_vector_size_in_bytes > 16) {
sub(sp, sp, sve_vector_size_in_bytes * FloatRegisterImpl::number_of_registers);
for (int i = 0; i < FloatRegisterImpl::number_of_registers; i++) {
@ -2543,7 +2534,14 @@ void MacroAssembler::pop_CPU_state(bool restore_vectors, bool use_sve,
reinitialize_ptrue();
}
pop(0x3fffffff, sp); // integer registers except lr & sp
// integer registers except lr & sp
pop(RegSet::range(r0, r17), sp);
#ifdef R18_RESERVED
ldp(zr, r19, Address(post(sp, 2 * wordSize)));
pop(RegSet::range(r20, r29), sp);
#else
pop(RegSet::range(r18_tls, r29), sp);
#endif
}
/**

@ -1106,10 +1106,6 @@ public:
void push(Register src);
void pop(Register dst);
// push all registers onto the stack
void pusha();
void popa();
void repne_scan(Register addr, Register value, Register count,
Register scratch);
void repne_scanw(Register addr, Register value, Register count,

@ -1397,11 +1397,12 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
__ cmp(rscratch1, (u1)StackOverflow::stack_guard_yellow_reserved_disabled);
__ br(Assembler::NE, no_reguard);
__ pusha(); // XXX only save smashed registers
__ push_call_clobbered_registers();
__ mov(c_rarg0, rthread);
__ mov(rscratch2, CAST_FROM_FN_PTR(address, SharedRuntime::reguard_yellow_pages));
__ blr(rscratch2);
__ popa(); // XXX only restore smashed registers
__ pop_call_clobbered_registers();
__ bind(no_reguard);
}