| Index: src/interpreter/register-translator.cc
|
| diff --git a/src/interpreter/register-translator.cc b/src/interpreter/register-translator.cc
|
| deleted file mode 100644
|
| index 3eba42f0dca179face77674d737dc3b2501a367c..0000000000000000000000000000000000000000
|
| --- a/src/interpreter/register-translator.cc
|
| +++ /dev/null
|
| @@ -1,173 +0,0 @@
|
| -// 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/register-translator.h"
|
| -
|
| -#include "src/interpreter/bytecode-array-builder.h"
|
| -
|
| -namespace v8 {
|
| -namespace internal {
|
| -namespace interpreter {
|
| -
|
| -RegisterTranslator::RegisterTranslator(RegisterMover* mover)
|
| - : mover_(mover),
|
| - emitting_moves_(false),
|
| - window_registers_count_(0),
|
| - output_moves_count_(0) {}
|
| -
|
| -void RegisterTranslator::TranslateInputRegisters(Bytecode bytecode,
|
| - uint32_t* raw_operands,
|
| - int raw_operand_count) {
|
| - DCHECK_EQ(Bytecodes::NumberOfOperands(bytecode), raw_operand_count);
|
| - if (!emitting_moves_) {
|
| - emitting_moves_ = true;
|
| - DCHECK_EQ(window_registers_count_, 0);
|
| - int register_bitmap = Bytecodes::GetRegisterOperandBitmap(bytecode);
|
| - for (int i = 0; i < raw_operand_count; i++) {
|
| - if ((register_bitmap & (1 << i)) == 0) {
|
| - continue;
|
| - }
|
| - Register in_reg = Register::FromRawOperand(raw_operands[i]);
|
| - Register out_reg = TranslateAndMove(bytecode, i, in_reg);
|
| - raw_operands[i] = out_reg.ToRawOperand();
|
| - }
|
| - window_registers_count_ = 0;
|
| - emitting_moves_ = false;
|
| - } else {
|
| - // When the register translator is translating registers, it will
|
| - // cause the bytecode generator to emit moves on it's behalf. This
|
| - // path is reached by these moves.
|
| - DCHECK(bytecode == Bytecode::kMovWide && raw_operand_count == 2 &&
|
| - Register::FromRawOperand(raw_operands[0]).is_valid() &&
|
| - Register::FromRawOperand(raw_operands[1]).is_valid());
|
| - }
|
| -}
|
| -
|
| -Register RegisterTranslator::TranslateAndMove(Bytecode bytecode,
|
| - int operand_index, Register reg) {
|
| - if (FitsInReg8Operand(reg)) {
|
| - return reg;
|
| - }
|
| -
|
| - OperandType operand_type = Bytecodes::GetOperandType(bytecode, operand_index);
|
| - OperandSize operand_size = Bytecodes::SizeOfOperand(operand_type);
|
| - if (operand_size == OperandSize::kShort) {
|
| - CHECK(FitsInReg16Operand(reg));
|
| - return Translate(reg);
|
| - }
|
| -
|
| - CHECK((operand_type == OperandType::kReg8 ||
|
| - operand_type == OperandType::kRegOut8) &&
|
| - RegisterIsMovableToWindow(bytecode, operand_index));
|
| - Register translated_reg = Translate(reg);
|
| - Register window_reg(kTranslationWindowStart + window_registers_count_);
|
| - window_registers_count_ += 1;
|
| - if (Bytecodes::IsRegisterInputOperandType(operand_type)) {
|
| - DCHECK(!Bytecodes::IsRegisterOutputOperandType(operand_type));
|
| - mover()->MoveRegisterUntranslated(translated_reg, window_reg);
|
| - } else if (Bytecodes::IsRegisterOutputOperandType(operand_type)) {
|
| - DCHECK_LT(output_moves_count_, kTranslationWindowLength);
|
| - output_moves_[output_moves_count_] =
|
| - std::make_pair(window_reg, translated_reg);
|
| - output_moves_count_ += 1;
|
| - } else {
|
| - UNREACHABLE();
|
| - }
|
| - return window_reg;
|
| -}
|
| -
|
| -// static
|
| -bool RegisterTranslator::RegisterIsMovableToWindow(Bytecode bytecode,
|
| - int operand_index) {
|
| - // By design, we only support moving individual registers. There
|
| - // should be wide variants of such bytecodes instead to avoid the
|
| - // need for a large translation window.
|
| - OperandType operand_type = Bytecodes::GetOperandType(bytecode, operand_index);
|
| - if (operand_type != OperandType::kReg8 &&
|
| - operand_type != OperandType::kRegOut8) {
|
| - return false;
|
| - } else if (operand_index + 1 == Bytecodes::NumberOfOperands(bytecode)) {
|
| - return true;
|
| - } else {
|
| - OperandType next_operand_type =
|
| - Bytecodes::GetOperandType(bytecode, operand_index + 1);
|
| - return (next_operand_type != OperandType::kRegCount8 &&
|
| - next_operand_type != OperandType::kRegCount16);
|
| - }
|
| -}
|
| -
|
| -void RegisterTranslator::TranslateOutputRegisters() {
|
| - if (!emitting_moves_) {
|
| - emitting_moves_ = true;
|
| - while (output_moves_count_ > 0) {
|
| - output_moves_count_ -= 1;
|
| - mover()->MoveRegisterUntranslated(
|
| - output_moves_[output_moves_count_].first,
|
| - output_moves_[output_moves_count_].second);
|
| - }
|
| - emitting_moves_ = false;
|
| - }
|
| -}
|
| -
|
| -// static
|
| -Register RegisterTranslator::Translate(Register reg) {
|
| - if (reg.index() >= kTranslationWindowStart) {
|
| - return Register(reg.index() + kTranslationWindowLength);
|
| - } else {
|
| - return reg;
|
| - }
|
| -}
|
| -
|
| -// static
|
| -bool RegisterTranslator::InTranslationWindow(Register reg) {
|
| - return (reg.index() >= kTranslationWindowStart &&
|
| - reg.index() <= kTranslationWindowLimit);
|
| -}
|
| -
|
| -// static
|
| -Register RegisterTranslator::UntranslateRegister(Register reg) {
|
| - if (reg.index() >= kTranslationWindowStart) {
|
| - return Register(reg.index() - kTranslationWindowLength);
|
| - } else {
|
| - return reg;
|
| - }
|
| -}
|
| -
|
| -// static
|
| -int RegisterTranslator::DistanceToTranslationWindow(Register reg) {
|
| - return kTranslationWindowStart - reg.index();
|
| -}
|
| -
|
| -// static
|
| -bool RegisterTranslator::FitsInReg8Operand(Register reg) {
|
| - return reg.is_byte_operand() && reg.index() < kTranslationWindowStart;
|
| -}
|
| -
|
| -// static
|
| -bool RegisterTranslator::FitsInReg16Operand(Register reg) {
|
| - int max_index = Register::MaxRegisterIndex() - kTranslationWindowLength + 1;
|
| - return reg.is_short_operand() && reg.index() < max_index;
|
| -}
|
| -
|
| -// static
|
| -int RegisterTranslator::RegisterCountAdjustment(int register_count,
|
| - int parameter_count) {
|
| - if (register_count > kTranslationWindowStart) {
|
| - return kTranslationWindowLength;
|
| - } else if (parameter_count > 0) {
|
| - Register param0 = Register::FromParameterIndex(0, parameter_count);
|
| - if (!param0.is_byte_operand()) {
|
| - // TODO(oth): Number of parameters means translation is
|
| - // required, but the translation window location is such that
|
| - // some space is wasted. Hopefully a rare corner case, but could
|
| - // relocate window to limit waste.
|
| - return kTranslationWindowLimit + 1 - register_count;
|
| - }
|
| - }
|
| - return 0;
|
| -}
|
| -
|
| -} // namespace interpreter
|
| -} // namespace internal
|
| -} // namespace v8
|
|
|