Index: src/compiler/instruction.cc |
diff --git a/src/compiler/instruction.cc b/src/compiler/instruction.cc |
index df3d345fc5280fc18c5075ade4e1b9c3afb12f55..ed66db2ce1234e80f24a1c7682018893d024fbab 100644 |
--- a/src/compiler/instruction.cc |
+++ b/src/compiler/instruction.cc |
@@ -53,22 +53,48 @@ std::ostream& operator<<(std::ostream& os, |
return os << "[immediate:" << imm.indexed_value() << "]"; |
} |
} |
- case InstructionOperand::ALLOCATED: |
- switch (AllocatedOperand::cast(op).allocated_kind()) { |
+ case InstructionOperand::ALLOCATED: { |
+ auto allocated = AllocatedOperand::cast(op); |
+ switch (allocated.allocated_kind()) { |
case AllocatedOperand::STACK_SLOT: |
- return os << "[stack:" << StackSlotOperand::cast(op).index() << "]"; |
+ os << "[stack:" << StackSlotOperand::cast(op).index(); |
+ break; |
case AllocatedOperand::DOUBLE_STACK_SLOT: |
- return os << "[double_stack:" |
- << DoubleStackSlotOperand::cast(op).index() << "]"; |
+ os << "[double_stack:" << DoubleStackSlotOperand::cast(op).index(); |
+ break; |
case AllocatedOperand::REGISTER: |
- return os << "[" |
- << conf->general_register_name( |
- RegisterOperand::cast(op).index()) << "|R]"; |
+ os << "[" |
+ << conf->general_register_name(RegisterOperand::cast(op).index()) |
+ << "|R"; |
+ break; |
case AllocatedOperand::DOUBLE_REGISTER: |
- return os << "[" |
- << conf->double_register_name( |
- DoubleRegisterOperand::cast(op).index()) << "|R]"; |
+ os << "[" |
+ << conf->double_register_name( |
+ DoubleRegisterOperand::cast(op).index()) << "|R"; |
+ break; |
} |
+ switch (allocated.machine_type()) { |
+ case kRepWord32: |
+ os << "|w32"; |
+ break; |
+ case kRepWord64: |
+ os << "|w64"; |
+ break; |
+ case kRepFloat32: |
+ os << "|f32"; |
+ break; |
+ case kRepFloat64: |
+ os << "|f64"; |
+ break; |
+ case kRepTagged: |
+ os << "|t"; |
+ break; |
+ default: |
+ os << "|?"; |
+ break; |
+ } |
+ return os << "]"; |
+ } |
case InstructionOperand::INVALID: |
return os << "(x)"; |
} |
@@ -83,7 +109,7 @@ std::ostream& operator<<(std::ostream& os, |
PrintableInstructionOperand printable_op = {printable.register_configuration_, |
mo.destination()}; |
os << printable_op; |
- if (mo.source() != mo.destination()) { |
+ if (!mo.source().Equals(mo.destination())) { |
printable_op.op_ = mo.source(); |
os << " = " << printable_op; |
} |
@@ -104,11 +130,11 @@ MoveOperands* ParallelMove::PrepareInsertAfter(MoveOperands* move) const { |
MoveOperands* to_eliminate = nullptr; |
for (auto curr : *this) { |
if (curr->IsEliminated()) continue; |
- if (curr->destination() == move->source()) { |
+ if (curr->destination().EqualsModuloType(move->source())) { |
DCHECK(!replacement); |
replacement = curr; |
if (to_eliminate != nullptr) break; |
- } else if (curr->destination() == move->destination()) { |
+ } else if (curr->destination().EqualsModuloType(move->destination())) { |
DCHECK(!to_eliminate); |
to_eliminate = curr; |
if (replacement != nullptr) break; |
@@ -479,8 +505,7 @@ InstructionSequence::InstructionSequence(Isolate* isolate, |
instructions_(zone()), |
next_virtual_register_(0), |
reference_maps_(zone()), |
- doubles_(std::less<int>(), VirtualRegisterSet::allocator_type(zone())), |
- references_(std::less<int>(), VirtualRegisterSet::allocator_type(zone())), |
+ representations_(zone()), |
deoptimization_entries_(zone()) { |
block_starts_.reserve(instruction_blocks_->size()); |
} |
@@ -548,23 +573,48 @@ const InstructionBlock* InstructionSequence::GetInstructionBlock( |
} |
-bool InstructionSequence::IsReference(int virtual_register) const { |
- return references_.find(virtual_register) != references_.end(); |
-} |
- |
- |
-bool InstructionSequence::IsDouble(int virtual_register) const { |
- return doubles_.find(virtual_register) != doubles_.end(); |
+static MachineType FilterRepresentation(MachineType rep) { |
+ DCHECK_EQ(rep, RepresentationOf(rep)); |
+ switch (rep) { |
+ case kRepBit: |
+ case kRepWord8: |
+ case kRepWord16: |
+ return InstructionSequence::DefaultRepresentation(); |
+ case kRepWord32: |
+ case kRepWord64: |
+ case kRepFloat32: |
+ case kRepFloat64: |
+ case kRepTagged: |
+ return rep; |
+ default: |
+ break; |
+ } |
+ UNREACHABLE(); |
+ return kMachNone; |
} |
-void InstructionSequence::MarkAsReference(int virtual_register) { |
- references_.insert(virtual_register); |
+MachineType InstructionSequence::GetRepresentation(int virtual_register) const { |
+ DCHECK_LE(0, virtual_register); |
+ DCHECK_LT(virtual_register, VirtualRegisterCount()); |
+ if (virtual_register >= static_cast<int>(representations_.size())) { |
+ return DefaultRepresentation(); |
+ } |
+ return representations_[virtual_register]; |
} |
-void InstructionSequence::MarkAsDouble(int virtual_register) { |
- doubles_.insert(virtual_register); |
+void InstructionSequence::MarkAsRepresentation(MachineType machine_type, |
+ int virtual_register) { |
+ DCHECK_LE(0, virtual_register); |
+ DCHECK_LT(virtual_register, VirtualRegisterCount()); |
+ if (virtual_register >= static_cast<int>(representations_.size())) { |
+ representations_.resize(VirtualRegisterCount(), DefaultRepresentation()); |
+ } |
+ machine_type = FilterRepresentation(machine_type); |
+ DCHECK_IMPLIES(representations_[virtual_register] != machine_type, |
+ representations_[virtual_register] == DefaultRepresentation()); |
+ representations_[virtual_register] = machine_type; |
} |