Chromium Code Reviews| Index: src/interpreter/bytecodes.cc |
| diff --git a/src/interpreter/bytecodes.cc b/src/interpreter/bytecodes.cc |
| index 5f334d1ff82ae844af75cfc528731fa89917e704..df7f4354bec61a3d4606baf9a66bb2aeccd1a8c5 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,43 @@ std::ostream& operator<<(std::ostream& os, const OperandType& operand_type) { |
| return os << Bytecodes::OperandTypeToString(operand_type); |
| } |
| + |
| +static const int kLastParamRegisterIndex = |
| + -InterpreterFrameConstants::kLastParamFromRegisterPointer / kPointerSize; |
| + |
|
rmcilroy
2015/09/02 15:22:29
nit extra newline
oth
2015/09/02 16:28:06
Done.
|
| +// 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_LE(index, parameter_count); |
|
rmcilroy
2015/09/02 15:22:29
/s/DCHECK_LE/DCHECK_LT, no?
oth
2015/09/02 16:28:06
Done.
|
| + DCHECK_LE(parameter_count, kMaxParameterIndex); |
|
rmcilroy
2015/09/02 15:22:29
ditto
oth
2015/09/02 16:28:06
Parameter count can be 1 larger than kMaxParameter
rmcilroy
2015/09/02 17:08:53
Yes your right, thanks.
|
| + int register_index = kLastParamRegisterIndex - parameter_count + index + 1; |
| + DCHECK_LT(register_index, 0); |
| + DCHECK_GE(register_index, -128); |
| + 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 |