| Index: src/interpreter/bytecodes.cc
|
| diff --git a/src/interpreter/bytecodes.cc b/src/interpreter/bytecodes.cc
|
| index 825014e465613ecb0073f5511ae333931e481ec2..e0c90f8ab970e43370b94855547adef3ea66550b 100644
|
| --- a/src/interpreter/bytecodes.cc
|
| +++ b/src/interpreter/bytecodes.cc
|
| @@ -7,10 +7,8 @@
|
| #include <iomanip>
|
|
|
| #include "src/base/bits.h"
|
| -#include "src/code-stubs.h"
|
| -#include "src/frames.h"
|
| +#include "src/globals.h"
|
| #include "src/interpreter/bytecode-traits.h"
|
| -#include "src/interpreter/interpreter.h"
|
|
|
| namespace v8 {
|
| namespace internal {
|
| @@ -104,6 +102,12 @@ const char* Bytecodes::OperandSizeToString(OperandSize operand_size) {
|
| }
|
|
|
| // static
|
| +uint8_t Bytecodes::ToByte(Bytecode bytecode) {
|
| + DCHECK_LE(bytecode, Bytecode::kLast);
|
| + return static_cast<uint8_t>(bytecode);
|
| +}
|
| +
|
| +// static
|
| Bytecode Bytecodes::FromByte(uint8_t value) {
|
| Bytecode bytecode = static_cast<Bytecode>(value);
|
| DCHECK(bytecode <= Bytecode::kLast);
|
| @@ -380,7 +384,6 @@ bool Bytecodes::IsConditionalJumpImmediate(Bytecode bytecode) {
|
| bytecode == Bytecode::kJumpIfUndefined;
|
| }
|
|
|
| -
|
| // static
|
| bool Bytecodes::IsConditionalJumpConstant(Bytecode bytecode) {
|
| return bytecode == Bytecode::kJumpIfTrueConstant ||
|
| @@ -622,144 +625,6 @@ OperandSize Bytecodes::SizeForUnsignedOperand(uint32_t value) {
|
| }
|
|
|
| // static
|
| -Register Bytecodes::DecodeRegisterOperand(const uint8_t* operand_start,
|
| - OperandType operand_type,
|
| - OperandScale operand_scale) {
|
| - DCHECK(Bytecodes::IsRegisterOperandType(operand_type));
|
| - int32_t operand =
|
| - DecodeSignedOperand(operand_start, operand_type, operand_scale);
|
| - return Register::FromOperand(operand);
|
| -}
|
| -
|
| -// static
|
| -int32_t Bytecodes::DecodeSignedOperand(const uint8_t* operand_start,
|
| - OperandType operand_type,
|
| - OperandScale operand_scale) {
|
| - DCHECK(!Bytecodes::IsUnsignedOperandType(operand_type));
|
| - switch (Bytecodes::SizeOfOperand(operand_type, operand_scale)) {
|
| - case OperandSize::kByte:
|
| - return static_cast<int8_t>(*operand_start);
|
| - case OperandSize::kShort:
|
| - return static_cast<int16_t>(ReadUnalignedUInt16(operand_start));
|
| - case OperandSize::kQuad:
|
| - return static_cast<int32_t>(ReadUnalignedUInt32(operand_start));
|
| - case OperandSize::kNone:
|
| - UNREACHABLE();
|
| - }
|
| - return 0;
|
| -}
|
| -
|
| -// static
|
| -uint32_t Bytecodes::DecodeUnsignedOperand(const uint8_t* operand_start,
|
| - OperandType operand_type,
|
| - OperandScale operand_scale) {
|
| - DCHECK(Bytecodes::IsUnsignedOperandType(operand_type));
|
| - switch (Bytecodes::SizeOfOperand(operand_type, operand_scale)) {
|
| - case OperandSize::kByte:
|
| - return *operand_start;
|
| - case OperandSize::kShort:
|
| - return ReadUnalignedUInt16(operand_start);
|
| - case OperandSize::kQuad:
|
| - return ReadUnalignedUInt32(operand_start);
|
| - case OperandSize::kNone:
|
| - UNREACHABLE();
|
| - }
|
| - return 0;
|
| -}
|
| -
|
| -// static
|
| -std::ostream& Bytecodes::Decode(std::ostream& os, const uint8_t* bytecode_start,
|
| - int parameter_count) {
|
| - Bytecode bytecode = Bytecodes::FromByte(bytecode_start[0]);
|
| - int prefix_offset = 0;
|
| - OperandScale operand_scale = OperandScale::kSingle;
|
| - if (IsPrefixScalingBytecode(bytecode)) {
|
| - prefix_offset = 1;
|
| - operand_scale = Bytecodes::PrefixBytecodeToOperandScale(bytecode);
|
| - bytecode = Bytecodes::FromByte(bytecode_start[1]);
|
| - }
|
| -
|
| - // Prepare to print bytecode and operands as hex digits.
|
| - std::ios saved_format(nullptr);
|
| - saved_format.copyfmt(saved_format);
|
| - os.fill('0');
|
| - os.flags(std::ios::hex);
|
| -
|
| - int bytecode_size = Bytecodes::Size(bytecode, operand_scale);
|
| - for (int i = 0; i < prefix_offset + bytecode_size; i++) {
|
| - os << std::setw(2) << static_cast<uint32_t>(bytecode_start[i]) << ' ';
|
| - }
|
| - os.copyfmt(saved_format);
|
| -
|
| - const int kBytecodeColumnSize = 6;
|
| - for (int i = prefix_offset + bytecode_size; i < kBytecodeColumnSize; i++) {
|
| - os << " ";
|
| - }
|
| -
|
| - os << Bytecodes::ToString(bytecode, operand_scale) << " ";
|
| -
|
| - // Operands for the debug break are from the original instruction.
|
| - if (IsDebugBreak(bytecode)) return os;
|
| -
|
| - int number_of_operands = NumberOfOperands(bytecode);
|
| - int range = 0;
|
| - for (int i = 0; i < number_of_operands; i++) {
|
| - OperandType op_type = GetOperandType(bytecode, i);
|
| - const uint8_t* operand_start =
|
| - &bytecode_start[prefix_offset +
|
| - GetOperandOffset(bytecode, i, operand_scale)];
|
| - switch (op_type) {
|
| - case interpreter::OperandType::kRegCount:
|
| - os << "#"
|
| - << DecodeUnsignedOperand(operand_start, op_type, operand_scale);
|
| - break;
|
| - case interpreter::OperandType::kIdx:
|
| - case interpreter::OperandType::kRuntimeId:
|
| - case interpreter::OperandType::kIntrinsicId:
|
| - os << "["
|
| - << DecodeUnsignedOperand(operand_start, op_type, operand_scale)
|
| - << "]";
|
| - break;
|
| - case interpreter::OperandType::kImm:
|
| - os << "[" << DecodeSignedOperand(operand_start, op_type, operand_scale)
|
| - << "]";
|
| - break;
|
| - case interpreter::OperandType::kFlag8:
|
| - os << "#"
|
| - << DecodeUnsignedOperand(operand_start, op_type, operand_scale);
|
| - break;
|
| - case interpreter::OperandType::kMaybeReg:
|
| - case interpreter::OperandType::kReg:
|
| - case interpreter::OperandType::kRegOut: {
|
| - Register reg =
|
| - DecodeRegisterOperand(operand_start, op_type, operand_scale);
|
| - os << reg.ToString(parameter_count);
|
| - break;
|
| - }
|
| - case interpreter::OperandType::kRegOutTriple:
|
| - range += 1;
|
| - case interpreter::OperandType::kRegOutPair:
|
| - case interpreter::OperandType::kRegPair: {
|
| - range += 1;
|
| - Register first_reg =
|
| - DecodeRegisterOperand(operand_start, op_type, operand_scale);
|
| - Register last_reg = Register(first_reg.index() + range);
|
| - os << first_reg.ToString(parameter_count) << "-"
|
| - << last_reg.ToString(parameter_count);
|
| - break;
|
| - }
|
| - case interpreter::OperandType::kNone:
|
| - UNREACHABLE();
|
| - break;
|
| - }
|
| - if (i != number_of_operands - 1) {
|
| - os << ", ";
|
| - }
|
| - }
|
| - return os;
|
| -}
|
| -
|
| -// static
|
| bool Bytecodes::BytecodeHasHandler(Bytecode bytecode,
|
| OperandScale operand_scale) {
|
| return operand_scale == OperandScale::kSingle ||
|
| @@ -786,169 +651,6 @@ std::ostream& operator<<(std::ostream& os, const OperandType& operand_type) {
|
| return os << Bytecodes::OperandTypeToString(operand_type);
|
| }
|
|
|
| -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();
|
| - }
|
| -}
|
| -
|
| -// static
|
| -uint8_t CreateObjectLiteralFlags::Encode(bool fast_clone_supported,
|
| - int properties_count,
|
| - int runtime_flags) {
|
| - uint8_t result = FlagsBits::encode(runtime_flags);
|
| - if (fast_clone_supported) {
|
| - STATIC_ASSERT(
|
| - FastCloneShallowObjectStub::kMaximumClonedProperties <=
|
| - 1 << CreateObjectLiteralFlags::FastClonePropertiesCountBits::kShift);
|
| - DCHECK_LE(properties_count,
|
| - FastCloneShallowObjectStub::kMaximumClonedProperties);
|
| - result |= CreateObjectLiteralFlags::FastClonePropertiesCountBits::encode(
|
| - properties_count);
|
| - }
|
| - return result;
|
| -}
|
| -
|
| -// static
|
| -uint8_t CreateClosureFlags::Encode(bool pretenure, bool is_function_scope) {
|
| - uint8_t result = PretenuredBit::encode(pretenure);
|
| - if (!FLAG_always_opt && !FLAG_prepare_always_opt &&
|
| - pretenure == NOT_TENURED && is_function_scope) {
|
| - result |= FastNewClosureBit::encode(true);
|
| - }
|
| - return result;
|
| -}
|
| -
|
| } // namespace interpreter
|
| } // namespace internal
|
| } // namespace v8
|
|
|