| 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;
|
| }
|
|
|
|
|
|
|