| Index: src/interpreter/bytecode-register.cc
|
| diff --git a/src/interpreter/bytecode-register.cc b/src/interpreter/bytecode-register.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..31e3b908527e229278684e70465b128b01881626
|
| --- /dev/null
|
| +++ b/src/interpreter/bytecode-register.cc
|
| @@ -0,0 +1,149 @@
|
| +// Copyright 2015 the V8 project authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "src/interpreter/bytecode-register.h"
|
| +
|
| +namespace v8 {
|
| +namespace internal {
|
| +namespace interpreter {
|
| +
|
| +static const int kLastParamRegisterIndex =
|
| + (InterpreterFrameConstants::kRegisterFileFromFp -
|
| + InterpreterFrameConstants::kLastParamFromFp) /
|
| + kPointerSize;
|
| +static const int kFunctionClosureRegisterIndex =
|
| + (InterpreterFrameConstants::kRegisterFileFromFp -
|
| + StandardFrameConstants::kFunctionOffset) /
|
| + kPointerSize;
|
| +static const int kCurrentContextRegisterIndex =
|
| + (InterpreterFrameConstants::kRegisterFileFromFp -
|
| + StandardFrameConstants::kContextOffset) /
|
| + kPointerSize;
|
| +static const int kNewTargetRegisterIndex =
|
| + (InterpreterFrameConstants::kRegisterFileFromFp -
|
| + InterpreterFrameConstants::kNewTargetFromFp) /
|
| + kPointerSize;
|
| +static const int kBytecodeArrayRegisterIndex =
|
| + (InterpreterFrameConstants::kRegisterFileFromFp -
|
| + InterpreterFrameConstants::kBytecodeArrayFromFp) /
|
| + kPointerSize;
|
| +static const int kBytecodeOffsetRegisterIndex =
|
| + (InterpreterFrameConstants::kRegisterFileFromFp -
|
| + InterpreterFrameConstants::kBytecodeOffsetFromFp) /
|
| + kPointerSize;
|
| +static const int kCallerPCOffsetRegisterIndex =
|
| + (InterpreterFrameConstants::kRegisterFileFromFp -
|
| + InterpreterFrameConstants::kCallerPCOffsetFromFp) /
|
| + kPointerSize;
|
| +
|
| +Register Register::FromParameterIndex(int index, int parameter_count) {
|
| + DCHECK_GE(index, 0);
|
| + DCHECK_LT(index, parameter_count);
|
| + int register_index = kLastParamRegisterIndex - parameter_count + index + 1;
|
| + DCHECK_LT(register_index, 0);
|
| + return Register(register_index);
|
| +}
|
| +
|
| +int Register::ToParameterIndex(int parameter_count) const {
|
| + DCHECK(is_parameter());
|
| + return index() - kLastParamRegisterIndex + parameter_count - 1;
|
| +}
|
| +
|
| +Register Register::function_closure() {
|
| + return Register(kFunctionClosureRegisterIndex);
|
| +}
|
| +
|
| +bool Register::is_function_closure() const {
|
| + return index() == kFunctionClosureRegisterIndex;
|
| +}
|
| +
|
| +Register Register::current_context() {
|
| + return Register(kCurrentContextRegisterIndex);
|
| +}
|
| +
|
| +bool Register::is_current_context() const {
|
| + return index() == kCurrentContextRegisterIndex;
|
| +}
|
| +
|
| +Register Register::new_target() { return Register(kNewTargetRegisterIndex); }
|
| +
|
| +bool Register::is_new_target() const {
|
| + return index() == kNewTargetRegisterIndex;
|
| +}
|
| +
|
| +Register Register::bytecode_array() {
|
| + return Register(kBytecodeArrayRegisterIndex);
|
| +}
|
| +
|
| +bool Register::is_bytecode_array() const {
|
| + return index() == kBytecodeArrayRegisterIndex;
|
| +}
|
| +
|
| +Register Register::bytecode_offset() {
|
| + return Register(kBytecodeOffsetRegisterIndex);
|
| +}
|
| +
|
| +bool Register::is_bytecode_offset() const {
|
| + return index() == kBytecodeOffsetRegisterIndex;
|
| +}
|
| +
|
| +// static
|
| +Register Register::virtual_accumulator() {
|
| + return Register(kCallerPCOffsetRegisterIndex);
|
| +}
|
| +
|
| +OperandSize Register::SizeOfOperand() const {
|
| + int32_t operand = ToOperand();
|
| + if (operand >= kMinInt8 && operand <= kMaxInt8) {
|
| + return OperandSize::kByte;
|
| + } else if (operand >= kMinInt16 && operand <= kMaxInt16) {
|
| + return OperandSize::kShort;
|
| + } else {
|
| + return OperandSize::kQuad;
|
| + }
|
| +}
|
| +
|
| +bool Register::AreContiguous(Register reg1, Register reg2, Register reg3,
|
| + Register reg4, Register reg5) {
|
| + if (reg1.index() + 1 != reg2.index()) {
|
| + return false;
|
| + }
|
| + if (reg3.is_valid() && reg2.index() + 1 != reg3.index()) {
|
| + return false;
|
| + }
|
| + if (reg4.is_valid() && reg3.index() + 1 != reg4.index()) {
|
| + return false;
|
| + }
|
| + if (reg5.is_valid() && reg4.index() + 1 != reg5.index()) {
|
| + return false;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +std::string Register::ToString(int parameter_count) {
|
| + if (is_current_context()) {
|
| + return std::string("<context>");
|
| + } else if (is_function_closure()) {
|
| + return std::string("<closure>");
|
| + } else if (is_new_target()) {
|
| + return std::string("<new.target>");
|
| + } else if (is_parameter()) {
|
| + int parameter_index = ToParameterIndex(parameter_count);
|
| + if (parameter_index == 0) {
|
| + return std::string("<this>");
|
| + } else {
|
| + std::ostringstream s;
|
| + s << "a" << parameter_index - 1;
|
| + return s.str();
|
| + }
|
| + } else {
|
| + std::ostringstream s;
|
| + s << "r" << index();
|
| + return s.str();
|
| + }
|
| +}
|
| +
|
| +} // namespace interpreter
|
| +} // namespace internal
|
| +} // namespace v8
|
|
|