Commit f025148e authored by Victor Gomes's avatar Victor Gomes Committed by V8 LUCI CQ

[maglev] Support double registers in register allocator

This assumes that Phi nodes never point to untagged values and
TemporaryRegisters are always general registers.

Bug: v8:7700
Change-Id: I74a6c43ff9f1ba87dd258e90a193f683d666b8ec
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3598883Reviewed-by: 's avatarLeszek Swirski <leszeks@chromium.org>
Commit-Queue: Victor Gomes <victorgomes@chromium.org>
Cr-Commit-Position: refs/heads/main@{#80144}
parent 76b40ef6
......@@ -295,11 +295,18 @@ class ValueLocation {
operand_ = compiler::ConstantOperand(args...);
}
Register AssignedRegister() const {
return Register::from_code(
compiler::AllocatedOperand::cast(operand_).register_code());
Register AssignedGeneralRegister() const {
DCHECK(!IsDoubleRegister());
return compiler::AllocatedOperand::cast(operand_).GetRegister();
}
DoubleRegister AssignedDoubleRegister() const {
DCHECK(IsDoubleRegister());
return compiler::AllocatedOperand::cast(operand_).GetDoubleRegister();
}
bool IsDoubleRegister() const { return operand_.IsDoubleRegister(); }
const compiler::InstructionOperand& operand() const { return operand_; }
const compiler::InstructionOperand& operand() { return operand_; }
......
This diff is collapsed.
......@@ -38,6 +38,7 @@ class RegisterFrameState {
AllocatableRegisters<RegisterT>::kRegisters;
static constexpr RegList kEmptyRegList = {};
RegList empty() const { return kEmptyRegList; }
RegList free() const { return free_; }
RegList used() const {
// Only allocatable registers should be free.
......@@ -133,9 +134,13 @@ class StraightForwardRegisterAllocator {
void AllocateSpillSlot(ValueNode* node);
void Spill(ValueNode* node);
void SpillAndClearRegisters();
void SpillRegisters();
template <typename RegisterT>
void SpillAndClearRegisters(RegisterFrameState<RegisterT>& registers);
void SpillAndClearRegisters();
void FreeRegistersUsedBy(ValueNode* node);
void FreeSomeGeneralRegister();
void FreeSomeDoubleRegister();
......@@ -152,6 +157,11 @@ class StraightForwardRegisterAllocator {
RegisterFrameState<RegisterT>& registers, RegisterT reg, ValueNode* node);
compiler::AllocatedOperand ForceAllocate(Register reg, ValueNode* node);
compiler::AllocatedOperand ForceAllocate(DoubleRegister reg, ValueNode* node);
compiler::AllocatedOperand ForceAllocate(const Input& input, ValueNode* node);
template <typename Function>
void ForEachMergePointRegisterState(
MergePointRegisterState& merge_point_state, Function&& f);
void InitializeRegisterValues(MergePointRegisterState& target_state);
void EnsureInRegister(MergePointRegisterState& target_state,
......
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