Commit 16b5fc3c authored by Georgia Kouveli's avatar Georgia Kouveli Committed by V8 LUCI CQ

[arm64] Remove template argument of PushCPURegList and friends

Callee saved registers do not include the LR anymore, so we can
now remove the last place where we pass a non-default template
argument to PushCPURegList/PopCPURegList (in the code generator).
This makes the template argument redundant, so we can remove the
template altogether.

Change-Id: I07f0c0a10840817df8a5afc1dc74330e290ce5bf
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3571816Reviewed-by: 's avatarJakob Linke <jgruber@chromium.org>
Commit-Queue: Georgia Kouveli <georgia.kouveli@arm.com>
Cr-Commit-Position: refs/heads/main@{#79842}
parent 6fb4e02c
...@@ -1241,58 +1241,6 @@ void TurboAssembler::Peek(const CPURegister& dst, const Operand& offset) { ...@@ -1241,58 +1241,6 @@ void TurboAssembler::Peek(const CPURegister& dst, const Operand& offset) {
#endif #endif
} }
template <TurboAssembler::StoreLRMode lr_mode>
void TurboAssembler::PushCPURegList(CPURegList registers) {
DCHECK_IMPLIES((lr_mode == kDontStoreLR), !registers.IncludesAliasOf(lr));
#ifdef V8_ENABLE_CONTROL_FLOW_INTEGRITY
if (lr_mode == kSignLR && registers.IncludesAliasOf(lr)) {
Pacibsp();
}
#endif
int size = registers.RegisterSizeInBytes();
DCHECK_EQ(0, (size * registers.Count()) % 16);
// Push up to four registers at a time.
while (!registers.IsEmpty()) {
int count_before = registers.Count();
const CPURegister& src0 = registers.PopHighestIndex();
const CPURegister& src1 = registers.PopHighestIndex();
const CPURegister& src2 = registers.PopHighestIndex();
const CPURegister& src3 = registers.PopHighestIndex();
int count = count_before - registers.Count();
PushHelper(count, size, src0, src1, src2, src3);
}
}
template <TurboAssembler::LoadLRMode lr_mode>
void TurboAssembler::PopCPURegList(CPURegList registers) {
int size = registers.RegisterSizeInBytes();
DCHECK_EQ(0, (size * registers.Count()) % 16);
#ifdef V8_ENABLE_CONTROL_FLOW_INTEGRITY
bool contains_lr = registers.IncludesAliasOf(lr);
DCHECK_IMPLIES((lr_mode == kDontLoadLR), !contains_lr);
#endif
// Pop up to four registers at a time.
while (!registers.IsEmpty()) {
int count_before = registers.Count();
const CPURegister& dst0 = registers.PopLowestIndex();
const CPURegister& dst1 = registers.PopLowestIndex();
const CPURegister& dst2 = registers.PopLowestIndex();
const CPURegister& dst3 = registers.PopLowestIndex();
int count = count_before - registers.Count();
PopHelper(count, size, dst0, dst1, dst2, dst3);
}
#ifdef V8_ENABLE_CONTROL_FLOW_INTEGRITY
if (lr_mode == kAuthLR && contains_lr) {
Autibsp();
}
#endif
}
void TurboAssembler::Claim(int64_t count, uint64_t unit_size) { void TurboAssembler::Claim(int64_t count, uint64_t unit_size) {
DCHECK_GE(count, 0); DCHECK_GE(count, 0);
uint64_t size = count * unit_size; uint64_t size = count * unit_size;
......
...@@ -56,6 +56,46 @@ constexpr int kStackSavedSavedFPSizeInBits = kDRegSizeInBits; ...@@ -56,6 +56,46 @@ constexpr int kStackSavedSavedFPSizeInBits = kDRegSizeInBits;
} // namespace } // namespace
void TurboAssembler::PushCPURegList(CPURegList registers) {
// If LR was stored here, we would need to sign it if
// V8_ENABLE_CONTROL_FLOW_INTEGRITY is on.
DCHECK(!registers.IncludesAliasOf(lr));
int size = registers.RegisterSizeInBytes();
DCHECK_EQ(0, (size * registers.Count()) % 16);
// Push up to four registers at a time.
while (!registers.IsEmpty()) {
int count_before = registers.Count();
const CPURegister& src0 = registers.PopHighestIndex();
const CPURegister& src1 = registers.PopHighestIndex();
const CPURegister& src2 = registers.PopHighestIndex();
const CPURegister& src3 = registers.PopHighestIndex();
int count = count_before - registers.Count();
PushHelper(count, size, src0, src1, src2, src3);
}
}
void TurboAssembler::PopCPURegList(CPURegList registers) {
int size = registers.RegisterSizeInBytes();
DCHECK_EQ(0, (size * registers.Count()) % 16);
// If LR was loaded here, we would need to authenticate it if
// V8_ENABLE_CONTROL_FLOW_INTEGRITY is on.
DCHECK(!registers.IncludesAliasOf(lr));
// Pop up to four registers at a time.
while (!registers.IsEmpty()) {
int count_before = registers.Count();
const CPURegister& dst0 = registers.PopLowestIndex();
const CPURegister& dst1 = registers.PopLowestIndex();
const CPURegister& dst2 = registers.PopLowestIndex();
const CPURegister& dst3 = registers.PopLowestIndex();
int count = count_before - registers.Count();
PopHelper(count, size, dst0, dst1, dst2, dst3);
}
}
int TurboAssembler::RequiredStackSizeForCallerSaved(SaveFPRegsMode fp_mode, int TurboAssembler::RequiredStackSizeForCallerSaved(SaveFPRegsMode fp_mode,
Register exclusion) const { Register exclusion) const {
auto list = kCallerSaved; auto list = kCallerSaved;
...@@ -79,7 +119,7 @@ int TurboAssembler::PushCallerSaved(SaveFPRegsMode fp_mode, ...@@ -79,7 +119,7 @@ int TurboAssembler::PushCallerSaved(SaveFPRegsMode fp_mode,
list.Remove(exclusion); list.Remove(exclusion);
list.Align(); list.Align();
PushCPURegList<kDontStoreLR>(list); PushCPURegList(list);
int bytes = list.TotalSizeInBytes(); int bytes = list.TotalSizeInBytes();
...@@ -106,7 +146,7 @@ int TurboAssembler::PopCallerSaved(SaveFPRegsMode fp_mode, Register exclusion) { ...@@ -106,7 +146,7 @@ int TurboAssembler::PopCallerSaved(SaveFPRegsMode fp_mode, Register exclusion) {
list.Remove(exclusion); list.Remove(exclusion);
list.Align(); list.Align();
PopCPURegList<kDontLoadLR>(list); PopCPURegList(list);
bytes += list.TotalSizeInBytes(); bytes += list.TotalSizeInBytes();
return bytes; return bytes;
...@@ -3574,7 +3614,7 @@ void TurboAssembler::Printf(const char* format, CPURegister arg0, ...@@ -3574,7 +3614,7 @@ void TurboAssembler::Printf(const char* format, CPURegister arg0,
// Preserve all caller-saved registers as well as NZCV. // Preserve all caller-saved registers as well as NZCV.
// PushCPURegList asserts that the size of each list is a multiple of 16 // PushCPURegList asserts that the size of each list is a multiple of 16
// bytes. // bytes.
PushCPURegList<kDontStoreLR>(saved_registers); PushCPURegList(saved_registers);
PushCPURegList(kCallerSavedV); PushCPURegList(kCallerSavedV);
// We can use caller-saved registers as scratch values (except for argN). // We can use caller-saved registers as scratch values (except for argN).
...@@ -3627,7 +3667,7 @@ void TurboAssembler::Printf(const char* format, CPURegister arg0, ...@@ -3627,7 +3667,7 @@ void TurboAssembler::Printf(const char* format, CPURegister arg0,
} }
PopCPURegList(kCallerSavedV); PopCPURegList(kCallerSavedV);
PopCPURegList<kDontLoadLR>(saved_registers); PopCPURegList(saved_registers);
TmpList()->set_bits(old_tmp_list); TmpList()->set_bits(old_tmp_list);
FPTmpList()->set_bits(old_fp_tmp_list); FPTmpList()->set_bits(old_fp_tmp_list);
......
...@@ -862,15 +862,7 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase { ...@@ -862,15 +862,7 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
// kSRegSizeInBits are supported. // kSRegSizeInBits are supported.
// //
// Otherwise, (Push|Pop)(CPU|X|W|D|S)RegList is preferred. // Otherwise, (Push|Pop)(CPU|X|W|D|S)RegList is preferred.
//
// The methods take an optional LoadLRMode or StoreLRMode template argument.
// When control flow integrity measures are enabled and the link register is
// included in 'registers', passing kSignLR to PushCPURegList will sign the
// link register before pushing the list, and passing kAuthLR to
// PopCPURegList will authenticate it after popping the list.
template <StoreLRMode lr_mode = kDontStoreLR>
void PushCPURegList(CPURegList registers); void PushCPURegList(CPURegList registers);
template <LoadLRMode lr_mode = kDontLoadLR>
void PopCPURegList(CPURegList registers); void PopCPURegList(CPURegList registers);
// Calculate how much stack space (in bytes) are required to store caller // Calculate how much stack space (in bytes) are required to store caller
...@@ -1752,31 +1744,23 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler { ...@@ -1752,31 +1744,23 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler {
tbx(vd, vn, vn2, vn3, vn4, vm); tbx(vd, vn, vn2, vn3, vn4, vm);
} }
// For the 'lr_mode' template argument of the following methods, see
// PushCPURegList/PopCPURegList.
template <StoreLRMode lr_mode = kDontStoreLR>
inline void PushSizeRegList(RegList registers, unsigned reg_size) { inline void PushSizeRegList(RegList registers, unsigned reg_size) {
PushCPURegList<lr_mode>(CPURegList(reg_size, registers)); PushCPURegList(CPURegList(reg_size, registers));
} }
template <StoreLRMode lr_mode = kDontStoreLR>
inline void PushSizeRegList(DoubleRegList registers, unsigned reg_size) { inline void PushSizeRegList(DoubleRegList registers, unsigned reg_size) {
PushCPURegList<lr_mode>(CPURegList(reg_size, registers)); PushCPURegList(CPURegList(reg_size, registers));
} }
template <LoadLRMode lr_mode = kDontLoadLR>
inline void PopSizeRegList(RegList registers, unsigned reg_size) { inline void PopSizeRegList(RegList registers, unsigned reg_size) {
PopCPURegList<lr_mode>(CPURegList(reg_size, registers)); PopCPURegList(CPURegList(reg_size, registers));
} }
template <LoadLRMode lr_mode = kDontLoadLR>
inline void PopSizeRegList(DoubleRegList registers, unsigned reg_size) { inline void PopSizeRegList(DoubleRegList registers, unsigned reg_size) {
PopCPURegList<lr_mode>(CPURegList(reg_size, registers)); PopCPURegList(CPURegList(reg_size, registers));
} }
template <StoreLRMode lr_mode = kDontStoreLR>
inline void PushXRegList(RegList regs) { inline void PushXRegList(RegList regs) {
PushSizeRegList<lr_mode>(regs, kXRegSizeInBits); PushSizeRegList(regs, kXRegSizeInBits);
} }
template <LoadLRMode lr_mode = kDontLoadLR>
inline void PopXRegList(RegList regs) { inline void PopXRegList(RegList regs) {
PopSizeRegList<lr_mode>(regs, kXRegSizeInBits); PopSizeRegList(regs, kXRegSizeInBits);
} }
inline void PushWRegList(RegList regs) { inline void PushWRegList(RegList regs) {
PushSizeRegList(regs, kWRegSizeInBits); PushSizeRegList(regs, kWRegSizeInBits);
......
...@@ -3203,7 +3203,7 @@ void CodeGenerator::AssembleConstructFrame() { ...@@ -3203,7 +3203,7 @@ void CodeGenerator::AssembleConstructFrame() {
__ PushCPURegList(saves_fp); __ PushCPURegList(saves_fp);
// Save registers. // Save registers.
__ PushCPURegList<TurboAssembler::kSignLR>(saves); __ PushCPURegList(saves);
if (returns != 0) { if (returns != 0) {
__ Claim(returns); __ Claim(returns);
...@@ -3221,7 +3221,7 @@ void CodeGenerator::AssembleReturn(InstructionOperand* additional_pop_count) { ...@@ -3221,7 +3221,7 @@ void CodeGenerator::AssembleReturn(InstructionOperand* additional_pop_count) {
// Restore registers. // Restore registers.
CPURegList saves = CPURegList saves =
CPURegList(kXRegSizeInBits, call_descriptor->CalleeSavedRegisters()); CPURegList(kXRegSizeInBits, call_descriptor->CalleeSavedRegisters());
__ PopCPURegList<TurboAssembler::kAuthLR>(saves); __ PopCPURegList(saves);
// Restore fp registers. // Restore fp registers.
CPURegList saves_fp = CPURegList saves_fp =
......
...@@ -813,7 +813,7 @@ Handle<HeapObject> RegExpMacroAssemblerARM64::GetCode(Handle<String> source) { ...@@ -813,7 +813,7 @@ Handle<HeapObject> RegExpMacroAssemblerARM64::GetCode(Handle<String> source) {
CPURegList registers_to_retain = kCalleeSaved; CPURegList registers_to_retain = kCalleeSaved;
DCHECK_EQ(registers_to_retain.Count(), kNumCalleeSavedRegisters); DCHECK_EQ(registers_to_retain.Count(), kNumCalleeSavedRegisters);
__ PushCPURegList<TurboAssembler::kDontStoreLR>(registers_to_retain); __ PushCPURegList(registers_to_retain);
__ Push<TurboAssembler::kSignLR>(lr, fp); __ Push<TurboAssembler::kSignLR>(lr, fp);
__ PushCPURegList(argument_registers); __ PushCPURegList(argument_registers);
...@@ -1128,7 +1128,7 @@ Handle<HeapObject> RegExpMacroAssemblerARM64::GetCode(Handle<String> source) { ...@@ -1128,7 +1128,7 @@ Handle<HeapObject> RegExpMacroAssemblerARM64::GetCode(Handle<String> source) {
__ Pop<TurboAssembler::kAuthLR>(fp, lr); __ Pop<TurboAssembler::kAuthLR>(fp, lr);
// Restore registers. // Restore registers.
__ PopCPURegList<TurboAssembler::kDontLoadLR>(registers_to_retain); __ PopCPURegList(registers_to_retain);
__ Ret(); __ Ret();
......
...@@ -12381,7 +12381,7 @@ static void PushPopSimpleHelper(int reg_count, int reg_size, ...@@ -12381,7 +12381,7 @@ static void PushPopSimpleHelper(int reg_count, int reg_size,
} }
break; break;
case PushPopRegList: case PushPopRegList:
__ PushSizeRegList<TurboAssembler::kDontStoreLR>(list, reg_size); __ PushSizeRegList(list, reg_size);
break; break;
} }
...@@ -12406,7 +12406,7 @@ static void PushPopSimpleHelper(int reg_count, int reg_size, ...@@ -12406,7 +12406,7 @@ static void PushPopSimpleHelper(int reg_count, int reg_size,
} }
break; break;
case PushPopRegList: case PushPopRegList:
__ PopSizeRegList<TurboAssembler::kDontLoadLR>(list, reg_size); __ PopSizeRegList(list, reg_size);
break; break;
} }
} }
...@@ -12740,8 +12740,8 @@ TEST(push_pop) { ...@@ -12740,8 +12740,8 @@ TEST(push_pop) {
__ PopXRegList({}); __ PopXRegList({});
// Don't push/pop x18 (platform register) or lr // Don't push/pop x18 (platform register) or lr
RegList all_regs = RegList::FromBits(0xFFFFFFFF) - RegList{x18, lr}; RegList all_regs = RegList::FromBits(0xFFFFFFFF) - RegList{x18, lr};
__ PushXRegList<TurboAssembler::kDontStoreLR>(all_regs); __ PushXRegList(all_regs);
__ PopXRegList<TurboAssembler::kDontLoadLR>(all_regs); __ PopXRegList(all_regs);
__ Drop(12); __ Drop(12);
END(); END();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment