Index: src/interpreter/bytecodes.cc |
diff --git a/src/interpreter/bytecodes.cc b/src/interpreter/bytecodes.cc |
index 5f334d1ff82ae844af75cfc528731fa89917e704..3fae0e92bc8e280bcce54c2252cd0cbe1005659a 100644 |
--- a/src/interpreter/bytecodes.cc |
+++ b/src/interpreter/bytecodes.cc |
@@ -4,7 +4,7 @@ |
#include "src/interpreter/bytecodes.h" |
-#include "src/interpreter/bytecode-array-builder.h" |
+#include "src/frames.h" |
namespace v8 { |
namespace internal { |
@@ -103,8 +103,8 @@ int Bytecodes::MaximumSize() { return 1 + kMaxOperands; } |
// static |
-std::ostream& Bytecodes::Decode(std::ostream& os, |
- const uint8_t* bytecode_start) { |
+std::ostream& Bytecodes::Decode(std::ostream& os, const uint8_t* bytecode_start, |
+ int parameter_count) { |
Vector<char> buf = Vector<char>::New(50); |
Bytecode bytecode = Bytecodes::FromByte(bytecode_start[0]); |
@@ -132,9 +132,20 @@ std::ostream& Bytecodes::Decode(std::ostream& os, |
case interpreter::OperandType::kImm8: |
os << "#" << static_cast<int>(operand); |
break; |
- case interpreter::OperandType::kReg: |
- os << "r" << Register::FromOperand(operand).index(); |
+ case interpreter::OperandType::kReg: { |
+ Register reg = Register::FromOperand(operand); |
+ if (reg.is_parameter()) { |
+ int parameter_index = reg.ToParameterIndex(parameter_count); |
+ if (parameter_index == 0) { |
+ os << "<this>"; |
+ } else { |
+ os << "a" << parameter_index - 1; |
+ } |
+ } else { |
+ os << "r" << reg.index(); |
+ } |
break; |
+ } |
case interpreter::OperandType::kNone: |
UNREACHABLE(); |
break; |
@@ -156,6 +167,44 @@ std::ostream& operator<<(std::ostream& os, const OperandType& operand_type) { |
return os << Bytecodes::OperandTypeToString(operand_type); |
} |
+ |
+static const int kLastParamRegisterIndex = |
+ -InterpreterFrameConstants::kLastParamFromRegisterPointer / kPointerSize; |
+ |
+ |
+// Registers occupy range 0-127 in 8-bit value leaving 128 unused values. |
+// Parameter indices are biased with the negative value kLastParamRegisterIndex |
+// for ease of access in the interpreter. |
+static const int kMaxParameterIndex = 128 + kLastParamRegisterIndex; |
+ |
+ |
+Register Register::FromParameterIndex(int index, int parameter_count) { |
+ DCHECK_GE(index, 0); |
+ DCHECK_LT(index, parameter_count); |
+ DCHECK_LE(parameter_count, kMaxParameterIndex + 1); |
+ int register_index = kLastParamRegisterIndex - parameter_count + index + 1; |
+ DCHECK_LT(register_index, 0); |
+ DCHECK_GE(register_index, Register::kMinRegisterIndex); |
+ return Register(register_index); |
+} |
+ |
+ |
+int Register::ToParameterIndex(int parameter_count) const { |
+ DCHECK(is_parameter()); |
+ return index() - kLastParamRegisterIndex + parameter_count - 1; |
+} |
+ |
+ |
+int Register::MaxParameterIndex() { return kMaxParameterIndex; } |
+ |
+ |
+uint8_t Register::ToOperand() const { return static_cast<uint8_t>(-index_); } |
+ |
+ |
+Register Register::FromOperand(uint8_t operand) { |
+ return Register(-static_cast<int8_t>(operand)); |
+} |
+ |
} // namespace interpreter |
} // namespace internal |
} // namespace v8 |