| Index: src/interpreter/bytecodes.cc
|
| diff --git a/src/interpreter/bytecodes.cc b/src/interpreter/bytecodes.cc
|
| index 5f7a9085aec33bdba04bcd4764a8cfac73a6e667..2ad06bffd5aeb8d26246d76bac2b89b7bb2be9a7 100644
|
| --- a/src/interpreter/bytecodes.cc
|
| +++ b/src/interpreter/bytecodes.cc
|
| @@ -25,6 +25,19 @@ const char* Bytecodes::ToString(Bytecode bytecode) {
|
| return "";
|
| }
|
|
|
| +// static
|
| +std::string Bytecodes::ToString(Bytecode bytecode, OperandScale operand_scale) {
|
| + static const char kSeparator = '.';
|
| +
|
| + std::string value(ToString(bytecode));
|
| + if (operand_scale > OperandScale::kSingle) {
|
| + Bytecode prefix_bytecode = OperandScaleToPrefixBytecode(operand_scale);
|
| + std::string suffix = ToString(prefix_bytecode);
|
| + return value.append(1, kSeparator).append(suffix);
|
| + } else {
|
| + return value;
|
| + }
|
| +}
|
|
|
| // static
|
| const char* Bytecodes::OperandTypeToString(OperandType operand_type) {
|
| @@ -39,6 +52,20 @@ const char* Bytecodes::OperandTypeToString(OperandType operand_type) {
|
| return "";
|
| }
|
|
|
| +// static
|
| +const char* Bytecodes::OperandScaleToString(OperandScale operand_scale) {
|
| + switch (operand_scale) {
|
| + case OperandScale::kSingle:
|
| + return "Single";
|
| + case OperandScale::kDouble:
|
| + return "Double";
|
| + case OperandScale::kQuadruple:
|
| + return "Quadruple";
|
| + case OperandScale::kInvalid:
|
| + UNREACHABLE();
|
| + }
|
| + return "";
|
| +}
|
|
|
| // static
|
| const char* Bytecodes::OperandSizeToString(OperandSize operand_size) {
|
| @@ -49,6 +76,8 @@ const char* Bytecodes::OperandSizeToString(OperandSize operand_size) {
|
| return "Byte";
|
| case OperandSize::kShort:
|
| return "Short";
|
| + case OperandSize::kQuad:
|
| + return "Quad";
|
| }
|
| UNREACHABLE();
|
| return "";
|
| @@ -72,31 +101,34 @@ Bytecode Bytecodes::FromByte(uint8_t value) {
|
|
|
| // static
|
| Bytecode Bytecodes::GetDebugBreak(Bytecode bytecode) {
|
| - switch (Size(bytecode)) {
|
| -#define CASE(Name, ...) \
|
| - case BytecodeTraits<__VA_ARGS__, OPERAND_TERM>::kSize: \
|
| - return Bytecode::k##Name;
|
| - DEBUG_BREAK_BYTECODE_LIST(CASE)
|
| -#undef CASE
|
| - default:
|
| - break;
|
| + DCHECK(!IsDebugBreak(bytecode));
|
| + if (bytecode == Bytecode::kWide) {
|
| + return Bytecode::kDebugBreakWide;
|
| + }
|
| + if (bytecode == Bytecode::kExtraWide) {
|
| + return Bytecode::kDebugBreakExtraWide;
|
| + }
|
| + int bytecode_size = Size(bytecode, OperandScale::kSingle);
|
| +#define RETURN_IF_DEBUG_BREAK_SIZE_MATCHES(Name, ...) \
|
| + if (bytecode_size == Size(Bytecode::k##Name, OperandScale::kSingle)) { \
|
| + return Bytecode::k##Name; \
|
| }
|
| + DEBUG_BREAK_PLAIN_BYTECODE_LIST(RETURN_IF_DEBUG_BREAK_SIZE_MATCHES)
|
| +#undef RETURN_IF_DEBUG_BREAK_SIZE_MATCHES
|
| UNREACHABLE();
|
| - return static_cast<Bytecode>(-1);
|
| + return Bytecode::kIllegal;
|
| }
|
|
|
| // static
|
| -int Bytecodes::Size(Bytecode bytecode) {
|
| - DCHECK(bytecode <= Bytecode::kLast);
|
| - switch (bytecode) {
|
| -#define CASE(Name, ...) \
|
| - case Bytecode::k##Name: \
|
| - return BytecodeTraits<__VA_ARGS__, OPERAND_TERM>::kSize;
|
| - BYTECODE_LIST(CASE)
|
| -#undef CASE
|
| +int Bytecodes::Size(Bytecode bytecode, OperandScale operand_scale) {
|
| + int size = 1;
|
| + for (int i = 0; i < NumberOfOperands(bytecode); i++) {
|
| + OperandSize operand_size = GetOperandSize(bytecode, i, operand_scale);
|
| + int delta = static_cast<int>(operand_size);
|
| + DCHECK(base::bits::IsPowerOfTwo32(static_cast<uint32_t>(delta)));
|
| + size += delta;
|
| }
|
| - UNREACHABLE();
|
| - return 0;
|
| + return size;
|
| }
|
|
|
|
|
| @@ -131,34 +163,58 @@ int Bytecodes::NumberOfRegisterOperands(Bytecode bytecode) {
|
| }
|
|
|
| // static
|
| -OperandType Bytecodes::GetOperandType(Bytecode bytecode, int i) {
|
| - DCHECK(bytecode <= Bytecode::kLast);
|
| - switch (bytecode) {
|
| -#define CASE(Name, ...) \
|
| - case Bytecode::k##Name: \
|
| - return BytecodeTraits<__VA_ARGS__, OPERAND_TERM>::GetOperandType(i);
|
| - BYTECODE_LIST(CASE)
|
| -#undef CASE
|
| +Bytecode Bytecodes::OperandScaleToPrefixBytecode(OperandScale operand_scale) {
|
| + switch (operand_scale) {
|
| + case OperandScale::kQuadruple:
|
| + return Bytecode::kExtraWide;
|
| + case OperandScale::kDouble:
|
| + return Bytecode::kWide;
|
| + default:
|
| + UNREACHABLE();
|
| + return Bytecode::kIllegal;
|
| }
|
| - UNREACHABLE();
|
| - return OperandType::kNone;
|
| }
|
|
|
| +// static
|
| +bool Bytecodes::OperandScaleRequiresPrefixBytecode(OperandScale operand_scale) {
|
| + return operand_scale != OperandScale::kSingle;
|
| +}
|
| +
|
| +// static
|
| +OperandScale Bytecodes::PrefixBytecodeToOperandScale(Bytecode bytecode) {
|
| + switch (bytecode) {
|
| + case Bytecode::kExtraWide:
|
| + case Bytecode::kDebugBreakExtraWide:
|
| + return OperandScale::kQuadruple;
|
| + case Bytecode::kWide:
|
| + case Bytecode::kDebugBreakWide:
|
| + return OperandScale::kDouble;
|
| + default:
|
| + UNREACHABLE();
|
| + return OperandScale::kSingle;
|
| + }
|
| +}
|
|
|
| // static
|
| -OperandSize Bytecodes::GetOperandSize(Bytecode bytecode, int i) {
|
| +OperandType Bytecodes::GetOperandType(Bytecode bytecode, int i) {
|
| DCHECK(bytecode <= Bytecode::kLast);
|
| switch (bytecode) {
|
| #define CASE(Name, ...) \
|
| case Bytecode::k##Name: \
|
| - return BytecodeTraits<__VA_ARGS__, OPERAND_TERM>::GetOperandSize(i);
|
| + return BytecodeTraits<__VA_ARGS__, OPERAND_TERM>::GetOperandType(i);
|
| BYTECODE_LIST(CASE)
|
| #undef CASE
|
| }
|
| UNREACHABLE();
|
| - return OperandSize::kNone;
|
| + return OperandType::kNone;
|
| }
|
|
|
| +// static
|
| +OperandSize Bytecodes::GetOperandSize(Bytecode bytecode, int i,
|
| + OperandScale operand_scale) {
|
| + OperandType op_type = GetOperandType(bytecode, i);
|
| + return ScaledOperandSize(op_type, operand_scale);
|
| +}
|
|
|
| // static
|
| int Bytecodes::GetRegisterOperandBitmap(Bytecode bytecode) {
|
| @@ -176,34 +232,25 @@ int Bytecodes::GetRegisterOperandBitmap(Bytecode bytecode) {
|
| }
|
|
|
| // static
|
| -int Bytecodes::GetOperandOffset(Bytecode bytecode, int i) {
|
| - DCHECK(bytecode <= Bytecode::kLast);
|
| - switch (bytecode) {
|
| -#define CASE(Name, ...) \
|
| - case Bytecode::k##Name: \
|
| - return BytecodeTraits<__VA_ARGS__, OPERAND_TERM>::GetOperandOffset(i);
|
| - BYTECODE_LIST(CASE)
|
| -#undef CASE
|
| +int Bytecodes::GetOperandOffset(Bytecode bytecode, int i,
|
| + OperandScale operand_scale) {
|
| + // TODO(oth): restore this to a statically determined constant.
|
| + int offset = 1;
|
| + for (int operand_index = 0; operand_index < i; ++operand_index) {
|
| + OperandSize operand_size =
|
| + GetOperandSize(bytecode, operand_index, operand_scale);
|
| + offset += static_cast<int>(operand_size);
|
| }
|
| - UNREACHABLE();
|
| - return 0;
|
| + return offset;
|
| }
|
|
|
| -
|
| // static
|
| -OperandSize Bytecodes::SizeOfOperand(OperandType operand_type) {
|
| - switch (operand_type) {
|
| -#define CASE(Name, Size) \
|
| - case OperandType::k##Name: \
|
| - return Size;
|
| - OPERAND_TYPE_LIST(CASE)
|
| -#undef CASE
|
| - }
|
| - UNREACHABLE();
|
| - return OperandSize::kNone;
|
| +OperandSize Bytecodes::SizeOfOperand(OperandType operand_type,
|
| + OperandScale operand_scale) {
|
| + return static_cast<OperandSize>(
|
| + ScaledOperandSize(operand_type, operand_scale));
|
| }
|
|
|
| -
|
| // static
|
| bool Bytecodes::IsConditionalJumpImmediate(Bytecode bytecode) {
|
| return bytecode == Bytecode::kJumpIfTrue ||
|
| @@ -227,24 +274,10 @@ bool Bytecodes::IsConditionalJumpConstant(Bytecode bytecode) {
|
| bytecode == Bytecode::kJumpIfUndefinedConstant;
|
| }
|
|
|
| -
|
| -// static
|
| -bool Bytecodes::IsConditionalJumpConstantWide(Bytecode bytecode) {
|
| - return bytecode == Bytecode::kJumpIfTrueConstantWide ||
|
| - bytecode == Bytecode::kJumpIfFalseConstantWide ||
|
| - bytecode == Bytecode::kJumpIfToBooleanTrueConstantWide ||
|
| - bytecode == Bytecode::kJumpIfToBooleanFalseConstantWide ||
|
| - bytecode == Bytecode::kJumpIfNotHoleConstantWide ||
|
| - bytecode == Bytecode::kJumpIfNullConstantWide ||
|
| - bytecode == Bytecode::kJumpIfUndefinedConstantWide;
|
| -}
|
| -
|
| -
|
| // static
|
| bool Bytecodes::IsConditionalJump(Bytecode bytecode) {
|
| return IsConditionalJumpImmediate(bytecode) ||
|
| - IsConditionalJumpConstant(bytecode) ||
|
| - IsConditionalJumpConstantWide(bytecode);
|
| + IsConditionalJumpConstant(bytecode);
|
| }
|
|
|
|
|
| @@ -260,34 +293,22 @@ bool Bytecodes::IsJumpConstant(Bytecode bytecode) {
|
| IsConditionalJumpConstant(bytecode);
|
| }
|
|
|
| -
|
| -// static
|
| -bool Bytecodes::IsJumpConstantWide(Bytecode bytecode) {
|
| - return bytecode == Bytecode::kJumpConstantWide ||
|
| - IsConditionalJumpConstantWide(bytecode);
|
| -}
|
| -
|
| -
|
| // static
|
| bool Bytecodes::IsJump(Bytecode bytecode) {
|
| - return IsJumpImmediate(bytecode) || IsJumpConstant(bytecode) ||
|
| - IsJumpConstantWide(bytecode);
|
| + return IsJumpImmediate(bytecode) || IsJumpConstant(bytecode);
|
| }
|
|
|
|
|
| // static
|
| bool Bytecodes::IsCallOrNew(Bytecode bytecode) {
|
| return bytecode == Bytecode::kCall || bytecode == Bytecode::kTailCall ||
|
| - bytecode == Bytecode::kNew || bytecode == Bytecode::kCallWide ||
|
| - bytecode == Bytecode::kTailCallWide || bytecode == Bytecode::kNewWide;
|
| + bytecode == Bytecode::kNew;
|
| }
|
|
|
| // static
|
| bool Bytecodes::IsCallRuntime(Bytecode bytecode) {
|
| return bytecode == Bytecode::kCallRuntime ||
|
| - bytecode == Bytecode::kCallRuntimeWide ||
|
| - bytecode == Bytecode::kCallRuntimeForPair ||
|
| - bytecode == Bytecode::kCallRuntimeForPairWide;
|
| + bytecode == Bytecode::kCallRuntimeForPair;
|
| }
|
|
|
| // static
|
| @@ -304,31 +325,40 @@ bool Bytecodes::IsDebugBreak(Bytecode bytecode) {
|
| }
|
|
|
| // static
|
| -bool Bytecodes::IsJumpOrReturn(Bytecode bytecode) {
|
| - return bytecode == Bytecode::kReturn || IsJump(bytecode);
|
| -}
|
| -
|
| -// static
|
| -bool Bytecodes::IsIndexOperandType(OperandType operand_type) {
|
| - return operand_type == OperandType::kIdx8 ||
|
| - operand_type == OperandType::kIdx16;
|
| +bool Bytecodes::IsBytecodeWithScalableOperands(Bytecode bytecode) {
|
| + switch (bytecode) {
|
| +#define CASE(Name, ...) \
|
| + case Bytecode::k##Name: \
|
| + typedef BytecodeTraits<__VA_ARGS__, OPERAND_TERM> Name##Trait; \
|
| + return Name##Trait::IsScalable();
|
| + BYTECODE_LIST(CASE)
|
| +#undef CASE
|
| + }
|
| + UNREACHABLE();
|
| + return false;
|
| }
|
|
|
| // static
|
| -bool Bytecodes::IsImmediateOperandType(OperandType operand_type) {
|
| - return operand_type == OperandType::kImm8;
|
| +bool Bytecodes::IsPrefixScalingBytecode(Bytecode bytecode) {
|
| + switch (bytecode) {
|
| + case Bytecode::kExtraWide:
|
| + case Bytecode::kDebugBreakExtraWide:
|
| + case Bytecode::kWide:
|
| + case Bytecode::kDebugBreakWide:
|
| + return true;
|
| + default:
|
| + return false;
|
| + }
|
| }
|
|
|
| // static
|
| -bool Bytecodes::IsRegisterCountOperandType(OperandType operand_type) {
|
| - return (operand_type == OperandType::kRegCount8 ||
|
| - operand_type == OperandType::kRegCount16);
|
| +bool Bytecodes::IsJumpOrReturn(Bytecode bytecode) {
|
| + return bytecode == Bytecode::kReturn || IsJump(bytecode);
|
| }
|
|
|
| // static
|
| bool Bytecodes::IsMaybeRegisterOperandType(OperandType operand_type) {
|
| - return (operand_type == OperandType::kMaybeReg8 ||
|
| - operand_type == OperandType::kMaybeReg16);
|
| + return operand_type == OperandType::kMaybeReg;
|
| }
|
|
|
| // static
|
| @@ -384,22 +414,71 @@ bool Bytecodes::IsRegisterOutputOperandType(OperandType operand_type) {
|
| return false;
|
| }
|
|
|
| -namespace {
|
| -static Register DecodeRegister(const uint8_t* operand_start,
|
| - OperandType operand_type) {
|
| - switch (Bytecodes::SizeOfOperand(operand_type)) {
|
| +// static
|
| +bool Bytecodes::IsUnsignedOperandType(OperandType operand_type) {
|
| + switch (operand_type) {
|
| +#define CASE(Name, _) \
|
| + case OperandType::k##Name: \
|
| + return OperandTraits<OperandType::k##Name>::TypeInfo::kIsUnsigned;
|
| + OPERAND_TYPE_LIST(CASE)
|
| +#undef CASE
|
| + }
|
| + UNREACHABLE();
|
| + return false;
|
| +}
|
| +
|
| +// static
|
| +OperandScale Bytecodes::NextOperandScale(OperandScale operand_scale) {
|
| + DCHECK(operand_scale >= OperandScale::kSingle &&
|
| + operand_scale <= OperandScale::kMaxValid);
|
| + return static_cast<OperandScale>(2 * static_cast<int>(operand_scale));
|
| +}
|
| +
|
| +// 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 Register::FromOperand(*operand_start);
|
| + return static_cast<int8_t>(*operand_start);
|
| case OperandSize::kShort:
|
| - return Register::FromWideOperand(ReadUnalignedUInt16(operand_start));
|
| - case OperandSize::kNone: {
|
| + return static_cast<int16_t>(ReadUnalignedUInt16(operand_start));
|
| + case OperandSize::kQuad:
|
| + return static_cast<int32_t>(ReadUnalignedUInt32(operand_start));
|
| + case OperandSize::kNone:
|
| UNREACHABLE();
|
| - }
|
| }
|
| - return Register();
|
| + return 0;
|
| }
|
| -} // namespace
|
|
|
| +// 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,
|
| @@ -407,18 +486,23 @@ std::ostream& Bytecodes::Decode(std::ostream& os, const uint8_t* bytecode_start,
|
| Vector<char> buf = Vector<char>::New(50);
|
|
|
| Bytecode bytecode = Bytecodes::FromByte(bytecode_start[0]);
|
| - int bytecode_size = Bytecodes::Size(bytecode);
|
| -
|
| - for (int i = 0; i < bytecode_size; i++) {
|
| + int prefix_offset = 0;
|
| + OperandScale operand_scale = OperandScale::kSingle;
|
| + if (IsPrefixScalingBytecode(bytecode)) {
|
| + prefix_offset = 1;
|
| + bytecode = Bytecodes::FromByte(bytecode_start[1]);
|
| + }
|
| + int bytecode_size = Bytecodes::Size(bytecode, operand_scale);
|
| + for (int i = 0; i < prefix_offset + bytecode_size; i++) {
|
| SNPrintF(buf, "%02x ", bytecode_start[i]);
|
| os << buf.start();
|
| }
|
| const int kBytecodeColumnSize = 6;
|
| - for (int i = bytecode_size; i < kBytecodeColumnSize; i++) {
|
| + for (int i = prefix_offset + bytecode_size; i < kBytecodeColumnSize; i++) {
|
| os << " ";
|
| }
|
|
|
| - os << bytecode << " ";
|
| + os << Bytecodes::ToString(bytecode, operand_scale) << " ";
|
|
|
| // Operands for the debug break are from the original instruction.
|
| if (IsDebugBreak(bytecode)) return os;
|
| @@ -428,42 +512,42 @@ std::ostream& Bytecodes::Decode(std::ostream& os, const uint8_t* bytecode_start,
|
| for (int i = 0; i < number_of_operands; i++) {
|
| OperandType op_type = GetOperandType(bytecode, i);
|
| const uint8_t* operand_start =
|
| - &bytecode_start[GetOperandOffset(bytecode, i)];
|
| + &bytecode_start[prefix_offset +
|
| + GetOperandOffset(bytecode, i, operand_scale)];
|
| switch (op_type) {
|
| - case interpreter::OperandType::kRegCount8:
|
| - os << "#" << static_cast<unsigned int>(*operand_start);
|
| - break;
|
| - case interpreter::OperandType::kRegCount16:
|
| - os << '#' << ReadUnalignedUInt16(operand_start);
|
| + case interpreter::OperandType::kRegCount:
|
| + os << "#"
|
| + << DecodeUnsignedOperand(operand_start, op_type, operand_scale);
|
| break;
|
| - case interpreter::OperandType::kIdx8:
|
| - os << "[" << static_cast<unsigned int>(*operand_start) << "]";
|
| + case interpreter::OperandType::kIdx:
|
| + case interpreter::OperandType::kRuntimeId:
|
| + os << "["
|
| + << DecodeUnsignedOperand(operand_start, op_type, operand_scale)
|
| + << "]";
|
| break;
|
| - case interpreter::OperandType::kIdx16:
|
| - os << "[" << ReadUnalignedUInt16(operand_start) << "]";
|
| + case interpreter::OperandType::kImm:
|
| + os << "[" << DecodeSignedOperand(operand_start, op_type, operand_scale)
|
| + << "]";
|
| break;
|
| - case interpreter::OperandType::kImm8:
|
| - os << "#" << static_cast<int>(static_cast<int8_t>(*operand_start));
|
| + case interpreter::OperandType::kFlag8:
|
| + os << "#"
|
| + << DecodeUnsignedOperand(operand_start, op_type, operand_scale);
|
| break;
|
| - case interpreter::OperandType::kMaybeReg8:
|
| - case interpreter::OperandType::kMaybeReg16:
|
| - case interpreter::OperandType::kReg8:
|
| - case interpreter::OperandType::kReg16:
|
| - case interpreter::OperandType::kRegOut8:
|
| - case interpreter::OperandType::kRegOut16: {
|
| - Register reg = DecodeRegister(operand_start, op_type);
|
| + 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::kRegOutTriple8:
|
| - case interpreter::OperandType::kRegOutTriple16:
|
| + case interpreter::OperandType::kRegOutTriple:
|
| range += 1;
|
| - case interpreter::OperandType::kRegOutPair8:
|
| - case interpreter::OperandType::kRegOutPair16:
|
| - case interpreter::OperandType::kRegPair8:
|
| - case interpreter::OperandType::kRegPair16: {
|
| + case interpreter::OperandType::kRegOutPair:
|
| + case interpreter::OperandType::kRegPair: {
|
| range += 1;
|
| - Register first_reg = DecodeRegister(operand_start, op_type);
|
| + 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);
|
| @@ -484,14 +568,16 @@ std::ostream& operator<<(std::ostream& os, const Bytecode& bytecode) {
|
| return os << Bytecodes::ToString(bytecode);
|
| }
|
|
|
| -
|
| -std::ostream& operator<<(std::ostream& os, const OperandType& operand_type) {
|
| - return os << Bytecodes::OperandTypeToString(operand_type);
|
| +std::ostream& operator<<(std::ostream& os, const OperandSize& operand_size) {
|
| + return os << Bytecodes::OperandSizeToString(operand_size);
|
| }
|
|
|
| +std::ostream& operator<<(std::ostream& os, const OperandScale& operand_scale) {
|
| + return os << Bytecodes::OperandScaleToString(operand_scale);
|
| +}
|
|
|
| -std::ostream& operator<<(std::ostream& os, const OperandSize& operand_size) {
|
| - return os << Bytecodes::OperandSizeToString(operand_size);
|
| +std::ostream& operator<<(std::ostream& os, const OperandType& operand_type) {
|
| + return os << Bytecodes::OperandTypeToString(operand_type);
|
| }
|
|
|
| static const int kLastParamRegisterIndex =
|
| @@ -503,29 +589,17 @@ static const int kCurrentContextRegisterIndex =
|
| static const int kNewTargetRegisterIndex =
|
| -InterpreterFrameConstants::kNewTargetFromRegisterPointer / kPointerSize;
|
|
|
| -// The register space is a signed 16-bit space. Register operands
|
| -// occupy range above 0. Parameter indices are biased with the
|
| -// negative value kLastParamRegisterIndex for ease of access in the
|
| -// interpreter.
|
| -static const int kMaxParameterIndex = kMaxInt16 + kLastParamRegisterIndex;
|
| -static const int kMaxRegisterIndex = -kMinInt16;
|
| -static const int kMaxReg8Index = -kMinInt8;
|
| -static const int kMinReg8Index = -kMaxInt8;
|
| -static const int kMaxReg16Index = -kMinInt16;
|
| -static const int kMinReg16Index = -kMaxInt16;
|
| -
|
| bool Register::is_byte_operand() const {
|
| - return index_ >= kMinReg8Index && index_ <= kMaxReg8Index;
|
| + return index_ >= -kMaxInt8 && index_ <= -kMinInt8;
|
| }
|
|
|
| bool Register::is_short_operand() const {
|
| - return index_ >= kMinReg16Index && index_ <= kMaxReg16Index;
|
| + return index_ >= -kMaxInt16 && index_ <= -kMinInt16;
|
| }
|
|
|
| Register Register::FromParameterIndex(int index, int parameter_count) {
|
| DCHECK_GE(index, 0);
|
| DCHECK_LT(index, parameter_count);
|
| - DCHECK_LE(parameter_count, kMaxParameterIndex + 1);
|
| int register_index = kLastParamRegisterIndex - parameter_count + index + 1;
|
| DCHECK_LT(register_index, 0);
|
| return Register(register_index);
|
| @@ -565,44 +639,6 @@ bool Register::is_new_target() const {
|
| return index() == kNewTargetRegisterIndex;
|
| }
|
|
|
| -int Register::MaxParameterIndex() { return kMaxParameterIndex; }
|
| -
|
| -int Register::MaxRegisterIndex() { return kMaxRegisterIndex; }
|
| -
|
| -int Register::MaxRegisterIndexForByteOperand() { return kMaxReg8Index; }
|
| -
|
| -uint8_t Register::ToOperand() const {
|
| - DCHECK(is_byte_operand());
|
| - return static_cast<uint8_t>(-index_);
|
| -}
|
| -
|
| -
|
| -Register Register::FromOperand(uint8_t operand) {
|
| - return Register(-static_cast<int8_t>(operand));
|
| -}
|
| -
|
| -
|
| -uint16_t Register::ToWideOperand() const {
|
| - DCHECK(is_short_operand());
|
| - return static_cast<uint16_t>(-index_);
|
| -}
|
| -
|
| -
|
| -Register Register::FromWideOperand(uint16_t operand) {
|
| - return Register(-static_cast<int16_t>(operand));
|
| -}
|
| -
|
| -
|
| -uint32_t Register::ToRawOperand() const {
|
| - return static_cast<uint32_t>(-index_);
|
| -}
|
| -
|
| -
|
| -Register Register::FromRawOperand(uint32_t operand) {
|
| - return Register(-static_cast<int32_t>(operand));
|
| -}
|
| -
|
| -
|
| bool Register::AreContiguous(Register reg1, Register reg2, Register reg3,
|
| Register reg4, Register reg5) {
|
| if (reg1.index() + 1 != reg2.index()) {
|
|
|