Chromium Code Reviews| Index: src/interpreter/bytecodes.cc |
| diff --git a/src/interpreter/bytecodes.cc b/src/interpreter/bytecodes.cc |
| index 5f334d1ff82ae844af75cfc528731fa89917e704..0ed7ae185016bf76a5aff4d22ef4cf5d513788c3 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,51 @@ int Bytecodes::MaximumSize() { return 1 + kMaxOperands; } |
| // static |
| -std::ostream& Bytecodes::Decode(std::ostream& os, |
| - const uint8_t* bytecode_start) { |
| +uint8_t Bytecodes::RegisterIndexToOperand(int index) { |
| + return static_cast<uint8_t>(-index); |
| +} |
| + |
| + |
| +// static |
| +int Bytecodes::RegisterIndexFromOperand(uint8_t operand) { |
| + int8_t index = -static_cast<int8_t>(operand); |
| + return index; |
| +} |
| + |
| + |
| +static const int kLastParamRegisterIndex = |
| + -InterpreterFrameConstants::kLastParamFromRegisterPointer / kPointerSize; |
| + |
| + |
| +// static |
| +uint8_t Bytecodes::ParameterIndexToOperand(int index, int parameter_count) { |
|
rmcilroy
2015/09/02 11:42:42
Could we make this a Register::FromParameterIndex(
oth
2015/09/02 14:02:20
Done.
|
| + // Parameters share the same space as registers |
| + DCHECK_LE(parameter_count, MaximumNumberOfParameters()); |
| + DCHECK_GE(index, 0); |
|
rmcilroy
2015/09/02 11:42:41
nit - DCHECK_LT(index, parameter_count)
oth
2015/09/02 14:02:20
Done.
|
| + int register_index = kLastParamRegisterIndex - parameter_count + index + 1; |
| + DCHECK_LT(register_index, 0); |
| + return RegisterIndexToOperand(register_index); |
| +} |
| + |
| + |
| +// static |
| +int Bytecodes::ParameterIndexFromOperand(uint8_t operand, int parameter_count) { |
| + // Parameters share the same space as registers |
| + DCHECK_LE(parameter_count, MaximumNumberOfParameters()); |
| + int register_index = RegisterIndexFromOperand(operand); |
| + return register_index - kLastParamRegisterIndex + parameter_count - 1; |
| +} |
| + |
| + |
| +// static |
| +int Bytecodes::MaximumNumberOfParameters() { |
| + return 128 + kLastParamRegisterIndex; |
|
rmcilroy
2015/09/02 11:42:41
This is a bit confusing. Could you use kMinRegiste
oth
2015/09/02 14:02:20
Comment added.
|
| +} |
| + |
| + |
| +// static |
| +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 +175,21 @@ 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: { |
| + int register_index = RegisterIndexFromOperand(operand); |
| + if (register_index >= 0) { |
| + os << "r" << register_index; |
| + } else { |
| + int parameter_index = |
| + ParameterIndexFromOperand(operand, parameter_count); |
| + if (parameter_index == 0) { |
| + os << "this"; |
|
rmcilroy
2015/09/02 11:42:42
nit - could we make it "<this>" or "|this|" or som
oth
2015/09/02 14:02:20
Done <this>.
Prefer current consistency of r0, r1
|
| + } else { |
| + os << "a" << parameter_index - 1; |
| + } |
| + } |
| break; |
| + } |
| case interpreter::OperandType::kNone: |
| UNREACHABLE(); |
| break; |