Index: src/compiler/instruction.cc |
diff --git a/src/compiler/instruction.cc b/src/compiler/instruction.cc |
index 9705bea20716a2e9428079f26975efd70fbb46e9..76a695052eabb7aa5b4493c4c6f8ddd22583ed71 100644 |
--- a/src/compiler/instruction.cc |
+++ b/src/compiler/instruction.cc |
@@ -6,17 +6,15 @@ |
#include "src/compiler/generic-node-inl.h" |
#include "src/compiler/graph.h" |
#include "src/compiler/instruction.h" |
-#include "src/macro-assembler.h" |
namespace v8 { |
namespace internal { |
namespace compiler { |
-STATIC_ASSERT(kMaxGeneralRegisters >= Register::kNumRegisters); |
-STATIC_ASSERT(kMaxDoubleRegisters >= DoubleRegister::kMaxNumRegisters); |
- |
- |
-std::ostream& operator<<(std::ostream& os, const InstructionOperand& op) { |
+std::ostream& operator<<(std::ostream& os, |
+ const PrintableInstructionOperand& printable) { |
+ const InstructionOperand& op = *printable.op_; |
+ const RegisterConfiguration* conf = printable.register_configuration_; |
switch (op.kind()) { |
case InstructionOperand::INVALID: |
return os << "(0)"; |
@@ -30,10 +28,10 @@ std::ostream& operator<<(std::ostream& os, const InstructionOperand& op) { |
case UnallocatedOperand::NONE: |
return os; |
case UnallocatedOperand::FIXED_REGISTER: |
- return os << "(=" << Register::AllocationIndexToString( |
+ return os << "(=" << conf->general_register_name( |
unalloc->fixed_register_index()) << ")"; |
case UnallocatedOperand::FIXED_DOUBLE_REGISTER: |
- return os << "(=" << DoubleRegister::AllocationIndexToString( |
+ return os << "(=" << conf->double_register_name( |
unalloc->fixed_register_index()) << ")"; |
case UnallocatedOperand::MUST_HAVE_REGISTER: |
return os << "(R)"; |
@@ -52,11 +50,9 @@ std::ostream& operator<<(std::ostream& os, const InstructionOperand& op) { |
case InstructionOperand::DOUBLE_STACK_SLOT: |
return os << "[double_stack:" << op.index() << "]"; |
case InstructionOperand::REGISTER: |
- return os << "[" << Register::AllocationIndexToString(op.index()) |
- << "|R]"; |
+ return os << "[" << conf->general_register_name(op.index()) << "|R]"; |
case InstructionOperand::DOUBLE_REGISTER: |
- return os << "[" << DoubleRegister::AllocationIndexToString(op.index()) |
- << "|R]"; |
+ return os << "[" << conf->double_register_name(op.index()) << "|R]"; |
} |
UNREACHABLE(); |
return os; |
@@ -101,9 +97,17 @@ void InstructionOperand::TearDownCaches() { |
} |
-std::ostream& operator<<(std::ostream& os, const MoveOperands& mo) { |
- os << *mo.destination(); |
- if (!mo.source()->Equals(mo.destination())) os << " = " << *mo.source(); |
+std::ostream& operator<<(std::ostream& os, |
+ const PrintableMoveOperands& printable) { |
+ const MoveOperands& mo = *printable.move_operands_; |
+ PrintableInstructionOperand printable_op = {printable.register_configuration_, |
+ mo.destination()}; |
+ |
+ os << printable_op; |
+ if (!mo.source()->Equals(mo.destination())) { |
+ printable_op.op_ = mo.source(); |
+ os << " = " << printable_op; |
+ } |
return os << ";"; |
} |
@@ -116,14 +120,17 @@ bool ParallelMove::IsRedundant() const { |
} |
-std::ostream& operator<<(std::ostream& os, const ParallelMove& pm) { |
+std::ostream& operator<<(std::ostream& os, |
+ const PrintableParallelMove& printable) { |
+ const ParallelMove& pm = *printable.parallel_move_; |
bool first = true; |
for (ZoneList<MoveOperands>::iterator move = pm.move_operands()->begin(); |
move != pm.move_operands()->end(); ++move) { |
if (move->IsEliminated()) continue; |
if (!first) os << " "; |
first = false; |
- os << *move; |
+ PrintableMoveOperands pmo = {printable.register_configuration_, move}; |
+ os << pmo; |
} |
return os; |
} |
@@ -256,11 +263,16 @@ std::ostream& operator<<(std::ostream& os, const FlagsCondition& fc) { |
} |
-std::ostream& operator<<(std::ostream& os, const Instruction& instr) { |
+std::ostream& operator<<(std::ostream& os, |
+ const PrintableInstruction& printable) { |
+ const Instruction& instr = *printable.instr_; |
+ PrintableInstructionOperand printable_op = {printable.register_configuration_, |
+ NULL}; |
if (instr.OutputCount() > 1) os << "("; |
for (size_t i = 0; i < instr.OutputCount(); i++) { |
if (i > 0) os << ", "; |
- os << *instr.OutputAt(i); |
+ printable_op.op_ = instr.OutputAt(i); |
+ os << printable_op; |
} |
if (instr.OutputCount() > 1) os << ") = "; |
@@ -272,7 +284,11 @@ std::ostream& operator<<(std::ostream& os, const Instruction& instr) { |
for (int i = GapInstruction::FIRST_INNER_POSITION; |
i <= GapInstruction::LAST_INNER_POSITION; i++) { |
os << "("; |
- if (gap->parallel_moves_[i] != NULL) os << *gap->parallel_moves_[i]; |
+ if (gap->parallel_moves_[i] != NULL) { |
+ PrintableParallelMove ppm = {printable.register_configuration_, |
+ gap->parallel_moves_[i]}; |
+ os << ppm; |
+ } |
os << ") "; |
} |
} else if (instr.IsSourcePosition()) { |
@@ -293,7 +309,8 @@ std::ostream& operator<<(std::ostream& os, const Instruction& instr) { |
} |
if (instr.InputCount() > 0) { |
for (size_t i = 0; i < instr.InputCount(); i++) { |
- os << " " << *instr.InputAt(i); |
+ printable_op.op_ = instr.InputAt(i); |
+ os << " " << printable_op; |
} |
} |
return os; |
@@ -585,7 +602,9 @@ void FrameStateDescriptor::SetType(size_t index, MachineType type) { |
} |
-std::ostream& operator<<(std::ostream& os, const InstructionSequence& code) { |
+std::ostream& operator<<(std::ostream& os, |
+ const PrintableInstructionSequence& printable) { |
+ const InstructionSequence& code = *printable.sequence_; |
for (size_t i = 0; i < code.immediates_.size(); ++i) { |
Constant constant = code.immediates_[i]; |
os << "IMM#" << i << ": " << constant << "\n"; |
@@ -626,20 +645,16 @@ std::ostream& operator<<(std::ostream& os, const InstructionSequence& code) { |
} |
ScopedVector<char> buf(32); |
+ PrintableInstruction printable_instr; |
+ printable_instr.register_configuration_ = printable.register_configuration_; |
for (int j = block->first_instruction_index(); |
j <= block->last_instruction_index(); j++) { |
// TODO(svenpanne) Add some basic formatting to our streams. |
SNPrintF(buf, "%5d", j); |
- os << " " << buf.start() << ": " << *code.InstructionAt(j) << "\n"; |
+ printable_instr.instr_ = code.InstructionAt(j); |
+ os << " " << buf.start() << ": " << printable_instr << "\n"; |
} |
- // TODO(dcarney): add this back somehow? |
- // os << " " << block->control(); |
- |
- // if (block->control_input() != NULL) { |
- // os << " v" << block->control_input()->id(); |
- // } |
- |
for (auto succ : block->successors()) { |
const InstructionBlock* succ_block = code.InstructionBlockAt(succ); |
os << " B" << succ_block->id(); |