| Index: src/interpreter/bytecodes.cc
|
| diff --git a/src/interpreter/bytecodes.cc b/src/interpreter/bytecodes.cc
|
| index 9fa1209d51b6075817e097918324483e41fb1a4d..fd27f391aa93636829fd1d689e98ca79aa15b7c0 100644
|
| --- a/src/interpreter/bytecodes.cc
|
| +++ b/src/interpreter/bytecodes.cc
|
| @@ -43,6 +43,22 @@ std::string Bytecodes::ToString(Bytecode bytecode, OperandScale operand_scale) {
|
| }
|
|
|
| // static
|
| +const char* Bytecodes::AccumulatorUseToString(AccumulatorUse accumulator_use) {
|
| + switch (accumulator_use) {
|
| + case AccumulatorUse::kNone:
|
| + return "None";
|
| + case AccumulatorUse::kRead:
|
| + return "Read";
|
| + case AccumulatorUse::kWrite:
|
| + return "Write";
|
| + case AccumulatorUse::kReadWrite:
|
| + return "ReadWrite";
|
| + }
|
| + UNREACHABLE();
|
| + return "";
|
| +}
|
| +
|
| +// static
|
| const char* Bytecodes::OperandTypeToString(OperandType operand_type) {
|
| switch (operand_type) {
|
| #define CASE(Name, _) \
|
| @@ -141,7 +157,7 @@ int Bytecodes::NumberOfOperands(Bytecode bytecode) {
|
| switch (bytecode) {
|
| #define CASE(Name, ...) \
|
| case Bytecode::k##Name: \
|
| - return BytecodeTraits<__VA_ARGS__, OPERAND_TERM>::kOperandCount;
|
| + return BytecodeTraits<__VA_ARGS__>::kOperandCount;
|
| BYTECODE_LIST(CASE)
|
| #undef CASE
|
| }
|
| @@ -154,9 +170,9 @@ int Bytecodes::NumberOfOperands(Bytecode bytecode) {
|
| int Bytecodes::NumberOfRegisterOperands(Bytecode bytecode) {
|
| DCHECK(bytecode <= Bytecode::kLast);
|
| switch (bytecode) {
|
| -#define CASE(Name, ...) \
|
| - case Bytecode::k##Name: \
|
| - typedef BytecodeTraits<__VA_ARGS__, OPERAND_TERM> Name##Trait; \
|
| +#define CASE(Name, ...) \
|
| + case Bytecode::k##Name: \
|
| + typedef BytecodeTraits<__VA_ARGS__> Name##Trait; \
|
| return Name##Trait::kRegisterOperandCount;
|
| BYTECODE_LIST(CASE)
|
| #undef CASE
|
| @@ -199,12 +215,38 @@ OperandScale Bytecodes::PrefixBytecodeToOperandScale(Bytecode bytecode) {
|
| }
|
|
|
| // static
|
| +AccumulatorUse Bytecodes::GetAccumulatorUse(Bytecode bytecode) {
|
| + DCHECK(bytecode <= Bytecode::kLast);
|
| + switch (bytecode) {
|
| +#define CASE(Name, ...) \
|
| + case Bytecode::k##Name: \
|
| + return BytecodeTraits<__VA_ARGS__>::kAccumulatorUse;
|
| + BYTECODE_LIST(CASE)
|
| +#undef CASE
|
| + }
|
| + UNREACHABLE();
|
| + return AccumulatorUse::kNone;
|
| +}
|
| +
|
| +// static
|
| +bool Bytecodes::ReadsAccumulator(Bytecode bytecode) {
|
| + return (GetAccumulatorUse(bytecode) & AccumulatorUse::kRead) ==
|
| + AccumulatorUse::kRead;
|
| +}
|
| +
|
| +// static
|
| +bool Bytecodes::WritesAccumulator(Bytecode bytecode) {
|
| + return (GetAccumulatorUse(bytecode) & AccumulatorUse::kWrite) ==
|
| + AccumulatorUse::kWrite;
|
| +}
|
| +
|
| +// 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);
|
| + return BytecodeTraits<__VA_ARGS__>::GetOperandType(i);
|
| BYTECODE_LIST(CASE)
|
| #undef CASE
|
| }
|
| @@ -223,9 +265,9 @@ OperandSize Bytecodes::GetOperandSize(Bytecode bytecode, int i,
|
| int Bytecodes::GetRegisterOperandBitmap(Bytecode bytecode) {
|
| DCHECK(bytecode <= Bytecode::kLast);
|
| switch (bytecode) {
|
| -#define CASE(Name, ...) \
|
| - case Bytecode::k##Name: \
|
| - typedef BytecodeTraits<__VA_ARGS__, OPERAND_TERM> Name##Trait; \
|
| +#define CASE(Name, ...) \
|
| + case Bytecode::k##Name: \
|
| + typedef BytecodeTraits<__VA_ARGS__> Name##Trait; \
|
| return Name##Trait::kRegisterOperandBitmap;
|
| BYTECODE_LIST(CASE)
|
| #undef CASE
|
| @@ -331,9 +373,9 @@ bool Bytecodes::IsDebugBreak(Bytecode bytecode) {
|
| // static
|
| bool Bytecodes::IsBytecodeWithScalableOperands(Bytecode bytecode) {
|
| switch (bytecode) {
|
| -#define CASE(Name, ...) \
|
| - case Bytecode::k##Name: \
|
| - typedef BytecodeTraits<__VA_ARGS__, OPERAND_TERM> Name##Trait; \
|
| +#define CASE(Name, ...) \
|
| + case Bytecode::k##Name: \
|
| + typedef BytecodeTraits<__VA_ARGS__> Name##Trait; \
|
| return Name##Trait::IsScalable();
|
| BYTECODE_LIST(CASE)
|
| #undef CASE
|
| @@ -586,6 +628,10 @@ std::ostream& operator<<(std::ostream& os, const Bytecode& bytecode) {
|
| return os << Bytecodes::ToString(bytecode);
|
| }
|
|
|
| +std::ostream& operator<<(std::ostream& os, const AccumulatorUse& use) {
|
| + return os << Bytecodes::AccumulatorUseToString(use);
|
| +}
|
| +
|
| std::ostream& operator<<(std::ostream& os, const OperandSize& operand_size) {
|
| return os << Bytecodes::OperandSizeToString(operand_size);
|
| }
|
|
|